diff --git a/Userland/Libraries/LibWeb/CSS/Parser/Parser.cpp b/Userland/Libraries/LibWeb/CSS/Parser/Parser.cpp index f5cd9af60fa..c9c468f8ca7 100644 --- a/Userland/Libraries/LibWeb/CSS/Parser/Parser.cpp +++ b/Userland/Libraries/LibWeb/CSS/Parser/Parser.cpp @@ -1,7 +1,7 @@ /* * Copyright (c) 2018-2022, Andreas Kling * Copyright (c) 2020-2021, the SerenityOS developers. - * Copyright (c) 2021-2023, Sam Atkins + * Copyright (c) 2021-2024, Sam Atkins * Copyright (c) 2021, Tobias Christiansen * Copyright (c) 2022, MacDue * Copyright (c) 2024, Shannon Booth @@ -91,15 +91,6 @@ static void log_parse_error(SourceLocation const& location = SourceLocation::cur namespace Web::CSS::Parser { -static bool contains_single_none_ident(TokenStream& tokens) -{ - if (tokens.remaining_token_count() > 1) - return false; - if (auto token = tokens.peek_token(); token.is_ident("none"sv)) - return true; - return false; -} - ErrorOr Parser::create(ParsingContext const& context, StringView input, StringView encoding) { auto tokens = TRY(Tokenizer::tokenize(input, encoding)); @@ -3343,6 +3334,20 @@ RefPtr Parser::parse_simple_comma_separated_value_list(PropertyID pr }); } +RefPtr Parser::parse_all_as_single_none_value(TokenStream& tokens) +{ + auto transaction = tokens.begin_transaction(); + tokens.skip_whitespace(); + auto maybe_none = tokens.next_token(); + tokens.skip_whitespace(); + + if (tokens.has_next_token() || !maybe_none.is_ident("none"sv)) + return {}; + + transaction.commit(); + return IdentifierStyleValue::create(ValueID::None); +} + static void remove_property(Vector& properties, PropertyID property_to_remove) { properties.remove_first_matching([&](auto it) { return it == property_to_remove; }); @@ -3986,8 +3991,8 @@ RefPtr Parser::parse_border_radius_shorthand_value(TokenStream Parser::parse_shadow_value(TokenStream& tokens, AllowInsetKeyword allow_inset_keyword) { // "none" - if (contains_single_none_ident(tokens)) - return parse_identifier_value(tokens); + if (auto none = parse_all_as_single_none_value(tokens)) + return none; return parse_comma_separated_value_list(tokens, [this, allow_inset_keyword](auto& tokens) { return parse_single_shadow_value(tokens, allow_inset_keyword); @@ -4298,12 +4303,10 @@ RefPtr Parser::parse_display_value(TokenStream& toke RefPtr Parser::parse_filter_value_list_value(TokenStream& tokens) { - auto transaction = tokens.begin_transaction(); + if (auto none = parse_all_as_single_none_value(tokens)) + return none; - if (contains_single_none_ident(tokens)) { - transaction.commit(); - return parse_identifier_value(tokens); - } + auto transaction = tokens.begin_transaction(); // FIXME: s are ignored for now // = [ | ]+ @@ -5543,10 +5546,8 @@ RefPtr Parser::parse_transform_value(TokenStream& to // = none | // = + - if (contains_single_none_ident(tokens)) { - tokens.next_token(); // none - return IdentifierStyleValue::create(ValueID::None); - } + if (auto none = parse_all_as_single_none_value(tokens)) + return none; StyleValueVector transformations; auto transaction = tokens.begin_transaction(); @@ -5797,10 +5798,8 @@ RefPtr Parser::parse_transform_origin_value(TokenStream Parser::parse_transition_value(TokenStream& tokens) { - if (contains_single_none_ident(tokens)) { - tokens.next_token(); // none - return IdentifierStyleValue::create(ValueID::None); - } + if (auto none = parse_all_as_single_none_value(tokens)) + return none; Vector transitions; auto transaction = tokens.begin_transaction(); @@ -6105,13 +6104,10 @@ Optional Parser::parse_track_sizing_function(ComponentVa RefPtr Parser::parse_grid_track_size_list(TokenStream& tokens, bool allow_separate_line_name_blocks) { - auto transaction = tokens.begin_transaction(); - - if (contains_single_none_ident(tokens)) { - tokens.next_token(); - transaction.commit(); + if (auto none = parse_all_as_single_none_value(tokens)) return GridTrackSizeListStyleValue::make_none(); - } + + auto transaction = tokens.begin_transaction(); Vector> track_list; auto last_object_was_line_names = false; @@ -6602,10 +6598,8 @@ RefPtr Parser::parse_grid_template_areas_value(TokenStream+ Vector> grid_area_rows; - if (contains_single_none_ident(tokens)) { - (void)tokens.next_token(); // none + if (auto none = parse_all_as_single_none_value(tokens)) return GridTemplateAreaStyleValue::create(move(grid_area_rows)); - } auto transaction = tokens.begin_transaction(); while (tokens.has_next_token() && tokens.peek_token().is(Token::Type::String)) { diff --git a/Userland/Libraries/LibWeb/CSS/Parser/Parser.h b/Userland/Libraries/LibWeb/CSS/Parser/Parser.h index 00f60bf8269..1c5af9f7020 100644 --- a/Userland/Libraries/LibWeb/CSS/Parser/Parser.h +++ b/Userland/Libraries/LibWeb/CSS/Parser/Parser.h @@ -1,6 +1,6 @@ /* * Copyright (c) 2020-2021, the SerenityOS developers. - * Copyright (c) 2021-2023, Sam Atkins + * Copyright (c) 2021-2024, Sam Atkins * * SPDX-License-Identifier: BSD-2-Clause */ @@ -303,6 +303,7 @@ private: template RefPtr parse_comma_separated_value_list(TokenStream&, ParseFunction); RefPtr parse_simple_comma_separated_value_list(PropertyID, TokenStream&); + RefPtr parse_all_as_single_none_value(TokenStream&); RefPtr parse_aspect_ratio_value(TokenStream&); RefPtr parse_background_value(TokenStream&);