Chromium Code Reviews| 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 21 matching lines...) Expand all Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 |
| OLD | NEW |