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