From 390cc30a9707b36477b1042359249f7e448038c0 Mon Sep 17 00:00:00 2001 From: Sam Atkins Date: Fri, 2 Jul 2021 19:52:07 +0100 Subject: LibWeb: Bring CSS::Parser::parse_as_comma_separated_list...() to spec Previous implementation was returning everything in a single Vector, when what we really want is a Vector of Vectors, one for each comma- separated part of the list. --- Userland/Libraries/LibWeb/CSS/Parser/Parser.cpp | 27 +++++++++++++++++++------ Userland/Libraries/LibWeb/CSS/Parser/Parser.h | 2 +- 2 files changed, 22 insertions(+), 7 deletions(-) (limited to 'Userland/Libraries') diff --git a/Userland/Libraries/LibWeb/CSS/Parser/Parser.cpp b/Userland/Libraries/LibWeb/CSS/Parser/Parser.cpp index debadf3358..2833f12f0d 100644 --- a/Userland/Libraries/LibWeb/CSS/Parser/Parser.cpp +++ b/Userland/Libraries/LibWeb/CSS/Parser/Parser.cpp @@ -833,20 +833,35 @@ Vector Parser::parse_as_list_of_component_values() return rules; } -Vector Parser::parse_as_list_of_comma_separated_component_values() +Vector> Parser::parse_as_comma_separated_list_of_component_values() { - Vector rules; + Vector> lists; + lists.append({}); for (;;) { - rules.append(consume_a_component_value()); + auto next = next_token(); - if (peek_token().is_comma()) + if (next.is_comma()) { + lists.append({}); continue; - if (peek_token().is_eof()) + } else if (next.is_eof()) { break; + } + + reconsume_current_input_token(); + auto component_value = consume_a_component_value(); + lists.last().append(component_value); } - return rules; + for (auto& list : lists) { + if (!list.is_empty() && list.first().is(Token::TokenType::Whitespace)) + list.take_first(); + + if (!list.is_empty() && list.last().is(Token::TokenType::Whitespace)) + list.take_last(); + } + + return lists; } RefPtr Parser::convert_rule(NonnullRefPtr) diff --git a/Userland/Libraries/LibWeb/CSS/Parser/Parser.h b/Userland/Libraries/LibWeb/CSS/Parser/Parser.h index 67cc146123..0ab9421f37 100644 --- a/Userland/Libraries/LibWeb/CSS/Parser/Parser.h +++ b/Userland/Libraries/LibWeb/CSS/Parser/Parser.h @@ -46,7 +46,7 @@ public: // For the contents of presentational attributes, which parse text into a single declaration’s value, or for parsing a stand-alone selector [SELECT] or list of Media Queries [MEDIAQ], as in Selectors API or the media HTML attribute. Vector parse_as_list_of_component_values(); - Vector parse_as_list_of_comma_separated_component_values(); + Vector> parse_as_comma_separated_list_of_component_values(); Vector parse_selectors(Vector parts); -- cgit v1.2.3