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 |