diff --git a/Userland/Libraries/LibWeb/CSS/Parser/Parser.cpp b/Userland/Libraries/LibWeb/CSS/Parser/Parser.cpp index 9d77cb3864..e634822f8a 100644 --- a/Userland/Libraries/LibWeb/CSS/Parser/Parser.cpp +++ b/Userland/Libraries/LibWeb/CSS/Parser/Parser.cpp @@ -179,36 +179,36 @@ NonnullRefPtr Parser::parse_a_stylesheet(TokenStream& tokens) Optional Parser::parse_as_selector() { - return parse_a_selector(m_token_stream); + auto selector_list = parse_a_selector(m_token_stream); + if (!selector_list.is_error()) + return selector_list.release_value(); + + return {}; } template -Optional Parser::parse_a_selector(TokenStream& tokens) +Result Parser::parse_a_selector(TokenStream& tokens) { - auto selector_list = parse_a_selector_list(tokens); - if (selector_list.has_value()) - return selector_list; - - return {}; + return parse_a_selector_list(tokens); } Optional Parser::parse_as_relative_selector() { - return parse_a_relative_selector(m_token_stream); -} - -template -Optional Parser::parse_a_relative_selector(TokenStream& tokens) -{ - auto selector_list = parse_a_relative_selector_list(tokens); - if (selector_list.has_value()) - return selector_list; + auto selector_list = parse_a_relative_selector(m_token_stream); + if (!selector_list.is_error()) + return selector_list.release_value(); return {}; } template -Optional Parser::parse_a_selector_list(TokenStream& tokens) +Result Parser::parse_a_relative_selector(TokenStream& tokens) +{ + return parse_a_relative_selector_list(tokens); +} + +template +Result Parser::parse_a_selector_list(TokenStream& tokens) { auto comma_separated_lists = parse_a_comma_separated_list_of_component_values(tokens); @@ -216,20 +216,19 @@ Optional Parser::parse_a_selector_list(TokenStream& tokens) for (auto& selector_parts : comma_separated_lists) { auto stream = TokenStream(selector_parts); auto selector = parse_complex_selector(stream, false); - if (selector) - selectors.append(selector.release_nonnull()); - else - return {}; + if (selector.is_error()) + return selector.error(); + selectors.append(selector.release_value()); } if (selectors.is_empty()) - return {}; + return SelectorParsingResult::SyntaxError; return selectors; } template -Optional Parser::parse_a_relative_selector_list(TokenStream& tokens) +Result Parser::parse_a_relative_selector_list(TokenStream& tokens) { auto comma_separated_lists = parse_a_comma_separated_list_of_component_values(tokens); @@ -237,28 +236,27 @@ Optional Parser::parse_a_relative_selector_list(TokenStream& to for (auto& selector_parts : comma_separated_lists) { auto stream = TokenStream(selector_parts); auto selector = parse_complex_selector(stream, true); - if (selector) - selectors.append(selector.release_nonnull()); - else - return {}; + if (selector.is_error()) + return selector.error(); + selectors.append(selector.release_value()); } if (selectors.is_empty()) - return {}; + return SelectorParsingResult::SyntaxError; return selectors; } -RefPtr Parser::parse_complex_selector(TokenStream& tokens, bool allow_starting_combinator) +Result, Parser::SelectorParsingResult> Parser::parse_complex_selector(TokenStream& tokens, bool allow_starting_combinator) { Vector compound_selectors; auto first_selector = parse_compound_selector(tokens); if (first_selector.is_error()) - return {}; + return first_selector.error(); if (!allow_starting_combinator) { if (first_selector.value().combinator != Selector::Combinator::Descendant) - return {}; + return SelectorParsingResult::SyntaxError; first_selector.value().combinator = Selector::Combinator::None; } compound_selectors.append(first_selector.value()); @@ -269,13 +267,13 @@ RefPtr Parser::parse_complex_selector(TokenStream Parser::parse_si simple_selector.pseudo_class.type = Selector::SimpleSelector::PseudoClass::Type::Not; auto function_token_stream = TokenStream(pseudo_function.values()); auto not_selector = parse_a_selector(function_token_stream); - if (!not_selector.has_value()) { + if (not_selector.is_error()) { dbgln_if(CSS_PARSER_DEBUG, "Invalid selector in :not() clause"); return SelectorParsingResult::SyntaxError; } - simple_selector.pseudo_class.not_selector = not_selector.value(); + simple_selector.pseudo_class.not_selector = not_selector.release_value(); } else if (pseudo_function.name().equals_ignoring_case("nth-child")) { simple_selector.pseudo_class.type = Selector::SimpleSelector::PseudoClass::Type::NthChild; auto function_values = TokenStream(pseudo_function.values()); @@ -1225,7 +1223,7 @@ RefPtr Parser::convert_to_rule(NonnullRefPtr rule) } else { auto prelude_stream = TokenStream(rule->m_prelude); auto selectors = parse_a_selector(prelude_stream); - if (!selectors.has_value() || selectors.value().is_empty()) { + if (selectors.is_error() || selectors.value().is_empty()) { dbgln("CSSParser: style rule selectors invalid; discarding."); prelude_stream.dump_all_tokens(); return {}; diff --git a/Userland/Libraries/LibWeb/CSS/Parser/Parser.h b/Userland/Libraries/LibWeb/CSS/Parser/Parser.h index 66800c7cc1..bad9bd0a2c 100644 --- a/Userland/Libraries/LibWeb/CSS/Parser/Parser.h +++ b/Userland/Libraries/LibWeb/CSS/Parser/Parser.h @@ -100,6 +100,11 @@ public: RefPtr parse_as_css_value(PropertyID); private: + enum class SelectorParsingResult { + Done, + SyntaxError, + }; + template NonnullRefPtr parse_a_stylesheet(TokenStream&); template @@ -117,13 +122,13 @@ private: template Vector> parse_a_comma_separated_list_of_component_values(TokenStream&); template - Optional parse_a_selector(TokenStream&); + Result parse_a_selector(TokenStream&); template - Optional parse_a_relative_selector(TokenStream&); + Result parse_a_relative_selector(TokenStream&); template - Optional parse_a_selector_list(TokenStream&); + Result parse_a_selector_list(TokenStream&); template - Optional parse_a_relative_selector_list(TokenStream&); + Result parse_a_relative_selector_list(TokenStream&); Optional parse_a_n_plus_b_pattern(TokenStream&); @@ -206,12 +211,7 @@ private: static OwnPtr parse_calc_number_sum_part_with_operator(ParsingContext const&, TokenStream&); static OwnPtr parse_calc_expression(ParsingContext const&, Vector const&); - enum class SelectorParsingResult { - Done, - SyntaxError, - }; - - RefPtr parse_complex_selector(TokenStream&, bool allow_starting_combinator); + Result, SelectorParsingResult> parse_complex_selector(TokenStream&, bool allow_starting_combinator); Result parse_compound_selector(TokenStream&); Optional parse_selector_combinator(TokenStream&); Result parse_simple_selector(TokenStream&);