From fa790e5095f9c105a60d58c431cd1fe8a9ca9058 Mon Sep 17 00:00:00 2001 From: Sam Atkins Date: Tue, 9 Sep 2025 14:48:51 +0100 Subject: [PATCH] LibWeb/CSS: Take AbstractElement in for_each_matching_rules() --- Libraries/LibWeb/CSS/StyleComputer.cpp | 20 ++++++++++---------- Libraries/LibWeb/CSS/StyleComputer.h | 2 +- Libraries/LibWeb/DOM/Document.cpp | 4 ++-- 3 files changed, 13 insertions(+), 13 deletions(-) diff --git a/Libraries/LibWeb/CSS/StyleComputer.cpp b/Libraries/LibWeb/CSS/StyleComputer.cpp index ece749c8380..dcc70e738fd 100644 --- a/Libraries/LibWeb/CSS/StyleComputer.cpp +++ b/Libraries/LibWeb/CSS/StyleComputer.cpp @@ -564,7 +564,7 @@ Vector StyleComputer::collect_matching_rules(DOM::AbstractE }; auto add_rules_from_cache = [&](RuleCache const& rule_cache) { - rule_cache.for_each_matching_rules(abstract_element.element(), abstract_element.pseudo_element(), [&](auto const& matching_rules) { + rule_cache.for_each_matching_rules(abstract_element, [&](auto const& matching_rules) { add_rules_to_run(matching_rules); return IterationDecision::Continue; }); @@ -3388,40 +3388,40 @@ void RuleCache::add_rule(MatchingRule const& matching_rule, Optional pseudo_element, Function const&)> callback) const +void RuleCache::for_each_matching_rules(DOM::AbstractElement abstract_element, Function const&)> callback) const { - for (auto const& class_name : element.class_names()) { + for (auto const& class_name : abstract_element.element().class_names()) { if (auto it = rules_by_class.find(class_name); it != rules_by_class.end()) { if (callback(it->value) == IterationDecision::Break) return; } } - if (auto id = element.id(); id.has_value()) { + if (auto id = abstract_element.element().id(); id.has_value()) { if (auto it = rules_by_id.find(id.value()); it != rules_by_id.end()) { if (callback(it->value) == IterationDecision::Break) return; } } - if (auto it = rules_by_tag_name.find(element.lowercased_local_name()); it != rules_by_tag_name.end()) { + if (auto it = rules_by_tag_name.find(abstract_element.element().lowercased_local_name()); it != rules_by_tag_name.end()) { if (callback(it->value) == IterationDecision::Break) return; } - if (pseudo_element.has_value()) { - if (Selector::PseudoElementSelector::is_known_pseudo_element_type(pseudo_element.value())) { - if (callback(rules_by_pseudo_element.at(to_underlying(pseudo_element.value()))) == IterationDecision::Break) + if (abstract_element.pseudo_element().has_value()) { + if (Selector::PseudoElementSelector::is_known_pseudo_element_type(abstract_element.pseudo_element().value())) { + if (callback(rules_by_pseudo_element.at(to_underlying(abstract_element.pseudo_element().value()))) == IterationDecision::Break) return; } else { // NOTE: We don't cache rules for unknown pseudo-elements. They can't match anything anyway. } } - if (element.is_document_element()) { + if (abstract_element.element().is_document_element()) { if (callback(root_rules) == IterationDecision::Break) return; } IterationDecision decision = IterationDecision::Continue; - element.for_each_attribute([&](auto& name, auto&) { + abstract_element.element().for_each_attribute([&](auto& name, auto&) { if (auto it = rules_by_attribute_name.find(name); it != rules_by_attribute_name.end()) { decision = callback(it->value); } diff --git a/Libraries/LibWeb/CSS/StyleComputer.h b/Libraries/LibWeb/CSS/StyleComputer.h index 52149709a08..c17db1181ef 100644 --- a/Libraries/LibWeb/CSS/StyleComputer.h +++ b/Libraries/LibWeb/CSS/StyleComputer.h @@ -124,7 +124,7 @@ struct RuleCache { HashMap> rules_by_animation_keyframes; void add_rule(MatchingRule const&, Optional, bool contains_root_pseudo_class); - void for_each_matching_rules(DOM::Element const&, Optional, Function const&)> callback) const; + void for_each_matching_rules(DOM::AbstractElement, Function const&)> callback) const; }; class FontLoader; diff --git a/Libraries/LibWeb/DOM/Document.cpp b/Libraries/LibWeb/DOM/Document.cpp index f122237d833..580c2e20f46 100644 --- a/Libraries/LibWeb/DOM/Document.cpp +++ b/Libraries/LibWeb/DOM/Document.cpp @@ -1845,9 +1845,9 @@ void Document::invalidate_style_for_elements_affected_by_pseudo_class_change(CSS return false; }; - auto matches_different_set_of_rules_after_state_change = [&](Element const& element) { + auto matches_different_set_of_rules_after_state_change = [&](Element& element) { bool result = false; - rules.for_each_matching_rules(element, {}, [&](auto& rules) { + rules.for_each_matching_rules({ element }, [&](auto& rules) { for (auto& rule : rules) { bool before = does_rule_match_on_element(element, rule); TemporaryChange change { element_slot, node };