Kaynağa Gözat

LibWeb: Use new GeneralEnclosed class in Supports

Sam Atkins 3 yıl önce
ebeveyn
işleme
99e18f40fb

+ 1 - 1
Userland/Libraries/LibWeb/CSS/Parser/Parser.cpp

@@ -1083,7 +1083,7 @@ Optional<Supports::InParens> Parser::parse_supports_in_parens(TokenStream<StyleC
     // `<general-enclosed>`
     if (auto general_enclosed = parse_general_enclosed(tokens); general_enclosed.has_value()) {
         return Supports::InParens {
-            .value = Supports::GeneralEnclosed {}
+            .value = general_enclosed.release_value()
         };
     }
 

+ 9 - 31
Userland/Libraries/LibWeb/CSS/Supports.cpp

@@ -19,42 +19,20 @@ Supports::Supports(NonnullOwnPtr<Condition>&& 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>& 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())

+ 1 - 23
Userland/Libraries/LibWeb/CSS/Supports.h

@@ -11,6 +11,7 @@
 #include <AK/String.h>
 #include <AK/Variant.h>
 #include <AK/Vector.h>
+#include <LibWeb/CSS/GeneralEnclosed.h>
 #include <LibWeb/CSS/Parser/StyleDeclarationRule.h>
 
 namespace Web::CSS {
@@ -18,30 +19,7 @@ namespace Web::CSS {
 class Supports final : public RefCounted<Supports> {
     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;