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:
parent
4780d25df5
commit
08dd93a8e0
3 changed files with 4 additions and 0 deletions
|
|
@ -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 = {}; }
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue