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 "core/css/parser/MediaQueryParser.h" | 5 #include "core/css/parser/MediaQueryParser.h" |
6 | 6 |
7 #include "core/MediaTypeNames.h" | 7 #include "core/MediaTypeNames.h" |
8 #include "core/css/parser/CSSTokenizer.h" | 8 #include "core/css/parser/CSSTokenizer.h" |
9 #include "platform/wtf/Vector.h" | 9 #include "platform/wtf/Vector.h" |
10 | 10 |
11 namespace blink { | 11 namespace blink { |
12 | 12 |
13 MediaQuerySet* MediaQueryParser::ParseMediaQuerySet( | 13 RefPtr<MediaQuerySet> MediaQueryParser::ParseMediaQuerySet( |
14 const String& query_string) { | 14 const String& query_string) { |
15 return ParseMediaQuerySet(CSSTokenizer(query_string).TokenRange()); | 15 return ParseMediaQuerySet(CSSTokenizer(query_string).TokenRange()); |
16 } | 16 } |
17 | 17 |
18 MediaQuerySet* MediaQueryParser::ParseMediaQuerySet(CSSParserTokenRange range) { | 18 RefPtr<MediaQuerySet> MediaQueryParser::ParseMediaQuerySet( |
| 19 CSSParserTokenRange range) { |
19 return MediaQueryParser(kMediaQuerySetParser).ParseImpl(range); | 20 return MediaQueryParser(kMediaQuerySetParser).ParseImpl(range); |
20 } | 21 } |
21 | 22 |
22 MediaQuerySet* MediaQueryParser::ParseMediaCondition( | 23 RefPtr<MediaQuerySet> MediaQueryParser::ParseMediaCondition( |
23 CSSParserTokenRange range) { | 24 CSSParserTokenRange range) { |
24 return MediaQueryParser(kMediaConditionParser).ParseImpl(range); | 25 return MediaQueryParser(kMediaConditionParser).ParseImpl(range); |
25 } | 26 } |
26 | 27 |
27 const MediaQueryParser::State MediaQueryParser::kReadRestrictor = | 28 const MediaQueryParser::State MediaQueryParser::kReadRestrictor = |
28 &MediaQueryParser::ReadRestrictor; | 29 &MediaQueryParser::ReadRestrictor; |
29 const MediaQueryParser::State MediaQueryParser::kReadMediaNot = | 30 const MediaQueryParser::State MediaQueryParser::kReadMediaNot = |
30 &MediaQueryParser::ReadMediaNot; | 31 &MediaQueryParser::ReadMediaNot; |
31 const MediaQueryParser::State MediaQueryParser::kReadMediaType = | 32 const MediaQueryParser::State MediaQueryParser::kReadMediaType = |
32 &MediaQueryParser::ReadMediaType; | 33 &MediaQueryParser::ReadMediaType; |
(...skipping 186 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
219 | 220 |
220 HandleBlocks(token); | 221 HandleBlocks(token); |
221 block_watcher_.HandleToken(token); | 222 block_watcher_.HandleToken(token); |
222 | 223 |
223 // Call the function that handles current state | 224 // Call the function that handles current state |
224 if (type != kWhitespaceToken) | 225 if (type != kWhitespaceToken) |
225 ((this)->*(state_))(type, token); | 226 ((this)->*(state_))(type, token); |
226 } | 227 } |
227 | 228 |
228 // The state machine loop | 229 // The state machine loop |
229 MediaQuerySet* MediaQueryParser::ParseImpl(CSSParserTokenRange range) { | 230 RefPtr<MediaQuerySet> MediaQueryParser::ParseImpl(CSSParserTokenRange range) { |
230 while (!range.AtEnd()) | 231 while (!range.AtEnd()) |
231 ProcessToken(range.Consume()); | 232 ProcessToken(range.Consume()); |
232 | 233 |
233 // FIXME: Can we get rid of this special case? | 234 // FIXME: Can we get rid of this special case? |
234 if (parser_type_ == kMediaQuerySetParser) | 235 if (parser_type_ == kMediaQuerySetParser) |
235 ProcessToken(CSSParserToken(kEOFToken)); | 236 ProcessToken(CSSParserToken(kEOFToken)); |
236 | 237 |
237 if (state_ != kReadAnd && state_ != kReadRestrictor && state_ != kDone && | 238 if (state_ != kReadAnd && state_ != kReadRestrictor && state_ != kDone && |
238 state_ != kReadMediaNot) | 239 state_ != kReadMediaNot) |
239 query_set_->AddMediaQuery(MediaQuery::CreateNotAll()); | 240 query_set_->AddMediaQuery(MediaQuery::CreateNotAll()); |
(...skipping 10 matching lines...) Expand all Loading... |
250 | 251 |
251 void MediaQueryData::Clear() { | 252 void MediaQueryData::Clear() { |
252 restrictor_ = MediaQuery::kNone; | 253 restrictor_ = MediaQuery::kNone; |
253 media_type_ = MediaTypeNames::all; | 254 media_type_ = MediaTypeNames::all; |
254 media_type_set_ = false; | 255 media_type_set_ = false; |
255 media_feature_ = String(); | 256 media_feature_ = String(); |
256 value_list_.clear(); | 257 value_list_.clear(); |
257 expressions_.clear(); | 258 expressions_.clear(); |
258 } | 259 } |
259 | 260 |
260 MediaQuery* MediaQueryData::TakeMediaQuery() { | 261 std::unique_ptr<MediaQuery> MediaQueryData::TakeMediaQuery() { |
261 MediaQuery* media_query = MediaQuery::Create( | 262 std::unique_ptr<MediaQuery> media_query = MediaQuery::Create( |
262 restrictor_, std::move(media_type_), std::move(expressions_)); | 263 restrictor_, std::move(media_type_), std::move(expressions_)); |
263 Clear(); | 264 Clear(); |
264 return media_query; | 265 return media_query; |
265 } | 266 } |
266 | 267 |
267 bool MediaQueryData::AddExpression() { | 268 bool MediaQueryData::AddExpression() { |
268 MediaQueryExp* expression = | 269 MediaQueryExp expression = MediaQueryExp::Create(media_feature_, value_list_); |
269 MediaQueryExp::CreateIfValid(media_feature_, value_list_); | |
270 bool is_valid = !!expression; | |
271 expressions_.push_back(expression); | 270 expressions_.push_back(expression); |
272 value_list_.clear(); | 271 value_list_.clear(); |
273 return is_valid; | 272 return expression.IsValid(); |
274 } | 273 } |
275 | 274 |
276 bool MediaQueryData::TryAddParserToken(CSSParserTokenType type, | 275 bool MediaQueryData::TryAddParserToken(CSSParserTokenType type, |
277 const CSSParserToken& token) { | 276 const CSSParserToken& token) { |
278 if (type == kNumberToken || type == kPercentageToken || | 277 if (type == kNumberToken || type == kPercentageToken || |
279 type == kDimensionToken || type == kDelimiterToken || | 278 type == kDimensionToken || type == kDelimiterToken || |
280 type == kIdentToken) { | 279 type == kIdentToken) { |
281 value_list_.push_back(token); | 280 value_list_.push_back(token); |
282 return true; | 281 return true; |
283 } | 282 } |
284 | 283 |
285 return false; | 284 return false; |
286 } | 285 } |
287 | 286 |
288 void MediaQueryData::SetMediaType(const String& media_type) { | 287 void MediaQueryData::SetMediaType(const String& media_type) { |
289 media_type_ = media_type; | 288 media_type_ = media_type; |
290 media_type_set_ = true; | 289 media_type_set_ = true; |
291 } | 290 } |
292 | 291 |
293 } // namespace blink | 292 } // namespace blink |
OLD | NEW |