| Index: Source/core/css/parser/MediaQueryParser.cpp
|
| diff --git a/Source/core/css/parser/MediaQueryParser.cpp b/Source/core/css/parser/MediaQueryParser.cpp
|
| index b90d155476965972ba2443654c25df52816d2482..925a25905bc520ac7cbc6219da3bd79f6d41dcbe 100644
|
| --- a/Source/core/css/parser/MediaQueryParser.cpp
|
| +++ b/Source/core/css/parser/MediaQueryParser.cpp
|
| @@ -55,36 +55,36 @@ void MediaQueryParser::setStateAndRestrict(State state, MediaQuery::Restrictor r
|
| }
|
|
|
| // State machine member functions start here
|
| -void MediaQueryParser::readRestrictor(MediaQueryTokenType type, TokenIterator& token)
|
| +void MediaQueryParser::readRestrictor(MediaQueryTokenType type, const MediaQueryToken& token)
|
| {
|
| readMediaType(type, token);
|
| }
|
|
|
| -void MediaQueryParser::readMediaType(MediaQueryTokenType type, TokenIterator& token)
|
| +void MediaQueryParser::readMediaType(MediaQueryTokenType type, const MediaQueryToken& token)
|
| {
|
| if (type == LeftParenthesisToken) {
|
| m_state = ReadFeature;
|
| } else if (type == IdentToken) {
|
| - if (m_state == ReadRestrictor && equalIgnoringCase(token->value(), "not")) {
|
| + if (m_state == ReadRestrictor && equalIgnoringCase(token.value(), "not")) {
|
| setStateAndRestrict(ReadMediaType, MediaQuery::Not);
|
| - } else if (m_state == ReadRestrictor && equalIgnoringCase(token->value(), "only")) {
|
| + } else if (m_state == ReadRestrictor && equalIgnoringCase(token.value(), "only")) {
|
| setStateAndRestrict(ReadMediaType, MediaQuery::Only);
|
| } else {
|
| - m_mediaQueryData.setMediaType(token->value());
|
| + m_mediaQueryData.setMediaType(token.value());
|
| m_state = ReadAnd;
|
| }
|
| } else if (type == EOFToken && (!m_querySet->queryVector().size() || m_state != ReadRestrictor)) {
|
| m_state = Done;
|
| } else {
|
| - if (type == CommaToken)
|
| - --token;
|
| m_state = SkipUntilComma;
|
| + if (type == CommaToken)
|
| + skipUntilComma(type, token);
|
| }
|
| }
|
|
|
| -void MediaQueryParser::readAnd(MediaQueryTokenType type, TokenIterator& token)
|
| +void MediaQueryParser::readAnd(MediaQueryTokenType type, const MediaQueryToken& token)
|
| {
|
| - if (type == IdentToken && equalIgnoringCase(token->value(), "and")) {
|
| + if (type == IdentToken && equalIgnoringCase(token.value(), "and")) {
|
| m_state = ReadFeatureStart;
|
| } else if (type == CommaToken) {
|
| m_querySet->addMediaQuery(m_mediaQueryData.takeMediaQuery());
|
| @@ -96,7 +96,7 @@ void MediaQueryParser::readAnd(MediaQueryTokenType type, TokenIterator& token)
|
| }
|
| }
|
|
|
| -void MediaQueryParser::readFeatureStart(MediaQueryTokenType type, TokenIterator& token)
|
| +void MediaQueryParser::readFeatureStart(MediaQueryTokenType type, const MediaQueryToken& token)
|
| {
|
| if (type == LeftParenthesisToken)
|
| m_state = ReadFeature;
|
| @@ -104,111 +104,81 @@ void MediaQueryParser::readFeatureStart(MediaQueryTokenType type, TokenIterator&
|
| m_state = SkipUntilComma;
|
| }
|
|
|
| -void MediaQueryParser::readFeature(MediaQueryTokenType type, TokenIterator& token)
|
| +void MediaQueryParser::readFeature(MediaQueryTokenType type, const MediaQueryToken& token)
|
| {
|
| if (type == IdentToken) {
|
| - m_mediaQueryData.setMediaFeature(token->value());
|
| + m_mediaQueryData.setMediaFeature(token.value());
|
| m_state = ReadFeatureColon;
|
| } else {
|
| m_state = SkipUntilComma;
|
| }
|
| }
|
|
|
| -void MediaQueryParser::readFeatureColon(MediaQueryTokenType type, TokenIterator& token)
|
| +void MediaQueryParser::readFeatureColon(MediaQueryTokenType type, const MediaQueryToken& token)
|
| {
|
| - if (type == ColonToken) {
|
| + if (type == ColonToken)
|
| m_state = ReadFeatureValue;
|
| - } else if (type == RightParenthesisToken || type == EOFToken) {
|
| - --token;
|
| - m_state = ReadFeatureEnd;
|
| - } else {
|
| + else if (type == RightParenthesisToken || type == EOFToken)
|
| + readFeatureEnd(type, token);
|
| + else
|
| m_state = SkipUntilBlockEnd;
|
| - }
|
| }
|
|
|
| -void MediaQueryParser::readFeatureValue(MediaQueryTokenType type, TokenIterator& token)
|
| +void MediaQueryParser::readFeatureValue(MediaQueryTokenType type, const MediaQueryToken& token)
|
| {
|
| - if (type == DimensionToken && token->unitType() == CSSPrimitiveValue::CSS_UNKNOWN) {
|
| + if (type == DimensionToken && token.unitType() == CSSPrimitiveValue::CSS_UNKNOWN) {
|
| m_state = SkipUntilComma;
|
| } else {
|
| - m_mediaQueryData.addParserValue(type, *token);
|
| + m_mediaQueryData.addParserValue(type, token);
|
| m_state = ReadFeatureEnd;
|
| }
|
| }
|
|
|
| -void MediaQueryParser::readFeatureEnd(MediaQueryTokenType type, TokenIterator& token)
|
| +void MediaQueryParser::readFeatureEnd(MediaQueryTokenType type, const MediaQueryToken& token)
|
| {
|
| if (type == RightParenthesisToken || type == EOFToken) {
|
| if (m_mediaQueryData.addExpression())
|
| m_state = ReadAnd;
|
| else
|
| m_state = SkipUntilComma;
|
| - } else if (type == DelimiterToken && token->delimiter() == '/') {
|
| - m_mediaQueryData.addParserValue(type, *token);
|
| + } else if (type == DelimiterToken && token.delimiter() == '/') {
|
| + m_mediaQueryData.addParserValue(type, token);
|
| m_state = ReadFeatureValue;
|
| } else {
|
| m_state = SkipUntilBlockEnd;
|
| }
|
| }
|
|
|
| -void MediaQueryParser::skipUntilComma(MediaQueryTokenType type, TokenIterator& token)
|
| +void MediaQueryParser::skipUntilComma(MediaQueryTokenType type, const MediaQueryToken& token)
|
| {
|
| - if ((type == CommaToken && m_blockStack.isEmpty()) || type == EOFToken) {
|
| + if ((type == CommaToken && !m_blockWatcher.blockLevel()) || type == EOFToken) {
|
| m_state = ReadRestrictor;
|
| m_mediaQueryData.clear();
|
| m_querySet->addMediaQuery(MediaQuery::createNotAll());
|
| }
|
| }
|
|
|
| -void MediaQueryParser::skipUntilBlockEnd(MediaQueryTokenType type, TokenIterator& token)
|
| +void MediaQueryParser::skipUntilBlockEnd(MediaQueryTokenType type, const MediaQueryToken& token)
|
| {
|
| - if (m_blockStack.isEmpty())
|
| + if (token.blockType() == MediaQueryToken::BlockEnd && !m_blockWatcher.blockLevel())
|
| m_state = SkipUntilComma;
|
| }
|
|
|
| -void MediaQueryParser::done(MediaQueryTokenType type, TokenIterator& token) { }
|
| +void MediaQueryParser::done(MediaQueryTokenType type, const MediaQueryToken& token) { }
|
|
|
| -void MediaQueryParser::popIfBlockMatches(Vector<BlockType>& blockStack, BlockType type)
|
| +void MediaQueryParser::handleBlocks(const MediaQueryToken& token)
|
| {
|
| - if (!blockStack.isEmpty() && blockStack.last() == type)
|
| - blockStack.removeLast();
|
| -}
|
| -
|
| -bool MediaQueryParser::observeBlock(BlockParameters& parameters, MediaQueryTokenType type)
|
| -{
|
| - if (type == parameters.leftToken) {
|
| - if (parameters.stateChange == ModifyState)
|
| + if (token.blockType() == MediaQueryToken::BlockStart
|
| + && (token.type() != LeftParenthesisToken || m_blockWatcher.blockLevel()))
|
| m_state = SkipUntilBlockEnd;
|
| - m_blockStack.append(parameters.blockType);
|
| - } else if (type == parameters.rightToken) {
|
| - popIfBlockMatches(m_blockStack, parameters.blockType);
|
| - } else {
|
| - return false;
|
| - }
|
| - return true;
|
| -}
|
| -
|
| -void MediaQueryParser::observeBlocks(MediaQueryTokenType type)
|
| -{
|
| - enum { BlockParametersCount = 4 };
|
| - BlockParameters blockParameterSet[BlockParametersCount] = {
|
| - { LeftParenthesisToken, RightParenthesisToken, ParenthesisBlock, DoNotModifyState },
|
| - { FunctionToken, RightParenthesisToken, ParenthesisBlock, ModifyState },
|
| - { LeftBracketToken, RightBracketToken, BracketsBlock, ModifyState },
|
| - { LeftBraceToken, RightBraceToken, BracesBlock, ModifyState }
|
| - };
|
| -
|
| - for (unsigned i = 0; i < BlockParametersCount; ++i) {
|
| - if (observeBlock(blockParameterSet[i], type))
|
| - break;
|
| - }
|
| }
|
|
|
| -void MediaQueryParser::processToken(TokenIterator& token)
|
| +void MediaQueryParser::processToken(const MediaQueryToken& token)
|
| {
|
| - MediaQueryTokenType type = token->type();
|
| + MediaQueryTokenType type = token.type();
|
|
|
| - observeBlocks(type);
|
| + handleBlocks(token);
|
| + m_blockWatcher.handleToken(token);
|
|
|
| // Call the function that handles current state
|
| if (type != WhitespaceToken && type != CommentToken)
|
| @@ -219,7 +189,7 @@ void MediaQueryParser::processToken(TokenIterator& token)
|
| PassRefPtrWillBeRawPtr<MediaQuerySet> MediaQueryParser::parseImpl(TokenIterator token, TokenIterator endToken)
|
| {
|
| for (; token != endToken; ++token)
|
| - processToken(token);
|
| + processToken(*token);
|
|
|
| if (m_state != ReadAnd && m_state != ReadRestrictor && m_state != Done)
|
| m_querySet->addMediaQuery(MediaQuery::createNotAll());
|
| @@ -263,7 +233,7 @@ bool MediaQueryData::addExpression()
|
| return isValid;
|
| }
|
|
|
| -void MediaQueryData::addParserValue(MediaQueryTokenType type, MediaQueryToken& token)
|
| +void MediaQueryData::addParserValue(MediaQueryTokenType type, const MediaQueryToken& token)
|
| {
|
| CSSParserValue value;
|
| if (type == NumberToken || type == PercentageToken || type == DimensionToken) {
|
|
|