Chromium Code Reviews| Index: Source/core/css/parser/MediaQueryParser.cpp |
| diff --git a/Source/core/css/parser/MediaQueryParser.cpp b/Source/core/css/parser/MediaQueryParser.cpp |
| index b90d155476965972ba2443654c25df52816d2482..be5a4fa8aa446545f52aed8e788f1341b03fca1d 100644 |
| --- a/Source/core/css/parser/MediaQueryParser.cpp |
| +++ b/Source/core/css/parser/MediaQueryParser.cpp |
| @@ -39,6 +39,7 @@ const MediaQueryParser::State MediaQueryParser::Done = &MediaQueryParser::done; |
| MediaQueryParser::MediaQueryParser(ParserType parserType) |
| : m_querySet(MediaQuerySet::create()) |
| + , m_blockLevel(0) |
| { |
| if (parserType == MediaQuerySetParser) |
| m_state = &MediaQueryParser::readRestrictor; |
| @@ -116,14 +117,12 @@ void MediaQueryParser::readFeature(MediaQueryTokenType type, TokenIterator& toke |
| void MediaQueryParser::readFeatureColon(MediaQueryTokenType type, TokenIterator& token) |
| { |
| - if (type == ColonToken) { |
| + if (type == ColonToken) |
| m_state = ReadFeatureValue; |
| - } else if (type == RightParenthesisToken || type == EOFToken) { |
| - --token; |
| - m_state = ReadFeatureEnd; |
| - } else { |
| + else if (type == RightParenthesisToken || type == EOFToken) |
| + readFeatureEnd(type, token); |
| + else |
| m_state = SkipUntilBlockEnd; |
| - } |
| } |
| void MediaQueryParser::readFeatureValue(MediaQueryTokenType type, TokenIterator& token) |
| @@ -153,7 +152,7 @@ void MediaQueryParser::readFeatureEnd(MediaQueryTokenType type, TokenIterator& t |
| void MediaQueryParser::skipUntilComma(MediaQueryTokenType type, TokenIterator& token) |
| { |
| - if ((type == CommaToken && m_blockStack.isEmpty()) || type == EOFToken) { |
| + if ((type == CommaToken && !m_blockLevel) || type == EOFToken) { |
| m_state = ReadRestrictor; |
| m_mediaQueryData.clear(); |
| m_querySet->addMediaQuery(MediaQuery::createNotAll()); |
| @@ -162,45 +161,21 @@ void MediaQueryParser::skipUntilComma(MediaQueryTokenType type, TokenIterator& t |
| void MediaQueryParser::skipUntilBlockEnd(MediaQueryTokenType type, TokenIterator& token) |
| { |
| - if (m_blockStack.isEmpty()) |
| + if (!m_blockLevel) |
| m_state = SkipUntilComma; |
| } |
| void MediaQueryParser::done(MediaQueryTokenType type, TokenIterator& token) { } |
| -void MediaQueryParser::popIfBlockMatches(Vector<BlockType>& blockStack, BlockType type) |
| -{ |
| - if (!blockStack.isEmpty() && blockStack.last() == type) |
| - blockStack.removeLast(); |
| -} |
| - |
| -bool MediaQueryParser::observeBlock(BlockParameters& parameters, MediaQueryTokenType type) |
| +void MediaQueryParser::observeBlocks(TokenIterator& token) |
| { |
| - if (type == parameters.leftToken) { |
| - if (parameters.stateChange == ModifyState) |
| + if (token->blockToken() == MediaQueryToken::BlockStart) { |
| + if (token->type() != LeftParenthesisToken || m_blockLevel) |
| m_state = SkipUntilBlockEnd; |
| - m_blockStack.append(parameters.blockType); |
| - } else if (type == parameters.rightToken) { |
| - popIfBlockMatches(m_blockStack, parameters.blockType); |
| - } else { |
| - return false; |
| - } |
| - return true; |
| -} |
| - |
| -void MediaQueryParser::observeBlocks(MediaQueryTokenType type) |
| -{ |
| - enum { BlockParametersCount = 4 }; |
| - BlockParameters blockParameterSet[BlockParametersCount] = { |
| - { LeftParenthesisToken, RightParenthesisToken, ParenthesisBlock, DoNotModifyState }, |
| - { FunctionToken, RightParenthesisToken, ParenthesisBlock, ModifyState }, |
| - { LeftBracketToken, RightBracketToken, BracketsBlock, ModifyState }, |
| - { LeftBraceToken, RightBraceToken, BracesBlock, ModifyState } |
| - }; |
| - |
| - for (unsigned i = 0; i < BlockParametersCount; ++i) { |
| - if (observeBlock(blockParameterSet[i], type)) |
| - break; |
| + ++m_blockLevel; |
|
eseidel
2014/04/08 16:58:49
Should the tokenizer just have a blockLevel() acce
|
| + } else if (token->blockToken() == MediaQueryToken::BlockEnd) { |
| + ASSERT(m_blockLevel); |
| + --m_blockLevel; |
| } |
| } |
| @@ -208,7 +183,7 @@ void MediaQueryParser::processToken(TokenIterator& token) |
| { |
| MediaQueryTokenType type = token->type(); |
| - observeBlocks(type); |
| + observeBlocks(token); |
| // Call the function that handles current state |
| if (type != WhitespaceToken && type != CommentToken) |