From 4b9c5635b36df645c83e9e2f1da269794717cbb1 Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Wed, 14 Sep 2022 13:29:07 +0200 Subject: [PATCH] LibWeb: Make :link selector behave according to spec It should match any `a` or `area` element that has an `href` attribute, not any element *inside* an enclosing linked element. --- Userland/Libraries/LibWeb/CSS/SelectorEngine.cpp | 13 ++++++++++++- Userland/Libraries/LibWeb/DOM/Node.cpp | 5 ----- Userland/Libraries/LibWeb/DOM/Node.h | 2 -- 3 files changed, 12 insertions(+), 8 deletions(-) diff --git a/Userland/Libraries/LibWeb/CSS/SelectorEngine.cpp b/Userland/Libraries/LibWeb/CSS/SelectorEngine.cpp index f2d0586af7..dfdf426bf8 100644 --- a/Userland/Libraries/LibWeb/CSS/SelectorEngine.cpp +++ b/Userland/Libraries/LibWeb/CSS/SelectorEngine.cpp @@ -11,6 +11,8 @@ #include #include #include +#include +#include #include #include @@ -44,6 +46,15 @@ static inline bool matches_lang_pseudo_class(DOM::Element const& element, Vector return false; } +// https://html.spec.whatwg.org/multipage/semantics-other.html#selector-link +static inline bool matches_link_pseudo_class(DOM::Element const& element) +{ + // All a elements that have an href attribute, and all area elements that have an href attribute, must match one of :link and :visited. + if (!is(element) && !is(element)) + return false; + return element.has_attribute(HTML::AttributeNames::href); +} + static inline bool matches_hover_pseudo_class(DOM::Element const& element) { auto* hovered_node = element.document().hovered_node(); @@ -163,7 +174,7 @@ static inline bool matches_pseudo_class(CSS::Selector::SimpleSelector::PseudoCla { switch (pseudo_class.type) { case CSS::Selector::SimpleSelector::PseudoClass::Type::Link: - return element.is_link(); + return matches_link_pseudo_class(element); case CSS::Selector::SimpleSelector::PseudoClass::Type::Visited: // FIXME: Maybe match this selector sometimes? return false; diff --git a/Userland/Libraries/LibWeb/DOM/Node.cpp b/Userland/Libraries/LibWeb/DOM/Node.cpp index c68efd6e21..66fe1a0f6f 100644 --- a/Userland/Libraries/LibWeb/DOM/Node.cpp +++ b/Userland/Libraries/LibWeb/DOM/Node.cpp @@ -244,11 +244,6 @@ void Node::invalidate_style() document().schedule_style_update(); } -bool Node::is_link() const -{ - return enclosing_link_element(); -} - String Node::child_text_content() const { if (!is(*this)) diff --git a/Userland/Libraries/LibWeb/DOM/Node.h b/Userland/Libraries/LibWeb/DOM/Node.h index 9f4383afb3..dcc1088192 100644 --- a/Userland/Libraries/LibWeb/DOM/Node.h +++ b/Userland/Libraries/LibWeb/DOM/Node.h @@ -170,8 +170,6 @@ public: void invalidate_style(); - bool is_link() const; - void set_document(Badge, Document&); virtual EventTarget* get_parent(Event const&) override;