| 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 |