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

Side by Side Diff: Source/core/css/parser/MediaQueryParser.cpp

Issue 225293006: Moved MQ parsing block tracking to tokenizer (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Fixed review comments Created 6 years, 8 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 unified diff | Download patch
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "config.h" 5 #include "config.h"
6 #include "core/css/parser/MediaQueryParser.h" 6 #include "core/css/parser/MediaQueryParser.h"
7 7
8 #include "MediaTypeNames.h" 8 #include "MediaTypeNames.h"
9 #include "core/css/parser/CSSPropertyParser.h" 9 #include "core/css/parser/CSSPropertyParser.h"
10 #include "core/css/parser/MediaQueryTokenizer.h" 10 #include "core/css/parser/MediaQueryTokenizer.h"
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after
109 if (type == IdentToken) { 109 if (type == IdentToken) {
110 m_mediaQueryData.setMediaFeature(token->value()); 110 m_mediaQueryData.setMediaFeature(token->value());
111 m_state = ReadFeatureColon; 111 m_state = ReadFeatureColon;
112 } else { 112 } else {
113 m_state = SkipUntilComma; 113 m_state = SkipUntilComma;
114 } 114 }
115 } 115 }
116 116
117 void MediaQueryParser::readFeatureColon(MediaQueryTokenType type, TokenIterator& token) 117 void MediaQueryParser::readFeatureColon(MediaQueryTokenType type, TokenIterator& token)
118 { 118 {
119 if (type == ColonToken) { 119 if (type == ColonToken)
120 m_state = ReadFeatureValue; 120 m_state = ReadFeatureValue;
121 } else if (type == RightParenthesisToken || type == EOFToken) { 121 else if (type == RightParenthesisToken || type == EOFToken)
122 --token; 122 readFeatureEnd(type, token);
123 m_state = ReadFeatureEnd; 123 else
124 } else {
125 m_state = SkipUntilBlockEnd; 124 m_state = SkipUntilBlockEnd;
126 }
127 } 125 }
128 126
129 void MediaQueryParser::readFeatureValue(MediaQueryTokenType type, TokenIterator& token) 127 void MediaQueryParser::readFeatureValue(MediaQueryTokenType type, TokenIterator& token)
130 { 128 {
131 if (type == DimensionToken && token->unitType() == CSSPrimitiveValue::CSS_UN KNOWN) { 129 if (type == DimensionToken && token->unitType() == CSSPrimitiveValue::CSS_UN KNOWN) {
132 m_state = SkipUntilComma; 130 m_state = SkipUntilComma;
133 } else { 131 } else {
134 m_mediaQueryData.addParserValue(type, *token); 132 m_mediaQueryData.addParserValue(type, *token);
135 m_state = ReadFeatureEnd; 133 m_state = ReadFeatureEnd;
136 } 134 }
137 } 135 }
138 136
139 void MediaQueryParser::readFeatureEnd(MediaQueryTokenType type, TokenIterator& t oken) 137 void MediaQueryParser::readFeatureEnd(MediaQueryTokenType type, TokenIterator& t oken)
140 { 138 {
141 if (type == RightParenthesisToken || type == EOFToken) { 139 if (type == RightParenthesisToken || type == EOFToken) {
142 if (m_mediaQueryData.addExpression()) 140 if (m_mediaQueryData.addExpression())
143 m_state = ReadAnd; 141 m_state = ReadAnd;
144 else 142 else
145 m_state = SkipUntilComma; 143 m_state = SkipUntilComma;
146 } else if (type == DelimiterToken && token->delimiter() == '/') { 144 } else if (type == DelimiterToken && token->delimiter() == '/') {
147 m_mediaQueryData.addParserValue(type, *token); 145 m_mediaQueryData.addParserValue(type, *token);
148 m_state = ReadFeatureValue; 146 m_state = ReadFeatureValue;
149 } else { 147 } else {
150 m_state = SkipUntilBlockEnd; 148 m_state = SkipUntilBlockEnd;
151 } 149 }
152 } 150 }
153 151
154 void MediaQueryParser::skipUntilComma(MediaQueryTokenType type, TokenIterator& t oken) 152 void MediaQueryParser::skipUntilComma(MediaQueryTokenType type, TokenIterator& t oken)
155 { 153 {
156 if ((type == CommaToken && m_blockStack.isEmpty()) || type == EOFToken) { 154 if ((type == CommaToken && !token->blockLevel()) || type == EOFToken) {
157 m_state = ReadRestrictor; 155 m_state = ReadRestrictor;
158 m_mediaQueryData.clear(); 156 m_mediaQueryData.clear();
159 m_querySet->addMediaQuery(MediaQuery::createNotAll()); 157 m_querySet->addMediaQuery(MediaQuery::createNotAll());
160 } 158 }
161 } 159 }
162 160
163 void MediaQueryParser::skipUntilBlockEnd(MediaQueryTokenType type, TokenIterator & token) 161 void MediaQueryParser::skipUntilBlockEnd(MediaQueryTokenType type, TokenIterator & token)
164 { 162 {
165 if (m_blockStack.isEmpty()) 163 if (token->blockType() == MediaQueryToken::BlockEnd && token->blockLevel() < = 1)
eseidel 2014/04/08 22:58:51 Why <= 1?
166 m_state = SkipUntilComma; 164 m_state = SkipUntilComma;
167 } 165 }
168 166
169 void MediaQueryParser::done(MediaQueryTokenType type, TokenIterator& token) { } 167 void MediaQueryParser::done(MediaQueryTokenType type, TokenIterator& token) { }
170 168
171 void MediaQueryParser::popIfBlockMatches(Vector<BlockType>& blockStack, BlockTyp e type) 169 void MediaQueryParser::handleBlocks(TokenIterator& token)
172 { 170 {
173 if (!blockStack.isEmpty() && blockStack.last() == type) 171 if (token->blockType() == MediaQueryToken::BlockStart
174 blockStack.removeLast(); 172 && (token->type() != LeftParenthesisToken || token->blockLevel() > 1))
eseidel 2014/04/08 22:58:51 Why > 1?
175 }
176
177 bool MediaQueryParser::observeBlock(BlockParameters& parameters, MediaQueryToken Type type)
178 {
179 if (type == parameters.leftToken) {
180 if (parameters.stateChange == ModifyState)
181 m_state = SkipUntilBlockEnd; 173 m_state = SkipUntilBlockEnd;
182 m_blockStack.append(parameters.blockType);
183 } else if (type == parameters.rightToken) {
184 popIfBlockMatches(m_blockStack, parameters.blockType);
185 } else {
186 return false;
187 }
188 return true;
189 }
190
191 void MediaQueryParser::observeBlocks(MediaQueryTokenType type)
192 {
193 enum { BlockParametersCount = 4 };
194 BlockParameters blockParameterSet[BlockParametersCount] = {
195 { LeftParenthesisToken, RightParenthesisToken, ParenthesisBlock, DoNotMo difyState },
196 { FunctionToken, RightParenthesisToken, ParenthesisBlock, ModifyState },
197 { LeftBracketToken, RightBracketToken, BracketsBlock, ModifyState },
198 { LeftBraceToken, RightBraceToken, BracesBlock, ModifyState }
199 };
200
201 for (unsigned i = 0; i < BlockParametersCount; ++i) {
202 if (observeBlock(blockParameterSet[i], type))
203 break;
204 }
205 } 174 }
206 175
207 void MediaQueryParser::processToken(TokenIterator& token) 176 void MediaQueryParser::processToken(TokenIterator& token)
208 { 177 {
209 MediaQueryTokenType type = token->type(); 178 MediaQueryTokenType type = token->type();
210 179
211 observeBlocks(type); 180 handleBlocks(token);
212 181
213 // Call the function that handles current state 182 // Call the function that handles current state
214 if (type != WhitespaceToken && type != CommentToken) 183 if (type != WhitespaceToken && type != CommentToken)
215 ((this)->*(m_state))(type, token); 184 ((this)->*(m_state))(type, token);
216 } 185 }
217 186
218 // The state machine loop 187 // The state machine loop
219 PassRefPtrWillBeRawPtr<MediaQuerySet> MediaQueryParser::parseImpl(TokenIterator token, TokenIterator endToken) 188 PassRefPtrWillBeRawPtr<MediaQuerySet> MediaQueryParser::parseImpl(TokenIterator token, TokenIterator endToken)
220 { 189 {
221 for (; token != endToken; ++token) 190 for (; token != endToken; ++token)
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after
283 m_valueList.addValue(value); 252 m_valueList.addValue(value);
284 } 253 }
285 254
286 void MediaQueryData::setMediaType(const String& mediaType) 255 void MediaQueryData::setMediaType(const String& mediaType)
287 { 256 {
288 m_mediaType = mediaType; 257 m_mediaType = mediaType;
289 m_mediaTypeSet = true; 258 m_mediaTypeSet = true;
290 } 259 }
291 260
292 } // namespace WebCore 261 } // namespace WebCore
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698