| 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 "SizesAttributeParser.h" | 6 #include "SizesAttributeParser.h" |
| 7 | 7 |
| 8 #include "MediaTypeNames.h" | 8 #include "MediaTypeNames.h" |
| 9 #include "core/css/MediaQueryEvaluator.h" | 9 #include "core/css/MediaQueryEvaluator.h" |
| 10 #include "core/css/parser/MediaQueryTokenizer.h" | 10 #include "core/css/parser/MediaQueryTokenizer.h" |
| 11 #include "core/css/parser/SizesCalcParser.h" | 11 #include "core/css/parser/SizesCalcParser.h" |
| 12 | 12 |
| 13 namespace WebCore { | 13 namespace WebCore { |
| 14 | 14 |
| 15 unsigned SizesAttributeParser::findEffectiveSize(const String& attribute, PassRe
fPtr<MediaValues> mediaValues) | 15 unsigned SizesAttributeParser::findEffectiveSize(const String& attribute, PassRe
fPtr<MediaValues> mediaValues) |
| 16 { | 16 { |
| 17 Vector<MediaQueryToken> tokens; | 17 Vector<MediaQueryToken> tokens; |
| 18 SizesAttributeParser parser(mediaValues); | 18 SizesAttributeParser parser(mediaValues); |
| 19 | 19 |
| 20 MediaQueryTokenizer::tokenize(attribute, tokens); | 20 MediaQueryTokenizer::tokenize(attribute, tokens); |
| 21 if (!parser.parse(tokens)) | 21 if (!parser.parse(tokens)) |
| 22 return parser.effectiveSizeDefaultValue(); | 22 return parser.effectiveSizeDefaultValue(); |
| 23 return parser.effectiveSize(); | 23 return parser.effectiveSize(); |
| 24 } | 24 } |
| 25 | 25 |
| 26 bool SizesAttributeParser::calculateLengthInPixels(MediaQueryTokenIterator start
Token, MediaQueryTokenIterator endToken, unsigned& result) | 26 bool SizesAttributeParser::calculateLengthInPixels(MediaQueryTokenIterator start
Token, MediaQueryTokenIterator endToken, unsigned& result) |
| 27 { | 27 { |
| 28 if (startToken == endToken) |
| 29 return false; |
| 28 MediaQueryTokenType type = startToken->type(); | 30 MediaQueryTokenType type = startToken->type(); |
| 29 if (type == DimensionToken) { | 31 if (type == DimensionToken) { |
| 30 int length; | 32 int length; |
| 31 if (!CSSPrimitiveValue::isLength(startToken->unitType())) | 33 if (!CSSPrimitiveValue::isLength(startToken->unitType())) |
| 32 return false; | 34 return false; |
| 33 if ((m_mediaValues->computeLength(startToken->numericValue(), startToken
->unitType(), length)) && (length > 0)) { | 35 if ((m_mediaValues->computeLength(startToken->numericValue(), startToken
->unitType(), length)) && (length > 0)) { |
| 34 result = (unsigned)length; | 36 result = (unsigned)length; |
| 35 return true; | 37 return true; |
| 36 } | 38 } |
| 37 } else if (type == FunctionToken) { | 39 } else if (type == FunctionToken) { |
| 38 return SizesCalcParser::parse(startToken, endToken, m_mediaValues, resul
t); | 40 return SizesCalcParser::parse(startToken, endToken, m_mediaValues, resul
t); |
| 41 } else if (type == NumberToken && !startToken->numericValue()) { |
| 42 result = 0; |
| 43 return true; |
| 39 } | 44 } |
| 40 | 45 |
| 41 return false; | 46 return false; |
| 42 } | 47 } |
| 43 | 48 |
| 44 static void reverseSkipIrrelevantTokens(MediaQueryTokenIterator& token, MediaQue
ryTokenIterator startToken) | 49 static void reverseSkipIrrelevantTokens(MediaQueryTokenIterator& token, MediaQue
ryTokenIterator startToken) |
| 45 { | 50 { |
| 46 MediaQueryTokenIterator endToken = token; | 51 MediaQueryTokenIterator endToken = token; |
| 47 while (token != startToken && (token->type() == WhitespaceToken || token->ty
pe() == CommentToken || token->type() == EOFToken)) | 52 while (token != startToken && (token->type() == WhitespaceToken || token->ty
pe() == CommentToken || token->type() == EOFToken)) |
| 48 --token; | 53 --token; |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 86 reverseSkipIrrelevantTokens(endToken, startToken); | 91 reverseSkipIrrelevantTokens(endToken, startToken); |
| 87 lengthTokenEnd = endToken; | 92 lengthTokenEnd = endToken; |
| 88 reverseSkipUntilComponentStart(endToken, startToken); | 93 reverseSkipUntilComponentStart(endToken, startToken); |
| 89 lengthTokenStart = endToken; | 94 lengthTokenStart = endToken; |
| 90 unsigned length; | 95 unsigned length; |
| 91 if (!calculateLengthInPixels(lengthTokenStart, lengthTokenEnd, length)) | 96 if (!calculateLengthInPixels(lengthTokenStart, lengthTokenEnd, length)) |
| 92 return false; | 97 return false; |
| 93 RefPtrWillBeRawPtr<MediaQuerySet> mediaCondition = MediaQueryParser::parseMe
diaCondition(startToken, endToken); | 98 RefPtrWillBeRawPtr<MediaQuerySet> mediaCondition = MediaQueryParser::parseMe
diaCondition(startToken, endToken); |
| 94 if (mediaCondition && mediaConditionMatches(mediaCondition)) { | 99 if (mediaCondition && mediaConditionMatches(mediaCondition)) { |
| 95 m_length = length; | 100 m_length = length; |
| 101 m_lengthWasSet = true; |
| 96 return true; | 102 return true; |
| 97 } | 103 } |
| 98 return false; | 104 return false; |
| 99 } | 105 } |
| 100 | 106 |
| 101 bool SizesAttributeParser::parse(Vector<MediaQueryToken>& tokens) | 107 bool SizesAttributeParser::parse(Vector<MediaQueryToken>& tokens) |
| 102 { | 108 { |
| 103 if (tokens.isEmpty()) | 109 if (tokens.isEmpty()) |
| 104 return false; | 110 return false; |
| 105 MediaQueryTokenIterator startToken = tokens.begin(); | 111 MediaQueryTokenIterator startToken = tokens.begin(); |
| 106 MediaQueryTokenIterator endToken; | 112 MediaQueryTokenIterator endToken; |
| 107 // Split on a comma token, and send the result tokens to be parsed as (media
-condition, length) pairs | 113 // Split on a comma token, and send the result tokens to be parsed as (media
-condition, length) pairs |
| 108 for (MediaQueryTokenIterator token = tokens.begin(); token != tokens.end();
++token) { | 114 for (MediaQueryTokenIterator token = tokens.begin(); token != tokens.end();
++token) { |
| 109 if (token->type() == CommaToken) { | 115 if (token->type() == CommaToken) { |
| 110 endToken = token; | 116 endToken = token; |
| 111 if (parseMediaConditionAndLength(startToken, endToken)) | 117 if (parseMediaConditionAndLength(startToken, endToken)) |
| 112 return true; | 118 return true; |
| 113 startToken = token; | 119 startToken = token; |
| 114 ++startToken; | 120 ++startToken; |
| 115 } | 121 } |
| 116 } | 122 } |
| 117 endToken = tokens.end(); | 123 endToken = tokens.end(); |
| 118 return parseMediaConditionAndLength(startToken, --endToken); | 124 return parseMediaConditionAndLength(startToken, --endToken); |
| 119 } | 125 } |
| 120 | 126 |
| 121 unsigned SizesAttributeParser::effectiveSize() | 127 unsigned SizesAttributeParser::effectiveSize() |
| 122 { | 128 { |
| 123 if (m_length) | 129 if (m_lengthWasSet) |
| 124 return m_length; | 130 return m_length; |
| 125 return effectiveSizeDefaultValue(); | 131 return effectiveSizeDefaultValue(); |
| 126 } | 132 } |
| 127 | 133 |
| 128 unsigned SizesAttributeParser::effectiveSizeDefaultValue() | 134 unsigned SizesAttributeParser::effectiveSizeDefaultValue() |
| 129 { | 135 { |
| 130 // Returning the equivalent of "100%" | 136 // Returning the equivalent of "100%" |
| 131 return m_mediaValues->viewportWidth(); | 137 return m_mediaValues->viewportWidth(); |
| 132 } | 138 } |
| 133 | 139 |
| 134 } // namespace | 140 } // namespace |
| 135 | 141 |
| OLD | NEW |