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 a4afb61bc34c592f2bb66661b740e6d19a0a0ce5..81e17520d1a4bf255c69a9aa4783896a04bad416 100644 |
| --- a/Source/core/css/parser/MediaQueryParser.cpp |
| +++ b/Source/core/css/parser/MediaQueryParser.cpp |
| @@ -25,7 +25,7 @@ const MediaQueryParser::State MediaQueryParser::ReadFeatureColon = &MediaQueryPa |
| const MediaQueryParser::State MediaQueryParser::ReadFeatureValue = &MediaQueryParser::readFeatureValue; |
| const MediaQueryParser::State MediaQueryParser::ReadFeatureEnd = &MediaQueryParser::readFeatureEnd; |
| const MediaQueryParser::State MediaQueryParser::SkipUntilComma = &MediaQueryParser::skipUntilComma; |
| -const MediaQueryParser::State MediaQueryParser::SkipUntilParenthesis = &MediaQueryParser::skipUntilParenthesis; |
| +const MediaQueryParser::State MediaQueryParser::SkipUntilBlockEnd = &MediaQueryParser::skipUntilBlockEnd; |
| const MediaQueryParser::State MediaQueryParser::Done = &MediaQueryParser::done; |
| // FIXME: Replace the MediaQueryTokenizer with a generic CSSTokenizer, once there is one, |
| @@ -111,7 +111,7 @@ void MediaQueryParser::readFeatureColon(MediaQueryTokenType type, TokenIterator& |
| --token; |
| m_state = ReadFeatureEnd; |
| } else { |
| - m_state = SkipUntilParenthesis; |
| + m_state = SkipUntilBlockEnd; |
| } |
| } |
| @@ -136,7 +136,7 @@ void MediaQueryParser::readFeatureEnd(MediaQueryTokenType type, TokenIterator& t |
| m_mediaQueryData.addParserValue(type, *token); |
| m_state = ReadFeatureValue; |
| } else { |
| - m_state = SkipUntilParenthesis; |
| + m_state = SkipUntilBlockEnd; |
| } |
| } |
| @@ -149,18 +149,55 @@ void MediaQueryParser::skipUntilComma(MediaQueryTokenType type, TokenIterator& t |
| } |
| } |
| -void MediaQueryParser::skipUntilParenthesis(MediaQueryTokenType type, TokenIterator& token) |
| +void MediaQueryParser::skipUntilBlockEnd(MediaQueryTokenType type, TokenIterator& token) |
| { |
| - if (type == RightParenthesisToken) |
| + if (m_blockStack.isEmpty()) |
|
eseidel
2014/04/01 21:15:08
I'm not sure I understand this. I guess it depend
|
| 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) |
| +{ |
| + if (type == parameters.lefttoken) { |
| + if (parameters.stateChange == ModifyState) |
| + 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) |
| +{ |
| + const unsigned blockParametersNumber = 3; |
| + BlockParameters blockParameterSet[blockParametersNumber] = { |
| + { LeftParenthesisToken, RightParenthesisToken, ParenthesisBlock, DoNotModifyState }, |
| + { LeftBracketToken, RightBracketToken, BracketsBlock, ModifyState }, |
|
eseidel
2014/04/01 21:15:08
What does "modify state" mean? It appears to me "
|
| + { LeftBraceToken, RightBraceToken, BracesBlock, ModifyState } |
| + }; |
| + |
| + for (unsigned i = 0; i < blockParametersNumber; ++i) { |
| + if (observeBlock(blockParameterSet[i], type)) |
| + break; |
| + } |
| +} |
| + |
| void MediaQueryParser::processToken(TokenIterator& token) |
| { |
| MediaQueryTokenType type = token->type(); |
| + observeBlocks(type); |
| + |
| // Call the function that handles current state |
| if (type != WhitespaceToken && type != CommentToken) |
| ((this)->*(m_state))(type, token); |