From 4d6e8d8f37e6a146aad620079e795175aab213a6 Mon Sep 17 00:00:00 2001 From: Sam Atkins Date: Thu, 7 Dec 2023 12:23:51 +0000 Subject: [PATCH] LibWeb: Parse border-radius properties using TokenStream --- .../Libraries/LibWeb/CSS/Parser/Parser.cpp | 40 +++++++++++-------- Userland/Libraries/LibWeb/CSS/Parser/Parser.h | 4 +- 2 files changed, 25 insertions(+), 19 deletions(-) diff --git a/Userland/Libraries/LibWeb/CSS/Parser/Parser.cpp b/Userland/Libraries/LibWeb/CSS/Parser/Parser.cpp index 0bb3df4bdc..983d0af91e 100644 --- a/Userland/Libraries/LibWeb/CSS/Parser/Parser.cpp +++ b/Userland/Libraries/LibWeb/CSS/Parser/Parser.cpp @@ -3200,28 +3200,31 @@ RefPtr Parser::parse_border_value(PropertyID property_id, Vector Parser::parse_border_radius_value(Vector const& component_values) +RefPtr Parser::parse_border_radius_value(TokenStream& tokens) { - if (component_values.size() == 2) { - auto horizontal = parse_dimension(component_values[0]); - auto vertical = parse_dimension(component_values[1]); - if (horizontal.has_value() && horizontal->is_length_percentage() && vertical.has_value() && vertical->is_length_percentage()) + if (tokens.remaining_token_count() == 2) { + auto transaction = tokens.begin_transaction(); + auto horizontal = parse_dimension(tokens.next_token()); + auto vertical = parse_dimension(tokens.next_token()); + if (horizontal.has_value() && horizontal->is_length_percentage() && vertical.has_value() && vertical->is_length_percentage()) { + transaction.commit(); return BorderRadiusStyleValue::create(horizontal->length_percentage(), vertical->length_percentage()); - - return nullptr; + } } - if (component_values.size() == 1) { - auto radius = parse_dimension(component_values[0]); - if (radius.has_value() && radius->is_length_percentage()) + if (tokens.remaining_token_count() == 1) { + auto transaction = tokens.begin_transaction(); + auto radius = parse_dimension(tokens.next_token()); + if (radius.has_value() && radius->is_length_percentage()) { + transaction.commit(); return BorderRadiusStyleValue::create(radius->length_percentage(), radius->length_percentage()); - return nullptr; + } } return nullptr; } -RefPtr Parser::parse_border_radius_shorthand_value(Vector const& component_values) +RefPtr Parser::parse_border_radius_shorthand_value(TokenStream& tokens) { auto top_left = [&](Vector& radii) { return radii[0]; }; auto top_right = [&](Vector& radii) { @@ -3265,9 +3268,11 @@ RefPtr Parser::parse_border_radius_shorthand_value(Vector horizontal_radii; Vector vertical_radii; bool reading_vertical = false; + auto transaction = tokens.begin_transaction(); - for (auto const& value : component_values) { - if (value.is_delim('/')) { + while (tokens.has_next_token()) { + auto& token = tokens.next_token(); + if (token.is_delim('/')) { if (reading_vertical || horizontal_radii.is_empty()) return nullptr; @@ -3275,7 +3280,7 @@ RefPtr Parser::parse_border_radius_shorthand_value(Vectoris_length_percentage()) return nullptr; if (reading_vertical) { @@ -3299,6 +3304,7 @@ RefPtr Parser::parse_border_radius_shorthand_value(Vector> Parser::parse_css_value(Property case PropertyID::BorderTopRightRadius: case PropertyID::BorderBottomRightRadius: case PropertyID::BorderBottomLeftRadius: - if (auto parsed_value = parse_border_radius_value(component_values)) + if (auto parsed_value = parse_border_radius_value(tokens); parsed_value && !tokens.has_next_token()) return parsed_value.release_nonnull(); return ParseError::SyntaxError; case PropertyID::BorderRadius: - if (auto parsed_value = parse_border_radius_shorthand_value(component_values)) + if (auto parsed_value = parse_border_radius_shorthand_value(tokens); parsed_value && !tokens.has_next_token()) return parsed_value.release_nonnull(); return ParseError::SyntaxError; case PropertyID::BoxShadow: diff --git a/Userland/Libraries/LibWeb/CSS/Parser/Parser.h b/Userland/Libraries/LibWeb/CSS/Parser/Parser.h index 1d119cd1e4..c08467c577 100644 --- a/Userland/Libraries/LibWeb/CSS/Parser/Parser.h +++ b/Userland/Libraries/LibWeb/CSS/Parser/Parser.h @@ -231,8 +231,8 @@ private: RefPtr parse_single_background_repeat_value(TokenStream&); RefPtr parse_single_background_size_value(TokenStream&); RefPtr parse_border_value(PropertyID, Vector const&); - RefPtr parse_border_radius_value(Vector const&); - RefPtr parse_border_radius_shorthand_value(Vector const&); + RefPtr parse_border_radius_value(TokenStream&); + RefPtr parse_border_radius_shorthand_value(TokenStream&); RefPtr parse_content_value(Vector const&); RefPtr parse_display_value(Vector const&); RefPtr parse_flex_value(Vector const&);