diff --git a/Userland/Libraries/LibWeb/CSS/Parser/GradientParsing.cpp b/Userland/Libraries/LibWeb/CSS/Parser/GradientParsing.cpp index 80c99111d0b..762d96e99b2 100644 --- a/Userland/Libraries/LibWeb/CSS/Parser/GradientParsing.cpp +++ b/Userland/Libraries/LibWeb/CSS/Parser/GradientParsing.cpp @@ -30,15 +30,14 @@ Optional> Parser::parse_color_stop_list(TokenStream color; Optional position; Optional second_position; - auto dimension = parse_dimension(token); - if (dimension.has_value() && is_position(*dimension)) { + if (auto dimension = parse_dimension(tokens.peek_token()); dimension.has_value() && is_position(*dimension)) { // [ ] or [] position = get_position(*dimension); + (void)tokens.next_token(); // dimension tokens.skip_whitespace(); // if (!tokens.has_next_token() || tokens.peek_token().is(Token::Type::Comma)) { @@ -46,13 +45,13 @@ Optional> Parser::parse_color_stop_list(TokenStream - auto maybe_color = parse_color_value(tokens.next_token()); + auto maybe_color = parse_color_value(tokens); if (!maybe_color) return ElementType::Garbage; color = maybe_color.release_nonnull(); } else { // [ ?] - auto maybe_color = parse_color_value(token); + auto maybe_color = parse_color_value(tokens); if (!maybe_color) return ElementType::Garbage; color = maybe_color.release_nonnull(); @@ -61,8 +60,7 @@ Optional> Parser::parse_color_stop_list(TokenStream Parser::parse_color(ComponentValue const& component_value) return {}; } -RefPtr Parser::parse_color_value(ComponentValue const& component_value) +RefPtr Parser::parse_color_value(TokenStream& tokens) { - auto color = parse_color(component_value); - if (color.has_value()) + auto transaction = tokens.begin_transaction(); + auto component_value = tokens.next_token(); + + if (auto color = parse_color(component_value); color.has_value()) { + transaction.commit(); return ColorStyleValue::create(color.value()); + } if (component_value.is(Token::Type::Ident)) { auto ident = value_id_from_string(component_value.token().ident()); - if (ident.has_value() && IdentifierStyleValue::is_color(ident.value())) + if (ident.has_value() && IdentifierStyleValue::is_color(ident.value())) { + transaction.commit(); return IdentifierStyleValue::create(ident.value()); + } } return nullptr; @@ -2565,10 +2571,8 @@ RefPtr Parser::parse_paint_value(TokenStream& tokens // ` = none | | [none | ]? | context-fill | context-stroke` auto parse_color_or_none = [&]() -> Optional> { - if (auto color = parse_color_value(tokens.peek_token())) { - (void)tokens.next_token(); + if (auto color = parse_color_value(tokens)) return color; - } // NOTE: also accepts identifiers, so we do this identifier check last. if (tokens.peek_token().is(Token::Type::Ident)) { @@ -6499,10 +6503,8 @@ Optional Parser::parse_css_value_for_properties(Readon } if (auto property = any_property_accepts_type(property_ids, ValueType::Color); property.has_value()) { - if (auto maybe_color = parse_color_value(peek_token)) { - (void)tokens.next_token(); + if (auto maybe_color = parse_color_value(tokens)) return PropertyAndValue { *property, maybe_color }; - } } if (auto property = any_property_accepts_type(property_ids, ValueType::Image); property.has_value()) { diff --git a/Userland/Libraries/LibWeb/CSS/Parser/Parser.h b/Userland/Libraries/LibWeb/CSS/Parser/Parser.h index 1af6db81957..24b8342e6b3 100644 --- a/Userland/Libraries/LibWeb/CSS/Parser/Parser.h +++ b/Userland/Libraries/LibWeb/CSS/Parser/Parser.h @@ -224,7 +224,7 @@ private: RefPtr parse_number_value(TokenStream&); RefPtr parse_number_or_percentage_value(TokenStream&); RefPtr parse_identifier_value(ComponentValue const&); - RefPtr parse_color_value(ComponentValue const&); + RefPtr parse_color_value(TokenStream&); RefPtr parse_rect_value(TokenStream&); RefPtr parse_ratio_value(TokenStream&); RefPtr parse_string_value(TokenStream&);