[CSS Container Queries] Basic support for container units
[webkit.git] / Source / WebCore / style / ContainerQueryEvaluator.h
blobc5b9e438292afa429e35fcbc3c90c4bf0dc7922b
1 /*
2 * Copyright (C) 2022 Apple Inc. All rights reserved.
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
6 * are met:
7 * 1. Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
13 * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY
14 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
15 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
16 * DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY
17 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
18 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
19 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
20 * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
21 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
22 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25 #pragma once
27 #include "ContainerQuery.h"
28 #include "SelectorMatchingState.h"
29 #include <wtf/Ref.h>
31 namespace WebCore {
33 class Element;
35 namespace Style {
37 enum class EvaluationResult : uint8_t { False, True, Unknown };
39 class ContainerQueryEvaluator {
40 public:
41 ContainerQueryEvaluator(const Element&, PseudoId, SelectorMatchingState*);
43 bool evaluate(const FilteredContainerQuery&) const;
45 static const Element* selectContainer(OptionSet<CQ::Axis>, const String& name, const Element&, const CachedQueryContainers*, PseudoId = PseudoId::None);
47 private:
48 struct SelectedContainer;
49 std::optional<SelectedContainer> selectContainer(const FilteredContainerQuery&) const;
51 EvaluationResult evaluateQuery(const CQ::ContainerQuery&, const SelectedContainer&) const;
52 EvaluationResult evaluateQuery(const CQ::SizeQuery&, const SelectedContainer&) const;
53 template<typename ConditionType> EvaluationResult evaluateCondition(const ConditionType&, const SelectedContainer&) const;
54 EvaluationResult evaluateSizeFeature(const CQ::SizeFeature&, const SelectedContainer&) const;
56 const Ref<const Element> m_element;
57 const PseudoId m_pseudoId;
58 SelectorMatchingState* m_selectorMatchingState;
61 inline EvaluationResult toEvaluationResult(bool boolean)
63 return boolean ? EvaluationResult::True : EvaluationResult::False;
66 inline EvaluationResult operator&(EvaluationResult left, EvaluationResult right)
68 if (left == EvaluationResult::Unknown || right == EvaluationResult::Unknown)
69 return EvaluationResult::Unknown;
70 if (left == EvaluationResult::True && right == EvaluationResult::True)
71 return EvaluationResult::True;
72 return EvaluationResult::False;
75 inline EvaluationResult operator!(EvaluationResult result)
77 switch (result) {
78 case EvaluationResult::True:
79 return EvaluationResult::False;
80 case EvaluationResult::False:
81 return EvaluationResult::True;
82 case EvaluationResult::Unknown:
83 return EvaluationResult::Unknown;
85 RELEASE_ASSERT_NOT_REACHED();