From 42176d37fce566cf0df09251e4cd11e091562458 Mon Sep 17 00:00:00 2001 From: Sam Atkins Date: Wed, 24 Nov 2021 14:12:35 +0000 Subject: [PATCH] LibWeb: Implement independent GeneralEnclosed class This is `` 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. --- .../Libraries/LibWeb/CSS/GeneralEnclosed.h | 85 +++++++++++++++++++ 1 file changed, 85 insertions(+) create mode 100644 Userland/Libraries/LibWeb/CSS/GeneralEnclosed.h 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 + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#pragma once + +#include + +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 +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 +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; +}; +}