LibWeb: Use invalidation sets for :defined style invalidation

This commit is contained in:
Aliaksandr Kalenik 2025-02-06 16:19:27 +01:00 committed by Andreas Kling
commit a6bea99959
Notes: github-actions[bot] 2025-02-06 19:08:10 +00:00
4 changed files with 8 additions and 16 deletions

View file

@ -2656,9 +2656,6 @@ void StyleComputer::collect_selector_insights(Selector const& selector, Selector
if (simple_selector.pseudo_class().type == PseudoClass::Has) {
insights.has_has_selectors = true;
}
if (simple_selector.pseudo_class().type == PseudoClass::Defined) {
insights.has_defined_selectors = true;
}
for (auto const& argument_selector : simple_selector.pseudo_class().argument_selector_list) {
collect_selector_insights(*argument_selector, insights);
}
@ -3175,13 +3172,4 @@ bool StyleComputer::may_have_has_selectors() const
return m_selector_insights->has_has_selectors;
}
bool StyleComputer::may_have_defined_selectors() const
{
if (!has_valid_rule_cache())
return true;
build_rule_cache_if_needed();
return m_selector_insights->has_defined_selectors;
}
}

View file

@ -177,7 +177,6 @@ public:
void collect_animation_into(DOM::Element&, Optional<CSS::Selector::PseudoElement::Type>, GC::Ref<Animations::KeyframeEffect> animation, ComputedProperties&, AnimationRefresh = AnimationRefresh::No) 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;
@ -257,7 +256,6 @@ private:
struct SelectorInsights {
bool has_has_selectors { false };
bool has_defined_selectors { false };
};
struct RuleCache {

View file

@ -69,6 +69,7 @@ static void collect_properties_used_in_has(Selector::SimpleSelector const& selec
switch (pseudo_class.type) {
case PseudoClass::Enabled:
case PseudoClass::Disabled:
case PseudoClass::Defined:
case PseudoClass::PlaceholderShown:
case PseudoClass::Checked:
if (in_has)
@ -122,6 +123,7 @@ static void build_invalidation_sets_for_simple_selector(Selector::SimpleSelector
auto const& pseudo_class = selector.pseudo_class();
switch (pseudo_class.type) {
case PseudoClass::Enabled:
case PseudoClass::Defined:
case PseudoClass::Disabled:
case PseudoClass::PlaceholderShown:
case PseudoClass::Checked:

View file

@ -1183,6 +1183,9 @@ bool Element::includes_properties_from_invalidation_set(CSS::InvalidationSet con
case CSS::PseudoClass::Disabled: {
return is_actually_disabled();
}
case CSS::PseudoClass::Defined: {
return is_defined();
}
case CSS::PseudoClass::Checked: {
// FIXME: This could be narrowed down to return true only if element is actually checked.
return is<HTML::HTMLInputElement>(*this) || is<HTML::HTMLOptionElement>(*this);
@ -2366,8 +2369,9 @@ void Element::set_custom_element_state(CustomElementState state)
return;
m_custom_element_state = state;
if (document().style_computer().may_have_defined_selectors())
invalidate_style(StyleInvalidationReason::CustomElementStateChange);
Vector<CSS::InvalidationSet::Property, 1> changed_properties;
changed_properties.append({ .type = CSS::InvalidationSet::Property::Type::PseudoClass, .value = CSS::PseudoClass::Defined });
invalidate_style(StyleInvalidationReason::CustomElementStateChange, changed_properties, {});
}
// https://html.spec.whatwg.org/multipage/dom.html#html-element-constructors