|
Lines 55-62
RefPtr<MediaQuerySet> MediaQueryParser::parseMediaCondition(CSSParserTokenRange
a/Source/WebCore/css/parser/MediaQueryParser.cpp_sec1
|
| 55 |
return MediaQueryParser(MediaConditionParser, context).parseInternal(range); |
55 |
return MediaQueryParser(MediaConditionParser, context).parseInternal(range); |
| 56 |
} |
56 |
} |
| 57 |
|
57 |
|
|
|
58 |
RefPtr<MediaQuerySet> MediaQueryParser::parseContainerQuery(CSSParserTokenRange range, MediaQueryParserContext context) |
| 59 |
{ |
| 60 |
if (range.atEnd()) |
| 61 |
return nullptr; |
| 62 |
if (range.peek().type() != LeftParenthesisToken && range.peek().type() != FunctionToken) |
| 63 |
return nullptr; |
| 64 |
return MediaQueryParser(ContainerQueryParser, context).parseInternal(range); |
| 65 |
} |
| 66 |
|
| 58 |
const MediaQueryParser::State MediaQueryParser::ReadRestrictor = &MediaQueryParser::readRestrictor; |
67 |
const MediaQueryParser::State MediaQueryParser::ReadRestrictor = &MediaQueryParser::readRestrictor; |
| 59 |
const MediaQueryParser::State MediaQueryParser::ReadMediaNot = &MediaQueryParser::readMediaNot; |
68 |
const MediaQueryParser::State MediaQueryParser::ReadMediaNot = &MediaQueryParser::readMediaNot; |
|
|
69 |
const MediaQueryParser::State MediaQueryParser::ReadContainerQuery = &MediaQueryParser::readContainerQuery; |
| 60 |
const MediaQueryParser::State MediaQueryParser::ReadMediaType = &MediaQueryParser::readMediaType; |
70 |
const MediaQueryParser::State MediaQueryParser::ReadMediaType = &MediaQueryParser::readMediaType; |
| 61 |
const MediaQueryParser::State MediaQueryParser::ReadAnd = &MediaQueryParser::readAnd; |
71 |
const MediaQueryParser::State MediaQueryParser::ReadAnd = &MediaQueryParser::readAnd; |
| 62 |
const MediaQueryParser::State MediaQueryParser::ReadFeatureStart = &MediaQueryParser::readFeatureStart; |
72 |
const MediaQueryParser::State MediaQueryParser::ReadFeatureStart = &MediaQueryParser::readFeatureStart; |
|
Lines 74-83
MediaQueryParser::MediaQueryParser(ParserType parserType, MediaQueryParserContex
a/Source/WebCore/css/parser/MediaQueryParser.cpp_sec2
|
| 74 |
, m_querySet(MediaQuerySet::create()) |
84 |
, m_querySet(MediaQuerySet::create()) |
| 75 |
|
85 |
|
| 76 |
{ |
86 |
{ |
| 77 |
if (parserType == MediaQuerySetParser) |
87 |
switch (m_parserType) { |
|
|
88 |
case MediaQuerySetParser: |
| 78 |
m_state = &MediaQueryParser::readRestrictor; |
89 |
m_state = &MediaQueryParser::readRestrictor; |
| 79 |
else // MediaConditionParser |
90 |
break; |
|
|
91 |
case MediaConditionParser: |
| 80 |
m_state = &MediaQueryParser::readMediaNot; |
92 |
m_state = &MediaQueryParser::readMediaNot; |
|
|
93 |
break; |
| 94 |
case ContainerQueryParser: |
| 95 |
m_state = &MediaQueryParser::readContainerQuery; |
| 96 |
break; |
| 97 |
} |
| 81 |
} |
98 |
} |
| 82 |
|
99 |
|
| 83 |
MediaQueryParser::~MediaQueryParser() = default; |
100 |
MediaQueryParser::~MediaQueryParser() = default; |
|
Lines 102-107
void MediaQueryParser::readMediaNot(CSSParserTokenType type, const CSSParserToke
a/Source/WebCore/css/parser/MediaQueryParser.cpp_sec3
|
| 102 |
readFeatureStart(type, token, range); |
119 |
readFeatureStart(type, token, range); |
| 103 |
} |
120 |
} |
| 104 |
|
121 |
|
|
|
122 |
void MediaQueryParser::readContainerQuery(CSSParserTokenType type, const CSSParserToken&, CSSParserTokenRange&) |
| 123 |
{ |
| 124 |
if (type == FunctionToken || type == LeftParenthesisToken) |
| 125 |
m_state = ReadFeature; |
| 126 |
} |
| 127 |
|
| 105 |
static bool isRestrictorOrLogicalOperator(const CSSParserToken& token) |
128 |
static bool isRestrictorOrLogicalOperator(const CSSParserToken& token) |
| 106 |
{ |
129 |
{ |
| 107 |
// FIXME: it would be more efficient to use lower-case always for tokenValue. |
130 |
// FIXME: it would be more efficient to use lower-case always for tokenValue. |
|
Lines 239-267
void MediaQueryParser::done(CSSParserTokenType /*type*/, const CSSParserToken& /
a/Source/WebCore/css/parser/MediaQueryParser.cpp_sec4
|
| 239 |
|
262 |
|
| 240 |
void MediaQueryParser::handleBlocks(const CSSParserToken& token) |
263 |
void MediaQueryParser::handleBlocks(const CSSParserToken& token) |
| 241 |
{ |
264 |
{ |
| 242 |
if (token.getBlockType() == CSSParserToken::BlockStart |
265 |
if (token.getBlockType() != CSSParserToken::BlockStart) |
| 243 |
&& (token.type() != LeftParenthesisToken || m_blockWatcher.blockLevel())) |
266 |
return; |
| 244 |
m_state = SkipUntilBlockEnd; |
267 |
auto shouldSkipBlock = [&] { |
|
|
268 |
// FIXME: Nested blocks should be supported. |
| 269 |
if (m_blockWatcher.blockLevel()) |
| 270 |
return true; |
| 271 |
if (token.type() == LeftParenthesisToken) |
| 272 |
return false; |
| 273 |
if (m_parserType == ContainerQueryParser && token.type() == FunctionToken) |
| 274 |
return !equalLettersIgnoringASCIICase(token.value(), "size"); |
| 275 |
return true; |
| 276 |
}(); |
| 277 |
if (shouldSkipBlock) |
| 278 |
m_state = SkipUntilBlockEnd; |
| 245 |
} |
279 |
} |
| 246 |
|
280 |
|
| 247 |
void MediaQueryParser::processToken(const CSSParserToken& token, CSSParserTokenRange& range) |
281 |
void MediaQueryParser::processToken(const CSSParserToken& token, CSSParserTokenRange& range) |
| 248 |
{ |
282 |
{ |
| 249 |
CSSParserTokenType type = token.type(); |
283 |
CSSParserTokenType type = token.type(); |
| 250 |
|
284 |
|
| 251 |
if (m_state != ReadFeatureValue || type == WhitespaceToken) { |
285 |
if (type == WhitespaceToken) { |
|
|
286 |
range.consume(); |
| 287 |
return; |
| 288 |
} |
| 289 |
|
| 290 |
if (m_state != ReadFeatureValue) { |
| 252 |
handleBlocks(token); |
291 |
handleBlocks(token); |
| 253 |
m_blockWatcher.handleToken(token); |
292 |
m_blockWatcher.handleToken(token); |
| 254 |
range.consume(); |
293 |
range.consume(); |
| 255 |
} |
294 |
} |
| 256 |
|
295 |
|
| 257 |
// Call the function that handles current state |
296 |
// Call the function that handles current state |
| 258 |
if (type != WhitespaceToken) |
297 |
((this)->*(m_state))(type, token, range); |
| 259 |
((this)->*(m_state))(type, token, range); |
|
|
| 260 |
} |
298 |
} |
| 261 |
|
299 |
|
| 262 |
// The state machine loop |
300 |
// The state machine loop |
| 263 |
RefPtr<MediaQuerySet> MediaQueryParser::parseInternal(CSSParserTokenRange range) |
301 |
RefPtr<MediaQuerySet> MediaQueryParser::parseInternal(CSSParserTokenRange& range) |
| 264 |
{ |
302 |
{ |
|
|
303 |
|
| 265 |
while (!range.atEnd()) |
304 |
while (!range.atEnd()) |
| 266 |
processToken(range.peek(), range); |
305 |
processToken(range.peek(), range); |
| 267 |
|
306 |
|