Chromium Code Reviews| Index: Source/core/css/parser/MediaQueryTokenizer.cpp |
| diff --git a/Source/core/css/parser/MediaQueryTokenizer.cpp b/Source/core/css/parser/MediaQueryTokenizer.cpp |
| index 469221d5252f011d894a9ece53292ef33c08fe02..7579b969432b2ac70a4f33d3f22a1bf533aa1f08 100644 |
| --- a/Source/core/css/parser/MediaQueryTokenizer.cpp |
| +++ b/Source/core/css/parser/MediaQueryTokenizer.cpp |
| @@ -67,34 +67,62 @@ MediaQueryToken MediaQueryTokenizer::whiteSpace(UChar cc) |
| return MediaQueryToken(WhitespaceToken); |
| } |
| +static bool popIfBlockMatches(Vector<MediaQueryTokenType>& blockStack, MediaQueryTokenType type) |
| +{ |
| + if (!blockStack.isEmpty() && blockStack.last() == type) { |
| + blockStack.removeLast(); |
| + return true; |
| + } |
| + return false; |
| +} |
| + |
| +MediaQueryToken MediaQueryTokenizer::blockStart(MediaQueryTokenType type) |
| +{ |
| + m_blockStack.append(type); |
| + return MediaQueryToken(type, MediaQueryToken::BlockStart); |
| +} |
| + |
| +MediaQueryToken MediaQueryTokenizer::blockStart(MediaQueryTokenType blockType, MediaQueryTokenType type, String name) |
| +{ |
| + m_blockStack.append(blockType); |
| + return MediaQueryToken(type, name, MediaQueryToken::BlockStart); |
| +} |
| + |
| +MediaQueryToken MediaQueryTokenizer::blockEnd(MediaQueryTokenType type, MediaQueryTokenType startType) |
| +{ |
| + if (popIfBlockMatches(m_blockStack, startType)) |
| + return MediaQueryToken(type, MediaQueryToken::BlockEnd); |
| + return MediaQueryToken(type); |
| +} |
| + |
| MediaQueryToken MediaQueryTokenizer::leftParenthesis(UChar cc) |
| { |
| - return MediaQueryToken(LeftParenthesisToken); |
| + return blockStart(LeftParenthesisToken); |
| } |
| MediaQueryToken MediaQueryTokenizer::rightParenthesis(UChar cc) |
| { |
| - return MediaQueryToken(RightParenthesisToken); |
| + return blockEnd(RightParenthesisToken, LeftParenthesisToken); |
| } |
| MediaQueryToken MediaQueryTokenizer::leftBracket(UChar cc) |
| { |
| - return MediaQueryToken(LeftBracketToken); |
| + return blockStart(LeftBracketToken); |
| } |
| MediaQueryToken MediaQueryTokenizer::rightBracket(UChar cc) |
| { |
| - return MediaQueryToken(RightBracketToken); |
| + return blockEnd(RightBracketToken, LeftBracketToken); |
| } |
| MediaQueryToken MediaQueryTokenizer::leftBrace(UChar cc) |
| { |
| - return MediaQueryToken(LeftBraceToken); |
| + return blockStart(LeftBraceToken); |
| } |
| MediaQueryToken MediaQueryTokenizer::rightBrace(UChar cc) |
| { |
| - return MediaQueryToken(RightBraceToken); |
| + return blockEnd(RightBraceToken, LeftBraceToken); |
| } |
| MediaQueryToken MediaQueryTokenizer::plusOrFullStop(UChar cc) |
| @@ -189,6 +217,7 @@ void MediaQueryTokenizer::tokenize(String string, Vector<MediaQueryToken>& outTo |
| MediaQueryTokenizer tokenizer(input); |
| while (true) { |
| MediaQueryToken token = tokenizer.nextToken(); |
| + token.setBlockLevel(tokenizer.m_blockStack.size()); |
|
eseidel
2014/04/08 22:58:51
I see. Because the parser doesn't know how to mai
|
| outTokens.append(token); |
| if (token.type() == EOFToken) |
| return; |
| @@ -216,7 +245,6 @@ MediaQueryToken MediaQueryTokenizer::nextToken() |
| if (codePointFunc) |
| return ((this)->*(codePointFunc))(cc); |
| - |
| return MediaQueryToken(DelimiterToken, cc); |
| } |
| @@ -315,8 +343,9 @@ MediaQueryToken MediaQueryTokenizer::consumeNumericToken() |
| MediaQueryToken MediaQueryTokenizer::consumeIdentLikeToken() |
| { |
| String name = consumeName(); |
| - if (consumeIfNext('(')) |
| - return MediaQueryToken(FunctionToken, name); |
| + if (consumeIfNext('(')) { |
| + return blockStart(LeftParenthesisToken, FunctionToken, name); |
| + } |
| return MediaQueryToken(IdentToken, name); |
| } |