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" |
11 | 11 |
12 namespace WebCore { | 12 namespace WebCore { |
13 | 13 |
14 PassRefPtrWillBeRawPtr<MediaQuerySet> MediaQueryParser::parse(const String& quer
yString) | 14 PassRefPtrWillBeRawPtr<MediaQuerySet> MediaQueryParser::parseMediaQuerySet(const
String& queryString) |
15 { | 15 { |
16 return MediaQueryParser(queryString).parseImpl(); | 16 // FIXME: Replace the MediaQueryTokenizer with a generic CSSTokenizer, once
there is one, |
| 17 // or better yet, replace the MediaQueryParser with a generic thread-safe CS
S parser. |
| 18 Vector<MediaQueryToken> tokens; |
| 19 MediaQueryTokenizer::tokenize(queryString, tokens); |
| 20 return MediaQueryParser(MediaQuerySetParser).parseImpl(tokens.begin(), token
s.end()); |
| 21 } |
| 22 |
| 23 PassRefPtrWillBeRawPtr<MediaQuerySet> MediaQueryParser::parseMediaCondition(Toke
nIterator token, TokenIterator endToken) |
| 24 { |
| 25 return MediaQueryParser(MediaConditionParser).parseImpl(token, endToken); |
17 } | 26 } |
18 | 27 |
19 const MediaQueryParser::State MediaQueryParser::ReadRestrictor = &MediaQueryPars
er::readRestrictor; | 28 const MediaQueryParser::State MediaQueryParser::ReadRestrictor = &MediaQueryPars
er::readRestrictor; |
20 const MediaQueryParser::State MediaQueryParser::ReadMediaType = &MediaQueryParse
r::readMediaType; | 29 const MediaQueryParser::State MediaQueryParser::ReadMediaType = &MediaQueryParse
r::readMediaType; |
21 const MediaQueryParser::State MediaQueryParser::ReadAnd = &MediaQueryParser::rea
dAnd; | 30 const MediaQueryParser::State MediaQueryParser::ReadAnd = &MediaQueryParser::rea
dAnd; |
22 const MediaQueryParser::State MediaQueryParser::ReadFeatureStart = &MediaQueryPa
rser::readFeatureStart; | 31 const MediaQueryParser::State MediaQueryParser::ReadFeatureStart = &MediaQueryPa
rser::readFeatureStart; |
23 const MediaQueryParser::State MediaQueryParser::ReadFeature = &MediaQueryParser:
:readFeature; | 32 const MediaQueryParser::State MediaQueryParser::ReadFeature = &MediaQueryParser:
:readFeature; |
24 const MediaQueryParser::State MediaQueryParser::ReadFeatureColon = &MediaQueryPa
rser::readFeatureColon; | 33 const MediaQueryParser::State MediaQueryParser::ReadFeatureColon = &MediaQueryPa
rser::readFeatureColon; |
25 const MediaQueryParser::State MediaQueryParser::ReadFeatureValue = &MediaQueryPa
rser::readFeatureValue; | 34 const MediaQueryParser::State MediaQueryParser::ReadFeatureValue = &MediaQueryPa
rser::readFeatureValue; |
26 const MediaQueryParser::State MediaQueryParser::ReadFeatureEnd = &MediaQueryPars
er::readFeatureEnd; | 35 const MediaQueryParser::State MediaQueryParser::ReadFeatureEnd = &MediaQueryPars
er::readFeatureEnd; |
27 const MediaQueryParser::State MediaQueryParser::SkipUntilComma = &MediaQueryPars
er::skipUntilComma; | 36 const MediaQueryParser::State MediaQueryParser::SkipUntilComma = &MediaQueryPars
er::skipUntilComma; |
28 const MediaQueryParser::State MediaQueryParser::SkipUntilBlockEnd = &MediaQueryP
arser::skipUntilBlockEnd; | 37 const MediaQueryParser::State MediaQueryParser::SkipUntilBlockEnd = &MediaQueryP
arser::skipUntilBlockEnd; |
29 const MediaQueryParser::State MediaQueryParser::Done = &MediaQueryParser::done; | 38 const MediaQueryParser::State MediaQueryParser::Done = &MediaQueryParser::done; |
30 | 39 |
31 // FIXME: Replace the MediaQueryTokenizer with a generic CSSTokenizer, once ther
e is one, | 40 MediaQueryParser::MediaQueryParser(ParserType parserType) |
32 // or better yet, replace the MediaQueryParser with a generic thread-safe CSS pa
rser. | 41 : m_querySet(MediaQuerySet::create()) |
33 MediaQueryParser::MediaQueryParser(const String& queryString) | |
34 : m_state(&MediaQueryParser::readRestrictor) | |
35 , m_querySet(MediaQuerySet::create()) | |
36 { | 42 { |
37 MediaQueryTokenizer::tokenize(queryString, m_tokens); | 43 if (parserType == MediaQuerySetParser) |
| 44 m_state = &MediaQueryParser::readRestrictor; |
| 45 else // MediaConditionParser |
| 46 m_state = &MediaQueryParser::readFeatureStart; |
38 } | 47 } |
39 | 48 |
| 49 MediaQueryParser::~MediaQueryParser() { }; |
| 50 |
40 void MediaQueryParser::setStateAndRestrict(State state, MediaQuery::Restrictor r
estrictor) | 51 void MediaQueryParser::setStateAndRestrict(State state, MediaQuery::Restrictor r
estrictor) |
41 { | 52 { |
42 m_mediaQueryData.setRestrictor(restrictor); | 53 m_mediaQueryData.setRestrictor(restrictor); |
43 m_state = state; | 54 m_state = state; |
44 } | 55 } |
45 | 56 |
46 // State machine member functions start here | 57 // State machine member functions start here |
47 void MediaQueryParser::readRestrictor(MediaQueryTokenType type, TokenIterator& t
oken) | 58 void MediaQueryParser::readRestrictor(MediaQueryTokenType type, TokenIterator& t
oken) |
48 { | 59 { |
49 readMediaType(type, token); | 60 readMediaType(type, token); |
(...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
198 MediaQueryTokenType type = token->type(); | 209 MediaQueryTokenType type = token->type(); |
199 | 210 |
200 observeBlocks(type); | 211 observeBlocks(type); |
201 | 212 |
202 // Call the function that handles current state | 213 // Call the function that handles current state |
203 if (type != WhitespaceToken && type != CommentToken) | 214 if (type != WhitespaceToken && type != CommentToken) |
204 ((this)->*(m_state))(type, token); | 215 ((this)->*(m_state))(type, token); |
205 } | 216 } |
206 | 217 |
207 // The state machine loop | 218 // The state machine loop |
208 PassRefPtrWillBeRawPtr<MediaQuerySet> MediaQueryParser::parseImpl() | 219 PassRefPtrWillBeRawPtr<MediaQuerySet> MediaQueryParser::parseImpl(TokenIterator
token, TokenIterator endToken) |
209 { | 220 { |
210 for (Vector<MediaQueryToken>::iterator token = m_tokens.begin(); token != m_
tokens.end(); ++token) | 221 for (; token != endToken; ++token) |
211 processToken(token); | 222 processToken(token); |
212 | 223 |
213 if (m_state != ReadAnd && m_state != ReadRestrictor && m_state != Done) | 224 if (m_state != ReadAnd && m_state != ReadRestrictor && m_state != Done) |
214 m_querySet->addMediaQuery(MediaQuery::createNotAll()); | 225 m_querySet->addMediaQuery(MediaQuery::createNotAll()); |
215 else if (m_mediaQueryData.currentMediaQueryChanged()) | 226 else if (m_mediaQueryData.currentMediaQueryChanged()) |
216 m_querySet->addMediaQuery(m_mediaQueryData.takeMediaQuery()); | 227 m_querySet->addMediaQuery(m_mediaQueryData.takeMediaQuery()); |
217 | 228 |
218 return m_querySet; | 229 return m_querySet; |
219 } | 230 } |
220 | 231 |
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
272 m_valueList.addValue(value); | 283 m_valueList.addValue(value); |
273 } | 284 } |
274 | 285 |
275 void MediaQueryData::setMediaType(const String& mediaType) | 286 void MediaQueryData::setMediaType(const String& mediaType) |
276 { | 287 { |
277 m_mediaType = mediaType; | 288 m_mediaType = mediaType; |
278 m_mediaTypeSet = true; | 289 m_mediaTypeSet = true; |
279 } | 290 } |
280 | 291 |
281 } // namespace WebCore | 292 } // namespace WebCore |
OLD | NEW |