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());