diff --git a/Userland/Libraries/LibWeb/CSS/Parser/Parser.cpp b/Userland/Libraries/LibWeb/CSS/Parser/Parser.cpp index 2a4d65dea7..637ae34b2c 100644 --- a/Userland/Libraries/LibWeb/CSS/Parser/Parser.cpp +++ b/Userland/Libraries/LibWeb/CSS/Parser/Parser.cpp @@ -318,20 +318,30 @@ Vector Parser::parse_selectors(Vector Optional { auto relation = CSS::Selector::ComplexSelector::Relation::Descendant; + if (index >= parts.size()) + return {}; + auto current_value = parts.at(index); if (current_value.is(Token::TokenType::Delim)) { auto delim = current_value.token().delim(); - if (is_combinator(delim)) { - if (delim == ">") { - relation = CSS::Selector::ComplexSelector::Relation::ImmediateChild; - } else if (delim == "+") { - relation = CSS::Selector::ComplexSelector::Relation::AdjacentSibling; - } else if (delim == "~") { - relation = CSS::Selector::ComplexSelector::Relation::GeneralSibling; - } else if (delim == "||") { - relation = CSS::Selector::ComplexSelector::Relation::Column; - } + if (delim == ">") { + relation = CSS::Selector::ComplexSelector::Relation::ImmediateChild; index++; + } else if (delim == "+") { + relation = CSS::Selector::ComplexSelector::Relation::AdjacentSibling; + index++; + } else if (delim == "~") { + relation = CSS::Selector::ComplexSelector::Relation::GeneralSibling; + index++; + } else if (delim == "|") { + if (index + 1 >= parts.size()) + return {}; + + auto next = parts.at(index + 1); + if (next.is(Token::TokenType::Delim) && next.token().delim() == "|") { + relation = CSS::Selector::ComplexSelector::Relation::Column; + index += 2; + } } } @@ -386,11 +396,6 @@ void Parser::reconsume_current_input_token() --m_iterator_offset; } -bool Parser::is_combinator(String input) -{ - return input == ">" || input == "+" || input == "~" || input == "||"; -} - NonnullRefPtrVector Parser::consume_a_list_of_rules(bool top_level) { NonnullRefPtrVector rules; diff --git a/Userland/Libraries/LibWeb/CSS/Parser/Parser.h b/Userland/Libraries/LibWeb/CSS/Parser/Parser.h index 6686f22c0f..db5b997b48 100644 --- a/Userland/Libraries/LibWeb/CSS/Parser/Parser.h +++ b/Userland/Libraries/LibWeb/CSS/Parser/Parser.h @@ -69,7 +69,6 @@ private: Token peek_token(); Token current_token(); void reconsume_current_input_token(); - bool is_combinator(String); NonnullRefPtrVector consume_a_list_of_rules(bool top_level); NonnullRefPtr consume_an_at_rule();