diff --git a/Userland/Libraries/LibWeb/CSS/Parser/Parser.cpp b/Userland/Libraries/LibWeb/CSS/Parser/Parser.cpp index d56ad35bd2..008caf2783 100644 --- a/Userland/Libraries/LibWeb/CSS/Parser/Parser.cpp +++ b/Userland/Libraries/LibWeb/CSS/Parser/Parser.cpp @@ -1083,7 +1083,7 @@ Optional Parser::parse_supports_in_parens(TokenStream` if (auto general_enclosed = parse_general_enclosed(tokens); general_enclosed.has_value()) { return Supports::InParens { - .value = Supports::GeneralEnclosed {} + .value = general_enclosed.release_value() }; } diff --git a/Userland/Libraries/LibWeb/CSS/Supports.cpp b/Userland/Libraries/LibWeb/CSS/Supports.cpp index bb96088e10..3ba725be03 100644 --- a/Userland/Libraries/LibWeb/CSS/Supports.cpp +++ b/Userland/Libraries/LibWeb/CSS/Supports.cpp @@ -19,42 +19,20 @@ Supports::Supports(NonnullOwnPtr&& condition) m_matches = result == MatchResult::True; } -Supports::MatchResult Supports::Condition::evaluate() const +MatchResult Supports::Condition::evaluate() const { switch (type) { case Type::Not: return negate(children.first().evaluate()); - case Type::And: { - size_t true_results = 0; - for (auto& child : children) { - auto child_match = child.evaluate(); - if (child_match == MatchResult::False) - return MatchResult::False; - if (child_match == MatchResult::True) - true_results++; - } - if (true_results == children.size()) - return MatchResult::True; - return MatchResult::Unknown; - } - case Type::Or: { - size_t false_results = 0; - for (auto& child : children) { - auto child_match = child.evaluate(); - if (child_match == MatchResult::True) - return MatchResult::True; - if (child_match == MatchResult::False) - false_results++; - } - if (false_results == children.size()) - return MatchResult::False; - return MatchResult::Unknown; - } + case Type::And: + return evaluate_and(children, [](auto& child) { return child.evaluate(); }); + case Type::Or: + return evaluate_or(children, [](auto& child) { return child.evaluate(); }); } VERIFY_NOT_REACHED(); } -Supports::MatchResult Supports::InParens::evaluate() const +MatchResult Supports::InParens::evaluate() const { return value.visit( [&](NonnullOwnPtr& condition) { @@ -63,12 +41,12 @@ Supports::MatchResult Supports::InParens::evaluate() const [&](Feature& feature) { return feature.evaluate(); }, - [&](GeneralEnclosed&) { - return MatchResult::Unknown; + [&](GeneralEnclosed& general_enclosed) { + return general_enclosed.evaluate(); }); } -Supports::MatchResult Supports::Feature::evaluate() const +MatchResult Supports::Feature::evaluate() const { auto style_property = Parser({}, "").convert_to_style_property(declaration); if (style_property.has_value()) diff --git a/Userland/Libraries/LibWeb/CSS/Supports.h b/Userland/Libraries/LibWeb/CSS/Supports.h index 6fe96351ce..b0d1f8a5ca 100644 --- a/Userland/Libraries/LibWeb/CSS/Supports.h +++ b/Userland/Libraries/LibWeb/CSS/Supports.h @@ -11,6 +11,7 @@ #include #include #include +#include #include namespace Web::CSS { @@ -18,30 +19,7 @@ namespace Web::CSS { class Supports final : public RefCounted { friend class Parser; -private: - enum class MatchResult { - False, - True, - Unknown, - }; - - static MatchResult negate(MatchResult value) - { - switch (value) { - case MatchResult::False: - return MatchResult::True; - case MatchResult::True: - return MatchResult::False; - case MatchResult::Unknown: - return MatchResult::Unknown; - } - VERIFY_NOT_REACHED(); - } - public: - struct GeneralEnclosed { - }; - struct Feature { // FIXME: Using this internal parser class is a bit of a hack. StyleDeclarationRule declaration;