From 74dc335b28a602291825a3a08fea639900eb4cad Mon Sep 17 00:00:00 2001 From: Aliaksandr Kalenik Date: Wed, 29 Jan 2025 01:45:34 +0100 Subject: [PATCH] LibWeb: Allow to early break from InvalidationSet::for_each_property() --- Libraries/LibWeb/CSS/InvalidationSet.cpp | 21 ++++++++++++------- Libraries/LibWeb/CSS/InvalidationSet.h | 2 +- .../LibWeb/CSS/StyleInvalidationData.cpp | 3 +++ Libraries/LibWeb/DOM/Node.cpp | 5 ++++- 4 files changed, 22 insertions(+), 9 deletions(-) diff --git a/Libraries/LibWeb/CSS/InvalidationSet.cpp b/Libraries/LibWeb/CSS/InvalidationSet.cpp index 117001d39e6..459e7b8bb55 100644 --- a/Libraries/LibWeb/CSS/InvalidationSet.cpp +++ b/Libraries/LibWeb/CSS/InvalidationSet.cpp @@ -21,14 +21,20 @@ bool InvalidationSet::is_empty() const return !m_needs_invalidate_self && !m_needs_invalidate_whole_subtree && m_properties.is_empty(); } -void InvalidationSet::for_each_property(Function const& callback) const +void InvalidationSet::for_each_property(Function const& callback) const { - if (m_needs_invalidate_self) - callback({ Property::Type::InvalidateSelf }); - if (m_needs_invalidate_whole_subtree) - callback({ Property::Type::InvalidateWholeSubtree }); - for (auto const& property : m_properties) - callback(property); + if (m_needs_invalidate_self) { + if (callback({ Property::Type::InvalidateSelf }) == IterationDecision::Break) + return; + } + if (m_needs_invalidate_whole_subtree) { + if (callback({ Property::Type::InvalidateWholeSubtree }) == IterationDecision::Break) + return; + } + for (auto const& property : m_properties) { + if (callback(property) == IterationDecision::Break) + return; + } } } @@ -92,6 +98,7 @@ ErrorOr Formatter::format(FormatBuilder& builde if (!first) builder.builder().append(", "sv); builder.builder().appendff("{}", property); + return IterationDecision::Continue; }); return {}; } diff --git a/Libraries/LibWeb/CSS/InvalidationSet.h b/Libraries/LibWeb/CSS/InvalidationSet.h index 3db0ab943ec..e008bb12b4c 100644 --- a/Libraries/LibWeb/CSS/InvalidationSet.h +++ b/Libraries/LibWeb/CSS/InvalidationSet.h @@ -51,7 +51,7 @@ public: void set_needs_invalidate_pseudo_class(PseudoClass pseudo_class) { m_properties.set({ Property::Type::PseudoClass, pseudo_class }); } bool is_empty() const; - void for_each_property(Function const& callback) const; + void for_each_property(Function const& callback) const; private: bool m_needs_invalidate_self { false }; diff --git a/Libraries/LibWeb/CSS/StyleInvalidationData.cpp b/Libraries/LibWeb/CSS/StyleInvalidationData.cpp index c54b99afa00..cf473a7c4f7 100644 --- a/Libraries/LibWeb/CSS/StyleInvalidationData.cpp +++ b/Libraries/LibWeb/CSS/StyleInvalidationData.cpp @@ -190,6 +190,7 @@ static InvalidationSet build_invalidation_sets_for_selector_impl(StyleInvalidati // we need to make all siblings are invalidated. descendant_invalidation_set.set_needs_invalidate_whole_subtree(); } + return IterationDecision::Continue; }); } @@ -216,6 +217,8 @@ static InvalidationSet build_invalidation_sets_for_selector_impl(StyleInvalidati } else { descendant_invalidation_set.include_all_from(invalidation_set_for_rightmost_selector); } + + return IterationDecision::Continue; }); } } diff --git a/Libraries/LibWeb/DOM/Node.cpp b/Libraries/LibWeb/DOM/Node.cpp index 4a20da50d41..ec8df229f3f 100644 --- a/Libraries/LibWeb/DOM/Node.cpp +++ b/Libraries/LibWeb/DOM/Node.cpp @@ -489,8 +489,11 @@ void Node::invalidate_style(StyleInvalidationReason reason, Vector