mirror of
https://github.com/RGBCube/serenity
synced 2025-05-31 10:18:11 +00:00
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.
This commit is contained in:
parent
f25203f245
commit
4b9c5635b3
3 changed files with 12 additions and 8 deletions
|
@ -11,6 +11,8 @@
|
|||
#include <LibWeb/DOM/Element.h>
|
||||
#include <LibWeb/DOM/Text.h>
|
||||
#include <LibWeb/HTML/AttributeNames.h>
|
||||
#include <LibWeb/HTML/HTMLAnchorElement.h>
|
||||
#include <LibWeb/HTML/HTMLAreaElement.h>
|
||||
#include <LibWeb/HTML/HTMLHtmlElement.h>
|
||||
#include <LibWeb/HTML/HTMLInputElement.h>
|
||||
|
||||
|
@ -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<HTML::HTMLAnchorElement>(element) && !is<HTML::HTMLAreaElement>(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;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue