diff --git a/Meta/Lagom/Tools/CodeGenerators/LibWeb/GenerateCSSPseudoClass.cpp b/Meta/Lagom/Tools/CodeGenerators/LibWeb/GenerateCSSPseudoClass.cpp index 88808dfac3..06e06ab38d 100644 --- a/Meta/Lagom/Tools/CodeGenerators/LibWeb/GenerateCSSPseudoClass.cpp +++ b/Meta/Lagom/Tools/CodeGenerators/LibWeb/GenerateCSSPseudoClass.cpp @@ -71,6 +71,7 @@ struct PseudoClassMetadata { None, ANPlusB, ANPlusBOf, + CompoundSelector, ForgivingSelectorList, LanguageRanges, SelectorList, @@ -164,6 +165,8 @@ PseudoClassMetadata pseudo_class_metadata(PseudoClass pseudo_class) parameter_type = "ANPlusB"_string; } else if (argument_string == ""sv) { parameter_type = "ANPlusBOf"_string; + } else if (argument_string == ""sv) { + parameter_type = "CompoundSelector"_string; } else if (argument_string == ""sv) { parameter_type = "ForgivingSelectorList"_string; } else if (argument_string == ""sv) { diff --git a/Userland/Libraries/LibWeb/CSS/Parser/Parser.cpp b/Userland/Libraries/LibWeb/CSS/Parser/Parser.cpp index 9d8d53ec48..101eb27d5f 100644 --- a/Userland/Libraries/LibWeb/CSS/Parser/Parser.cpp +++ b/Userland/Libraries/LibWeb/CSS/Parser/Parser.cpp @@ -633,6 +633,24 @@ Parser::ParseErrorOr Parser::parse_pseudo_simple_selec return parse_nth_child_selector(pseudo_class, pseudo_function.values(), false); case PseudoClassMetadata::ParameterType::ANPlusBOf: return parse_nth_child_selector(pseudo_class, pseudo_function.values(), true); + case PseudoClassMetadata::ParameterType::CompoundSelector: { + auto function_token_stream = TokenStream(pseudo_function.values()); + auto compound_selector = MUST(parse_compound_selector(function_token_stream)); + if (!compound_selector.has_value()) { + dbgln_if(CSS_PARSER_DEBUG, "Failed to parse :{}() parameter as a compound selector", pseudo_function.name()); + return ParseError::SyntaxError; + } + + Vector compound_selectors { compound_selector.release_value() }; + auto selector = Selector::create(move(compound_selectors)); + + return Selector::SimpleSelector { + .type = Selector::SimpleSelector::Type::PseudoClass, + .value = Selector::SimpleSelector::PseudoClassSelector { + .type = pseudo_class, + .argument_selector_list = { move(selector) } } + }; + } case PseudoClassMetadata::ParameterType::ForgivingSelectorList: { auto function_token_stream = TokenStream(pseudo_function.values()); // NOTE: Because it's forgiving, even complete garbage will parse OK as an empty selector-list. diff --git a/Userland/Libraries/LibWeb/CSS/PseudoClasses.json b/Userland/Libraries/LibWeb/CSS/PseudoClasses.json index 942fcd5746..41eb2b7a5b 100644 --- a/Userland/Libraries/LibWeb/CSS/PseudoClasses.json +++ b/Userland/Libraries/LibWeb/CSS/PseudoClasses.json @@ -36,7 +36,7 @@ "argument": "" }, "host": { - "argument": "?" + "argument": "?" }, "hover": { "argument": "" diff --git a/Userland/Libraries/LibWeb/Dump.cpp b/Userland/Libraries/LibWeb/Dump.cpp index 4997ae1be2..af6e9bef35 100644 --- a/Userland/Libraries/LibWeb/Dump.cpp +++ b/Userland/Libraries/LibWeb/Dump.cpp @@ -496,6 +496,7 @@ void dump_selector(StringBuilder& builder, CSS::Selector const& selector) builder.append(")"sv); break; } + case CSS::PseudoClassMetadata::ParameterType::CompoundSelector: case CSS::PseudoClassMetadata::ParameterType::ForgivingSelectorList: case CSS::PseudoClassMetadata::ParameterType::SelectorList: { builder.append("(["sv);