From c02163c31fe8301b35419c6d7fc75b1e30f58c80 Mon Sep 17 00:00:00 2001 From: MacDue Date: Tue, 8 Nov 2022 20:50:00 +0100 Subject: [PATCH] LibWeb: Allow optional values to be missing when parsing ``s --- .../Libraries/LibWeb/CSS/Parser/Parser.cpp | 50 +++++++++++-------- Userland/Libraries/LibWeb/CSS/Parser/Parser.h | 2 +- 2 files changed, 30 insertions(+), 22 deletions(-) diff --git a/Userland/Libraries/LibWeb/CSS/Parser/Parser.cpp b/Userland/Libraries/LibWeb/CSS/Parser/Parser.cpp index bb8afd11d7..a265c6718f 100644 --- a/Userland/Libraries/LibWeb/CSS/Parser/Parser.cpp +++ b/Userland/Libraries/LibWeb/CSS/Parser/Parser.cpp @@ -2644,7 +2644,7 @@ RefPtr Parser::parse_conic_gradient_function(ComponentValue const& c return ConicGradientStyleValue::create(from_angle, at_position, move(*color_stops), repeating_gradient); } -Optional Parser::parse_position(TokenStream& tokens) +Optional Parser::parse_position(TokenStream& tokens, PositionValue initial_value) { auto transaction = tokens.begin_transaction(); tokens.skip_whitespace(); @@ -2700,7 +2700,7 @@ Optional Parser::parse_position(TokenStream& toke // [ left | center | right ] || [ top | center | bottom ] auto alternation_1 = [&]() -> Optional { auto transaction = tokens.begin_transaction(); - PositionValue position {}; + PositionValue position = initial_value; auto& first_token = tokens.next_token(); if (!first_token.is(Token::Type::Ident)) return {}; @@ -2709,15 +2709,17 @@ Optional Parser::parse_position(TokenStream& toke auto horizontal_position = parse_horizontal_preset(ident); if (horizontal_position.has_value()) { position.horizontal_position = *horizontal_position; + auto transaction_optional_parse = tokens.begin_transaction(); tokens.skip_whitespace(); if (tokens.has_next_token()) { auto& second_token = tokens.next_token(); - if (!second_token.is(Token::Type::Ident)) - return {}; - auto vertical_position = parse_vertical_preset(second_token.token().ident()); - if (!vertical_position.has_value()) - return {}; - position.vertical_position = *vertical_position; + if (second_token.is(Token::Type::Ident)) { + auto vertical_position = parse_vertical_preset(second_token.token().ident()); + if (vertical_position.has_value()) { + transaction_optional_parse.commit(); + position.vertical_position = *vertical_position; + } + } } } else { // ? @@ -2725,14 +2727,17 @@ Optional Parser::parse_position(TokenStream& toke if (!vertical_position.has_value()) return {}; position.vertical_position = *vertical_position; + auto transaction_optional_parse = tokens.begin_transaction(); + tokens.skip_whitespace(); if (tokens.has_next_token()) { auto& second_token = tokens.next_token(); - if (!second_token.is(Token::Type::Ident)) - return {}; - auto horizontal_position = parse_horizontal_preset(second_token.token().ident()); - if (!horizontal_position.has_value()) - return {}; - position.horizontal_position = *horizontal_position; + if (second_token.is(Token::Type::Ident)) { + auto horizontal_position = parse_horizontal_preset(second_token.token().ident()); + if (horizontal_position.has_value()) { + transaction_optional_parse.commit(); + position.horizontal_position = *horizontal_position; + } + } } } transaction.commit(); @@ -2743,7 +2748,7 @@ Optional Parser::parse_position(TokenStream& toke // [ top | center | bottom | ]? auto alternation_2 = [&]() -> Optional { auto transaction = tokens.begin_transaction(); - PositionValue position {}; + PositionValue position = initial_value; auto& first_token = tokens.next_token(); if (first_token.is(Token::Type::Ident)) { auto horizontal_position = parse_horizontal_preset(first_token.token().ident()); @@ -2756,19 +2761,22 @@ Optional Parser::parse_position(TokenStream& toke return {}; position.horizontal_position = dimension->length_percentage(); } + auto transaction_optional_parse = tokens.begin_transaction(); tokens.skip_whitespace(); if (tokens.has_next_token()) { auto& second_token = tokens.next_token(); if (second_token.is(Token::Type::Ident)) { auto vertical_position = parse_vertical_preset(second_token.token().ident()); - if (!vertical_position.has_value()) - return {}; - position.vertical_position = *vertical_position; + if (vertical_position.has_value()) { + transaction_optional_parse.commit(); + position.vertical_position = *vertical_position; + } } else { auto dimension = parse_dimension(second_token); - if (!dimension.has_value() || !dimension->is_length_percentage()) - return {}; - position.vertical_position = dimension->length_percentage(); + if (dimension.has_value() && dimension->is_length_percentage()) { + transaction_optional_parse.commit(); + position.vertical_position = dimension->length_percentage(); + } } } transaction.commit(); diff --git a/Userland/Libraries/LibWeb/CSS/Parser/Parser.h b/Userland/Libraries/LibWeb/CSS/Parser/Parser.h index d224023bbc..50b765d363 100644 --- a/Userland/Libraries/LibWeb/CSS/Parser/Parser.h +++ b/Userland/Libraries/LibWeb/CSS/Parser/Parser.h @@ -255,7 +255,7 @@ private: Optional parse_min_max(Vector const&); Optional parse_repeat(Vector const&); Optional parse_track_sizing_function(ComponentValue const&); - Optional parse_position(TokenStream&); + Optional parse_position(TokenStream&, PositionValue initial_value = PositionValue::center()); enum class AllowedDataUrlType { None,