From 5cf04a33ad956bff319fe89374b1ebc68ea759f6 Mon Sep 17 00:00:00 2001 From: Sam Atkins Date: Mon, 24 Mar 2025 13:44:05 +0000 Subject: [PATCH] LibWeb/CSS: Add method for parsing `` directly We specifically want to parse one inside a selector, where we only care about the string itself and don't want a whole style value. --- Libraries/LibWeb/CSS/Parser/Parser.h | 1 + Libraries/LibWeb/CSS/Parser/ValueParsing.cpp | 19 +++++++++++++------ 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/Libraries/LibWeb/CSS/Parser/Parser.h b/Libraries/LibWeb/CSS/Parser/Parser.h index 3e3e5289205..468f2ca0ad8 100644 --- a/Libraries/LibWeb/CSS/Parser/Parser.h +++ b/Libraries/LibWeb/CSS/Parser/Parser.h @@ -301,6 +301,7 @@ private: Optional parse_css_value_for_properties(ReadonlySpan, TokenStream&); RefPtr parse_builtin_value(TokenStream&); RefPtr parse_calculated_value(ComponentValue const&); + Optional parse_custom_ident(TokenStream&, ReadonlySpan blacklist); RefPtr parse_custom_ident_value(TokenStream&, ReadonlySpan blacklist); // NOTE: Implemented in generated code. (GenerateCSSMathFunctions.cpp) RefPtr parse_math_function(Function const&, CalculationContext const&); diff --git a/Libraries/LibWeb/CSS/Parser/ValueParsing.cpp b/Libraries/LibWeb/CSS/Parser/ValueParsing.cpp index f510b2d3371..0e01a83978e 100644 --- a/Libraries/LibWeb/CSS/Parser/ValueParsing.cpp +++ b/Libraries/LibWeb/CSS/Parser/ValueParsing.cpp @@ -2907,34 +2907,41 @@ RefPtr Parser::parse_builtin_value(TokenStream& t } // https://www.w3.org/TR/css-values-4/#custom-idents -RefPtr Parser::parse_custom_ident_value(TokenStream& tokens, ReadonlySpan blacklist) +Optional Parser::parse_custom_ident(TokenStream& tokens, ReadonlySpan blacklist) { auto transaction = tokens.begin_transaction(); tokens.discard_whitespace(); auto const& token = tokens.consume_a_token(); if (!token.is(Token::Type::Ident)) - return nullptr; + return {}; auto custom_ident = token.token().ident(); // The CSS-wide keywords are not valid s. if (is_css_wide_keyword(custom_ident)) - return nullptr; + return {}; // The default keyword is reserved and is also not a valid . if (custom_ident.equals_ignoring_ascii_case("default"sv)) - return nullptr; + return {}; // Specifications using must specify clearly what other keywords are excluded from , // if any—for example by saying that any pre-defined keywords in that property’s value definition are excluded. // Excluded keywords are excluded in all ASCII case permutations. for (auto& value : blacklist) { if (custom_ident.equals_ignoring_ascii_case(value)) - return nullptr; + return {}; } transaction.commit(); - return CustomIdentStyleValue::create(custom_ident); + return custom_ident; +} + +RefPtr Parser::parse_custom_ident_value(TokenStream& tokens, ReadonlySpan blacklist) +{ + if (auto custom_ident = parse_custom_ident(tokens, blacklist); custom_ident.has_value()) + return CustomIdentStyleValue::create(custom_ident.release_value()); + return nullptr; } Optional Parser::parse_grid_size(ComponentValue const& component_value)