LibWeb: Count previous-sibling visits during style invalidation

Add a `previousSiblingInvalidationWalkVisits` counter that increments
once per element examined during the previous-sibling walk in
`invalidate_style` on `NodeInsertBefore` and `NodeRemove`. This can be
expensive and the next commit introduces an optimization that prevents
this work being done unnecessarily
This commit is contained in:
Tim Ledbetter 2026-04-26 14:15:43 +01:00 committed by Andreas Kling
parent 4780d25df5
commit 08dd93a8e0
3 changed files with 4 additions and 0 deletions

View file

@ -859,6 +859,7 @@ public:
u64 element_style_noop_recomputations { 0 };
u64 element_inherited_style_recomputations { 0 };
u64 element_inherited_style_noop_recomputations { 0 };
u64 previous_sibling_invalidation_walk_visits { 0 };
};
StyleInvalidationCounters& style_invalidation_counters() const { return m_style_invalidation_counters; }
void reset_style_invalidation_counters() const { m_style_invalidation_counters = {}; }

View file

@ -551,7 +551,9 @@ void Node::invalidate_style(StyleInvalidationReason reason)
};
if (reason == StyleInvalidationReason::NodeInsertBefore || reason == StyleInvalidationReason::NodeRemove) {
auto& counters = document().style_invalidation_counters();
for (auto* sibling = previous_sibling(); sibling; sibling = sibling->previous_sibling()) {
++counters.previous_sibling_invalidation_walk_visits;
if (auto* element = as_if<Element>(sibling); element && previous_sibling_needs_structural_invalidation(*element))
mark_entire_subtree_for_style_update(*element);
}

View file

@ -612,6 +612,7 @@ JS::Object* Internals::get_style_invalidation_counters()
object->define_direct_property("elementStyleNoopRecomputations"_utf16_fly_string, JS::Value(counters.element_style_noop_recomputations), JS::default_attributes);
object->define_direct_property("elementInheritedStyleRecomputations"_utf16_fly_string, JS::Value(counters.element_inherited_style_recomputations), JS::default_attributes);
object->define_direct_property("elementInheritedStyleNoopRecomputations"_utf16_fly_string, JS::Value(counters.element_inherited_style_noop_recomputations), JS::default_attributes);
object->define_direct_property("previousSiblingInvalidationWalkVisits"_utf16_fly_string, JS::Value(counters.previous_sibling_invalidation_walk_visits), JS::default_attributes);
return object;
}