1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-24 16:17:34 +00:00

LibWeb: Allow optional values to be missing when parsing <position>s

This commit is contained in:
MacDue 2022-11-08 20:50:00 +01:00 committed by Sam Atkins
parent b7d436fe1b
commit c02163c31f
2 changed files with 30 additions and 22 deletions

View file

@ -2644,7 +2644,7 @@ RefPtr<StyleValue> Parser::parse_conic_gradient_function(ComponentValue const& c
return ConicGradientStyleValue::create(from_angle, at_position, move(*color_stops), repeating_gradient); return ConicGradientStyleValue::create(from_angle, at_position, move(*color_stops), repeating_gradient);
} }
Optional<PositionValue> Parser::parse_position(TokenStream<ComponentValue>& tokens) Optional<PositionValue> Parser::parse_position(TokenStream<ComponentValue>& tokens, PositionValue initial_value)
{ {
auto transaction = tokens.begin_transaction(); auto transaction = tokens.begin_transaction();
tokens.skip_whitespace(); tokens.skip_whitespace();
@ -2700,7 +2700,7 @@ Optional<PositionValue> Parser::parse_position(TokenStream<ComponentValue>& toke
// [ left | center | right ] || [ top | center | bottom ] // [ left | center | right ] || [ top | center | bottom ]
auto alternation_1 = [&]() -> Optional<PositionValue> { auto alternation_1 = [&]() -> Optional<PositionValue> {
auto transaction = tokens.begin_transaction(); auto transaction = tokens.begin_transaction();
PositionValue position {}; PositionValue position = initial_value;
auto& first_token = tokens.next_token(); auto& first_token = tokens.next_token();
if (!first_token.is(Token::Type::Ident)) if (!first_token.is(Token::Type::Ident))
return {}; return {};
@ -2709,15 +2709,17 @@ Optional<PositionValue> Parser::parse_position(TokenStream<ComponentValue>& toke
auto horizontal_position = parse_horizontal_preset(ident); auto horizontal_position = parse_horizontal_preset(ident);
if (horizontal_position.has_value()) { if (horizontal_position.has_value()) {
position.horizontal_position = *horizontal_position; position.horizontal_position = *horizontal_position;
auto transaction_optional_parse = tokens.begin_transaction();
tokens.skip_whitespace(); tokens.skip_whitespace();
if (tokens.has_next_token()) { if (tokens.has_next_token()) {
auto& second_token = tokens.next_token(); auto& second_token = tokens.next_token();
if (!second_token.is(Token::Type::Ident)) if (second_token.is(Token::Type::Ident)) {
return {}; auto vertical_position = parse_vertical_preset(second_token.token().ident());
auto vertical_position = parse_vertical_preset(second_token.token().ident()); if (vertical_position.has_value()) {
if (!vertical_position.has_value()) transaction_optional_parse.commit();
return {}; position.vertical_position = *vertical_position;
position.vertical_position = *vertical_position; }
}
} }
} else { } else {
// <vertical-position> <horizontal-position>? // <vertical-position> <horizontal-position>?
@ -2725,14 +2727,17 @@ Optional<PositionValue> Parser::parse_position(TokenStream<ComponentValue>& toke
if (!vertical_position.has_value()) if (!vertical_position.has_value())
return {}; return {};
position.vertical_position = *vertical_position; position.vertical_position = *vertical_position;
auto transaction_optional_parse = tokens.begin_transaction();
tokens.skip_whitespace();
if (tokens.has_next_token()) { if (tokens.has_next_token()) {
auto& second_token = tokens.next_token(); auto& second_token = tokens.next_token();
if (!second_token.is(Token::Type::Ident)) if (second_token.is(Token::Type::Ident)) {
return {}; auto horizontal_position = parse_horizontal_preset(second_token.token().ident());
auto horizontal_position = parse_horizontal_preset(second_token.token().ident()); if (horizontal_position.has_value()) {
if (!horizontal_position.has_value()) transaction_optional_parse.commit();
return {}; position.horizontal_position = *horizontal_position;
position.horizontal_position = *horizontal_position; }
}
} }
} }
transaction.commit(); transaction.commit();
@ -2743,7 +2748,7 @@ Optional<PositionValue> Parser::parse_position(TokenStream<ComponentValue>& toke
// [ top | center | bottom | <length-percentage> ]? // [ top | center | bottom | <length-percentage> ]?
auto alternation_2 = [&]() -> Optional<PositionValue> { auto alternation_2 = [&]() -> Optional<PositionValue> {
auto transaction = tokens.begin_transaction(); auto transaction = tokens.begin_transaction();
PositionValue position {}; PositionValue position = initial_value;
auto& first_token = tokens.next_token(); auto& first_token = tokens.next_token();
if (first_token.is(Token::Type::Ident)) { if (first_token.is(Token::Type::Ident)) {
auto horizontal_position = parse_horizontal_preset(first_token.token().ident()); auto horizontal_position = parse_horizontal_preset(first_token.token().ident());
@ -2756,19 +2761,22 @@ Optional<PositionValue> Parser::parse_position(TokenStream<ComponentValue>& toke
return {}; return {};
position.horizontal_position = dimension->length_percentage(); position.horizontal_position = dimension->length_percentage();
} }
auto transaction_optional_parse = tokens.begin_transaction();
tokens.skip_whitespace(); tokens.skip_whitespace();
if (tokens.has_next_token()) { if (tokens.has_next_token()) {
auto& second_token = tokens.next_token(); auto& second_token = tokens.next_token();
if (second_token.is(Token::Type::Ident)) { if (second_token.is(Token::Type::Ident)) {
auto vertical_position = parse_vertical_preset(second_token.token().ident()); auto vertical_position = parse_vertical_preset(second_token.token().ident());
if (!vertical_position.has_value()) if (vertical_position.has_value()) {
return {}; transaction_optional_parse.commit();
position.vertical_position = *vertical_position; position.vertical_position = *vertical_position;
}
} else { } else {
auto dimension = parse_dimension(second_token); auto dimension = parse_dimension(second_token);
if (!dimension.has_value() || !dimension->is_length_percentage()) if (dimension.has_value() && dimension->is_length_percentage()) {
return {}; transaction_optional_parse.commit();
position.vertical_position = dimension->length_percentage(); position.vertical_position = dimension->length_percentage();
}
} }
} }
transaction.commit(); transaction.commit();

View file

@ -255,7 +255,7 @@ private:
Optional<GridMinMax> parse_min_max(Vector<ComponentValue> const&); Optional<GridMinMax> parse_min_max(Vector<ComponentValue> const&);
Optional<GridRepeat> parse_repeat(Vector<ComponentValue> const&); Optional<GridRepeat> parse_repeat(Vector<ComponentValue> const&);
Optional<ExplicitGridTrack> parse_track_sizing_function(ComponentValue const&); Optional<ExplicitGridTrack> parse_track_sizing_function(ComponentValue const&);
Optional<PositionValue> parse_position(TokenStream<ComponentValue>&); Optional<PositionValue> parse_position(TokenStream<ComponentValue>&, PositionValue initial_value = PositionValue::center());
enum class AllowedDataUrlType { enum class AllowedDataUrlType {
None, None,