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.
This commit is contained in:
Andreas Kling 2025-05-20 12:03:44 +02:00 committed by Andreas Kling
commit 821d54de7f
Notes: github-actions[bot] 2025-05-20 11:29:55 +00:00
2 changed files with 32 additions and 32 deletions

View file

@ -18,9 +18,9 @@ RequiredInvalidationAfterStyleChange compute_property_invalidation(CSS::Property
if (!property_value_changed) if (!property_value_changed)
return invalidation; 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. // 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(); return RequiredInvalidationAfterStyleChange::full();
} }

View file

@ -2,8 +2,8 @@ Harness status: OK
Found 233 tests Found 233 tests
120 Pass 148 Pass
113 Fail 85 Fail
Pass abs(1) should be used-value-equivalent to 1 Pass abs(1) should be used-value-equivalent to 1
Pass sign(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 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(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 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 Pass abs(10px) should be used-value-equivalent to 10px
Fail abs(10%) should be used-value-equivalent to 10px Pass abs(10%) should be used-value-equivalent to 10px
Fail abs(10px + 10%) should be used-value-equivalent to 20px Pass abs(10px + 10%) should be used-value-equivalent to 20px
Fail calc(10px + abs(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 Pass abs(-10px) should be used-value-equivalent to 10px
Fail abs(-10%) should be used-value-equivalent to 10px Pass 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 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 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 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 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(1in) should be used-value-equivalent to 1in
Pass abs(1pc) should be used-value-equivalent to 1pc Pass abs(1pc) should be used-value-equivalent to 1pc
Pass abs(1pt) should be used-value-equivalent to 1pt Pass abs(1pt) should be used-value-equivalent to 1pt
Fail abs(1em) should be used-value-equivalent to 1em Pass abs(1em) should be used-value-equivalent to 1em
Fail abs(1ex) should be used-value-equivalent to 1ex Pass abs(1ex) should be used-value-equivalent to 1ex
Fail abs(1ch) should be used-value-equivalent to 1ch Pass abs(1ch) should be used-value-equivalent to 1ch
Fail abs(1rem) should be used-value-equivalent to 1rem Pass abs(1rem) should be used-value-equivalent to 1rem
Fail abs(1vh) should be used-value-equivalent to 1vh Pass abs(1vh) should be used-value-equivalent to 1vh
Fail abs(1vw) should be used-value-equivalent to 1vw Pass abs(1vw) should be used-value-equivalent to 1vw
Fail abs(1vmin) should be used-value-equivalent to 1vmin Pass abs(1vmin) should be used-value-equivalent to 1vmin
Fail abs(1vmax) should be used-value-equivalent to 1vmax Pass abs(1vmax) should be used-value-equivalent to 1vmax
Pass abs(-1px) should be used-value-equivalent to 1px Pass abs(-1px) should be used-value-equivalent to 1px
Pass abs(-1cm) should be used-value-equivalent to 1cm Pass abs(-1cm) should be used-value-equivalent to 1cm
Pass abs(-1mm) should be used-value-equivalent to 1mm 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(-1in) should be used-value-equivalent to 1in
Pass abs(-1pc) should be used-value-equivalent to 1pc Pass abs(-1pc) should be used-value-equivalent to 1pc
Pass abs(-1pt) should be used-value-equivalent to 1pt Pass abs(-1pt) should be used-value-equivalent to 1pt
Fail abs(-1em) should be used-value-equivalent to 1em Pass abs(-1em) should be used-value-equivalent to 1em
Fail abs(-1ex) should be used-value-equivalent to 1ex Pass abs(-1ex) should be used-value-equivalent to 1ex
Fail abs(-1ch) should be used-value-equivalent to 1ch Pass abs(-1ch) should be used-value-equivalent to 1ch
Fail abs(-1rem) should be used-value-equivalent to 1rem Pass abs(-1rem) should be used-value-equivalent to 1rem
Fail abs(-1vh) should be used-value-equivalent to 1vh Pass abs(-1vh) should be used-value-equivalent to 1vh
Fail abs(-1vw) should be used-value-equivalent to 1vw Pass abs(-1vw) should be used-value-equivalent to 1vw
Fail abs(-1vmin) should be used-value-equivalent to 1vmin Pass abs(-1vmin) should be used-value-equivalent to 1vmin
Fail abs(-1vmax) should be used-value-equivalent to 1vmax Pass abs(-1vmax) should be used-value-equivalent to 1vmax
Pass abs(1s) should be used-value-equivalent to 1s Pass abs(1s) should be used-value-equivalent to 1s
Pass abs(1ms) should be used-value-equivalent to 1ms Pass abs(1ms) should be used-value-equivalent to 1ms
Pass abs(-1s) should be used-value-equivalent to 1s 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 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 - 1em) should be used-value-equivalent to 0; fontSize=10px
Fail sign(10px - 2em) should be used-value-equivalent to -1; 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(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(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(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(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(40px - 2em)) should be used-value-equivalent to 3
Fail calc(3 + sign(38px - 2em)) should be used-value-equivalent to 2 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 Pass 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 Pass 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(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(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(40px - 2em)) should be used-value-equivalent to 90deg
Fail calc(90deg + 30deg * sign(38px - 2em)) should be used-value-equivalent to 60deg 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(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(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(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 Pass 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 Pass 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 Pass calc(50px + 100px * sign(30px - 2rem)) should be used-value-equivalent to -50px