summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Userland/Libraries/LibWeb/CSS/Parser/Parser.cpp33
-rw-r--r--Userland/Libraries/LibWeb/CSS/Parser/Parser.h1
2 files changed, 19 insertions, 15 deletions
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<CSS::Selector::ComplexSelector> Parser::parse_selectors(Vector<StyleCompo
auto parse_complex_selector = [&]() -> Optional<CSS::Selector::ComplexSelector> {
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 == "||") {
+ 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;
}
- index++;
}
}
@@ -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<QualifiedStyleRule> Parser::consume_a_list_of_rules(bool top_level)
{
NonnullRefPtrVector<QualifiedStyleRule> 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<QualifiedStyleRule> consume_a_list_of_rules(bool top_level);
NonnullRefPtr<AtStyleRule> consume_an_at_rule();