1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-25 15:07:45 +00:00

LibWeb: Implement the :where() selector

This is identical to :is() except for specificity, so we can use the
same code paths. :^)
This commit is contained in:
Sam Atkins 2022-03-17 16:13:13 +00:00 committed by Andreas Kling
parent 47eb4b2db7
commit 993653317c
5 changed files with 22 additions and 8 deletions

View file

@ -584,13 +584,17 @@ Result<Selector::SimpleSelector, Parser::ParsingResult> Parser::parse_simple_sel
};
auto& pseudo_function = pseudo_class_token.function();
if (pseudo_function.name().equals_ignoring_case("is"sv)) {
simple_selector.pseudo_class.type = Selector::SimpleSelector::PseudoClass::Type::Is;
if (pseudo_function.name().equals_ignoring_case("is"sv)
|| pseudo_function.name().equals_ignoring_case("where"sv)) {
simple_selector.pseudo_class.type = pseudo_function.name().equals_ignoring_case("is"sv)
? Selector::SimpleSelector::PseudoClass::Type::Is
: Selector::SimpleSelector::PseudoClass::Type::Where;
auto function_token_stream = TokenStream(pseudo_function.values());
auto is_selector = parse_a_selector_list(function_token_stream, SelectorParsingMode::Forgiving);
auto argument_selector_list = parse_a_selector_list(function_token_stream, SelectorParsingMode::Forgiving);
// NOTE: Because it's forgiving, even complete garbage will parse OK as an empty selector-list.
VERIFY(!is_selector.is_error());
simple_selector.pseudo_class.argument_selector_list = is_selector.release_value();
VERIFY(!argument_selector_list.is_error());
simple_selector.pseudo_class.argument_selector_list = argument_selector_list.release_value();
} else if (pseudo_function.name().equals_ignoring_case("not"sv)) {
simple_selector.pseudo_class.type = Selector::SimpleSelector::PseudoClass::Type::Not;
auto function_token_stream = TokenStream(pseudo_function.values());