mirror of
https://github.com/LadybirdBrowser/ladybird
synced 2026-04-26 01:35:08 +02:00
A DOM mutation under a document that uses any :has() rule currently walks every ancestor up to the root, invoking invalidate_style_if_ affected_by_has() on each. Most of those ancestors have nothing to do with :has(), so the work scales linearly with DOM depth. Introduce an in_has_scope flag on Element, set while evaluating :has() arguments for invalidation metadata. StyleScope's upward invalidation walk now terminates at the first element that is neither in :has() scope nor a :has() anchor, so it only traverses the region where some :has() rule might actually care about the change. Keep the existing fast :has() matching paths for normal selector matching, but bypass them while collecting per-element metadata so the scope markers still get populated. Node insertion also schedules the parent for the :has() walk so newly inserted nodes still reach the real anchor. The css-has-invalidation suite adds focused coverage for these shapes and updates the expected counters to reflect the shorter walks.
15 lines
401 B
Plaintext
15 lines
401 B
Plaintext
[add .red (only :has(.red) flips)]
|
|
hasAncestorWalkInvocations: 1
|
|
hasAncestorWalkVisits: 2
|
|
hasMatchInvocations: 2
|
|
hasResultCacheHits: 0
|
|
hasResultCacheMisses: 2
|
|
styleInvalidations: 1
|
|
[add .blue (only :has(.blue) flips, .red stable)]
|
|
hasAncestorWalkInvocations: 1
|
|
hasAncestorWalkVisits: 2
|
|
hasMatchInvocations: 2
|
|
hasResultCacheHits: 0
|
|
hasResultCacheMisses: 2
|
|
styleInvalidations: 1
|