Procházet zdrojové kódy

LibWeb: Bring CSS::Parser::parse_as_comma_separated_list...() to spec

Previous implementation was returning everything in a single Vector,
when what we really want is a Vector of Vectors, one for each comma-
separated part of the list.
Sam Atkins před 4 roky
rodič
revize
390cc30a97

+ 21 - 6
Userland/Libraries/LibWeb/CSS/Parser/Parser.cpp

@@ -833,20 +833,35 @@ Vector<StyleComponentValueRule> Parser::parse_as_list_of_component_values()
     return rules;
 }
 
-Vector<StyleComponentValueRule> Parser::parse_as_list_of_comma_separated_component_values()
+Vector<Vector<StyleComponentValueRule>> Parser::parse_as_comma_separated_list_of_component_values()
 {
-    Vector<StyleComponentValueRule> rules;
+    Vector<Vector<StyleComponentValueRule>> lists;
+    lists.append({});
 
     for (;;) {
-        rules.append(consume_a_component_value());
+        auto next = next_token();
 
-        if (peek_token().is_comma())
+        if (next.is_comma()) {
+            lists.append({});
             continue;
-        if (peek_token().is_eof())
+        } else if (next.is_eof()) {
             break;
+        }
+
+        reconsume_current_input_token();
+        auto component_value = consume_a_component_value();
+        lists.last().append(component_value);
     }
 
-    return rules;
+    for (auto& list : lists) {
+        if (!list.is_empty() && list.first().is(Token::TokenType::Whitespace))
+            list.take_first();
+
+        if (!list.is_empty() && list.last().is(Token::TokenType::Whitespace))
+            list.take_last();
+    }
+
+    return lists;
 }
 
 RefPtr<CSSRule> Parser::convert_rule(NonnullRefPtr<QualifiedStyleRule>)

+ 1 - 1
Userland/Libraries/LibWeb/CSS/Parser/Parser.h

@@ -46,7 +46,7 @@ public:
     // For the contents of presentational attributes, which parse text into a single declaration’s value, or for parsing a stand-alone selector [SELECT] or list of Media Queries [MEDIAQ], as in Selectors API or the media HTML attribute.
     Vector<StyleComponentValueRule> parse_as_list_of_component_values();
 
-    Vector<StyleComponentValueRule> parse_as_list_of_comma_separated_component_values();
+    Vector<Vector<StyleComponentValueRule>> parse_as_comma_separated_list_of_component_values();
 
     Vector<CSS::Selector::ComplexSelector> parse_selectors(Vector<StyleComponentValueRule> parts);