From faba11f33c0e0ff93e9838e7005f7d813928dcc3 Mon Sep 17 00:00:00 2001 From: Sam Atkins Date: Mon, 1 Dec 2025 12:54:40 +0000 Subject: [PATCH] LibWeb/CSS: Pull out Supports::Declaration parsing Avoid repeating this in two places. --- Libraries/LibWeb/CSS/Parser/Parser.cpp | 26 +++++++++++++++------ Libraries/LibWeb/CSS/Parser/Parser.h | 1 + Libraries/LibWeb/CSS/Parser/RuleParsing.cpp | 6 ++--- 3 files changed, 22 insertions(+), 11 deletions(-) diff --git a/Libraries/LibWeb/CSS/Parser/Parser.cpp b/Libraries/LibWeb/CSS/Parser/Parser.cpp index d948eae5344..7fea2748ff9 100644 --- a/Libraries/LibWeb/CSS/Parser/Parser.cpp +++ b/Libraries/LibWeb/CSS/Parser/Parser.cpp @@ -335,14 +335,9 @@ OwnPtr Parser::parse_supports_feature(TokenStream = ( )` if (first_token.is_block() && first_token.block().is_paren()) { TokenStream block_tokens { first_token.block().value }; - // FIXME: Parsing and then converting back to a string is weird. - if (auto declaration = consume_a_declaration(block_tokens); declaration.has_value() && !block_tokens.has_next_token()) { + if (auto declaration = parse_supports_declaration(block_tokens)) { transaction.commit(); - auto supports_declaration = Supports::Declaration::create( - declaration->to_string(), - convert_to_style_property(*declaration).has_value()); - - return BooleanExpressionInParens::create(supports_declaration.release_nonnull()); + return BooleanExpressionInParens::create(declaration.release_nonnull()); } } @@ -396,6 +391,23 @@ OwnPtr Parser::parse_supports_feature(TokenStream Parser::parse_supports_declaration(TokenStream& tokens) +{ + // ` = ( )` + // NB: Here, we only care about the part. + auto transaction = tokens.begin_transaction(); + tokens.discard_whitespace(); + if (auto declaration = consume_a_declaration(tokens); declaration.has_value()) { + tokens.discard_whitespace(); + if (!tokens.has_next_token()) { + transaction.commit(); + return Supports::Declaration::create(declaration->to_string(), convert_to_style_property(*declaration).has_value()); + } + } + return {}; +} + // https://www.w3.org/TR/mediaqueries-4/#typedef-general-enclosed OwnPtr Parser::parse_general_enclosed(TokenStream& tokens, MatchResult result) { diff --git a/Libraries/LibWeb/CSS/Parser/Parser.h b/Libraries/LibWeb/CSS/Parser/Parser.h index 42a16db4097..c4b3fe11242 100644 --- a/Libraries/LibWeb/CSS/Parser/Parser.h +++ b/Libraries/LibWeb/CSS/Parser/Parser.h @@ -564,6 +564,7 @@ private: OwnPtr parse_boolean_expression_group(TokenStream&, MatchResult result_for_general_enclosed, ParseTest parse_test); OwnPtr parse_supports_feature(TokenStream&); + OwnPtr parse_supports_declaration(TokenStream&); NonnullRefPtr resolve_unresolved_style_value(DOM::AbstractElement, GuardedSubstitutionContexts&, PropertyNameAndID const&, UnresolvedStyleValue const&); diff --git a/Libraries/LibWeb/CSS/Parser/RuleParsing.cpp b/Libraries/LibWeb/CSS/Parser/RuleParsing.cpp index a088669cb67..b438bd307eb 100644 --- a/Libraries/LibWeb/CSS/Parser/RuleParsing.cpp +++ b/Libraries/LibWeb/CSS/Parser/RuleParsing.cpp @@ -245,12 +245,10 @@ GC::Ptr Parser::convert_to_import_rule(AtRule const& rule) supports = parse_a_supports(supports_tokens); if (!supports) { m_rule_context.append(RuleContext::SupportsCondition); - auto declaration = consume_a_declaration(supports_tokens); + auto supports_declaration = parse_supports_declaration(supports_tokens); m_rule_context.take_last(); - if (declaration.has_value()) { - auto supports_declaration = Supports::Declaration::create(declaration->to_string(), convert_to_style_property(*declaration).has_value()); + if (supports_declaration) supports = Supports::create(supports_declaration.release_nonnull()); - } } }