From dd5adb28fd0a2d771ad02f548aa22fb706202945 Mon Sep 17 00:00:00 2001 From: Sam Atkins Date: Fri, 8 Dec 2023 17:44:57 +0000 Subject: [PATCH] LibWeb: Parse transform property using TokenStream While I'm at it, use the helper for "none", and remove the unnecessary whitespace skipping. --- .../Libraries/LibWeb/CSS/Parser/Parser.cpp | 24 +++++++------------ Userland/Libraries/LibWeb/CSS/Parser/Parser.h | 2 +- 2 files changed, 10 insertions(+), 16 deletions(-) diff --git a/Userland/Libraries/LibWeb/CSS/Parser/Parser.cpp b/Userland/Libraries/LibWeb/CSS/Parser/Parser.cpp index d0c48cc026..0a7490945f 100644 --- a/Userland/Libraries/LibWeb/CSS/Parser/Parser.cpp +++ b/Userland/Libraries/LibWeb/CSS/Parser/Parser.cpp @@ -4814,25 +4814,18 @@ RefPtr Parser::parse_easing_value(TokenStream& token return EasingStyleValue::create(function, move(values)); } -RefPtr Parser::parse_transform_value(Vector const& component_values) +RefPtr Parser::parse_transform_value(TokenStream& tokens) { + if (contains_single_none_ident(tokens)) { + tokens.next_token(); // none + return IdentifierStyleValue::create(ValueID::None); + } + StyleValueVector transformations; - auto tokens = TokenStream { component_values }; - tokens.skip_whitespace(); + auto transaction = tokens.begin_transaction(); while (tokens.has_next_token()) { - tokens.skip_whitespace(); 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()) return nullptr; auto maybe_function = transform_function_from_string(part.function().name()); @@ -4936,6 +4929,7 @@ RefPtr Parser::parse_transform_value(Vector const& c transformations.append(TransformationStyleValue::create(function, move(values))); } + transaction.commit(); return StyleValueList::create(move(transformations), StyleValueList::Separator::Space); } @@ -5944,7 +5938,7 @@ Parser::ParseErrorOr> Parser::parse_css_value(Property return parsed_value.release_nonnull(); return ParseError::SyntaxError; 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 ParseError::SyntaxError; case PropertyID::TransformOrigin: diff --git a/Userland/Libraries/LibWeb/CSS/Parser/Parser.h b/Userland/Libraries/LibWeb/CSS/Parser/Parser.h index 9ddfffacb5..a30b3e0764 100644 --- a/Userland/Libraries/LibWeb/CSS/Parser/Parser.h +++ b/Userland/Libraries/LibWeb/CSS/Parser/Parser.h @@ -256,7 +256,7 @@ private: RefPtr parse_text_decoration_value(TokenStream&); RefPtr parse_text_decoration_line_value(TokenStream&); RefPtr parse_easing_value(TokenStream&); - RefPtr parse_transform_value(Vector const&); + RefPtr parse_transform_value(TokenStream&); RefPtr parse_transform_origin_value(Vector const&); RefPtr parse_grid_track_size_list(Vector const&, bool allow_separate_line_name_blocks = false); RefPtr parse_grid_auto_track_sizes(Vector const&);