LibWeb: Collect interesting document-wide insights about CSS selectors

Starting out with these two things:
- Whether any :has() selectors are present
- The set of all names referenced by attribute selectors
This commit is contained in:
Andreas Kling 2024-12-23 15:22:10 +01:00 committed by Andreas Kling
commit 6983c65c54
Notes: github-actions[bot] 2024-12-23 16:06:10 +00:00
2 changed files with 42 additions and 22 deletions

View file

@ -169,7 +169,8 @@ public:
};
void collect_animation_into(DOM::Element&, Optional<CSS::Selector::PseudoElement::Type>, GC::Ref<Animations::KeyframeEffect> animation, ComputedProperties&, AnimationRefresh = AnimationRefresh::No) const;
[[nodiscard]] bool has_has_selectors() const { return m_has_has_selectors; }
[[nodiscard]] bool has_has_selectors() const;
[[nodiscard]] bool has_attribute_selector(FlyString const& attribute_name) const;
size_t number_of_css_font_faces_with_loading_in_progress() const;
@ -247,6 +248,11 @@ private:
GC::Ref<DOM::Document> m_document;
struct SelectorInsights {
bool has_has_selectors { false };
HashTable<FlyString> all_names_used_in_attribute_selectors;
};
struct RuleCache {
HashMap<FlyString, Vector<MatchingRule>> rules_by_id;
HashMap<FlyString, Vector<MatchingRule>> rules_by_class;
@ -257,15 +263,15 @@ private:
Vector<MatchingRule> other_rules;
HashMap<FlyString, NonnullRefPtr<Animations::KeyframeEffect::KeyFrameSet>> rules_by_animation_keyframes;
bool has_has_selectors { false };
};
NonnullOwnPtr<RuleCache> make_rule_cache_for_cascade_origin(CascadeOrigin);
NonnullOwnPtr<RuleCache> make_rule_cache_for_cascade_origin(CascadeOrigin, SelectorInsights&);
RuleCache const& rule_cache_for_cascade_origin(CascadeOrigin) const;
bool m_has_has_selectors { false };
static void collect_selector_insights(Selector const&, SelectorInsights&);
OwnPtr<SelectorInsights> m_selector_insights;
OwnPtr<RuleCache> m_author_rule_cache;
OwnPtr<RuleCache> m_user_rule_cache;
OwnPtr<RuleCache> m_user_agent_rule_cache;