summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSam Atkins <atkinssj@serenityos.org>2021-11-24 14:12:35 +0000
committerAndreas Kling <kling@serenityos.org>2021-11-24 22:57:46 +0100
commit42176d37fce566cf0df09251e4cd11e091562458 (patch)
tree2c476fb2cd0b1f91ae66089b8219337de9853338
parentb40388584bc1f72941d8c403c8f1c69b7ff0998b (diff)
downloadserenity-42176d37fce566cf0df09251e4cd11e091562458.zip
LibWeb: Implement independent GeneralEnclosed class
This is `<general-enclosed>` in CSS grammar. It represents a section of a `@media` or `@supports` rule that exists in some future standard that we don't understand yet, but don't want to make the entire rule invalid. There's not much that it can usefully do, but we store a string representation of its contents so that it can be serialized out.
-rw-r--r--Userland/Libraries/LibWeb/CSS/GeneralEnclosed.h85
1 files changed, 85 insertions, 0 deletions
diff --git a/Userland/Libraries/LibWeb/CSS/GeneralEnclosed.h b/Userland/Libraries/LibWeb/CSS/GeneralEnclosed.h
new file mode 100644
index 0000000000..05788ca713
--- /dev/null
+++ b/Userland/Libraries/LibWeb/CSS/GeneralEnclosed.h
@@ -0,0 +1,85 @@
+/*
+ * Copyright (c) 2021, Sam Atkins <atkinssj@serenityos.org>
+ *
+ * SPDX-License-Identifier: BSD-2-Clause
+ */
+
+#pragma once
+
+#include <AK/String.h>
+
+namespace Web::CSS {
+
+// Corresponds to Kleene 3-valued logic.
+// https://www.w3.org/TR/mediaqueries-4/#evaluating
+enum class MatchResult {
+ False,
+ True,
+ Unknown,
+};
+
+inline MatchResult as_match_result(bool value)
+{
+ return value ? MatchResult::True : MatchResult::False;
+}
+
+inline 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();
+}
+
+template<typename Collection, typename Evaluate>
+inline MatchResult evaluate_and(Collection& collection, Evaluate evaluate)
+{
+ size_t true_results = 0;
+ for (auto& item : collection) {
+ auto item_match = evaluate(item);
+ if (item_match == MatchResult::False)
+ return MatchResult::False;
+ if (item_match == MatchResult::True)
+ true_results++;
+ }
+ if (true_results == collection.size())
+ return MatchResult::True;
+ return MatchResult::Unknown;
+}
+
+template<typename Collection, typename Evaluate>
+inline MatchResult evaluate_or(Collection& collection, Evaluate evaluate)
+{
+ size_t false_results = 0;
+ for (auto& item : collection) {
+ auto item_match = evaluate(item);
+ if (item_match == MatchResult::True)
+ return MatchResult::True;
+ if (item_match == MatchResult::False)
+ false_results++;
+ }
+ if (false_results == collection.size())
+ return MatchResult::False;
+ return MatchResult::Unknown;
+}
+
+// https://www.w3.org/TR/mediaqueries-4/#typedef-general-enclosed
+class GeneralEnclosed {
+public:
+ GeneralEnclosed(String serialized_contents)
+ : m_serialized_contents(move(serialized_contents))
+ {
+ }
+
+ MatchResult evaluate() const { return MatchResult::Unknown; }
+ StringView to_string() const { return m_serialized_contents.view(); }
+
+private:
+ String m_serialized_contents;
+};
+}