Title: [289706] trunk/Source/WebCore
Revision
289706
Author
[email protected]
Date
2022-02-13 04:21:50 -0800 (Sun, 13 Feb 2022)

Log Message

[CSS Container Queries] Add separate ContainerQuery and FilteredContainerQuery types
https://bugs.webkit.org/show_bug.cgi?id=236515

Reviewed by Alan Bujtas.

ContainerQuery is just a type alias to MediaQuerySet for now.
FilteredContainerQuery is a ContainerQuery plus name filter (type filter coming later).

* WebCore.xcodeproj/project.pbxproj:
* css/ContainerQuery.h: Added.

Move to a file of its own.

* css/StyleRule.cpp:
(WebCore::StyleRuleContainer::StyleRuleContainer):
(WebCore::StyleRuleContainer::create):
* css/StyleRule.h:
* style/ContainerQueryEvaluator.cpp:
(WebCore::Style::ContainerQueryEvaluator::evaluate const):
* style/ContainerQueryEvaluator.h:
* style/ElementRuleCollector.cpp:
(WebCore::Style::ElementRuleCollector::containerQueryMatches):
* style/ElementRuleCollector.h:
* style/RuleSet.h:
(WebCore::Style::RuleSet::containerQueryFor const):
* style/RuleSetBuilder.cpp:
(WebCore::Style::RuleSetBuilder::addChildRules):

Modified Paths

Added Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (289705 => 289706)


--- trunk/Source/WebCore/ChangeLog	2022-02-13 07:11:12 UTC (rev 289705)
+++ trunk/Source/WebCore/ChangeLog	2022-02-13 12:21:50 UTC (rev 289706)
@@ -1,3 +1,33 @@
+2022-02-13  Antti Koivisto  <[email protected]>
+
+        [CSS Container Queries] Add separate ContainerQuery and FilteredContainerQuery types
+        https://bugs.webkit.org/show_bug.cgi?id=236515
+
+        Reviewed by Alan Bujtas.
+
+        ContainerQuery is just a type alias to MediaQuerySet for now.
+        FilteredContainerQuery is a ContainerQuery plus name filter (type filter coming later).
+
+        * WebCore.xcodeproj/project.pbxproj:
+        * css/ContainerQuery.h: Added.
+
+        Move to a file of its own.
+
+        * css/StyleRule.cpp:
+        (WebCore::StyleRuleContainer::StyleRuleContainer):
+        (WebCore::StyleRuleContainer::create):
+        * css/StyleRule.h:
+        * style/ContainerQueryEvaluator.cpp:
+        (WebCore::Style::ContainerQueryEvaluator::evaluate const):
+        * style/ContainerQueryEvaluator.h:
+        * style/ElementRuleCollector.cpp:
+        (WebCore::Style::ElementRuleCollector::containerQueryMatches):
+        * style/ElementRuleCollector.h:
+        * style/RuleSet.h:
+        (WebCore::Style::RuleSet::containerQueryFor const):
+        * style/RuleSetBuilder.cpp:
+        (WebCore::Style::RuleSetBuilder::addChildRules):
+
 2022-02-12  Eric Carlson  <[email protected]>
 
         [macOS] Use system window and screen picker when available

Modified: trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj (289705 => 289706)


--- trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj	2022-02-13 07:11:12 UTC (rev 289705)
+++ trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj	2022-02-13 12:21:50 UTC (rev 289706)
@@ -5428,6 +5428,7 @@
 		E4E94D6122FF158A00DD191F /* LegacyLineLayout.h in Headers */ = {isa = PBXBuildFile; fileRef = E4A1AC7822FAFD500017B75B /* LegacyLineLayout.h */; settings = {ATTRIBUTES = (Private, ); }; };
 		E4ED3ECC2768A51D00F17AC8 /* HasSelectorFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = E4ED3ECA2768A51C00F17AC8 /* HasSelectorFilter.h */; };
 		E4F0BE3125712F6E009E7431 /* CaretRectComputation.h in Headers */ = {isa = PBXBuildFile; fileRef = E4F0BE2E25710A75009E7431 /* CaretRectComputation.h */; };
+		E4F1573927B9261500B330D8 /* ContainerQuery.h in Headers */ = {isa = PBXBuildFile; fileRef = E4F1573227B6991F00B330D8 /* ContainerQuery.h */; settings = {ATTRIBUTES = (Private, ); }; };
 		E4F38D1B2626F13B007B1064 /* DefaultResourceLoadPriority.h in Headers */ = {isa = PBXBuildFile; fileRef = E4F38D192626F13B007B1064 /* DefaultResourceLoadPriority.h */; };
 		E4F819C626FB4EBF0094E162 /* InlineBoxPainter.h in Headers */ = {isa = PBXBuildFile; fileRef = E4F819C526FB4EBF0094E162 /* InlineBoxPainter.h */; };
 		E4F9EEF3156DA00700D23E7E /* StyleSheetContents.h in Headers */ = {isa = PBXBuildFile; fileRef = E4F9EEF1156D84C400D23E7E /* StyleSheetContents.h */; settings = {ATTRIBUTES = (Private, ); }; };
@@ -17609,6 +17610,7 @@
 		E4ED3ECD2768A68800F17AC8 /* HasSelectorFilter.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = HasSelectorFilter.cpp; sourceTree = "<group>"; };
 		E4F0BE2E25710A75009E7431 /* CaretRectComputation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CaretRectComputation.h; sourceTree = "<group>"; };
 		E4F0BE3025710A76009E7431 /* CaretRectComputation.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = CaretRectComputation.cpp; sourceTree = "<group>"; };
+		E4F1573227B6991F00B330D8 /* ContainerQuery.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ContainerQuery.h; sourceTree = "<group>"; };
 		E4F38D192626F13B007B1064 /* DefaultResourceLoadPriority.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DefaultResourceLoadPriority.h; sourceTree = "<group>"; };
 		E4F38D1C2626F144007B1064 /* DefaultResourceLoadPriority.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = DefaultResourceLoadPriority.cpp; sourceTree = "<group>"; };
 		E4F819C226FB4EAF0094E162 /* InlineBoxPainter.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = InlineBoxPainter.cpp; sourceTree = "<group>"; };
@@ -31593,6 +31595,7 @@
 				4BAFD0DA21921EAD00C0AB64 /* typedom */,
 				FBD6AF8415EF21D4008B7110 /* BasicShapeFunctions.cpp */,
 				FBD6AF8515EF21D4008B7110 /* BasicShapeFunctions.h */,
+				E4F1573227B6991F00B330D8 /* ContainerQuery.h */,
 				A80E6CDA0A1989CA007FB8C5 /* Counter.h */,
 				CAE9F90D146441F000C245B0 /* CSSAspectRatioValue.cpp */,
 				CAE9F90E146441F000C245B0 /* CSSAspectRatioValue.h */,
@@ -37185,6 +37188,7 @@
 				E45322AC140CE267005A0F92 /* SelectorQuery.h in Headers */,
 				F4D43D662188038B00ECECAC /* SerializedAttachmentData.h in Headers */,
 				E18DF33518AAF12C00773E59 /* SerializedCryptoKeyWrap.h in Headers */,
+				E4F1573927B9261500B330D8 /* ContainerQuery.h in Headers */,
 				077AF14018F4AE400001ED61 /* SerializedPlatformDataCue.h in Headers */,
 				077AF14318F4B1BB0001ED61 /* SerializedPlatformDataCueMac.h in Headers */,
 				076D1C1F23F6EB5B00D95B06 /* SerializedPlatformDataCueValue.h in Headers */,

Added: trunk/Source/WebCore/css/ContainerQuery.h (0 => 289706)


--- trunk/Source/WebCore/css/ContainerQuery.h	                        (rev 0)
+++ trunk/Source/WebCore/css/ContainerQuery.h	2022-02-13 12:21:50 UTC (rev 289706)
@@ -0,0 +1,40 @@
+/*
+ * Copyright (C) 2022 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#pragma once
+
+#include <wtf/text/AtomString.h>
+
+namespace WebCore {
+
+class MediaQuerySet;
+
+using ContainerQuery = MediaQuerySet;
+
+struct FilteredContainerQuery {
+    AtomString nameFilter;
+    Ref<ContainerQuery> query;
+};
+
+}

Modified: trunk/Source/WebCore/css/StyleRule.cpp (289705 => 289706)


--- trunk/Source/WebCore/css/StyleRule.cpp	2022-02-13 07:11:12 UTC (rev 289705)
+++ trunk/Source/WebCore/css/StyleRule.cpp	2022-02-13 12:21:50 UTC (rev 289706)
@@ -536,30 +536,30 @@
     return adoptRef(*new StyleRuleLayer(WTFMove(name), WTFMove(rules)));
 }
 
-StyleRuleContainer::StyleRuleContainer(ContainerQuery&& query, Vector<RefPtr<StyleRuleBase>>&& rules)
+StyleRuleContainer::StyleRuleContainer(FilteredContainerQuery&& query, Vector<RefPtr<StyleRuleBase>>&& rules)
     : StyleRuleGroup(StyleRuleType::Container, WTFMove(rules))
-    , m_query(WTFMove(query))
+    , m_filteredQuery(WTFMove(query))
 {
 }
 
-StyleRuleContainer::StyleRuleContainer(ContainerQuery&& query, std::unique_ptr<DeferredStyleGroupRuleList>&& rules)
+StyleRuleContainer::StyleRuleContainer(FilteredContainerQuery&& query, std::unique_ptr<DeferredStyleGroupRuleList>&& rules)
     : StyleRuleGroup(StyleRuleType::Container, WTFMove(rules))
-    , m_query(WTFMove(query))
+    , m_filteredQuery(WTFMove(query))
 {
 }
 
 StyleRuleContainer::StyleRuleContainer(const StyleRuleContainer& other)
     : StyleRuleGroup(other)
-    , m_query(other.m_query)
+    , m_filteredQuery(other.m_filteredQuery)
 {
 }
 
-Ref<StyleRuleContainer> StyleRuleContainer::create(ContainerQuery&& query, Vector<RefPtr<StyleRuleBase>>&& rules)
+Ref<StyleRuleContainer> StyleRuleContainer::create(FilteredContainerQuery&& query, Vector<RefPtr<StyleRuleBase>>&& rules)
 {
     return adoptRef(*new StyleRuleContainer(WTFMove(query), WTFMove(rules)));
 }
 
-Ref<StyleRuleContainer> StyleRuleContainer::create(ContainerQuery&& query, std::unique_ptr<DeferredStyleGroupRuleList>&& rules)
+Ref<StyleRuleContainer> StyleRuleContainer::create(FilteredContainerQuery&& query, std::unique_ptr<DeferredStyleGroupRuleList>&& rules)
 {
     return adoptRef(*new StyleRuleContainer(WTFMove(query), WTFMove(rules)));
 }

Modified: trunk/Source/WebCore/css/StyleRule.h (289705 => 289706)


--- trunk/Source/WebCore/css/StyleRule.h	2022-02-13 07:11:12 UTC (rev 289705)
+++ trunk/Source/WebCore/css/StyleRule.h	2022-02-13 12:21:50 UTC (rev 289706)
@@ -23,6 +23,7 @@
 
 #include "CSSSelectorList.h"
 #include "CompiledSelector.h"
+#include "ContainerQuery.h"
 #include "FontPaletteValues.h"
 #include "StyleProperties.h"
 #include "StyleRuleType.h"
@@ -314,25 +315,20 @@
     std::variant<CascadeLayerName, Vector<CascadeLayerName>> m_nameVariant;
 };
 
-struct ContainerQuery {
-    AtomString containerName;
-    Ref<MediaQuerySet> query;
-};
-
 class StyleRuleContainer final : public StyleRuleGroup {
 public:
-    static Ref<StyleRuleContainer> create(ContainerQuery&&, Vector<RefPtr<StyleRuleBase>>&&);
-    static Ref<StyleRuleContainer> create(ContainerQuery&&, std::unique_ptr<DeferredStyleGroupRuleList>&&);
+    static Ref<StyleRuleContainer> create(FilteredContainerQuery&&, Vector<RefPtr<StyleRuleBase>>&&);
+    static Ref<StyleRuleContainer> create(FilteredContainerQuery&&, std::unique_ptr<DeferredStyleGroupRuleList>&&);
     Ref<StyleRuleContainer> copy() const { return adoptRef(*new StyleRuleContainer(*this)); }
 
-    const ContainerQuery& query() const { return m_query; }
+    const FilteredContainerQuery& filteredQuery() const { return m_filteredQuery; }
 
 private:
-    StyleRuleContainer(ContainerQuery&&, Vector<RefPtr<StyleRuleBase>>&&);
-    StyleRuleContainer(ContainerQuery&&, std::unique_ptr<DeferredStyleGroupRuleList>&&);
+    StyleRuleContainer(FilteredContainerQuery&&, Vector<RefPtr<StyleRuleBase>>&&);
+    StyleRuleContainer(FilteredContainerQuery&&, std::unique_ptr<DeferredStyleGroupRuleList>&&);
     StyleRuleContainer(const StyleRuleContainer&);
 
-    ContainerQuery m_query;
+    FilteredContainerQuery m_filteredQuery;
 };
 
 // This is only used by the CSS parser.

Modified: trunk/Source/WebCore/style/ContainerQueryEvaluator.cpp (289705 => 289706)


--- trunk/Source/WebCore/style/ContainerQueryEvaluator.cpp	2022-02-13 07:11:12 UTC (rev 289705)
+++ trunk/Source/WebCore/style/ContainerQueryEvaluator.cpp	2022-02-13 12:21:50 UTC (rev 289706)
@@ -59,25 +59,26 @@
 
 enum class Comparator { Lesser, Greater, LesserOrEqual, GreaterOrEqual, Equal, True };
 
-bool ContainerQueryEvaluator::evaluate(const ContainerQuery& containerQuery) const
+bool ContainerQueryEvaluator::evaluate(const FilteredContainerQuery& filteredContainerQuery) const
 {
     if (m_containers.isEmpty())
         return false;
 
-    auto rendererForContainerSelector = [&]() -> RenderBox* {
+    auto containerRendererForFilter = [&]() -> RenderBox* {
         for (auto& container : makeReversedRange(m_containers)) {
             auto* renderer = dynamicDowncast<RenderBox>(container->renderer());
             if (!renderer)
                 return nullptr;
-            if (containerQuery.containerName.isEmpty())
+            if (filteredContainerQuery.nameFilter.isEmpty())
                 return renderer;
-            if (renderer->style().containerNames().contains(containerQuery.containerName))
+            // FIXME: Support type filter.
+            if (renderer->style().containerNames().contains(filteredContainerQuery.nameFilter))
                 return renderer;
         }
         return nullptr;
     };
 
-    auto* renderer = rendererForContainerSelector();
+    auto* renderer = containerRendererForFilter();
     if (!renderer)
         return false;
 
@@ -129,7 +130,7 @@
     bool result = false;
 
     // FIXME: This is very rudimentary.
-    auto& queries = containerQuery.query->queryVector();
+    auto& queries = filteredContainerQuery.query->queryVector();
     for (auto& query : queries) {
         for (auto& _expression_ : query.expressions()) {
             if (_expression_.mediaFeature() == MediaFeatureNames::minWidth) {

Modified: trunk/Source/WebCore/style/ContainerQueryEvaluator.h (289705 => 289706)


--- trunk/Source/WebCore/style/ContainerQueryEvaluator.h	2022-02-13 07:11:12 UTC (rev 289705)
+++ trunk/Source/WebCore/style/ContainerQueryEvaluator.h	2022-02-13 12:21:50 UTC (rev 289706)
@@ -28,7 +28,7 @@
 
 namespace WebCore {
 
-struct ContainerQuery;
+struct FilteredContainerQuery;
 class Element;
 
 namespace Style {
@@ -37,7 +37,7 @@
 public:
     ContainerQueryEvaluator(const Vector<Ref<const Element>>& containers);
 
-    bool evaluate(const ContainerQuery&) const;
+    bool evaluate(const FilteredContainerQuery&) const;
 
 private:
     const Vector<Ref<const Element>>& m_containers;

Modified: trunk/Source/WebCore/style/ElementRuleCollector.cpp (289705 => 289706)


--- trunk/Source/WebCore/style/ElementRuleCollector.cpp	2022-02-13 07:11:12 UTC (rev 289705)
+++ trunk/Source/WebCore/style/ElementRuleCollector.cpp	2022-02-13 12:21:50 UTC (rev 289706)
@@ -505,7 +505,7 @@
     }
 }
 
-bool ElementRuleCollector::containerQueryMatches(const ContainerQuery& query)
+bool ElementRuleCollector::containerQueryMatches(const FilteredContainerQuery& query)
 {
     if (!m_selectorMatchingState)
         return true;

Modified: trunk/Source/WebCore/style/ElementRuleCollector.h (289705 => 289706)


--- trunk/Source/WebCore/style/ElementRuleCollector.h	2022-02-13 07:11:12 UTC (rev 289705)
+++ trunk/Source/WebCore/style/ElementRuleCollector.h	2022-02-13 12:21:50 UTC (rev 289706)
@@ -112,7 +112,7 @@
     void collectMatchingRules(const MatchRequest&);
     void collectMatchingRulesForList(const RuleSet::RuleDataVector*, const MatchRequest&);
     bool ruleMatches(const RuleData&, unsigned& specificity, ScopeOrdinal);
-    bool containerQueryMatches(const ContainerQuery&);
+    bool containerQueryMatches(const FilteredContainerQuery&);
 
     void sortMatchedRules();
 

Modified: trunk/Source/WebCore/style/RuleSet.h (289705 => 289706)


--- trunk/Source/WebCore/style/RuleSet.h	2022-02-13 07:11:12 UTC (rev 289705)
+++ trunk/Source/WebCore/style/RuleSet.h	2022-02-13 12:21:50 UTC (rev 289706)
@@ -108,7 +108,7 @@
     static constexpr auto cascadeLayerPriorityForUnlayered = std::numeric_limits<CascadeLayerPriority>::max();
 
     CascadeLayerPriority cascadeLayerPriorityFor(const RuleData&) const;
-    const ContainerQuery* containerQueryFor(const RuleData&) const;
+    const FilteredContainerQuery* containerQueryFor(const RuleData&) const;
 
 private:
     friend class RuleSetBuilder;
@@ -144,7 +144,7 @@
     CascadeLayerPriority cascadeLayerPriorityForIdentifier(CascadeLayerIdentifier) const;
 
     struct ContainerQueryAndParent {
-        ContainerQuery query;
+        FilteredContainerQuery query;
         ContainerQueryIdentifier parent;
     };
 
@@ -221,7 +221,7 @@
     return cascadeLayerPriorityForIdentifier(identifier);
 }
 
-inline const ContainerQuery* RuleSet::containerQueryFor(const RuleData& ruleData) const
+inline const FilteredContainerQuery* RuleSet::containerQueryFor(const RuleData& ruleData) const
 {
     if (m_containerQueryIdentifierForRulePosition.size() <= ruleData.position())
         return nullptr;

Modified: trunk/Source/WebCore/style/RuleSetBuilder.cpp (289705 => 289706)


--- trunk/Source/WebCore/style/RuleSetBuilder.cpp	2022-02-13 07:11:12 UTC (rev 289705)
+++ trunk/Source/WebCore/style/RuleSetBuilder.cpp	2022-02-13 12:21:50 UTC (rev 289706)
@@ -113,7 +113,7 @@
             auto& containerRule = downcast<StyleRuleContainer>(*rule);
             auto previousContainerQueryIdentifier = m_currentContainerQueryIdentifier;
             if (m_ruleSet) {
-                m_ruleSet->m_containerQueries.append({ containerRule.query(), previousContainerQueryIdentifier });
+                m_ruleSet->m_containerQueries.append({ containerRule.filteredQuery(), previousContainerQueryIdentifier });
                 m_currentContainerQueryIdentifier = m_ruleSet->m_containerQueries.size();
             }
             addChildRules(containerRule.childRules());
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to