From 39abd75d592ed06b277e91e192555b270865d9d9 Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Sat, 8 Feb 2025 14:23:17 +0100 Subject: [PATCH] LibWeb: Use invalidation sets for link-related pseudo classes - :any-link - :link - :local-link --- Libraries/LibWeb/CSS/StyleInvalidationData.cpp | 6 ++++++ Libraries/LibWeb/HTML/HTMLHyperlinkElementUtils.cpp | 9 ++++++++- Libraries/LibWeb/SVG/SVGAElement.cpp | 9 ++++++++- 3 files changed, 22 insertions(+), 2 deletions(-) diff --git a/Libraries/LibWeb/CSS/StyleInvalidationData.cpp b/Libraries/LibWeb/CSS/StyleInvalidationData.cpp index af281ffb15c2..2991789af2c0 100644 --- a/Libraries/LibWeb/CSS/StyleInvalidationData.cpp +++ b/Libraries/LibWeb/CSS/StyleInvalidationData.cpp @@ -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: diff --git a/Libraries/LibWeb/HTML/HTMLHyperlinkElementUtils.cpp b/Libraries/LibWeb/HTML/HTMLHyperlinkElementUtils.cpp index cd11f795b00d..edf6058c988d 100644 --- a/Libraries/LibWeb/HTML/HTMLHyperlinkElementUtils.cpp +++ b/Libraries/LibWeb/HTML/HTMLHyperlinkElementUtils.cpp @@ -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 }, + }, + {}); } }; diff --git a/Libraries/LibWeb/SVG/SVGAElement.cpp b/Libraries/LibWeb/SVG/SVGAElement.cpp index a2eaff813323..d69fa0cc1ee7 100644 --- a/Libraries/LibWeb/SVG/SVGAElement.cpp +++ b/Libraries/LibWeb/SVG/SVGAElement.cpp @@ -39,7 +39,14 @@ void SVGAElement::attribute_changed(FlyString const& name, Optional 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)