Browse Source

LibWeb: Parse transform property using TokenStream

While I'm at it, use the helper for "none", and remove the unnecessary
whitespace skipping.
Sam Atkins 1 year ago
parent
commit
dd5adb28fd

+ 9 - 15
Userland/Libraries/LibWeb/CSS/Parser/Parser.cpp

@@ -4814,25 +4814,18 @@ RefPtr<StyleValue> Parser::parse_easing_value(TokenStream<ComponentValue>& token
     return EasingStyleValue::create(function, move(values));
     return EasingStyleValue::create(function, move(values));
 }
 }
 
 
-RefPtr<StyleValue> Parser::parse_transform_value(Vector<ComponentValue> const& component_values)
+RefPtr<StyleValue> Parser::parse_transform_value(TokenStream<ComponentValue>& tokens)
 {
 {
+    if (contains_single_none_ident(tokens)) {
+        tokens.next_token(); // none
+        return IdentifierStyleValue::create(ValueID::None);
+    }
+
     StyleValueVector transformations;
     StyleValueVector transformations;
-    auto tokens = TokenStream { component_values };
-    tokens.skip_whitespace();
+    auto transaction = tokens.begin_transaction();
 
 
     while (tokens.has_next_token()) {
     while (tokens.has_next_token()) {
-        tokens.skip_whitespace();
         auto const& part = tokens.next_token();
         auto const& part = tokens.next_token();
-
-        if (part.is_ident("none"sv)) {
-            if (!transformations.is_empty())
-                return nullptr;
-            tokens.skip_whitespace();
-            if (tokens.has_next_token())
-                return nullptr;
-            return IdentifierStyleValue::create(ValueID::None);
-        }
-
         if (!part.is_function())
         if (!part.is_function())
             return nullptr;
             return nullptr;
         auto maybe_function = transform_function_from_string(part.function().name());
         auto maybe_function = transform_function_from_string(part.function().name());
@@ -4936,6 +4929,7 @@ RefPtr<StyleValue> Parser::parse_transform_value(Vector<ComponentValue> const& c
 
 
         transformations.append(TransformationStyleValue::create(function, move(values)));
         transformations.append(TransformationStyleValue::create(function, move(values)));
     }
     }
+    transaction.commit();
     return StyleValueList::create(move(transformations), StyleValueList::Separator::Space);
     return StyleValueList::create(move(transformations), StyleValueList::Separator::Space);
 }
 }
 
 
@@ -5944,7 +5938,7 @@ Parser::ParseErrorOr<NonnullRefPtr<StyleValue>> Parser::parse_css_value(Property
             return parsed_value.release_nonnull();
             return parsed_value.release_nonnull();
         return ParseError::SyntaxError;
         return ParseError::SyntaxError;
     case PropertyID::Transform:
     case PropertyID::Transform:
-        if (auto parsed_value = parse_transform_value(component_values))
+        if (auto parsed_value = parse_transform_value(tokens); parsed_value && !tokens.has_next_token())
             return parsed_value.release_nonnull();
             return parsed_value.release_nonnull();
         return ParseError::SyntaxError;
         return ParseError::SyntaxError;
     case PropertyID::TransformOrigin:
     case PropertyID::TransformOrigin:

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

@@ -256,7 +256,7 @@ private:
     RefPtr<StyleValue> parse_text_decoration_value(TokenStream<ComponentValue>&);
     RefPtr<StyleValue> parse_text_decoration_value(TokenStream<ComponentValue>&);
     RefPtr<StyleValue> parse_text_decoration_line_value(TokenStream<ComponentValue>&);
     RefPtr<StyleValue> parse_text_decoration_line_value(TokenStream<ComponentValue>&);
     RefPtr<StyleValue> parse_easing_value(TokenStream<ComponentValue>&);
     RefPtr<StyleValue> parse_easing_value(TokenStream<ComponentValue>&);
-    RefPtr<StyleValue> parse_transform_value(Vector<ComponentValue> const&);
+    RefPtr<StyleValue> parse_transform_value(TokenStream<ComponentValue>&);
     RefPtr<StyleValue> parse_transform_origin_value(Vector<ComponentValue> const&);
     RefPtr<StyleValue> parse_transform_origin_value(Vector<ComponentValue> const&);
     RefPtr<StyleValue> parse_grid_track_size_list(Vector<ComponentValue> const&, bool allow_separate_line_name_blocks = false);
     RefPtr<StyleValue> parse_grid_track_size_list(Vector<ComponentValue> const&, bool allow_separate_line_name_blocks = false);
     RefPtr<StyleValue> parse_grid_auto_track_sizes(Vector<ComponentValue> const&);
     RefPtr<StyleValue> parse_grid_auto_track_sizes(Vector<ComponentValue> const&);