diff --git a/Libraries/LibWeb/CSS/StyleComputer.cpp b/Libraries/LibWeb/CSS/StyleComputer.cpp index a96a11e32f2..df94b01a5e9 100644 --- a/Libraries/LibWeb/CSS/StyleComputer.cpp +++ b/Libraries/LibWeb/CSS/StyleComputer.cpp @@ -2530,7 +2530,7 @@ GC::Ref StyleComputer::compute_properties(DOM::Element& elem void StyleComputer::build_rule_cache_if_needed() const { - if (m_author_rule_cache && m_user_rule_cache && m_user_agent_rule_cache) + if (has_valid_rule_cache()) return; const_cast(*this).build_rule_cache(); } @@ -3077,19 +3077,19 @@ size_t StyleComputer::number_of_css_font_faces_with_loading_in_progress() const return count; } -bool StyleComputer::has_has_selectors() const +bool StyleComputer::may_have_has_selectors() const { - if (!document().is_active()) - return false; + if (!has_valid_rule_cache()) + return true; build_rule_cache_if_needed(); return m_selector_insights->has_has_selectors; } -bool StyleComputer::has_defined_selectors() const +bool StyleComputer::may_have_defined_selectors() const { - if (!document().is_active()) - return false; + if (!has_valid_rule_cache()) + return true; build_rule_cache_if_needed(); return m_selector_insights->has_defined_selectors; diff --git a/Libraries/LibWeb/CSS/StyleComputer.h b/Libraries/LibWeb/CSS/StyleComputer.h index fccc7b58b10..37909461fd3 100644 --- a/Libraries/LibWeb/CSS/StyleComputer.h +++ b/Libraries/LibWeb/CSS/StyleComputer.h @@ -153,6 +153,7 @@ public: InvalidationSet invalidation_set_for_properties(Vector const&) const; bool invalidation_property_used_in_has_selector(InvalidationSet::Property const&) const; + [[nodiscard]] bool has_valid_rule_cache() const { return m_author_rule_cache; } void invalidate_rule_cache(); Gfx::Font const& initial_font() const; @@ -176,8 +177,8 @@ public: }; void collect_animation_into(DOM::Element&, Optional, GC::Ref animation, ComputedProperties&, AnimationRefresh = AnimationRefresh::No) const; - [[nodiscard]] bool has_has_selectors() const; - [[nodiscard]] bool has_defined_selectors() const; + [[nodiscard]] bool may_have_has_selectors() const; + [[nodiscard]] bool may_have_defined_selectors() const; size_t number_of_css_font_faces_with_loading_in_progress() const; diff --git a/Libraries/LibWeb/DOM/Document.cpp b/Libraries/LibWeb/DOM/Document.cpp index 1ebdc2e687c..260525ae944 100644 --- a/Libraries/LibWeb/DOM/Document.cpp +++ b/Libraries/LibWeb/DOM/Document.cpp @@ -1617,7 +1617,7 @@ void Document::invalidate_style_for_elements_affected_by_hover_change(Node& old_ return; auto& invalidation_root = [&] -> Node& { - if (style_computer().has_has_selectors()) + if (style_computer().may_have_has_selectors()) return old_new_hovered_common_ancestor; return old_new_hovered_common_ancestor; }(); diff --git a/Libraries/LibWeb/DOM/Element.cpp b/Libraries/LibWeb/DOM/Element.cpp index cee6a5a7129..d61245d81b5 100644 --- a/Libraries/LibWeb/DOM/Element.cpp +++ b/Libraries/LibWeb/DOM/Element.cpp @@ -2328,7 +2328,7 @@ void Element::set_custom_element_state(CustomElementState state) return; m_custom_element_state = state; - if (document().style_computer().has_defined_selectors()) + if (document().style_computer().may_have_defined_selectors()) invalidate_style(StyleInvalidationReason::CustomElementStateChange); } diff --git a/Libraries/LibWeb/DOM/Node.cpp b/Libraries/LibWeb/DOM/Node.cpp index 224772e9728..4817e7251a3 100644 --- a/Libraries/LibWeb/DOM/Node.cpp +++ b/Libraries/LibWeb/DOM/Node.cpp @@ -408,7 +408,7 @@ void Node::invalidate_style(StyleInvalidationReason reason) // FIXME: This is very not optimal! We should figure out a smaller set of elements to invalidate, // but right now the :has() selector means we have to invalidate everything. - if (!is_document() && document().style_computer().has_has_selectors()) { + if (!is_document() && document().style_computer().may_have_has_selectors()) { document().invalidate_style(reason); return; }