diff --git a/Userland/Libraries/LibWeb/CSS/CSSStyleRule.cpp b/Userland/Libraries/LibWeb/CSS/CSSStyleRule.cpp index a5ff41b4b9..75a570344d 100644 --- a/Userland/Libraries/LibWeb/CSS/CSSStyleRule.cpp +++ b/Userland/Libraries/LibWeb/CSS/CSSStyleRule.cpp @@ -8,7 +8,7 @@ namespace Web::CSS { -CSSStyleRule::CSSStyleRule(Vector&& selectors, NonnullRefPtr&& declaration) +CSSStyleRule::CSSStyleRule(NonnullRefPtrVector&& selectors, NonnullRefPtr&& declaration) : m_selectors(move(selectors)) , m_declaration(move(declaration)) { diff --git a/Userland/Libraries/LibWeb/CSS/CSSStyleRule.h b/Userland/Libraries/LibWeb/CSS/CSSStyleRule.h index 41dce31a78..b0c636323f 100644 --- a/Userland/Libraries/LibWeb/CSS/CSSStyleRule.h +++ b/Userland/Libraries/LibWeb/CSS/CSSStyleRule.h @@ -7,6 +7,7 @@ #pragma once +#include #include #include #include @@ -19,23 +20,23 @@ class CSSStyleRule : public CSSRule { AK_MAKE_NONMOVABLE(CSSStyleRule); public: - static NonnullRefPtr create(Vector&& selectors, NonnullRefPtr&& declaration) + static NonnullRefPtr create(NonnullRefPtrVector&& selectors, NonnullRefPtr&& declaration) { return adopt_ref(*new CSSStyleRule(move(selectors), move(declaration))); } ~CSSStyleRule(); - const Vector& selectors() const { return m_selectors; } + const NonnullRefPtrVector& selectors() const { return m_selectors; } const CSSStyleDeclaration& declaration() const { return m_declaration; } virtual StringView class_name() const { return "CSSStyleRule"; }; virtual Type type() const { return Type::Style; }; private: - CSSStyleRule(Vector&&, NonnullRefPtr&&); + CSSStyleRule(NonnullRefPtrVector&&, NonnullRefPtr&&); - Vector m_selectors; + NonnullRefPtrVector m_selectors; NonnullRefPtr m_declaration; }; diff --git a/Userland/Libraries/LibWeb/CSS/Parser/DeprecatedCSSParser.cpp b/Userland/Libraries/LibWeb/CSS/Parser/DeprecatedCSSParser.cpp index 513d6d6bc7..6e7972d8f4 100644 --- a/Userland/Libraries/LibWeb/CSS/Parser/DeprecatedCSSParser.cpp +++ b/Userland/Libraries/LibWeb/CSS/Parser/DeprecatedCSSParser.cpp @@ -683,10 +683,10 @@ public: return; complex_selectors.first().relation = CSS::Selector::ComplexSelector::Relation::None; - current_rule.selectors.append(CSS::Selector(move(complex_selectors))); + current_rule.selectors.append(CSS::Selector::create(move(complex_selectors))); } - Optional parse_individual_selector() + RefPtr parse_individual_selector() { parse_selector(); if (current_rule.selectors.is_empty()) @@ -1037,7 +1037,7 @@ private: NonnullRefPtrVector rules; struct CurrentRule { - Vector selectors; + NonnullRefPtrVector selectors; Vector properties; HashMap custom_properties; }; @@ -1050,7 +1050,7 @@ private: StringView css; }; -Optional parse_selector(const CSS::DeprecatedParsingContext& context, const StringView& selector_text) +RefPtr parse_selector(const CSS::DeprecatedParsingContext& context, const StringView& selector_text) { CSSParser parser(context, selector_text); return parser.parse_individual_selector(); diff --git a/Userland/Libraries/LibWeb/CSS/Parser/DeprecatedCSSParser.h b/Userland/Libraries/LibWeb/CSS/Parser/DeprecatedCSSParser.h index 64f755f0b4..e60c056ded 100644 --- a/Userland/Libraries/LibWeb/CSS/Parser/DeprecatedCSSParser.h +++ b/Userland/Libraries/LibWeb/CSS/Parser/DeprecatedCSSParser.h @@ -31,7 +31,7 @@ namespace Web { RefPtr parse_css(const CSS::DeprecatedParsingContext&, const StringView&); RefPtr parse_css_declaration(const CSS::DeprecatedParsingContext&, const StringView&); RefPtr parse_css_value(const CSS::DeprecatedParsingContext&, const StringView&, CSS::PropertyID property_id = CSS::PropertyID::Invalid); -Optional parse_selector(const CSS::DeprecatedParsingContext&, const StringView&); +RefPtr parse_selector(const CSS::DeprecatedParsingContext&, const StringView&); RefPtr parse_line_width(const CSS::DeprecatedParsingContext&, const StringView&); RefPtr parse_color(const CSS::DeprecatedParsingContext&, const StringView&); diff --git a/Userland/Libraries/LibWeb/CSS/Parser/Parser.cpp b/Userland/Libraries/LibWeb/CSS/Parser/Parser.cpp index bbf5e49cfb..4e5480e147 100644 --- a/Userland/Libraries/LibWeb/CSS/Parser/Parser.cpp +++ b/Userland/Libraries/LibWeb/CSS/Parser/Parser.cpp @@ -171,55 +171,55 @@ NonnullRefPtr Parser::parse_as_stylesheet(TokenStream& tokens) return stylesheet; } -Vector Parser::parse_a_selector() +NonnullRefPtrVector Parser::parse_a_selector() { return parse_a_selector(m_token_stream); } template -Vector Parser::parse_a_selector(TokenStream& tokens) +NonnullRefPtrVector Parser::parse_a_selector(TokenStream& tokens) { dbgln_if(CSS_PARSER_TRACE, "Parser::parse_a_selector"); auto comma_separated_lists = parse_as_comma_separated_list_of_component_values(tokens); - Vector selectors; + NonnullRefPtrVector selectors; for (auto& selector_parts : comma_separated_lists) { auto stream = TokenStream(selector_parts); auto selector = parse_single_selector(stream); - if (selector.has_value()) - selectors.append(selector.value()); + if (selector) + selectors.append(selector.release_nonnull()); } return selectors; } -Vector Parser::parse_a_relative_selector() +NonnullRefPtrVector Parser::parse_a_relative_selector() { return parse_a_relative_selector(m_token_stream); } template -Vector Parser::parse_a_relative_selector(TokenStream& tokens) +NonnullRefPtrVector Parser::parse_a_relative_selector(TokenStream& tokens) { dbgln_if(CSS_PARSER_TRACE, "Parser::parse_a_relative_selector"); auto comma_separated_lists = parse_as_comma_separated_list_of_component_values(tokens); - Vector selectors; + NonnullRefPtrVector selectors; for (auto& selector_parts : comma_separated_lists) { auto stream = TokenStream(selector_parts); auto selector = parse_single_selector(stream, true); - if (selector.has_value()) - selectors.append(selector.value()); + if (selector) + selectors.append(selector.release_nonnull()); } return selectors; } template -Optional Parser::parse_single_selector(TokenStream& tokens, bool is_relative) +RefPtr Parser::parse_single_selector(TokenStream& tokens, bool is_relative) { dbgln_if(CSS_PARSER_TRACE, "Parser::parse_single_selector"); @@ -555,7 +555,7 @@ Optional Parser::parse_single_selector(TokenStream& tokens, bool is if (!is_relative) selectors.first().relation = Selector::ComplexSelector::Relation::None; - return Selector(move(selectors)); + return Selector::create(move(selectors)); } NonnullRefPtrVector Parser::consume_a_list_of_rules(bool top_level) @@ -1145,7 +1145,7 @@ RefPtr Parser::convert_to_rule(NonnullRefPtr rule) } else { auto prelude_stream = TokenStream(rule->m_prelude); - Vector selectors = parse_a_selector(prelude_stream); + auto selectors = parse_a_selector(prelude_stream); auto declaration = convert_to_declaration(*rule->m_block); if (declaration && !selectors.is_empty()) return CSSStyleRule::create(move(selectors), move(*declaration)); diff --git a/Userland/Libraries/LibWeb/CSS/Parser/Parser.h b/Userland/Libraries/LibWeb/CSS/Parser/Parser.h index 0db9a72af4..3e46103f51 100644 --- a/Userland/Libraries/LibWeb/CSS/Parser/Parser.h +++ b/Userland/Libraries/LibWeb/CSS/Parser/Parser.h @@ -8,6 +8,8 @@ #pragma once #include +#include +#include #include #include #include @@ -110,19 +112,19 @@ public: Vector> parse_as_comma_separated_list_of_component_values(TokenStream&); template - Optional parse_single_selector(TokenStream&, bool is_relative = false); + RefPtr parse_single_selector(TokenStream&, bool is_relative = false); Optional parse_nth_child_pattern(TokenStream&); // FIXME: https://www.w3.org/TR/selectors-4/ // Contrary to the name, these parse a comma-separated list of selectors, according to the spec. - Vector parse_a_selector(); + NonnullRefPtrVector parse_a_selector(); template - Vector parse_a_selector(TokenStream&); + NonnullRefPtrVector parse_a_selector(TokenStream&); - Vector parse_a_relative_selector(); + NonnullRefPtrVector parse_a_relative_selector(); template - Vector parse_a_relative_selector(TokenStream&); + NonnullRefPtrVector parse_a_relative_selector(TokenStream&); RefPtr parse_css_value(PropertyID, TokenStream&); diff --git a/Userland/Libraries/LibWeb/CSS/Selector.h b/Userland/Libraries/LibWeb/CSS/Selector.h index d9cb4c710b..b7c0f18e16 100644 --- a/Userland/Libraries/LibWeb/CSS/Selector.h +++ b/Userland/Libraries/LibWeb/CSS/Selector.h @@ -8,12 +8,13 @@ #pragma once #include +#include #include #include namespace Web::CSS { -class Selector { +class Selector : public RefCounted { public: struct SimpleSelector { enum class Type { @@ -112,7 +113,11 @@ public: CompoundSelector compound_selector; }; - explicit Selector(Vector&&); + static NonnullRefPtr create(Vector&& complex_selectors) + { + return adopt_ref(*new Selector(move(complex_selectors))); + } + ~Selector(); Vector const& complex_selectors() const { return m_complex_selectors; } @@ -120,6 +125,8 @@ public: u32 specificity() const; private: + explicit Selector(Vector&&); + Vector m_complex_selectors; }; diff --git a/Userland/Libraries/LibWeb/CSS/SelectorEngine.cpp b/Userland/Libraries/LibWeb/CSS/SelectorEngine.cpp index f94d8c425d..efd9938453 100644 --- a/Userland/Libraries/LibWeb/CSS/SelectorEngine.cpp +++ b/Userland/Libraries/LibWeb/CSS/SelectorEngine.cpp @@ -117,9 +117,9 @@ static bool matches_pseudo_class(CSS::Selector::SimpleSelector::PseudoClass cons if (pseudo_class.not_selector.is_empty()) return false; auto not_selector = Web::parse_selector(CSS::DeprecatedParsingContext(element), pseudo_class.not_selector); - if (!not_selector.has_value()) + if (!not_selector) return false; - auto not_matches = matches(not_selector.value(), element); + auto not_matches = matches(not_selector.release_nonnull(), element); return !not_matches; } case CSS::Selector::SimpleSelector::PseudoClass::Type::NthChild: diff --git a/Userland/Libraries/LibWeb/DOM/ParentNode.cpp b/Userland/Libraries/LibWeb/DOM/ParentNode.cpp index 904a1f4945..447954e6b2 100644 --- a/Userland/Libraries/LibWeb/DOM/ParentNode.cpp +++ b/Userland/Libraries/LibWeb/DOM/ParentNode.cpp @@ -14,14 +14,14 @@ namespace Web::DOM { RefPtr ParentNode::query_selector(const StringView& selector_text) { auto selector = parse_selector(CSS::DeprecatedParsingContext(*this), selector_text); - if (!selector.has_value()) + if (!selector) return {}; - dump_selector(selector.value()); + dump_selector(selector.release_nonnull()); RefPtr result; for_each_in_inclusive_subtree_of_type([&](auto& element) { - if (SelectorEngine::matches(selector.value(), element)) { + if (SelectorEngine::matches(selector.release_nonnull(), element)) { result = element; return IterationDecision::Break; } @@ -34,14 +34,14 @@ RefPtr ParentNode::query_selector(const StringView& selector_text) NonnullRefPtrVector ParentNode::query_selector_all(const StringView& selector_text) { auto selector = parse_selector(CSS::DeprecatedParsingContext(*this), selector_text); - if (!selector.has_value()) + if (!selector) return {}; - dump_selector(selector.value()); + dump_selector(selector.release_nonnull()); NonnullRefPtrVector elements; for_each_in_inclusive_subtree_of_type([&](auto& element) { - if (SelectorEngine::matches(selector.value(), element)) { + if (SelectorEngine::matches(selector.release_nonnull(), element)) { elements.append(element); } return IterationDecision::Continue;