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
parent f66c55138b
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)
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();
}

View file

@ -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
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