mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2025-04-27 06:48:49 +00:00
LibWeb: Limit sibling style invalidation by max distance
If an element is affected only by selectors using the direct sibling combinator `+`, we can calculate the maximum invalidation distance and use it to limit style invalidation. For example, the selector `.a + .b + .c` has a maximum invalidation distance of 2, meaning we can skip invalidating any element affected by this selector if it's more than two siblings away from the element that triggered the style invalidation. This change results in visible performance improvement when hovering PR list on GitHub.
This commit is contained in:
parent
46abdd1126
commit
84ecaaa75c
Notes:
github-actions[bot]
2025-03-10 17:57:49 +00:00
Author: https://github.com/kalenikaliaksandr
Commit: 84ecaaa75c
Pull-request: https://github.com/LadybirdBrowser/ladybird/pull/3891
6 changed files with 61 additions and 10 deletions
|
@ -978,7 +978,9 @@ bool matches(CSS::Selector const& selector, int component_list_index, DOM::Eleme
|
|||
}
|
||||
case CSS::Selector::Combinator::NextSibling:
|
||||
if (context.collect_per_element_selector_involvement_metadata) {
|
||||
const_cast<DOM::Element&>(element).set_affected_by_sibling_combinator(true);
|
||||
const_cast<DOM::Element&>(element).set_affected_by_direct_sibling_combinator(true);
|
||||
auto new_sibling_invalidation_distance = max(selector.sibling_invalidation_distance(), element.sibling_invalidation_distance());
|
||||
const_cast<DOM::Element&>(element).set_sibling_invalidation_distance(new_sibling_invalidation_distance);
|
||||
}
|
||||
VERIFY(component_list_index != 0);
|
||||
if (auto* sibling = element.previous_element_sibling())
|
||||
|
@ -986,7 +988,7 @@ bool matches(CSS::Selector const& selector, int component_list_index, DOM::Eleme
|
|||
return false;
|
||||
case CSS::Selector::Combinator::SubsequentSibling:
|
||||
if (context.collect_per_element_selector_involvement_metadata) {
|
||||
const_cast<DOM::Element&>(element).set_affected_by_sibling_combinator(true);
|
||||
const_cast<DOM::Element&>(element).set_affected_by_indirect_sibling_combinator(true);
|
||||
}
|
||||
VERIFY(component_list_index != 0);
|
||||
for (auto* sibling = element.previous_element_sibling(); sibling; sibling = sibling->previous_element_sibling()) {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue