LibWeb: Use invalidation sets for link-related pseudo classes

- :any-link
- :link
- :local-link
This commit is contained in:
Andreas Kling 2025-02-08 14:23:17 +01:00 committed by Alexander Kalenik
parent 719a2e448f
commit 39abd75d59
Notes: github-actions[bot] 2025-02-08 17:12:20 +00:00
3 changed files with 22 additions and 2 deletions

View file

@ -72,6 +72,9 @@ static void collect_properties_used_in_has(Selector::SimpleSelector const& selec
case PseudoClass::Defined:
case PseudoClass::PlaceholderShown:
case PseudoClass::Checked:
case PseudoClass::Link:
case PseudoClass::AnyLink:
case PseudoClass::LocalLink:
if (in_has)
style_invalidation_data.pseudo_classes_used_in_has_selectors.set(pseudo_class.type);
break;
@ -128,6 +131,9 @@ static void build_invalidation_sets_for_simple_selector(Selector::SimpleSelector
case PseudoClass::PlaceholderShown:
case PseudoClass::Checked:
case PseudoClass::Has:
case PseudoClass::Link:
case PseudoClass::AnyLink:
case PseudoClass::LocalLink:
invalidation_set.set_needs_invalidate_pseudo_class(pseudo_class.type);
break;
default:

View file

@ -30,7 +30,14 @@ void HTMLHyperlinkElementUtils::set_the_url()
{
ScopeGuard invalidate_style_if_needed = [old_url = m_url, this] {
if (m_url != old_url) {
hyperlink_element_utils_element().invalidate_style(DOM::StyleInvalidationReason::HTMLHyperlinkElementHrefChange);
hyperlink_element_utils_element().invalidate_style(
DOM::StyleInvalidationReason::HTMLHyperlinkElementHrefChange,
{
{ .type = CSS::InvalidationSet::Property::Type::PseudoClass, .value = CSS::PseudoClass::AnyLink },
{ .type = CSS::InvalidationSet::Property::Type::PseudoClass, .value = CSS::PseudoClass::Link },
{ .type = CSS::InvalidationSet::Property::Type::PseudoClass, .value = CSS::PseudoClass::LocalLink },
},
{});
}
};

View file

@ -39,7 +39,14 @@ void SVGAElement::attribute_changed(FlyString const& name, Optional<String> cons
Base::attribute_changed(name, old_value, value, namespace_);
if (name == SVG::AttributeNames::href) {
invalidate_style(DOM::StyleInvalidationReason::HTMLHyperlinkElementHrefChange);
invalidate_style(
DOM::StyleInvalidationReason::HTMLHyperlinkElementHrefChange,
{
{ .type = CSS::InvalidationSet::Property::Type::PseudoClass, .value = CSS::PseudoClass::AnyLink },
{ .type = CSS::InvalidationSet::Property::Type::PseudoClass, .value = CSS::PseudoClass::Link },
{ .type = CSS::InvalidationSet::Property::Type::PseudoClass, .value = CSS::PseudoClass::LocalLink },
},
{});
}
if (name == HTML::AttributeNames::rel) {
if (m_rel_list)