OLD | NEW |
---|---|
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 Loading... | |
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 Loading... | |
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 |
OLD | NEW |