|
Lines 74-82
std::optional<CQ::ContainerQuery> ContainerQueryParser::consumeContainerQuery(CS
a/Source/WebCore/css/ContainerQueryParser.cpp_sec1
|
| 74 |
blockRange.consumeWhitespace(); |
74 |
blockRange.consumeWhitespace(); |
| 75 |
|
75 |
|
| 76 |
// Try to parse as a size query first. |
76 |
// Try to parse as a size query first. |
| 77 |
auto blockForSizeQuery = blockRange; |
77 |
auto blockForSizeFeature = blockRange; |
| 78 |
if (auto sizeQuery = consumeSizeQuery(blockForSizeQuery)) |
78 |
if (auto sizeFeature = consumeSizeFeature(blockForSizeFeature)) |
| 79 |
return { *sizeQuery }; |
79 |
return { *sizeFeature }; |
| 80 |
|
80 |
|
| 81 |
if (auto condition = consumeCondition<CQ::ContainerCondition>(blockRange)) |
81 |
if (auto condition = consumeCondition<CQ::ContainerCondition>(blockRange)) |
| 82 |
return { condition }; |
82 |
return { condition }; |
|
Lines 91-102
std::optional<ConditionType> ContainerQueryParser::consumeCondition(CSSParserTok
a/Source/WebCore/css/ContainerQueryParser.cpp_sec2
|
| 91 |
auto consumeQuery = [&](CSSParserTokenRange& range) { |
91 |
auto consumeQuery = [&](CSSParserTokenRange& range) { |
| 92 |
if constexpr (std::is_same_v<CQ::ContainerCondition, ConditionType>) |
92 |
if constexpr (std::is_same_v<CQ::ContainerCondition, ConditionType>) |
| 93 |
return consumeContainerQuery(range); |
93 |
return consumeContainerQuery(range); |
| 94 |
if constexpr (std::is_same_v<CQ::SizeCondition, ConditionType>) { |
94 |
// Style query support would be here. |
| 95 |
if (range.peek().type() != LeftParenthesisToken) |
|
|
| 96 |
return std::optional<CQ::SizeQuery>(); |
| 97 |
auto blockRange = range.consumeBlock(); |
| 98 |
return consumeSizeQuery(blockRange); |
| 99 |
} |
| 100 |
}; |
95 |
}; |
| 101 |
|
96 |
|
| 102 |
if (range.peek().type() == IdentToken) { |
97 |
if (range.peek().type() == IdentToken) { |
|
Lines 148-179
std::optional<ConditionType> ContainerQueryParser::consumeCondition(CSSParserTok
a/Source/WebCore/css/ContainerQueryParser.cpp_sec3
|
| 148 |
return condition; |
143 |
return condition; |
| 149 |
} |
144 |
} |
| 150 |
|
145 |
|
| 151 |
std::optional<CQ::SizeQuery> ContainerQueryParser::consumeSizeQuery(CSSParserTokenRange& range) |
146 |
std::optional<CQ::SizeFeature> ContainerQueryParser::consumeSizeFeature(CSSParserTokenRange& range) |
| 152 |
{ |
147 |
{ |
| 153 |
if (range.peek().type() == LeftParenthesisToken || (range.peek().type() == IdentToken && range.peek().id() == CSSValueNot)) { |
148 |
auto consume = [&] { |
| 154 |
auto sizeCondition = consumeCondition<CQ::SizeCondition>(range); |
149 |
auto rangeCopy = range; |
| 155 |
if (!sizeCondition) |
150 |
if (auto sizeFeature = consumePlainSizeFeature(range)) |
| 156 |
return { }; |
151 |
return sizeFeature; |
| 157 |
return { *sizeCondition }; |
|
|
| 158 |
} |
| 159 |
|
| 160 |
auto sizeFeature = consumeSizeFeature(range); |
| 161 |
if (!sizeFeature) |
| 162 |
return { }; |
| 163 |
|
| 164 |
m_requiredAxes.add(CQ::requiredAxesForFeature(sizeFeature->name)); |
| 165 |
|
152 |
|
| 166 |
return { *sizeFeature }; |
153 |
range = rangeCopy; |
| 167 |
} |
154 |
return consumeRangeSizeFeature(range); |
|
|
155 |
}; |
| 168 |
|
156 |
|
| 169 |
std::optional<CQ::SizeFeature> ContainerQueryParser::consumeSizeFeature(CSSParserTokenRange& range) |
157 |
auto sizeFeature = consume(); |
| 170 |
{ |
158 |
if (sizeFeature) |
| 171 |
auto rangeCopy = range; |
159 |
m_requiredAxes.add(CQ::requiredAxesForFeature(sizeFeature->name)); |
| 172 |
if (auto sizeFeature = consumePlainSizeFeature(range)) |
|
|
| 173 |
return sizeFeature; |
| 174 |
|
160 |
|
| 175 |
range = rangeCopy; |
161 |
return sizeFeature; |
| 176 |
return consumeRangeSizeFeature(range); |
|
|
| 177 |
} |
162 |
} |
| 178 |
|
163 |
|
| 179 |
static String consumeFeatureName(CSSParserTokenRange& range) |
164 |
static String consumeFeatureName(CSSParserTokenRange& range) |
|
Lines 206-211
std::optional<CQ::SizeFeature> ContainerQueryParser::consumePlainSizeFeature(CSS
a/Source/WebCore/css/ContainerQueryParser.cpp_sec4
|
| 206 |
if (range.atEnd()) { |
191 |
if (range.atEnd()) { |
| 207 |
if (op != CQ::ComparisonOperator::Equal) |
192 |
if (op != CQ::ComparisonOperator::Equal) |
| 208 |
return { }; |
193 |
return { }; |
|
|
194 |
|
| 209 |
return CQ::SizeFeature { featureName, CQ::Syntax::Boolean, { }, { } }; |
195 |
return CQ::SizeFeature { featureName, CQ::Syntax::Boolean, { }, { } }; |
| 210 |
} |
196 |
} |
| 211 |
|
197 |
|
|
Lines 217-223
std::optional<CQ::SizeFeature> ContainerQueryParser::consumePlainSizeFeature(CSS
a/Source/WebCore/css/ContainerQueryParser.cpp_sec5
|
| 217 |
return { }; |
203 |
return { }; |
| 218 |
|
204 |
|
| 219 |
auto value = consumeValue(range); |
205 |
auto value = consumeValue(range); |
| 220 |
|
206 |
|
| 221 |
return CQ::SizeFeature { featureName, CQ::Syntax::Colon, { }, CQ::Comparison { op, WTFMove(value) } }; |
207 |
return CQ::SizeFeature { featureName, CQ::Syntax::Colon, { }, CQ::Comparison { op, WTFMove(value) } }; |
| 222 |
} |
208 |
} |
| 223 |
|
209 |
|