1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-05-21 16:05:07 +00:00

LibWeb: Make :host() take a <compound-selector>

This matches the spec:
https://drafts.csswg.org/css-scoping-1/#selectordef-host
This commit is contained in:
Sam Atkins 2023-08-12 13:47:45 +01:00 committed by Andreas Kling
parent b314a115ca
commit b684bab5f1
4 changed files with 23 additions and 1 deletions

View file

@ -71,6 +71,7 @@ struct PseudoClassMetadata {
None, None,
ANPlusB, ANPlusB,
ANPlusBOf, ANPlusBOf,
CompoundSelector,
ForgivingSelectorList, ForgivingSelectorList,
LanguageRanges, LanguageRanges,
SelectorList, SelectorList,
@ -164,6 +165,8 @@ PseudoClassMetadata pseudo_class_metadata(PseudoClass pseudo_class)
parameter_type = "ANPlusB"_string; parameter_type = "ANPlusB"_string;
} else if (argument_string == "<an+b-of>"sv) { } else if (argument_string == "<an+b-of>"sv) {
parameter_type = "ANPlusBOf"_string; parameter_type = "ANPlusBOf"_string;
} else if (argument_string == "<compound-selector>"sv) {
parameter_type = "CompoundSelector"_string;
} else if (argument_string == "<forgiving-selector-list>"sv) { } else if (argument_string == "<forgiving-selector-list>"sv) {
parameter_type = "ForgivingSelectorList"_string; parameter_type = "ForgivingSelectorList"_string;
} else if (argument_string == "<language-ranges>"sv) { } else if (argument_string == "<language-ranges>"sv) {

View file

@ -633,6 +633,24 @@ Parser::ParseErrorOr<Selector::SimpleSelector> Parser::parse_pseudo_simple_selec
return parse_nth_child_selector(pseudo_class, pseudo_function.values(), false); return parse_nth_child_selector(pseudo_class, pseudo_function.values(), false);
case PseudoClassMetadata::ParameterType::ANPlusBOf: case PseudoClassMetadata::ParameterType::ANPlusBOf:
return parse_nth_child_selector(pseudo_class, pseudo_function.values(), true); 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: { case PseudoClassMetadata::ParameterType::ForgivingSelectorList: {
auto function_token_stream = TokenStream(pseudo_function.values()); auto function_token_stream = TokenStream(pseudo_function.values());
// NOTE: Because it's forgiving, even complete garbage will parse OK as an empty selector-list. // NOTE: Because it's forgiving, even complete garbage will parse OK as an empty selector-list.

View file

@ -36,7 +36,7 @@
"argument": "" "argument": ""
}, },
"host": { "host": {
"argument": "<selector-list>?" "argument": "<compound-selector>?"
}, },
"hover": { "hover": {
"argument": "" "argument": ""

View file

@ -496,6 +496,7 @@ void dump_selector(StringBuilder& builder, CSS::Selector const& selector)
builder.append(")"sv); builder.append(")"sv);
break; break;
} }
case CSS::PseudoClassMetadata::ParameterType::CompoundSelector:
case CSS::PseudoClassMetadata::ParameterType::ForgivingSelectorList: case CSS::PseudoClassMetadata::ParameterType::ForgivingSelectorList:
case CSS::PseudoClassMetadata::ParameterType::SelectorList: { case CSS::PseudoClassMetadata::ParameterType::SelectorList: {
builder.append("(["sv); builder.append("(["sv);