WebKit Bugzilla
New
Browse
Search+
Log In
×
Sign in with GitHub
or
Remember my login
Create Account
·
Forgot Password
Forgotten password account recovery
[patch]
Patch
bug-243449-20220802130515.patch (text/plain), 43.11 KB, created by
Antti Koivisto
on 2022-08-02 03:05:17 PDT
(
hide
)
Description:
Patch
Filename:
MIME Type:
Creator:
Antti Koivisto
Created:
2022-08-02 03:05:17 PDT
Size:
43.11 KB
patch
obsolete
>From 7f345678b53d2c3b6965c2b46d151f175ce8b3d2 Mon Sep 17 00:00:00 2001 >From: Antti Koivisto <antti@apple.com> >Date: Tue, 2 Aug 2022 12:53:09 +0300 >Subject: [PATCH] [CSS Container Queries] Update query grammar to the spec > https://bugs.webkit.org/show_bug.cgi?id=243449 <rdar://97967682> > >Reviewed by NOBODY (OOPS!). > >The spec was changed to allow logical operators on top level without parenthesis making > >@container not (foo) > >legal. > >https://drafts.csswg.org/css-contain-3/#container-rule > >* LayoutTests/imported/w3c/web-platform-tests/css/css-contain/container-queries/at-container-parsing-expected.txt: >* LayoutTests/imported/w3c/web-platform-tests/css/css-contain/container-queries/at-container-parsing.html: >* LayoutTests/imported/w3c/web-platform-tests/css/css-contain/container-queries/crashtests/chrome-bug-1346969-crash.html: Added. >* LayoutTests/imported/w3c/web-platform-tests/css/css-contain/container-queries/crashtests/chrome-remove-insert-evaluator-crash.html: Added. >* LayoutTests/imported/w3c/web-platform-tests/css/css-contain/container-queries/crashtests/w3c-import.log: >* Source/WebCore/css/CSSContainerRule.cpp: >(WebCore::CSSContainerRule::cssText const): > >Factor query serialization to a function in CQ namespace. > >(WebCore::CSSContainerRule::conditionText const): >(WebCore::CSSContainerRule::nameText const): >(WebCore::CSSContainerRule::nameFilterText const): Deleted. >* Source/WebCore/css/CSSContainerRule.h: >* Source/WebCore/css/ContainerQuery.cpp: >(WebCore::CQ::serialize): >(WebCore::serialize): Deleted. >* Source/WebCore/css/ContainerQuery.h: > >Update to the spec grammar and terminology. >ContainerQuery now includes the name part and replaces FilteredContainerQuery. >QueryInParens replaces ContainerQuery. >Also move ContainerQuery to CQ namespace. > >* Source/WebCore/css/ContainerQueryParser.cpp: >(WebCore::ContainerQueryParser::consumeContainerQuery): >(WebCore::ContainerQueryParser::consumeQueryInParens): >(WebCore::ContainerQueryParser::consumeCondition): >(WebCore::ContainerQueryParser::consumeFilteredContainerQuery): Deleted. >* Source/WebCore/css/ContainerQueryParser.h: >* Source/WebCore/css/StyleRule.cpp: >(WebCore::StyleRuleContainer::StyleRuleContainer): >(WebCore::StyleRuleContainer::create): >* Source/WebCore/css/StyleRule.h: >* Source/WebCore/css/parser/CSSParserImpl.cpp: >(WebCore::CSSParserImpl::consumeContainerRule): >* Source/WebCore/inspector/InspectorStyleSheet.cpp: >(WebCore::buildArrayForGroupings): >* Source/WebCore/style/ContainerQueryEvaluator.cpp: >(WebCore::Style::ContainerQueryEvaluator::evaluate const): >(WebCore::Style::ContainerQueryEvaluator::selectContainer const): >(WebCore::Style::ContainerQueryEvaluator::evaluateQueryInParens const): >(WebCore::Style::ContainerQueryEvaluator::evaluateCondition const): >(WebCore::Style::ContainerQueryEvaluator::evaluateQuery const): Deleted. >* Source/WebCore/style/ContainerQueryEvaluator.h: >* Source/WebCore/style/RuleSet.h: >(WebCore::Style:: const): >--- > Source/WebCore/css/CSSContainerRule.cpp | 14 +- > Source/WebCore/css/CSSContainerRule.h | 2 +- > Source/WebCore/css/ContainerQuery.cpp | 16 +- > Source/WebCore/css/ContainerQuery.h | 21 +- > Source/WebCore/css/ContainerQueryParser.cpp | 16 +- > Source/WebCore/css/ContainerQueryParser.h | 4 +- > Source/WebCore/css/StyleRule.cpp | 8 +- > Source/WebCore/css/StyleRule.h | 8 +- > Source/WebCore/css/parser/CSSParserImpl.cpp | 2 +- > .../WebCore/inspector/InspectorStyleSheet.cpp | 6 +- > .../WebCore/style/ContainerQueryEvaluator.cpp | 20 +- > .../WebCore/style/ContainerQueryEvaluator.h | 6 +- > Source/WebCore/style/RuleSet.h | 8 +- > .../at-container-parsing-expected.txt | 54 ++-- > .../at-container-parsing.html | 285 +++++++++--------- > .../crashtests/chrome-bug-1346969-crash.html | 14 + > .../chrome-remove-insert-evaluator-crash.html | 15 + > .../crashtests/w3c-import.log | 2 + > 18 files changed, 274 insertions(+), 227 deletions(-) > create mode 100644 LayoutTests/imported/w3c/web-platform-tests/css/css-contain/container-queries/crashtests/chrome-bug-1346969-crash.html > create mode 100644 LayoutTests/imported/w3c/web-platform-tests/css/css-contain/container-queries/crashtests/chrome-remove-insert-evaluator-crash.html > >diff --git a/Source/WebCore/css/CSSContainerRule.cpp b/Source/WebCore/css/CSSContainerRule.cpp >index 2150a03aa59f..81be0f6a6514 100644 >--- a/Source/WebCore/css/CSSContainerRule.cpp >+++ b/Source/WebCore/css/CSSContainerRule.cpp >@@ -54,13 +54,7 @@ String CSSContainerRule::cssText() const > > builder.append("@container "); > >- auto name = styleRuleContainer().filteredQuery().nameFilter; >- if (!name.isEmpty()) { >- serializeIdentifier(name, builder); >- builder.append(' '); >- } >- >- serialize(builder, styleRuleContainer().filteredQuery().query); >+ CQ::serialize(builder, styleRuleContainer().containerQuery()); > > builder.append(" {\n"); > appendCSSTextForItems(builder); >@@ -72,15 +66,15 @@ String CSSContainerRule::cssText() const > String CSSContainerRule::conditionText() const > { > StringBuilder builder; >- serialize(builder, styleRuleContainer().filteredQuery().query); >+ CQ::serialize(builder, styleRuleContainer().containerQuery().condition); > return builder.toString(); > } > >-String CSSContainerRule::nameFilterText() const >+String CSSContainerRule::nameText() const > { > StringBuilder builder; > >- auto name = styleRuleContainer().filteredQuery().nameFilter; >+ auto name = styleRuleContainer().containerQuery().name; > if (!name.isEmpty()) > serializeIdentifier(name, builder); > >diff --git a/Source/WebCore/css/CSSContainerRule.h b/Source/WebCore/css/CSSContainerRule.h >index 5c95325852ea..1ec64f12aacc 100644 >--- a/Source/WebCore/css/CSSContainerRule.h >+++ b/Source/WebCore/css/CSSContainerRule.h >@@ -37,7 +37,7 @@ public: > > String cssText() const final; > String conditionText() const final; >- String nameFilterText() const; >+ String nameText() const; > > private: > const StyleRuleContainer& styleRuleContainer() const; >diff --git a/Source/WebCore/css/ContainerQuery.cpp b/Source/WebCore/css/ContainerQuery.cpp >index 385fedf3fdd9..103460918f80 100644 >--- a/Source/WebCore/css/ContainerQuery.cpp >+++ b/Source/WebCore/css/ContainerQuery.cpp >@@ -90,9 +90,9 @@ OptionSet<Axis> requiredAxesForFeature(const AtomString& featureName) > void serialize(StringBuilder&, const SizeFeature&); > template<typename ConditionType> void serialize(StringBuilder&, const ConditionType&); > >-static void serialize(StringBuilder& builder, const ContainerQuery& containerQuery) >+static void serialize(StringBuilder& builder, const QueryInParens& query) > { >- WTF::switchOn(containerQuery, [&](auto& node) { >+ WTF::switchOn(query, [&](auto& node) { > builder.append('('); > serialize(builder, node); > builder.append(')'); >@@ -186,12 +186,22 @@ void serialize(StringBuilder& builder, const ConditionType& condition) > } > } > >+void serialize(StringBuilder& builder, const ContainerCondition& condition) >+{ >+ serialize<ContainerCondition>(builder, condition); > } > > void serialize(StringBuilder& builder, const ContainerQuery& query) > { >- CQ::serialize(builder, query); >+ auto name = query.name; >+ if (!name.isEmpty()) { >+ serializeIdentifier(name, builder); >+ builder.append(' '); >+ } >+ >+ serialize<ContainerCondition>(builder, query.condition); > } > > } >+} > >diff --git a/Source/WebCore/css/ContainerQuery.h b/Source/WebCore/css/ContainerQuery.h >index 58e69f9c981d..d118293b3e07 100644 >--- a/Source/WebCore/css/ContainerQuery.h >+++ b/Source/WebCore/css/ContainerQuery.h >@@ -44,7 +44,7 @@ struct UnknownQuery { > String text; > }; > >-using ContainerQuery = std::variant<ContainerCondition, SizeFeature, UnknownQuery>; >+using QueryInParens = std::variant<ContainerCondition, SizeFeature, UnknownQuery>; > > enum class LogicalOperator : uint8_t { And, Or, Not }; > enum class ComparisonOperator : uint8_t { LessThan, LessThanOrEqual, Equal, GreaterThan, GreaterThanOrEqual }; >@@ -52,7 +52,7 @@ enum class Syntax : uint8_t { Boolean, Colon, Range }; > > struct ContainerCondition { > LogicalOperator logicalOperator { LogicalOperator::And }; >- Vector<ContainerQuery> queries; >+ Vector<QueryInParens> queries; > }; > > struct Comparison { >@@ -84,18 +84,17 @@ enum class Axis : uint8_t { > }; > OptionSet<Axis> requiredAxesForFeature(const AtomString&); > >-} >- >-using ContainerQuery = CQ::ContainerQuery; >- >-struct FilteredContainerQuery { >- AtomString nameFilter; >+struct ContainerQuery { >+ AtomString name; > OptionSet<CQ::Axis> axisFilter; >- ContainerQuery query; >+ CQ::ContainerCondition condition; > }; > >-using CachedQueryContainers = Vector<Ref<const Element>>; >- >+void serialize(StringBuilder&, const ContainerCondition&); > void serialize(StringBuilder&, const ContainerQuery&); > > } >+ >+using CachedQueryContainers = Vector<Ref<const Element>>; >+ >+} >diff --git a/Source/WebCore/css/ContainerQueryParser.cpp b/Source/WebCore/css/ContainerQueryParser.cpp >index 41131d535651..4589babad1d1 100644 >--- a/Source/WebCore/css/ContainerQueryParser.cpp >+++ b/Source/WebCore/css/ContainerQueryParser.cpp >@@ -30,13 +30,13 @@ > > namespace WebCore { > >-std::optional<FilteredContainerQuery> ContainerQueryParser::consumeFilteredContainerQuery(CSSParserTokenRange& range, const CSSParserContext& context) >+std::optional<CQ::ContainerQuery> ContainerQueryParser::consumeContainerQuery(CSSParserTokenRange& range, const CSSParserContext& context) > { > ContainerQueryParser parser(context); >- return parser.consumeFilteredContainerQuery(range); >+ return parser.consumeContainerQuery(range); > } > >-std::optional<FilteredContainerQuery> ContainerQueryParser::consumeFilteredContainerQuery(CSSParserTokenRange& range) >+std::optional<CQ::ContainerQuery> ContainerQueryParser::consumeContainerQuery(CSSParserTokenRange& range) > { > auto consumeName = [&] { > if (range.peek().type() == LeftParenthesisToken || range.peek().type() == FunctionToken) >@@ -51,14 +51,14 @@ std::optional<FilteredContainerQuery> ContainerQueryParser::consumeFilteredConta > > m_requiredAxes = { }; > >- auto query = consumeContainerQuery(range); >- if (!query) >+ auto condition = consumeCondition<CQ::ContainerCondition>(range); >+ if (!condition) > return { }; > >- return FilteredContainerQuery { name, m_requiredAxes, *query }; >+ return CQ::ContainerQuery { name, m_requiredAxes, *condition }; > } > >-std::optional<CQ::ContainerQuery> ContainerQueryParser::consumeContainerQuery(CSSParserTokenRange& range) >+std::optional<CQ::QueryInParens> ContainerQueryParser::consumeQueryInParens(CSSParserTokenRange& range) > { > if (range.peek().type() == FunctionToken) { > auto name = range.peek().value(); >@@ -92,7 +92,7 @@ std::optional<ConditionType> ContainerQueryParser::consumeCondition(CSSParserTok > { > auto consumeQuery = [&](CSSParserTokenRange& range) { > if constexpr (std::is_same_v<CQ::ContainerCondition, ConditionType>) >- return consumeContainerQuery(range); >+ return consumeQueryInParens(range); > // Style query support would be here. > }; > >diff --git a/Source/WebCore/css/ContainerQueryParser.h b/Source/WebCore/css/ContainerQueryParser.h >index 85c6bb875a03..de7add5cb781 100644 >--- a/Source/WebCore/css/ContainerQueryParser.h >+++ b/Source/WebCore/css/ContainerQueryParser.h >@@ -34,11 +34,11 @@ class CSSParserTokenRange; > > class ContainerQueryParser { > public: >- static std::optional<FilteredContainerQuery> consumeFilteredContainerQuery(CSSParserTokenRange&, const CSSParserContext&); >+ static std::optional<CQ::ContainerQuery> consumeContainerQuery(CSSParserTokenRange&, const CSSParserContext&); > > private: >- std::optional<FilteredContainerQuery> consumeFilteredContainerQuery(CSSParserTokenRange&); > std::optional<CQ::ContainerQuery> consumeContainerQuery(CSSParserTokenRange&); >+ std::optional<CQ::QueryInParens> consumeQueryInParens(CSSParserTokenRange&); > template<typename ConditionType> std::optional<ConditionType> consumeCondition(CSSParserTokenRange&); > std::optional<CQ::SizeFeature> consumeSizeFeature(CSSParserTokenRange&); > std::optional<CQ::SizeFeature> consumePlainSizeFeature(CSSParserTokenRange&); >diff --git a/Source/WebCore/css/StyleRule.cpp b/Source/WebCore/css/StyleRule.cpp >index f8dcdb7e4b32..9cb47b5e2e17 100644 >--- a/Source/WebCore/css/StyleRule.cpp >+++ b/Source/WebCore/css/StyleRule.cpp >@@ -455,19 +455,19 @@ Ref<StyleRuleLayer> StyleRuleLayer::createBlock(CascadeLayerName&& name, Vector< > return adoptRef(*new StyleRuleLayer(WTFMove(name), WTFMove(rules))); > } > >-StyleRuleContainer::StyleRuleContainer(FilteredContainerQuery&& query, Vector<RefPtr<StyleRuleBase>>&& rules) >+StyleRuleContainer::StyleRuleContainer(CQ::ContainerQuery&& query, Vector<RefPtr<StyleRuleBase>>&& rules) > : StyleRuleGroup(StyleRuleType::Container, WTFMove(rules)) >- , m_filteredQuery(WTFMove(query)) >+ , m_containerdQuery(WTFMove(query)) > { > } > > StyleRuleContainer::StyleRuleContainer(const StyleRuleContainer& other) > : StyleRuleGroup(other) >- , m_filteredQuery(other.m_filteredQuery) >+ , m_containerdQuery(other.m_containerdQuery) > { > } > >-Ref<StyleRuleContainer> StyleRuleContainer::create(FilteredContainerQuery&& query, Vector<RefPtr<StyleRuleBase>>&& rules) >+Ref<StyleRuleContainer> StyleRuleContainer::create(CQ::ContainerQuery&& query, Vector<RefPtr<StyleRuleBase>>&& rules) > { > return adoptRef(*new StyleRuleContainer(WTFMove(query), WTFMove(rules))); > } >diff --git a/Source/WebCore/css/StyleRule.h b/Source/WebCore/css/StyleRule.h >index 2330e2144dfe..d2efd5deb56e 100644 >--- a/Source/WebCore/css/StyleRule.h >+++ b/Source/WebCore/css/StyleRule.h >@@ -291,16 +291,16 @@ private: > > class StyleRuleContainer final : public StyleRuleGroup { > public: >- static Ref<StyleRuleContainer> create(FilteredContainerQuery&&, Vector<RefPtr<StyleRuleBase>>&&); >+ static Ref<StyleRuleContainer> create(CQ::ContainerQuery&&, Vector<RefPtr<StyleRuleBase>>&&); > Ref<StyleRuleContainer> copy() const { return adoptRef(*new StyleRuleContainer(*this)); } > >- const FilteredContainerQuery& filteredQuery() const { return m_filteredQuery; } >+ const CQ::ContainerQuery& containerQuery() const { return m_containerdQuery; } > > private: >- StyleRuleContainer(FilteredContainerQuery&&, Vector<RefPtr<StyleRuleBase>>&&); >+ StyleRuleContainer(CQ::ContainerQuery&&, Vector<RefPtr<StyleRuleBase>>&&); > StyleRuleContainer(const StyleRuleContainer&); > >- FilteredContainerQuery m_filteredQuery; >+ CQ::ContainerQuery m_containerdQuery; > }; > > // This is only used by the CSS parser. >diff --git a/Source/WebCore/css/parser/CSSParserImpl.cpp b/Source/WebCore/css/parser/CSSParserImpl.cpp >index 1389ee83fea0..47e9de2f2803 100644 >--- a/Source/WebCore/css/parser/CSSParserImpl.cpp >+++ b/Source/WebCore/css/parser/CSSParserImpl.cpp >@@ -780,7 +780,7 @@ RefPtr<StyleRuleContainer> CSSParserImpl::consumeContainerRule(CSSParserTokenRan > if (prelude.atEnd()) > return nullptr; > >- auto query = ContainerQueryParser::consumeFilteredContainerQuery(prelude, m_context); >+ auto query = ContainerQueryParser::consumeContainerQuery(prelude, m_context); > if (!query) > return nullptr; > >diff --git a/Source/WebCore/inspector/InspectorStyleSheet.cpp b/Source/WebCore/inspector/InspectorStyleSheet.cpp >index 940f4059b52a..4147c94bd138 100644 >--- a/Source/WebCore/inspector/InspectorStyleSheet.cpp >+++ b/Source/WebCore/inspector/InspectorStyleSheet.cpp >@@ -519,9 +519,9 @@ static Ref<JSON::ArrayOf<Protocol::CSS::Grouping>> buildArrayForGroupings(CSSRul > .release(); > > StringBuilder builder; >- auto nameFilter = containerRule->nameFilterText(); >- if (!nameFilter.isEmpty()) >- builder.append(nameFilter, ' '); >+ auto nameText = containerRule->nameText(); >+ if (!nameText.isEmpty()) >+ builder.append(nameText, ' '); > builder.append(containerRule->conditionText()); > containerRulePayload->setText(builder.toString()); > >diff --git a/Source/WebCore/style/ContainerQueryEvaluator.cpp b/Source/WebCore/style/ContainerQueryEvaluator.cpp >index f9c5f6c2cdd7..61474fe87d04 100644 >--- a/Source/WebCore/style/ContainerQueryEvaluator.cpp >+++ b/Source/WebCore/style/ContainerQueryEvaluator.cpp >@@ -53,16 +53,16 @@ ContainerQueryEvaluator::ContainerQueryEvaluator(const Element& element, Selecti > { > } > >-bool ContainerQueryEvaluator::evaluate(const FilteredContainerQuery& filteredContainerQuery) const >+bool ContainerQueryEvaluator::evaluate(const CQ::ContainerQuery& containerQuery) const > { >- auto container = selectContainer(filteredContainerQuery); >+ auto container = selectContainer(containerQuery); > if (!container) > return false; > >- return evaluateQuery(filteredContainerQuery.query, *container) == EvaluationResult::True; >+ return evaluateCondition(containerQuery.condition, *container) == EvaluationResult::True; > } > >-auto ContainerQueryEvaluator::selectContainer(const FilteredContainerQuery& filteredContainerQuery) const -> std::optional<SelectedContainer> >+auto ContainerQueryEvaluator::selectContainer(const CQ::ContainerQuery& containerQuery) const -> std::optional<SelectedContainer> > { > // "For each element, the query container to be queried is selected from among the elementâs > // ancestor query containers that have a valid container-type for all the container features >@@ -82,7 +82,7 @@ auto ContainerQueryEvaluator::selectContainer(const FilteredContainerQuery& filt > > auto* cachedQueryContainers = m_selectorMatchingState ? &m_selectorMatchingState->queryContainers : nullptr; > >- auto* container = selectContainer(filteredContainerQuery.axisFilter, filteredContainerQuery.nameFilter, m_element.get(), m_selectionMode, m_scopeOrdinal, cachedQueryContainers); >+ auto* container = selectContainer(containerQuery.axisFilter, containerQuery.name, m_element.get(), m_selectionMode, m_scopeOrdinal, cachedQueryContainers); > if (!container) > return { }; > >@@ -164,9 +164,9 @@ const Element* ContainerQueryEvaluator::selectContainer(OptionSet<CQ::Axis> axes > return { }; > } > >-auto ContainerQueryEvaluator::evaluateQuery(const CQ::ContainerQuery& containerQuery, const SelectedContainer& container) const -> EvaluationResult >+auto ContainerQueryEvaluator::evaluateQueryInParens(const CQ::QueryInParens& queryInParens, const SelectedContainer& container) const -> EvaluationResult > { >- return WTF::switchOn(containerQuery, [&](const CQ::ContainerCondition& containerCondition) { >+ return WTF::switchOn(queryInParens, [&](const CQ::ContainerCondition& containerCondition) { > return evaluateCondition(containerCondition, container); > }, [&](const CQ::SizeFeature& sizeFeature) { > return evaluateSizeFeature(sizeFeature, container); >@@ -183,11 +183,11 @@ auto ContainerQueryEvaluator::evaluateCondition(const ConditionType& condition, > > switch (condition.logicalOperator) { > case CQ::LogicalOperator::Not: >- return !evaluateQuery(condition.queries.first(), container); >+ return !evaluateQueryInParens(condition.queries.first(), container); > case CQ::LogicalOperator::And: { > auto result = EvaluationResult::True; > for (auto query : condition.queries) { >- auto queryResult = evaluateQuery(query, container); >+ auto queryResult = evaluateQueryInParens(query, container); > if (queryResult == EvaluationResult::False) > return EvaluationResult::False; > if (queryResult == EvaluationResult::Unknown) >@@ -198,7 +198,7 @@ auto ContainerQueryEvaluator::evaluateCondition(const ConditionType& condition, > case CQ::LogicalOperator::Or: { > auto result = EvaluationResult::False; > for (auto query : condition.queries) { >- auto queryResult = evaluateQuery(query, container); >+ auto queryResult = evaluateQueryInParens(query, container); > if (queryResult == EvaluationResult::True) > return EvaluationResult::True; > if (queryResult == EvaluationResult::Unknown) >diff --git a/Source/WebCore/style/ContainerQueryEvaluator.h b/Source/WebCore/style/ContainerQueryEvaluator.h >index 1b73788036cf..c77199db7745 100644 >--- a/Source/WebCore/style/ContainerQueryEvaluator.h >+++ b/Source/WebCore/style/ContainerQueryEvaluator.h >@@ -42,15 +42,15 @@ public: > enum class SelectionMode : bool { Element, PseudoElement }; > ContainerQueryEvaluator(const Element&, SelectionMode, ScopeOrdinal, SelectorMatchingState*); > >- bool evaluate(const FilteredContainerQuery&) const; >+ bool evaluate(const CQ::ContainerQuery&) const; > > static const Element* selectContainer(OptionSet<CQ::Axis>, const String& name, const Element&, SelectionMode = SelectionMode::Element, ScopeOrdinal = ScopeOrdinal::Element, const CachedQueryContainers* = nullptr); > > private: > struct SelectedContainer; >- std::optional<SelectedContainer> selectContainer(const FilteredContainerQuery&) const; >+ std::optional<SelectedContainer> selectContainer(const CQ::ContainerQuery&) const; > >- EvaluationResult evaluateQuery(const CQ::ContainerQuery&, const SelectedContainer&) const; >+ EvaluationResult evaluateQueryInParens(const CQ::QueryInParens&, const SelectedContainer&) const; > template<typename ConditionType> EvaluationResult evaluateCondition(const ConditionType&, const SelectedContainer&) const; > EvaluationResult evaluateSizeFeature(const CQ::SizeFeature&, const SelectedContainer&) const; > >diff --git a/Source/WebCore/style/RuleSet.h b/Source/WebCore/style/RuleSet.h >index 16ffa2906386..fe711570c452 100644 >--- a/Source/WebCore/style/RuleSet.h >+++ b/Source/WebCore/style/RuleSet.h >@@ -113,7 +113,7 @@ public: > CascadeLayerPriority cascadeLayerPriorityFor(const RuleData&) const; > > bool hasContainerQueries() const { return !m_containerQueries.isEmpty(); } >- Vector<const FilteredContainerQuery*> containerQueriesFor(const RuleData&) const; >+ Vector<const CQ::ContainerQuery*> containerQueriesFor(const RuleData&) const; > > private: > friend class RuleSetBuilder; >@@ -230,17 +230,17 @@ inline CascadeLayerPriority RuleSet::cascadeLayerPriorityFor(const RuleData& rul > return cascadeLayerPriorityForIdentifier(identifier); > } > >-inline Vector<const FilteredContainerQuery*> RuleSet::containerQueriesFor(const RuleData& ruleData) const >+inline Vector<const CQ::ContainerQuery*> RuleSet::containerQueriesFor(const RuleData& ruleData) const > { > if (m_containerQueryIdentifierForRulePosition.size() <= ruleData.position()) > return { }; > >- Vector<const FilteredContainerQuery*> queries; >+ Vector<const CQ::ContainerQuery*> queries; > > auto identifier = m_containerQueryIdentifierForRulePosition[ruleData.position()]; > while (identifier) { > auto& query = m_containerQueries[identifier - 1]; >- queries.append(&query.containerRule->filteredQuery()); >+ queries.append(&query.containerRule->containerQuery()); > identifier = query.parent; > }; > >diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-contain/container-queries/at-container-parsing-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/css/css-contain/container-queries/at-container-parsing-expected.txt >index 29dae852411c..fe6fb879212a 100644 >--- a/LayoutTests/imported/w3c/web-platform-tests/css/css-contain/container-queries/at-container-parsing-expected.txt >+++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-contain/container-queries/at-container-parsing-expected.txt >@@ -21,7 +21,7 @@ PASS (not (width: 100px)) > PASS ((width: 100px) and (height: 100px)) > PASS (((width: 40px) or (width: 50px)) and (height: 100px)) > PASS ((width: 100px) and ((height: 40px) or (height: 50px))) >-PASS (((width: 40x) and (height: 50px)) or (height: 100px)) >+PASS (((width: 40px) and (height: 50px)) or (height: 100px)) > PASS ((width: 50px) or ((width: 40px) and (height: 50px))) > PASS ((width: 100px) and (not (height: 100px))) > PASS (width < 100px) >@@ -47,6 +47,9 @@ PASS (width < calc(10px + 10em)) > PASS (width < max(10px, 10em)) > PASS (calc(10px + 10em) < width) > PASS (calc(10px + 10em) < width < max(30px, 30em)) >+PASS (width: 100px) and (height: 100px) >+PASS (width: 100px) or (height: 100px) >+PASS not (width: 100px) > PASS foo(width) > PASS size(width) > PASS (asdf) >@@ -74,32 +77,31 @@ PASS screen or (width: 100px) > PASS not screen and (width: 100px) > PASS not screen or (width: 100px) > PASS (width: 100px), (height: 100px) >-PASS (width: 100px) and (height: 100px) >-PASS (width: 100px) or (height: 100px) >-PASS not (width: 100px) > PASS foo (width: 100px) >-PASS Container selector: foo >-PASS Container selector: foo >-PASS Container selector: foo >-PASS Container selector: foo foo >-PASS Container selector: 1px >-PASS Container selector: 50gil >-PASS Container selector: name(foo) >-PASS Container selector: type(inline-size) >-PASS Container selector: "foo" >-PASS Container selector: "inherit" >-PASS Container selector: none >-PASS Container selector: None >-PASS Container selector: normal >-PASS Container selector: Normal >-PASS Container selector: auto >-PASS Container selector: Auto >-PASS Container selector: and >-PASS Container selector: or >-PASS Container selector: not >-PASS Container selector: And >-PASS Container selector: oR >-PASS Container selector: nOt >+PASS name not (width <= 500px) >+PASS not (width <= 500px) >+PASS Container name: foo >+PASS Container name: foo >+PASS Container name: foo >+PASS Container name: foo foo >+PASS Container name: 1px >+PASS Container name: 50gil >+PASS Container name: name(foo) >+PASS Container name: type(inline-size) >+PASS Container name: "foo" >+PASS Container name: "inherit" >+PASS Container name: none >+PASS Container name: None >+PASS Container name: normal >+PASS Container name: Normal >+PASS Container name: auto >+PASS Container name: Auto >+PASS Container name: and >+PASS Container name: or >+PASS Container name: not >+PASS Container name: And >+PASS Container name: oR >+PASS Container name: nOt > FAIL style(--my-prop: foo) assert_equals: expected "true" but got "" > FAIL style(--my-prop: foo - bar ()) assert_equals: expected "true" but got "" > FAIL style(not ((--foo: calc(10px + 2em)) and ((--foo: url(x))))) assert_equals: expected "true" but got "" >diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-contain/container-queries/at-container-parsing.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-contain/container-queries/at-container-parsing.html >index 6278f88216f3..3cf7f3a0251d 100644 >--- a/LayoutTests/imported/w3c/web-platform-tests/css/css-contain/container-queries/at-container-parsing.html >+++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-contain/container-queries/at-container-parsing.html >@@ -22,170 +22,181 @@ > return style; > } > >- function test_query_invalid(query) { >+ function test_rule_valid(query) { > test(t => { > t.add_cleanup(cleanup_main); >- let style = set_style(`@container name ${query} {}`); >- assert_equals(style.sheet.rules.length, 0); >+ let style = set_style(`@container ${query} {}`); >+ assert_equals(style.sheet.rules.length, 1); > }, query); > } > >- // Tests that 1) the query parses, and 2) is either "unknown" or not, as >+ function test_condition_invalid(condition) { >+ test(t => { >+ t.add_cleanup(cleanup_main); >+ let style = set_style(`@container name ${condition} {}`); >+ assert_equals(style.sheet.rules.length, 0); >+ }, condition); >+ } >+ >+ // Tests that 1) the condition parses, and 2) is either "unknown" or not, as > // specified. >- function test_query_valid(query, unknown) { >+ function test_condition_valid(condition, unknown) { > test(t => { > t.add_cleanup(cleanup_main); > let style = set_style(` >- @container name ${query} {} >- @container name (${query} or (not ${query})) { main { --match:true; } } >+ @container name ${condition} {} >+ @container name (${condition}) or (not (${condition})) { main { --match:true; } } > `); > assert_equals(style.sheet.rules.length, 2); > const expected = unknown ? '' : 'true'; > assert_equals(getComputedStyle(main).getPropertyValue('--match'), expected); >- }, query); >+ }, condition); > } > >- function test_query_known(query) { >- test_query_valid(query, false /* unknown */); >+ function test_condition_known(condition) { >+ test_condition_valid(condition, false /* unknown */); > } > >- function test_query_unknown(query) { >- test_query_valid(query, true /* unknown */); >+ function test_condition_unknown(condition) { >+ test_condition_valid(condition, true /* unknown */); > } > >- function test_container_selector_invalid(container_selector) { >+ function test_container_name_invalid(container_name) { > test(t => { > t.add_cleanup(cleanup_main); >- let style = set_style(`@container ${container_selector} (width) {}`); >+ let style = set_style(`@container ${container_name} not (width) {}`); > assert_equals(style.sheet.rules.length, 0); >- }, `Container selector: ${container_selector}`); >+ }, `Container name: ${container_name}`); > } > >- function test_container_selector_valid(container_selector) { >+ function test_container_name_valid(container_name) { > test(t => { > t.add_cleanup(cleanup_main); >- let style = set_style(`@container ${container_selector} (width) {}`); >+ let style = set_style(`@container ${container_name} not (width) {}`); > assert_equals(style.sheet.rules.length, 1); >- }, `Container selector: ${container_selector}`); >+ }, `Container name: ${container_name}`); > } > >- test_query_known('(width)'); >- test_query_known('(min-width: 0px)'); >- test_query_known('(max-width: 0px)'); >- test_query_known('(height)'); >- test_query_known('(min-height: 0px)'); >- test_query_known('(max-height: 0px)'); >- test_query_known('(aspect-ratio)'); >- test_query_known('(min-aspect-ratio: 1/2)'); >- test_query_known('(max-aspect-ratio: 1/2)'); >- test_query_known('(orientation: portrait)'); >- test_query_known('(inline-size)'); >- test_query_known('(min-inline-size: 0px)'); >- test_query_known('(max-inline-size: 0px)'); >- test_query_known('(block-size)'); >- test_query_known('(min-block-size: 0px)'); >- test_query_known('(max-block-size: 0px)'); >- >- test_query_known('(width: 100px)'); >- test_query_known('((width: 100px))'); >- test_query_known('(not (width: 100px))'); >- test_query_known('((width: 100px) and (height: 100px))'); >- test_query_known('(((width: 40px) or (width: 50px)) and (height: 100px))'); >- test_query_known('((width: 100px) and ((height: 40px) or (height: 50px)))'); >- test_query_known('(((width: 40x) and (height: 50px)) or (height: 100px))'); >- test_query_known('((width: 50px) or ((width: 40px) and (height: 50px)))'); >- test_query_known('((width: 100px) and (not (height: 100px)))'); >- test_query_known('(width < 100px)'); >- test_query_known('(width <= 100px)'); >- test_query_known('(width = 100px)'); >- test_query_known('(width > 100px)'); >- test_query_known('(width >= 100px)'); >- test_query_known('(100px < width)'); >- test_query_known('(100px <= width)'); >- test_query_known('(100px = width)'); >- test_query_known('(100px > width)'); >- test_query_known('(100px >= width)'); >- test_query_known('(100px < width < 200px)'); >- test_query_known('(100px < width <= 200px)'); >- test_query_known('(100px <= width < 200px)'); >- test_query_known('(100px > width > 200px)'); >- test_query_known('(100px > width >= 200px)'); >- test_query_known('(100px >= width > 200px)'); >- >- test_query_known('(width: calc(10px))'); >- test_query_known('(width: calc(10em))'); >- test_query_known('(width: calc(10px + 10em))'); >- test_query_known('(width < calc(10px + 10em))'); >- test_query_known('(width < max(10px, 10em))'); >- test_query_known('(calc(10px + 10em) < width)'); >- test_query_known('(calc(10px + 10em) < width < max(30px, 30em))'); >- >- test_query_unknown('foo(width)'); >- test_query_unknown('size(width)'); >- test_query_unknown('(asdf)'); >- test_query_unknown('(resolution > 100dpi)'); >- test_query_unknown('(resolution: 150dpi)'); >- test_query_unknown('(color)'); >- test_query_unknown('(min-color: 1)'); >- test_query_unknown('(color-index >= 1)'); >- test_query_unknown('size(grid)'); >- test_query_unknown('(grid)'); >- test_query_unknown('(width == 100px)'); >- test_query_unknown('(100px == width)'); >- test_query_unknown('(100px = width = 200px)'); >- test_query_unknown('(100px < width > 200px)'); >- test_query_unknown('(100px <= width >= 200px)'); >- test_query_unknown('(100px <= width > 200px)'); >- test_query_unknown('(100px < width >= 200px)'); >- test_query_unknown('(100px : width : 200px)'); >- >- test_query_invalid('screen'); >- test_query_invalid('print'); >- test_query_invalid('not print'); >- test_query_invalid('only print'); >- test_query_invalid('screen and (width: 100px)'); >- test_query_invalid('screen or (width: 100px)'); >- test_query_invalid('not screen and (width: 100px)'); >- test_query_invalid('not screen or (width: 100px)'); >- test_query_invalid('(width: 100px), (height: 100px)'); >- test_query_invalid('(width: 100px) and (height: 100px)'); >- test_query_invalid('(width: 100px) or (height: 100px)'); >- test_query_invalid('not (width: 100px)'); >- test_query_invalid('foo (width: 100px)'); >- >- test_container_selector_valid('foo'); >- test_container_selector_valid(' foo'); >- test_container_selector_valid(' foo '); >- >- test_container_selector_invalid('foo foo'); >- test_container_selector_invalid('1px'); >- test_container_selector_invalid('50gil'); >- test_container_selector_invalid('name(foo)'); >- test_container_selector_invalid('type(inline-size)'); >- test_container_selector_invalid('"foo"'); >- test_container_selector_invalid('"inherit"'); >- test_container_selector_invalid('none'); >- test_container_selector_invalid('None'); >- test_container_selector_invalid('normal'); >- test_container_selector_invalid('Normal'); >- test_container_selector_invalid('auto'); >- test_container_selector_invalid('Auto'); >- test_container_selector_invalid('and'); >- test_container_selector_invalid('or'); >- test_container_selector_invalid('not'); >- test_container_selector_invalid('And'); >- test_container_selector_invalid('oR'); >- test_container_selector_invalid('nOt'); >- >- test_query_known('style(--my-prop: foo)'); >- test_query_known('style(--my-prop: foo - bar ())'); >- test_query_known('style(not ((--foo: calc(10px + 2em)) and ((--foo: url(x)))))'); >- test_query_known('style((--foo: bar) or (--bar: 10px))'); >- test_query_known('style(--foo: bar !important)'); >- test_query_known('style(--my-prop:)'); >- test_query_known('style(--my-prop: )'); >- >- test_query_unknown('style(--foo: bar;)'); >- test_query_unknown('style(--foo)'); >- test_query_unknown('style(style(--foo: bar))'); >+ test_condition_known('(width)'); >+ test_condition_known('(min-width: 0px)'); >+ test_condition_known('(max-width: 0px)'); >+ test_condition_known('(height)'); >+ test_condition_known('(min-height: 0px)'); >+ test_condition_known('(max-height: 0px)'); >+ test_condition_known('(aspect-ratio)'); >+ test_condition_known('(min-aspect-ratio: 1/2)'); >+ test_condition_known('(max-aspect-ratio: 1/2)'); >+ test_condition_known('(orientation: portrait)'); >+ test_condition_known('(inline-size)'); >+ test_condition_known('(min-inline-size: 0px)'); >+ test_condition_known('(max-inline-size: 0px)'); >+ test_condition_known('(block-size)'); >+ test_condition_known('(min-block-size: 0px)'); >+ test_condition_known('(max-block-size: 0px)'); >+ >+ test_condition_known('(width: 100px)'); >+ test_condition_known('((width: 100px))'); >+ test_condition_known('(not (width: 100px))'); >+ test_condition_known('((width: 100px) and (height: 100px))'); >+ test_condition_known('(((width: 40px) or (width: 50px)) and (height: 100px))'); >+ test_condition_known('((width: 100px) and ((height: 40px) or (height: 50px)))'); >+ test_condition_known('(((width: 40px) and (height: 50px)) or (height: 100px))'); >+ test_condition_known('((width: 50px) or ((width: 40px) and (height: 50px)))'); >+ test_condition_known('((width: 100px) and (not (height: 100px)))'); >+ test_condition_known('(width < 100px)'); >+ test_condition_known('(width <= 100px)'); >+ test_condition_known('(width = 100px)'); >+ test_condition_known('(width > 100px)'); >+ test_condition_known('(width >= 100px)'); >+ test_condition_known('(100px < width)'); >+ test_condition_known('(100px <= width)'); >+ test_condition_known('(100px = width)'); >+ test_condition_known('(100px > width)'); >+ test_condition_known('(100px >= width)'); >+ test_condition_known('(100px < width < 200px)'); >+ test_condition_known('(100px < width <= 200px)'); >+ test_condition_known('(100px <= width < 200px)'); >+ test_condition_known('(100px > width > 200px)'); >+ test_condition_known('(100px > width >= 200px)'); >+ test_condition_known('(100px >= width > 200px)'); >+ >+ test_condition_known('(width: calc(10px))'); >+ test_condition_known('(width: calc(10em))'); >+ test_condition_known('(width: calc(10px + 10em))'); >+ test_condition_known('(width < calc(10px + 10em))'); >+ test_condition_known('(width < max(10px, 10em))'); >+ test_condition_known('(calc(10px + 10em) < width)'); >+ test_condition_known('(calc(10px + 10em) < width < max(30px, 30em))'); >+ test_condition_known('(width: 100px) and (height: 100px)'); >+ test_condition_known('(width: 100px) or (height: 100px)'); >+ test_condition_known('not (width: 100px)'); >+ >+ test_condition_unknown('foo(width)'); >+ test_condition_unknown('size(width)'); >+ test_condition_unknown('(asdf)'); >+ test_condition_unknown('(resolution > 100dpi)'); >+ test_condition_unknown('(resolution: 150dpi)'); >+ test_condition_unknown('(color)'); >+ test_condition_unknown('(min-color: 1)'); >+ test_condition_unknown('(color-index >= 1)'); >+ test_condition_unknown('size(grid)'); >+ test_condition_unknown('(grid)'); >+ test_condition_unknown('(width == 100px)'); >+ test_condition_unknown('(100px == width)'); >+ test_condition_unknown('(100px = width = 200px)'); >+ test_condition_unknown('(100px < width > 200px)'); >+ test_condition_unknown('(100px <= width >= 200px)'); >+ test_condition_unknown('(100px <= width > 200px)'); >+ test_condition_unknown('(100px < width >= 200px)'); >+ test_condition_unknown('(100px : width : 200px)'); >+ >+ test_condition_invalid('screen'); >+ test_condition_invalid('print'); >+ test_condition_invalid('not print'); >+ test_condition_invalid('only print'); >+ test_condition_invalid('screen and (width: 100px)'); >+ test_condition_invalid('screen or (width: 100px)'); >+ test_condition_invalid('not screen and (width: 100px)'); >+ test_condition_invalid('not screen or (width: 100px)'); >+ test_condition_invalid('(width: 100px), (height: 100px)'); >+ test_condition_invalid('foo (width: 100px)'); >+ >+ test_rule_valid('name not (width <= 500px)'); >+ test_rule_valid('not (width <= 500px)'); >+ >+ test_container_name_valid('foo'); >+ test_container_name_valid(' foo'); >+ test_container_name_valid(' foo '); >+ >+ test_container_name_invalid('foo foo'); >+ test_container_name_invalid('1px'); >+ test_container_name_invalid('50gil'); >+ test_container_name_invalid('name(foo)'); >+ test_container_name_invalid('type(inline-size)'); >+ test_container_name_invalid('"foo"'); >+ test_container_name_invalid('"inherit"'); >+ test_container_name_invalid('none'); >+ test_container_name_invalid('None'); >+ test_container_name_invalid('normal'); >+ test_container_name_invalid('Normal'); >+ test_container_name_invalid('auto'); >+ test_container_name_invalid('Auto'); >+ test_container_name_invalid('and'); >+ test_container_name_invalid('or'); >+ test_container_name_invalid('not'); >+ test_container_name_invalid('And'); >+ test_container_name_invalid('oR'); >+ test_container_name_invalid('nOt'); >+ >+ test_condition_known('style(--my-prop: foo)'); >+ test_condition_known('style(--my-prop: foo - bar ())'); >+ test_condition_known('style(not ((--foo: calc(10px + 2em)) and ((--foo: url(x)))))'); >+ test_condition_known('style((--foo: bar) or (--bar: 10px))'); >+ test_condition_known('style(--foo: bar !important)'); >+ test_condition_known('style(--my-prop:)'); >+ test_condition_known('style(--my-prop: )'); >+ >+ test_condition_unknown('style(--foo: bar;)'); >+ test_condition_unknown('style(--foo)'); >+ test_condition_unknown('style(style(--foo: bar))'); > </script> >diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-contain/container-queries/crashtests/chrome-bug-1346969-crash.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-contain/container-queries/crashtests/chrome-bug-1346969-crash.html >new file mode 100644 >index 000000000000..37c74cf8cb1c >--- /dev/null >+++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-contain/container-queries/crashtests/chrome-bug-1346969-crash.html >@@ -0,0 +1,14 @@ >+<!doctype html> >+<title>Chrome crash bug 1346969</title> >+<link rel="help" href="https://crbug.com/1346969"> >+<table id="table"> </table> >+<script> >+ document.body.offsetTop; >+ table.style.containerType = "inline-size"; >+ table.style.appearance = "auto"; >+ table.style.columnCount = 2; >+ table.createTBody(); >+ table.createCaption(); >+ document.body.offsetTop; >+ table.style.whiteSpace = "pre-wrap"; >+</script> >diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-contain/container-queries/crashtests/chrome-remove-insert-evaluator-crash.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-contain/container-queries/crashtests/chrome-remove-insert-evaluator-crash.html >new file mode 100644 >index 000000000000..986f6b0bf69f >--- /dev/null >+++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-contain/container-queries/crashtests/chrome-remove-insert-evaluator-crash.html >@@ -0,0 +1,15 @@ >+<!doctype html> >+<title>Removing and re-inserting a container should crash</title> >+<link rel="help" href="https://crbug.com/1342750"> >+<style> >+ #container { container-type: inline-size } >+</style> >+<div id="outer"> >+ <div id="container"></div> >+</div> >+<script> >+ container.offsetTop; >+ let removed = container; >+ container.remove(); >+ outer.appendChild(removed); >+</script> >diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-contain/container-queries/crashtests/w3c-import.log b/LayoutTests/imported/w3c/web-platform-tests/css/css-contain/container-queries/crashtests/w3c-import.log >index d31ff46bd9a5..7a1186fd5685 100644 >--- a/LayoutTests/imported/w3c/web-platform-tests/css/css-contain/container-queries/crashtests/w3c-import.log >+++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-contain/container-queries/crashtests/w3c-import.log >@@ -18,7 +18,9 @@ List of files: > /LayoutTests/imported/w3c/web-platform-tests/css/css-contain/container-queries/crashtests/canvas-as-container-crash.html > /LayoutTests/imported/w3c/web-platform-tests/css/css-contain/container-queries/crashtests/chrome-bug-1289718-000-crash.html > /LayoutTests/imported/w3c/web-platform-tests/css/css-contain/container-queries/crashtests/chrome-bug-1289718-001-crash.html >+/LayoutTests/imported/w3c/web-platform-tests/css/css-contain/container-queries/crashtests/chrome-bug-1346969-crash.html > /LayoutTests/imported/w3c/web-platform-tests/css/css-contain/container-queries/crashtests/chrome-quotes-crash.html >+/LayoutTests/imported/w3c/web-platform-tests/css/css-contain/container-queries/crashtests/chrome-remove-insert-evaluator-crash.html > /LayoutTests/imported/w3c/web-platform-tests/css/css-contain/container-queries/crashtests/columns-in-table-001-crash.html > /LayoutTests/imported/w3c/web-platform-tests/css/css-contain/container-queries/crashtests/columns-in-table-002-crash.html > /LayoutTests/imported/w3c/web-platform-tests/css/css-contain/container-queries/crashtests/container-in-canvas-crash.html
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Formatted Diff
|
Diff
Attachments on
bug 243449
:
461354
|
461355
|
461357
|
461358