From b9b2fd62b5308b1d006cadd8f3b2d5fcf9e1f1f5 Mon Sep 17 00:00:00 2001 From: Sam Atkins Date: Fri, 9 Aug 2024 11:38:00 +0100 Subject: [PATCH] LibWeb/CSS: Parse builtin values using TokenStream --- .../Libraries/LibWeb/CSS/Parser/Parser.cpp | 27 +++++++++++++------ Userland/Libraries/LibWeb/CSS/Parser/Parser.h | 2 +- 2 files changed, 20 insertions(+), 9 deletions(-) diff --git a/Userland/Libraries/LibWeb/CSS/Parser/Parser.cpp b/Userland/Libraries/LibWeb/CSS/Parser/Parser.cpp index 66d36d08b70..527383a2060 100644 --- a/Userland/Libraries/LibWeb/CSS/Parser/Parser.cpp +++ b/Userland/Libraries/LibWeb/CSS/Parser/Parser.cpp @@ -1538,18 +1538,28 @@ Optional Parser::convert_to_style_property(Declaration const& dec return StyleProperty { declaration.importance(), property_id.value(), value.release_value(), {} }; } -RefPtr Parser::parse_builtin_value(ComponentValue const& component_value) +RefPtr Parser::parse_builtin_value(TokenStream& tokens) { + auto transaction = tokens.begin_transaction(); + auto& component_value = tokens.next_token(); if (component_value.is(Token::Type::Ident)) { auto ident = component_value.token().ident(); - if (ident.equals_ignoring_ascii_case("inherit"sv)) + if (ident.equals_ignoring_ascii_case("inherit"sv)) { + transaction.commit(); return InheritStyleValue::the(); - if (ident.equals_ignoring_ascii_case("initial"sv)) + } + if (ident.equals_ignoring_ascii_case("initial"sv)) { + transaction.commit(); return InitialStyleValue::the(); - if (ident.equals_ignoring_ascii_case("unset"sv)) + } + if (ident.equals_ignoring_ascii_case("unset"sv)) { + transaction.commit(); return UnsetStyleValue::the(); - if (ident.equals_ignoring_ascii_case("revert"sv)) + } + if (ident.equals_ignoring_ascii_case("revert"sv)) { + transaction.commit(); return RevertStyleValue::the(); + } // FIXME: Implement `revert-layer` from CSS-CASCADE-5. } @@ -4997,7 +5007,7 @@ RefPtr Parser::parse_font_family_value(TokenStream& // If this is a valid identifier, it's NOT a custom-ident and can't be part of a larger name. // CSS-wide keywords are not allowed - if (auto builtin = parse_builtin_value(peek)) + if (auto builtin = parse_builtin_value(tokens)) return nullptr; auto maybe_ident = value_id_from_string(peek.token().ident()); @@ -6901,13 +6911,14 @@ Parser::ParseErrorOr> Parser::parse_css_value(Property if (component_values.is_empty()) return ParseError::SyntaxError; + auto tokens = TokenStream { component_values }; + if (component_values.size() == 1) { - if (auto parsed_value = parse_builtin_value(component_values.first())) + if (auto parsed_value = parse_builtin_value(tokens)) return parsed_value.release_nonnull(); } // Special-case property handling - auto tokens = TokenStream { component_values }; switch (property_id) { case PropertyID::AspectRatio: if (auto parsed_value = parse_aspect_ratio_value(tokens); parsed_value && !tokens.has_next_token()) diff --git a/Userland/Libraries/LibWeb/CSS/Parser/Parser.h b/Userland/Libraries/LibWeb/CSS/Parser/Parser.h index 11207d11ab6..cc4963d48ea 100644 --- a/Userland/Libraries/LibWeb/CSS/Parser/Parser.h +++ b/Userland/Libraries/LibWeb/CSS/Parser/Parser.h @@ -278,7 +278,7 @@ private: RefPtr style_value; }; Optional parse_css_value_for_properties(ReadonlySpan, TokenStream&); - RefPtr parse_builtin_value(ComponentValue const&); + RefPtr parse_builtin_value(TokenStream&); RefPtr parse_calculated_value(ComponentValue const&); RefPtr parse_custom_ident_value(TokenStream&, std::initializer_list blacklist); // NOTE: Implemented in generated code. (GenerateCSSMathFunctions.cpp)