Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(725)

Unified Diff: Source/core/css/parser/MediaQueryParser.cpp

Issue 217423005: Get Media Query parser to handle parens, brackets and braces blocks correctly (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Refactored observeBlocks Created 6 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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);

Powered by Google App Engine
This is Rietveld 408576698