From 821d54de7f4010678e1a9c004aa368e86b39b5cf Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Tue, 20 May 2025 12:03:44 +0200 Subject: [PATCH] LibWeb: Invalidate layout tree on CSS position property change When position changes, we may need to make larger structural updates to the layout tree. A simple relayout is not sufficient. This was a source of flakiness in the engine, and gives us at least +28 new WPT subtest passes. --- Libraries/LibWeb/CSS/StyleInvalidation.cpp | 4 +- .../css/css-values/signs-abs-computed.txt | 60 +++++++++---------- 2 files changed, 32 insertions(+), 32 deletions(-) diff --git a/Libraries/LibWeb/CSS/StyleInvalidation.cpp b/Libraries/LibWeb/CSS/StyleInvalidation.cpp index 3cad957819b..9c7e80ddb8a 100644 --- a/Libraries/LibWeb/CSS/StyleInvalidation.cpp +++ b/Libraries/LibWeb/CSS/StyleInvalidation.cpp @@ -18,9 +18,9 @@ RequiredInvalidationAfterStyleChange compute_property_invalidation(CSS::Property if (!property_value_changed) return invalidation; - // NOTE: If the computed CSS display, content, or content-visibility property changes, we have to rebuild the entire layout tree. + // NOTE: If the computed CSS display, position, content, or content-visibility property changes, we have to rebuild the entire layout tree. // In the future, we should figure out ways to rebuild a smaller part of the tree. - if (AK::first_is_one_of(property_id, CSS::PropertyID::Display, CSS::PropertyID::Content, CSS::PropertyID::ContentVisibility)) { + if (AK::first_is_one_of(property_id, CSS::PropertyID::Display, CSS::PropertyID::Position, CSS::PropertyID::Content, CSS::PropertyID::ContentVisibility)) { return RequiredInvalidationAfterStyleChange::full(); } diff --git a/Tests/LibWeb/Text/expected/wpt-import/css/css-values/signs-abs-computed.txt b/Tests/LibWeb/Text/expected/wpt-import/css/css-values/signs-abs-computed.txt index 4f4b13f7d3f..3262891a2a4 100644 --- a/Tests/LibWeb/Text/expected/wpt-import/css/css-values/signs-abs-computed.txt +++ b/Tests/LibWeb/Text/expected/wpt-import/css/css-values/signs-abs-computed.txt @@ -2,8 +2,8 @@ Harness status: OK Found 233 tests -120 Pass -113 Fail +148 Pass +85 Fail Pass abs(1) should be used-value-equivalent to 1 Pass sign(1) should be used-value-equivalent to 1 Pass abs(-1) should be used-value-equivalent to 1 @@ -19,12 +19,12 @@ Pass calc(abs(0.1 + 0.2) * -2) should be used-value-equivalent to -0.6 Pass calc(sign(0.1 - 0.2) - 0.05) should be used-value-equivalent to -1.05 Pass calc(sign(1) + sign(1) - 0.05) should be used-value-equivalent to 1.95 Pass abs(10px) should be used-value-equivalent to 10px -Fail abs(10%) should be used-value-equivalent to 10px -Fail abs(10px + 10%) should be used-value-equivalent to 20px -Fail calc(10px + abs(10%)) should be used-value-equivalent to 20px +Pass abs(10%) should be used-value-equivalent to 10px +Pass abs(10px + 10%) should be used-value-equivalent to 20px +Pass calc(10px + abs(10%)) should be used-value-equivalent to 20px Pass abs(-10px) should be used-value-equivalent to 10px -Fail abs(-10%) should be used-value-equivalent to 10px -Fail calc((1em + 1px) * (sign(1em - 10px - 10%) + 1)) should be used-value-equivalent to 21px +Pass abs(-10%) should be used-value-equivalent to 10px +Pass calc((1em + 1px) * (sign(1em - 10px - 10%) + 1)) should be used-value-equivalent to 21px Pass calc(calc(sign(-0))) should be used-value-equivalent to 0 Fail clamp(-1, calc( 1 / sign(calc(sign(-0)))), 1) should be used-value-equivalent to -1 Pass calc(calc(sign(0))) should be used-value-equivalent to 0 @@ -172,14 +172,14 @@ Pass abs(1Q) should be used-value-equivalent to 1Q Pass abs(1in) should be used-value-equivalent to 1in Pass abs(1pc) should be used-value-equivalent to 1pc Pass abs(1pt) should be used-value-equivalent to 1pt -Fail abs(1em) should be used-value-equivalent to 1em -Fail abs(1ex) should be used-value-equivalent to 1ex -Fail abs(1ch) should be used-value-equivalent to 1ch -Fail abs(1rem) should be used-value-equivalent to 1rem -Fail abs(1vh) should be used-value-equivalent to 1vh -Fail abs(1vw) should be used-value-equivalent to 1vw -Fail abs(1vmin) should be used-value-equivalent to 1vmin -Fail abs(1vmax) should be used-value-equivalent to 1vmax +Pass abs(1em) should be used-value-equivalent to 1em +Pass abs(1ex) should be used-value-equivalent to 1ex +Pass abs(1ch) should be used-value-equivalent to 1ch +Pass abs(1rem) should be used-value-equivalent to 1rem +Pass abs(1vh) should be used-value-equivalent to 1vh +Pass abs(1vw) should be used-value-equivalent to 1vw +Pass abs(1vmin) should be used-value-equivalent to 1vmin +Pass abs(1vmax) should be used-value-equivalent to 1vmax Pass abs(-1px) should be used-value-equivalent to 1px Pass abs(-1cm) should be used-value-equivalent to 1cm Pass abs(-1mm) should be used-value-equivalent to 1mm @@ -187,14 +187,14 @@ Pass abs(-1Q) should be used-value-equivalent to 1Q Pass abs(-1in) should be used-value-equivalent to 1in Pass abs(-1pc) should be used-value-equivalent to 1pc Pass abs(-1pt) should be used-value-equivalent to 1pt -Fail abs(-1em) should be used-value-equivalent to 1em -Fail abs(-1ex) should be used-value-equivalent to 1ex -Fail abs(-1ch) should be used-value-equivalent to 1ch -Fail abs(-1rem) should be used-value-equivalent to 1rem -Fail abs(-1vh) should be used-value-equivalent to 1vh -Fail abs(-1vw) should be used-value-equivalent to 1vw -Fail abs(-1vmin) should be used-value-equivalent to 1vmin -Fail abs(-1vmax) should be used-value-equivalent to 1vmax +Pass abs(-1em) should be used-value-equivalent to 1em +Pass abs(-1ex) should be used-value-equivalent to 1ex +Pass abs(-1ch) should be used-value-equivalent to 1ch +Pass abs(-1rem) should be used-value-equivalent to 1rem +Pass abs(-1vh) should be used-value-equivalent to 1vh +Pass abs(-1vw) should be used-value-equivalent to 1vw +Pass abs(-1vmin) should be used-value-equivalent to 1vmin +Pass abs(-1vmax) should be used-value-equivalent to 1vmax Pass abs(1s) should be used-value-equivalent to 1s Pass abs(1ms) should be used-value-equivalent to 1ms Pass abs(-1s) should be used-value-equivalent to 1s @@ -209,16 +209,16 @@ Pass abs(-1rad) should be used-value-equivalent to 1rad Pass abs(-1turn) should be used-value-equivalent to 1turn Fail sign(10px - 1em) should be used-value-equivalent to 0; fontSize=10px Fail sign(10px - 2em) should be used-value-equivalent to -1; fontSize=10px -Fail calc(sign(10%) * 100px) should be used-value-equivalent to 100px +Pass calc(sign(10%) * 100px) should be used-value-equivalent to 100px Fail calc(2.5 - sign(41px - 2em) / 2) should be used-value-equivalent to 2 Fail calc(2.5 - sign(40px - 2em) / 2) should be used-value-equivalent to 2.5 Fail calc(2.5 - sign(39px - 2em) / 2) should be used-value-equivalent to 3 Fail calc(3 + sign(42px - 2em)) should be used-value-equivalent to 4 Fail calc(3 + sign(40px - 2em)) should be used-value-equivalent to 3 Fail calc(3 + sign(38px - 2em)) should be used-value-equivalent to 2 -Fail calc(50px + 100px * sign(42px - 2em)) should be used-value-equivalent to 150px -Fail calc(50px + 100px * sign(40px - 2em)) should be used-value-equivalent to 50px -Fail calc(50px + 100px * sign(38px - 2em)) should be used-value-equivalent to -50px +Pass calc(50px + 100px * sign(42px - 2em)) should be used-value-equivalent to 150px +Pass calc(50px + 100px * sign(40px - 2em)) should be used-value-equivalent to 50px +Pass calc(50px + 100px * sign(38px - 2em)) should be used-value-equivalent to -50px Fail calc(90deg + 30deg * sign(42px - 2em)) should be used-value-equivalent to 120deg Fail calc(90deg + 30deg * sign(40px - 2em)) should be used-value-equivalent to 90deg Fail calc(90deg + 30deg * sign(38px - 2em)) should be used-value-equivalent to 60deg @@ -234,6 +234,6 @@ Fail calc(3fr + 1fr * sign(38px - 2em)) should be used-value-equivalent to 2fr Fail calc(2.5 - sign(33px - 2rem) / 2) should be used-value-equivalent to 2 Fail calc(2.5 - sign(32px - 2rem) / 2) should be used-value-equivalent to 2.5 Fail calc(2.5 - sign(31px - 2rem) / 2) should be used-value-equivalent to 3 -Fail calc(50px + 100px * sign(34px - 2rem)) should be used-value-equivalent to 150px -Fail calc(50px + 100px * sign(32px - 2rem)) should be used-value-equivalent to 50px -Fail calc(50px + 100px * sign(30px - 2rem)) should be used-value-equivalent to -50px \ No newline at end of file +Pass calc(50px + 100px * sign(34px - 2rem)) should be used-value-equivalent to 150px +Pass calc(50px + 100px * sign(32px - 2rem)) should be used-value-equivalent to 50px +Pass calc(50px + 100px * sign(30px - 2rem)) should be used-value-equivalent to -50px \ No newline at end of file