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

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: Debug build fix 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 21 matching lines...) Expand all
32 const MediaQueryParser::State MediaQueryParser::ReadFeature = &MediaQueryParser: :readFeature; 32 const MediaQueryParser::State MediaQueryParser::ReadFeature = &MediaQueryParser: :readFeature;
33 const MediaQueryParser::State MediaQueryParser::ReadFeatureColon = &MediaQueryPa rser::readFeatureColon; 33 const MediaQueryParser::State MediaQueryParser::ReadFeatureColon = &MediaQueryPa rser::readFeatureColon;
34 const MediaQueryParser::State MediaQueryParser::ReadFeatureValue = &MediaQueryPa rser::readFeatureValue; 34 const MediaQueryParser::State MediaQueryParser::ReadFeatureValue = &MediaQueryPa rser::readFeatureValue;
35 const MediaQueryParser::State MediaQueryParser::ReadFeatureEnd = &MediaQueryPars er::readFeatureEnd; 35 const MediaQueryParser::State MediaQueryParser::ReadFeatureEnd = &MediaQueryPars er::readFeatureEnd;
36 const MediaQueryParser::State MediaQueryParser::SkipUntilComma = &MediaQueryPars er::skipUntilComma; 36 const MediaQueryParser::State MediaQueryParser::SkipUntilComma = &MediaQueryPars er::skipUntilComma;
37 const MediaQueryParser::State MediaQueryParser::SkipUntilBlockEnd = &MediaQueryP arser::skipUntilBlockEnd; 37 const MediaQueryParser::State MediaQueryParser::SkipUntilBlockEnd = &MediaQueryP arser::skipUntilBlockEnd;
38 const MediaQueryParser::State MediaQueryParser::Done = &MediaQueryParser::done; 38 const MediaQueryParser::State MediaQueryParser::Done = &MediaQueryParser::done;
39 39
40 MediaQueryParser::MediaQueryParser(ParserType parserType) 40 MediaQueryParser::MediaQueryParser(ParserType parserType)
41 : m_querySet(MediaQuerySet::create()) 41 : m_querySet(MediaQuerySet::create())
42 , m_blockLevel(0)
42 { 43 {
43 if (parserType == MediaQuerySetParser) 44 if (parserType == MediaQuerySetParser)
44 m_state = &MediaQueryParser::readRestrictor; 45 m_state = &MediaQueryParser::readRestrictor;
45 else // MediaConditionParser 46 else // MediaConditionParser
46 m_state = &MediaQueryParser::readFeatureStart; 47 m_state = &MediaQueryParser::readFeatureStart;
47 } 48 }
48 49
49 MediaQueryParser::~MediaQueryParser() { }; 50 MediaQueryParser::~MediaQueryParser() { };
50 51
51 void MediaQueryParser::setStateAndRestrict(State state, MediaQuery::Restrictor r estrictor) 52 void MediaQueryParser::setStateAndRestrict(State state, MediaQuery::Restrictor r estrictor)
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
109 if (type == IdentToken) { 110 if (type == IdentToken) {
110 m_mediaQueryData.setMediaFeature(token->value()); 111 m_mediaQueryData.setMediaFeature(token->value());
111 m_state = ReadFeatureColon; 112 m_state = ReadFeatureColon;
112 } else { 113 } else {
113 m_state = SkipUntilComma; 114 m_state = SkipUntilComma;
114 } 115 }
115 } 116 }
116 117
117 void MediaQueryParser::readFeatureColon(MediaQueryTokenType type, TokenIterator& token) 118 void MediaQueryParser::readFeatureColon(MediaQueryTokenType type, TokenIterator& token)
118 { 119 {
119 if (type == ColonToken) { 120 if (type == ColonToken)
120 m_state = ReadFeatureValue; 121 m_state = ReadFeatureValue;
121 } else if (type == RightParenthesisToken || type == EOFToken) { 122 else if (type == RightParenthesisToken || type == EOFToken)
122 --token; 123 readFeatureEnd(type, token);
123 m_state = ReadFeatureEnd; 124 else
124 } else {
125 m_state = SkipUntilBlockEnd; 125 m_state = SkipUntilBlockEnd;
126 }
127 } 126 }
128 127
129 void MediaQueryParser::readFeatureValue(MediaQueryTokenType type, TokenIterator& token) 128 void MediaQueryParser::readFeatureValue(MediaQueryTokenType type, TokenIterator& token)
130 { 129 {
131 if (type == DimensionToken && token->unitType() == CSSPrimitiveValue::CSS_UN KNOWN) { 130 if (type == DimensionToken && token->unitType() == CSSPrimitiveValue::CSS_UN KNOWN) {
132 m_state = SkipUntilComma; 131 m_state = SkipUntilComma;
133 } else { 132 } else {
134 m_mediaQueryData.addParserValue(type, *token); 133 m_mediaQueryData.addParserValue(type, *token);
135 m_state = ReadFeatureEnd; 134 m_state = ReadFeatureEnd;
136 } 135 }
137 } 136 }
138 137
139 void MediaQueryParser::readFeatureEnd(MediaQueryTokenType type, TokenIterator& t oken) 138 void MediaQueryParser::readFeatureEnd(MediaQueryTokenType type, TokenIterator& t oken)
140 { 139 {
141 if (type == RightParenthesisToken || type == EOFToken) { 140 if (type == RightParenthesisToken || type == EOFToken) {
142 if (m_mediaQueryData.addExpression()) 141 if (m_mediaQueryData.addExpression())
143 m_state = ReadAnd; 142 m_state = ReadAnd;
144 else 143 else
145 m_state = SkipUntilComma; 144 m_state = SkipUntilComma;
146 } else if (type == DelimiterToken && token->delimiter() == '/') { 145 } else if (type == DelimiterToken && token->delimiter() == '/') {
147 m_mediaQueryData.addParserValue(type, *token); 146 m_mediaQueryData.addParserValue(type, *token);
148 m_state = ReadFeatureValue; 147 m_state = ReadFeatureValue;
149 } else { 148 } else {
150 m_state = SkipUntilBlockEnd; 149 m_state = SkipUntilBlockEnd;
151 } 150 }
152 } 151 }
153 152
154 void MediaQueryParser::skipUntilComma(MediaQueryTokenType type, TokenIterator& t oken) 153 void MediaQueryParser::skipUntilComma(MediaQueryTokenType type, TokenIterator& t oken)
155 { 154 {
156 if ((type == CommaToken && m_blockStack.isEmpty()) || type == EOFToken) { 155 if ((type == CommaToken && !m_blockLevel) || type == EOFToken) {
157 m_state = ReadRestrictor; 156 m_state = ReadRestrictor;
158 m_mediaQueryData.clear(); 157 m_mediaQueryData.clear();
159 m_querySet->addMediaQuery(MediaQuery::createNotAll()); 158 m_querySet->addMediaQuery(MediaQuery::createNotAll());
160 } 159 }
161 } 160 }
162 161
163 void MediaQueryParser::skipUntilBlockEnd(MediaQueryTokenType type, TokenIterator & token) 162 void MediaQueryParser::skipUntilBlockEnd(MediaQueryTokenType type, TokenIterator & token)
164 { 163 {
165 if (m_blockStack.isEmpty()) 164 if (!m_blockLevel)
166 m_state = SkipUntilComma; 165 m_state = SkipUntilComma;
167 } 166 }
168 167
169 void MediaQueryParser::done(MediaQueryTokenType type, TokenIterator& token) { } 168 void MediaQueryParser::done(MediaQueryTokenType type, TokenIterator& token) { }
170 169
171 void MediaQueryParser::popIfBlockMatches(Vector<BlockType>& blockStack, BlockTyp e type) 170 void MediaQueryParser::observeBlocks(TokenIterator& token)
172 { 171 {
173 if (!blockStack.isEmpty() && blockStack.last() == type) 172 if (token->blockToken() == MediaQueryToken::BlockStart) {
174 blockStack.removeLast(); 173 if (token->type() != LeftParenthesisToken || m_blockLevel)
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; 174 m_state = SkipUntilBlockEnd;
182 m_blockStack.append(parameters.blockType); 175 ++m_blockLevel;
eseidel 2014/04/08 16:58:49 Should the tokenizer just have a blockLevel() acce
183 } else if (type == parameters.rightToken) { 176 } else if (token->blockToken() == MediaQueryToken::BlockEnd) {
184 popIfBlockMatches(m_blockStack, parameters.blockType); 177 ASSERT(m_blockLevel);
185 } else { 178 --m_blockLevel;
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 } 179 }
205 } 180 }
206 181
207 void MediaQueryParser::processToken(TokenIterator& token) 182 void MediaQueryParser::processToken(TokenIterator& token)
208 { 183 {
209 MediaQueryTokenType type = token->type(); 184 MediaQueryTokenType type = token->type();
210 185
211 observeBlocks(type); 186 observeBlocks(token);
212 187
213 // Call the function that handles current state 188 // Call the function that handles current state
214 if (type != WhitespaceToken && type != CommentToken) 189 if (type != WhitespaceToken && type != CommentToken)
215 ((this)->*(m_state))(type, token); 190 ((this)->*(m_state))(type, token);
216 } 191 }
217 192
218 // The state machine loop 193 // The state machine loop
219 PassRefPtrWillBeRawPtr<MediaQuerySet> MediaQueryParser::parseImpl(TokenIterator token, TokenIterator endToken) 194 PassRefPtrWillBeRawPtr<MediaQuerySet> MediaQueryParser::parseImpl(TokenIterator token, TokenIterator endToken)
220 { 195 {
221 for (; token != endToken; ++token) 196 for (; token != endToken; ++token)
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after
283 m_valueList.addValue(value); 258 m_valueList.addValue(value);
284 } 259 }
285 260
286 void MediaQueryData::setMediaType(const String& mediaType) 261 void MediaQueryData::setMediaType(const String& mediaType)
287 { 262 {
288 m_mediaType = mediaType; 263 m_mediaType = mediaType;
289 m_mediaTypeSet = true; 264 m_mediaTypeSet = true;
290 } 265 }
291 266
292 } // namespace WebCore 267 } // namespace WebCore
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698