LibWeb: Don't allow trailing commas in selector lists

comma-separated list != #-multiplier
This commit is contained in:
Gingeh 2024-11-22 19:48:50 +11:00 committed by Andreas Kling
parent 8965698ce7
commit bb5678a175
Notes: github-actions[bot] 2024-11-23 08:51:44 +00:00
8 changed files with 3515 additions and 6 deletions

View file

@ -86,10 +86,9 @@ static NonnullRefPtr<Selector> create_invalid_selector(Selector::Combinator comb
template<typename T>
Parser::ParseErrorOr<SelectorList> Parser::parse_a_selector_list(TokenStream<T>& tokens, SelectorType mode, SelectorParsingMode parsing_mode)
{
auto comma_separated_lists = parse_a_comma_separated_list_of_component_values(tokens);
SelectorList selectors;
for (auto& selector_parts : comma_separated_lists) {
for (;;) {
auto selector_parts = consume_a_list_of_component_values(tokens, Token::Type::Comma);
auto stream = TokenStream(selector_parts);
auto selector = parse_complex_selector(stream, mode);
if (selector.is_error()) {
@ -97,11 +96,17 @@ Parser::ParseErrorOr<SelectorList> Parser::parse_a_selector_list(TokenStream<T>&
// Keep the invalid selector around for serialization and nesting
auto combinator = mode == SelectorType::Standalone ? Selector::Combinator::None : Selector::Combinator::Descendant;
selectors.append(create_invalid_selector(combinator, move(selector_parts)));
continue;
} else {
return selector.error();
}
return selector.error();
} else {
selectors.append(selector.release_value());
}
selectors.append(selector.release_value());
if (tokens.is_empty())
break;
tokens.discard_a_token();
}
if (selectors.is_empty() && parsing_mode != SelectorParsingMode::Forgiving)