LibWeb: Implement the :target selector pseudo-class

We don't yet set the Document's target element in most cases, so this
does not function very well. But that will improve once we *do* set it,
which involves a more complete Navigables implementation.
This commit is contained in:
Sam Atkins 2023-08-11 20:07:00 +01:00 committed by Andreas Kling
parent 8bd3b74e3a
commit a9620d8784
Notes: sideshowbarker 2024-07-17 07:25:39 +09:00
5 changed files with 11 additions and 0 deletions

View file

@ -587,6 +587,8 @@ Parser::ParseErrorOr<Selector::SimpleSelector> Parser::parse_pseudo_simple_selec
return make_pseudo_class_selector(Selector::SimpleSelector::PseudoClass::Type::Seeking); return make_pseudo_class_selector(Selector::SimpleSelector::PseudoClass::Type::Seeking);
if (pseudo_name.equals_ignoring_ascii_case("stalled"sv)) if (pseudo_name.equals_ignoring_ascii_case("stalled"sv))
return make_pseudo_class_selector(Selector::SimpleSelector::PseudoClass::Type::Stalled); return make_pseudo_class_selector(Selector::SimpleSelector::PseudoClass::Type::Stalled);
if (pseudo_name.equals_ignoring_ascii_case("target"sv))
return make_pseudo_class_selector(Selector::SimpleSelector::PseudoClass::Type::Target);
if (pseudo_name.equals_ignoring_ascii_case("host"sv)) if (pseudo_name.equals_ignoring_ascii_case("host"sv))
return make_pseudo_class_selector(Selector::SimpleSelector::PseudoClass::Type::Host); return make_pseudo_class_selector(Selector::SimpleSelector::PseudoClass::Type::Host);
if (pseudo_name.equals_ignoring_ascii_case("visited"sv)) if (pseudo_name.equals_ignoring_ascii_case("visited"sv))

View file

@ -258,6 +258,7 @@ ErrorOr<String> Selector::SimpleSelector::serialize() const
case Selector::SimpleSelector::PseudoClass::Type::VolumeLocked: case Selector::SimpleSelector::PseudoClass::Type::VolumeLocked:
case Selector::SimpleSelector::PseudoClass::Type::Buffering: case Selector::SimpleSelector::PseudoClass::Type::Buffering:
case Selector::SimpleSelector::PseudoClass::Type::Stalled: case Selector::SimpleSelector::PseudoClass::Type::Stalled:
case Selector::SimpleSelector::PseudoClass::Type::Target:
// If the pseudo-class does not accept arguments append ":" (U+003A), followed by the name of the pseudo-class, to s. // If the pseudo-class does not accept arguments append ":" (U+003A), followed by the name of the pseudo-class, to s.
TRY(s.try_append(':')); TRY(s.try_append(':'));
TRY(s.try_append(pseudo_class_name(pseudo_class.type))); TRY(s.try_append(pseudo_class_name(pseudo_class.type)));

View file

@ -123,6 +123,7 @@ public:
VolumeLocked, VolumeLocked,
Buffering, Buffering,
Stalled, Stalled,
Target,
}; };
Type type; Type type;
@ -344,6 +345,8 @@ constexpr StringView pseudo_class_name(Selector::SimpleSelector::PseudoClass::Ty
return "buffering"sv; return "buffering"sv;
case Selector::SimpleSelector::PseudoClass::Type::Stalled: case Selector::SimpleSelector::PseudoClass::Type::Stalled:
return "stalled"sv; return "stalled"sv;
case Selector::SimpleSelector::PseudoClass::Type::Target:
return "target"sv;
} }
VERIFY_NOT_REACHED(); VERIFY_NOT_REACHED();
} }

View file

@ -425,6 +425,8 @@ static inline bool matches_pseudo_class(CSS::Selector::SimpleSelector::PseudoCla
auto const& media_element = static_cast<HTML::HTMLMediaElement const&>(element); auto const& media_element = static_cast<HTML::HTMLMediaElement const&>(element);
return media_element.stalled(); return media_element.stalled();
} }
case CSS::Selector::SimpleSelector::PseudoClass::Type::Target:
return element.is_target();
} }
return false; return false;

View file

@ -590,6 +590,9 @@ void dump_selector(StringBuilder& builder, CSS::Selector const& selector)
case CSS::Selector::SimpleSelector::PseudoClass::Type::Stalled: case CSS::Selector::SimpleSelector::PseudoClass::Type::Stalled:
pseudo_class_description = "Stalled"; pseudo_class_description = "Stalled";
break; break;
case CSS::Selector::SimpleSelector::PseudoClass::Type::Target:
pseudo_class_description = "Target";
break;
} }
builder.appendff(" pseudo_class={}", pseudo_class_description); builder.appendff(" pseudo_class={}", pseudo_class_description);