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/SizesAttributeParser.h" | 6 #include "core/css/parser/SizesAttributeParser.h" |
7 | 7 |
8 #include "core/MediaTypeNames.h" | 8 #include "core/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 blink { | 13 namespace blink { |
14 | 14 |
15 SizesAttributeParser::SizesAttributeParser(PassRefPtr<MediaValues> mediaValues,
const String& attribute) | 15 SizesAttributeParser::SizesAttributeParser(PassRefPtr<MediaValues> mediaValues,
const String& attribute) |
16 : m_mediaValues(mediaValues) | 16 : m_mediaValues(mediaValues) |
17 , m_length(0) | 17 , m_length(0) |
18 , m_lengthWasSet(false) | 18 , m_lengthWasSet(false) |
19 , m_viewportDependant(false) | 19 , m_viewportDependant(false) |
20 { | 20 { |
21 MediaQueryTokenizer::tokenize(attribute, m_tokens); | 21 MediaQueryTokenizer::tokenize(attribute, m_tokens); |
22 m_isValid = parse(m_tokens); | 22 m_isValid = parse(m_tokens); |
23 } | 23 } |
24 | 24 |
25 unsigned SizesAttributeParser::length() | 25 float SizesAttributeParser::length() |
26 { | 26 { |
27 if (m_isValid) | 27 if (m_isValid) |
28 return effectiveSize(); | 28 return effectiveSize(); |
29 return effectiveSizeDefaultValue(); | 29 return effectiveSizeDefaultValue(); |
30 } | 30 } |
31 | 31 |
32 bool SizesAttributeParser::calculateLengthInPixels(MediaQueryTokenIterator start
Token, MediaQueryTokenIterator endToken, unsigned& result) | 32 bool SizesAttributeParser::calculateLengthInPixels(MediaQueryTokenIterator start
Token, MediaQueryTokenIterator endToken, float& result) |
33 { | 33 { |
34 if (startToken == endToken) | 34 if (startToken == endToken) |
35 return false; | 35 return false; |
36 MediaQueryTokenType type = startToken->type(); | 36 MediaQueryTokenType type = startToken->type(); |
37 if (type == DimensionToken) { | 37 if (type == DimensionToken) { |
38 int length; | 38 double length; |
39 if (!CSSPrimitiveValue::isLength(startToken->unitType())) | 39 if (!CSSPrimitiveValue::isLength(startToken->unitType())) |
40 return false; | 40 return false; |
41 m_viewportDependant = CSSPrimitiveValue::isViewportPercentageLength(star
tToken->unitType()); | 41 m_viewportDependant = CSSPrimitiveValue::isViewportPercentageLength(star
tToken->unitType()); |
42 if ((m_mediaValues->computeLength(startToken->numericValue(), startToken
->unitType(), length)) && (length >= 0)) { | 42 if ((m_mediaValues->computeLength(startToken->numericValue(), startToken
->unitType(), length)) && (length >= 0)) { |
43 result = (unsigned)length; | 43 result = clampTo<float>(length); |
44 return true; | 44 return true; |
45 } | 45 } |
46 } else if (type == FunctionToken) { | 46 } else if (type == FunctionToken) { |
47 SizesCalcParser calcParser(startToken, endToken, m_mediaValues); | 47 SizesCalcParser calcParser(startToken, endToken, m_mediaValues); |
48 if (!calcParser.isValid()) | 48 if (!calcParser.isValid()) |
49 return false; | 49 return false; |
50 m_viewportDependant = calcParser.viewportDependant(); | 50 m_viewportDependant = calcParser.viewportDependant(); |
51 result = calcParser.result(); | 51 result = calcParser.result(); |
52 return true; | 52 return true; |
53 } else if (type == NumberToken && !startToken->numericValue()) { | 53 } else if (type == NumberToken && !startToken->numericValue()) { |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
97 | 97 |
98 bool SizesAttributeParser::parseMediaConditionAndLength(MediaQueryTokenIterator
startToken, MediaQueryTokenIterator endToken) | 98 bool SizesAttributeParser::parseMediaConditionAndLength(MediaQueryTokenIterator
startToken, MediaQueryTokenIterator endToken) |
99 { | 99 { |
100 MediaQueryTokenIterator lengthTokenStart; | 100 MediaQueryTokenIterator lengthTokenStart; |
101 MediaQueryTokenIterator lengthTokenEnd; | 101 MediaQueryTokenIterator lengthTokenEnd; |
102 | 102 |
103 reverseSkipIrrelevantTokens(endToken, startToken); | 103 reverseSkipIrrelevantTokens(endToken, startToken); |
104 lengthTokenEnd = endToken; | 104 lengthTokenEnd = endToken; |
105 reverseSkipUntilComponentStart(endToken, startToken); | 105 reverseSkipUntilComponentStart(endToken, startToken); |
106 lengthTokenStart = endToken; | 106 lengthTokenStart = endToken; |
107 unsigned length; | 107 float length; |
108 if (!calculateLengthInPixels(lengthTokenStart, lengthTokenEnd, length)) | 108 if (!calculateLengthInPixels(lengthTokenStart, lengthTokenEnd, length)) |
109 return false; | 109 return false; |
110 RefPtrWillBeRawPtr<MediaQuerySet> mediaCondition = MediaQueryParser::parseMe
diaCondition(startToken, endToken); | 110 RefPtrWillBeRawPtr<MediaQuerySet> mediaCondition = MediaQueryParser::parseMe
diaCondition(startToken, endToken); |
111 if (mediaCondition && mediaConditionMatches(mediaCondition)) { | 111 if (mediaCondition && mediaConditionMatches(mediaCondition)) { |
112 m_length = length; | 112 m_length = length; |
113 m_lengthWasSet = true; | 113 m_lengthWasSet = true; |
114 return true; | 114 return true; |
115 } | 115 } |
116 return false; | 116 return false; |
117 } | 117 } |
(...skipping 12 matching lines...) Expand all Loading... |
130 if (parseMediaConditionAndLength(startToken, endToken)) | 130 if (parseMediaConditionAndLength(startToken, endToken)) |
131 return true; | 131 return true; |
132 startToken = token; | 132 startToken = token; |
133 ++startToken; | 133 ++startToken; |
134 } | 134 } |
135 } | 135 } |
136 endToken = tokens.end(); | 136 endToken = tokens.end(); |
137 return parseMediaConditionAndLength(startToken, --endToken); | 137 return parseMediaConditionAndLength(startToken, --endToken); |
138 } | 138 } |
139 | 139 |
140 unsigned SizesAttributeParser::effectiveSize() | 140 float SizesAttributeParser::effectiveSize() |
141 { | 141 { |
142 if (m_lengthWasSet) | 142 if (m_lengthWasSet) |
143 return m_length; | 143 return m_length; |
144 return effectiveSizeDefaultValue(); | 144 return effectiveSizeDefaultValue(); |
145 } | 145 } |
146 | 146 |
147 unsigned SizesAttributeParser::effectiveSizeDefaultValue() | 147 unsigned SizesAttributeParser::effectiveSizeDefaultValue() |
148 { | 148 { |
149 // Returning the equivalent of "100vw" | 149 // Returning the equivalent of "100vw" |
150 m_viewportDependant = true; | 150 m_viewportDependant = true; |
151 return m_mediaValues->viewportWidth(); | 151 return m_mediaValues->viewportWidth(); |
152 } | 152 } |
153 | 153 |
154 } // namespace | 154 } // namespace |
155 | 155 |
OLD | NEW |