Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(70)

Side by Side Diff: Source/core/css/MediaQueryExp.cpp

Issue 171383002: A thread-safe Media Query Parser (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Another attempt to fix Android build issues Created 6 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 /* 1 /*
2 * CSS Media Query 2 * CSS Media Query
3 * 3 *
4 * Copyright (C) 2006 Kimmo Kinnunen <kimmo.t.kinnunen@nokia.com>. 4 * Copyright (C) 2006 Kimmo Kinnunen <kimmo.t.kinnunen@nokia.com>.
5 * Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). 5 * Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
6 * Copyright (C) 2013 Apple Inc. All rights reserved. 6 * Copyright (C) 2013 Apple Inc. All rights reserved.
7 * 7 *
8 * Redistribution and use in source and binary forms, with or without 8 * Redistribution and use in source and binary forms, with or without
9 * modification, are permitted provided that the following conditions 9 * modification, are permitted provided that the following conditions
10 * are met: 10 * are met:
(...skipping 14 matching lines...) Expand all
25 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 25 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 26 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
27 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28 */ 28 */
29 29
30 #include "config.h" 30 #include "config.h"
31 #include "core/css/MediaQueryExp.h" 31 #include "core/css/MediaQueryExp.h"
32 32
33 #include "CSSValueKeywords.h" 33 #include "CSSValueKeywords.h"
34 #include "core/css/CSSAspectRatioValue.h" 34 #include "core/css/CSSAspectRatioValue.h"
35 #include "core/css/parser/BisonCSSParser.h" 35 #include "core/css/CSSParserValues.h"
36 #include "core/css/CSSPrimitiveValue.h" 36 #include "core/css/CSSPrimitiveValue.h"
37 #include "core/html/parser/HTMLParserIdioms.h"
37 #include "wtf/text/StringBuilder.h" 38 #include "wtf/text/StringBuilder.h"
38 39
39 namespace WebCore { 40 namespace WebCore {
40 41
41 static inline bool featureWithCSSValueID(const AtomicString& mediaFeature, const CSSParserValue* value) 42 using namespace MediaFeatureNames;
43
44 static inline bool hashEquals(const unsigned mediaFeatureHash, const String& med iaFeature)
45 {
46 return (mediaFeatureHash == mediaFeature.impl()->existingHash());
47 }
48
49 static inline bool featureWithCSSValueID(const unsigned mediaFeatureHash, const CSSParserValue* value)
42 { 50 {
43 if (!value->id) 51 if (!value->id)
44 return false; 52 return false;
45 53
46 return mediaFeature == MediaFeatureNames::orientationMediaFeature 54 return hashEquals(mediaFeatureHash, orientationMediaFeature)
47 || mediaFeature == MediaFeatureNames::viewModeMediaFeature 55 || hashEquals(mediaFeatureHash, viewModeMediaFeature)
48 || mediaFeature == MediaFeatureNames::pointerMediaFeature 56 || hashEquals(mediaFeatureHash, pointerMediaFeature)
49 || mediaFeature == MediaFeatureNames::scanMediaFeature; 57 || hashEquals(mediaFeatureHash, scanMediaFeature);
abarth-chromium 2014/03/01 07:28:25 Where do these strings come from? We can make the
50 } 58 }
51 59
52 static inline bool featureWithValidIdent(const AtomicString& mediaFeature, CSSVa lueID ident) 60 static inline bool featureWithValidIdent(const unsigned mediaFeatureHash, CSSVal ueID ident)
53 { 61 {
54 if (mediaFeature == MediaFeatureNames::orientationMediaFeature) 62 if (hashEquals(mediaFeatureHash, orientationMediaFeature))
55 return ident == CSSValuePortrait || ident == CSSValueLandscape; 63 return ident == CSSValuePortrait || ident == CSSValueLandscape;
56 64
57 if (mediaFeature == MediaFeatureNames::viewModeMediaFeature) { 65 if (hashEquals(mediaFeatureHash, viewModeMediaFeature)) {
58 switch (ident) { 66 switch (ident) {
59 case CSSValueWindowed: 67 case CSSValueWindowed:
60 case CSSValueFloating: 68 case CSSValueFloating:
61 case CSSValueFullscreen: 69 case CSSValueFullscreen:
62 case CSSValueMaximized: 70 case CSSValueMaximized:
63 case CSSValueMinimized: 71 case CSSValueMinimized:
64 return true; 72 return true;
65 default: 73 default:
66 return false; 74 return false;
67 } 75 }
68 } 76 }
69 77
70 if (mediaFeature == MediaFeatureNames::pointerMediaFeature) 78 if (hashEquals(mediaFeatureHash, pointerMediaFeature))
71 return ident == CSSValueNone || ident == CSSValueCoarse || ident == CSSV alueFine; 79 return ident == CSSValueNone || ident == CSSValueCoarse || ident == CSSV alueFine;
72 80
73 if (mediaFeature == MediaFeatureNames::scanMediaFeature) 81 if (hashEquals(mediaFeatureHash, scanMediaFeature))
74 return ident == CSSValueInterlace || ident == CSSValueProgressive; 82 return ident == CSSValueInterlace || ident == CSSValueProgressive;
75 83
76 ASSERT_NOT_REACHED(); 84 ASSERT_NOT_REACHED();
77 return false; 85 return false;
78 } 86 }
79 87
80 static inline bool featureWithValidPositiveLenghtOrNumber(const AtomicString& me diaFeature, const CSSParserValue* value) 88 static inline bool featureWithValidPositiveLengthOrNumber(const unsigned mediaFe atureHash, const CSSParserValue* value)
81 { 89 {
82 if (!(((value->unit >= CSSPrimitiveValue::CSS_EMS && value->unit <= CSSPrimi tiveValue::CSS_PC) || value->unit == CSSPrimitiveValue::CSS_REMS) || value->unit == CSSPrimitiveValue::CSS_NUMBER) || value->fValue < 0) 90 if (!(((value->unit >= CSSPrimitiveValue::CSS_PERCENTAGE && value->unit <= C SSPrimitiveValue::CSS_PC) || value->unit == CSSPrimitiveValue::CSS_REMS) || valu e->unit == CSSPrimitiveValue::CSS_NUMBER) || value->fValue < 0)
83 return false; 91 return false;
84 92
85 return mediaFeature == MediaFeatureNames::heightMediaFeature 93
86 || mediaFeature == MediaFeatureNames::maxHeightMediaFeature 94 return hashEquals(mediaFeatureHash, heightMediaFeature)
87 || mediaFeature == MediaFeatureNames::minHeightMediaFeature 95 || hashEquals(mediaFeatureHash, maxHeightMediaFeature)
88 || mediaFeature == MediaFeatureNames::widthMediaFeature 96 || hashEquals(mediaFeatureHash, minHeightMediaFeature)
89 || mediaFeature == MediaFeatureNames::maxWidthMediaFeature 97 || hashEquals(mediaFeatureHash, widthMediaFeature)
90 || mediaFeature == MediaFeatureNames::minWidthMediaFeature 98 || hashEquals(mediaFeatureHash, maxWidthMediaFeature)
91 || mediaFeature == MediaFeatureNames::deviceHeightMediaFeature 99 || hashEquals(mediaFeatureHash, minWidthMediaFeature)
92 || mediaFeature == MediaFeatureNames::maxDeviceHeightMediaFeature 100 || hashEquals(mediaFeatureHash, deviceHeightMediaFeature)
93 || mediaFeature == MediaFeatureNames::minDeviceHeightMediaFeature 101 || hashEquals(mediaFeatureHash, maxDeviceHeightMediaFeature)
94 || mediaFeature == MediaFeatureNames::deviceWidthMediaFeature 102 || hashEquals(mediaFeatureHash, minDeviceHeightMediaFeature)
95 || mediaFeature == MediaFeatureNames::maxDeviceWidthMediaFeature 103 || hashEquals(mediaFeatureHash, deviceWidthMediaFeature)
96 || mediaFeature == MediaFeatureNames::minDeviceWidthMediaFeature; 104 || hashEquals(mediaFeatureHash, minDeviceWidthMediaFeature)
105 || hashEquals(mediaFeatureHash, maxDeviceWidthMediaFeature);
97 } 106 }
98 107
99 static inline bool featureWithValidDensity(const AtomicString& mediaFeature, con st CSSParserValue* value) 108 static inline bool featureWithValidDensity(const unsigned mediaFeatureHash, cons t CSSParserValue* value)
100 { 109 {
101 if ((value->unit != CSSPrimitiveValue::CSS_DPPX && value->unit != CSSPrimiti veValue::CSS_DPI && value->unit != CSSPrimitiveValue::CSS_DPCM) || value->fValue <= 0) 110 if ((value->unit != CSSPrimitiveValue::CSS_DPPX && value->unit != CSSPrimiti veValue::CSS_DPI && value->unit != CSSPrimitiveValue::CSS_DPCM) || value->fValue <= 0)
102 return false; 111 return false;
103 112
104 return mediaFeature == MediaFeatureNames::resolutionMediaFeature 113 return hashEquals(mediaFeatureHash, resolutionMediaFeature)
105 || mediaFeature == MediaFeatureNames::maxResolutionMediaFeature 114 || hashEquals(mediaFeatureHash, minResolutionMediaFeature)
106 || mediaFeature == MediaFeatureNames::minResolutionMediaFeature; 115 || hashEquals(mediaFeatureHash, maxResolutionMediaFeature);
107 } 116 }
108 117
109 static inline bool featureWithPositiveInteger(const AtomicString& mediaFeature, const CSSParserValue* value) 118 static inline bool featureWithPositiveInteger(const unsigned mediaFeatureHash, c onst CSSParserValue* value)
110 { 119 {
111 if (!value->isInt || value->fValue < 0) 120 if (!value->isInt || value->fValue < 0)
112 return false; 121 return false;
113 122
114 return mediaFeature == MediaFeatureNames::colorMediaFeature 123 return hashEquals(mediaFeatureHash, colorMediaFeature)
115 || mediaFeature == MediaFeatureNames::maxColorMediaFeature 124 || hashEquals(mediaFeatureHash, maxColorMediaFeature)
116 || mediaFeature == MediaFeatureNames::minColorMediaFeature 125 || hashEquals(mediaFeatureHash, minColorMediaFeature)
117 || mediaFeature == MediaFeatureNames::colorIndexMediaFeature 126 || hashEquals(mediaFeatureHash, colorIndexMediaFeature)
118 || mediaFeature == MediaFeatureNames::maxColorIndexMediaFeature 127 || hashEquals(mediaFeatureHash, maxColorIndexMediaFeature)
119 || mediaFeature == MediaFeatureNames::minColorIndexMediaFeature 128 || hashEquals(mediaFeatureHash, minColorIndexMediaFeature)
120 || mediaFeature == MediaFeatureNames::monochromeMediaFeature 129 || hashEquals(mediaFeatureHash, monochromeMediaFeature)
121 || mediaFeature == MediaFeatureNames::minMonochromeMediaFeature 130 || hashEquals(mediaFeatureHash, maxMonochromeMediaFeature)
122 || mediaFeature == MediaFeatureNames::maxMonochromeMediaFeature; 131 || hashEquals(mediaFeatureHash, minMonochromeMediaFeature);
123 } 132 }
124 133
125 static inline bool featureWithPositiveNumber(const AtomicString& mediaFeature, c onst CSSParserValue* value) 134 static inline bool featureWithPositiveNumber(const unsigned mediaFeatureHash, co nst CSSParserValue* value)
126 { 135 {
127 if (value->unit != CSSPrimitiveValue::CSS_NUMBER || value->fValue < 0) 136 if (value->unit != CSSPrimitiveValue::CSS_NUMBER || value->fValue < 0)
128 return false; 137 return false;
129 138
130 return mediaFeature == MediaFeatureNames::transform2dMediaFeature 139 return hashEquals(mediaFeatureHash, transform2dMediaFeature)
131 || mediaFeature == MediaFeatureNames::transform3dMediaFeature 140 || hashEquals(mediaFeatureHash, transform3dMediaFeature)
132 || mediaFeature == MediaFeatureNames::animationMediaFeature 141 || hashEquals(mediaFeatureHash, animationMediaFeature)
133 || mediaFeature == MediaFeatureNames::devicePixelRatioMediaFeature 142 || hashEquals(mediaFeatureHash, devicePixelRatioMediaFeature)
134 || mediaFeature == MediaFeatureNames::maxDevicePixelRatioMediaFeature 143 || hashEquals(mediaFeatureHash, maxDevicePixelRatioMediaFeature)
135 || mediaFeature == MediaFeatureNames::minDevicePixelRatioMediaFeature; 144 || hashEquals(mediaFeatureHash, minDevicePixelRatioMediaFeature);
136 } 145 }
137 146
138 static inline bool featureWithZeroOrOne(const AtomicString& mediaFeature, const CSSParserValue* value) 147 static inline bool featureWithZeroOrOne(const unsigned mediaFeatureHash, const C SSParserValue* value)
139 { 148 {
140 if (!value->isInt || !(value->fValue == 1 || !value->fValue)) 149 if (!value->isInt || !(value->fValue == 1 || !value->fValue))
141 return false; 150 return false;
142 151
143 return mediaFeature == MediaFeatureNames::gridMediaFeature 152 return hashEquals(mediaFeatureHash, gridMediaFeature)
144 || mediaFeature == MediaFeatureNames::hoverMediaFeature; 153 || hashEquals(mediaFeatureHash, hoverMediaFeature);
145 } 154 }
146 155
147 static inline bool featureWithAspectRatio(const AtomicString& mediaFeature) 156 static inline bool featureWithAspectRatio(const unsigned mediaFeatureHash)
148 { 157 {
149 return mediaFeature == MediaFeatureNames::aspectRatioMediaFeature 158 return hashEquals(mediaFeatureHash, aspectRatioMediaFeature)
150 || mediaFeature == MediaFeatureNames::deviceAspectRatioMediaFeature 159 || hashEquals(mediaFeatureHash, deviceAspectRatioMediaFeature)
151 || mediaFeature == MediaFeatureNames::minAspectRatioMediaFeature 160 || hashEquals(mediaFeatureHash, minAspectRatioMediaFeature)
152 || mediaFeature == MediaFeatureNames::maxAspectRatioMediaFeature 161 || hashEquals(mediaFeatureHash, maxAspectRatioMediaFeature)
153 || mediaFeature == MediaFeatureNames::minDeviceAspectRatioMediaFeature 162 || hashEquals(mediaFeatureHash, minDeviceAspectRatioMediaFeature)
154 || mediaFeature == MediaFeatureNames::maxDeviceAspectRatioMediaFeature; 163 || hashEquals(mediaFeatureHash, maxDeviceAspectRatioMediaFeature);
155 } 164 }
156 165
157 static inline bool featureWithoutValue(const AtomicString& mediaFeature) 166 static inline bool featureWithoutValue(const unsigned mediaFeatureHash)
158 { 167 {
159 // Media features that are prefixed by min/max cannot be used without a valu e. 168 // Media features that are prefixed by min/max cannot be used without a valu e.
160 return mediaFeature == MediaFeatureNames::monochromeMediaFeature 169 return hashEquals(mediaFeatureHash, monochromeMediaFeature)
161 || mediaFeature == MediaFeatureNames::colorMediaFeature 170 || hashEquals(mediaFeatureHash, colorMediaFeature)
162 || mediaFeature == MediaFeatureNames::colorIndexMediaFeature 171 || hashEquals(mediaFeatureHash, colorIndexMediaFeature)
163 || mediaFeature == MediaFeatureNames::gridMediaFeature 172 || hashEquals(mediaFeatureHash, gridMediaFeature)
164 || mediaFeature == MediaFeatureNames::heightMediaFeature 173 || hashEquals(mediaFeatureHash, heightMediaFeature)
165 || mediaFeature == MediaFeatureNames::widthMediaFeature 174 || hashEquals(mediaFeatureHash, widthMediaFeature)
166 || mediaFeature == MediaFeatureNames::deviceHeightMediaFeature 175 || hashEquals(mediaFeatureHash, deviceHeightMediaFeature)
167 || mediaFeature == MediaFeatureNames::deviceWidthMediaFeature 176 || hashEquals(mediaFeatureHash, deviceWidthMediaFeature)
168 || mediaFeature == MediaFeatureNames::orientationMediaFeature 177 || hashEquals(mediaFeatureHash, orientationMediaFeature)
169 || mediaFeature == MediaFeatureNames::aspectRatioMediaFeature 178 || hashEquals(mediaFeatureHash, aspectRatioMediaFeature)
170 || mediaFeature == MediaFeatureNames::deviceAspectRatioMediaFeature 179 || hashEquals(mediaFeatureHash, deviceAspectRatioMediaFeature)
171 || mediaFeature == MediaFeatureNames::hoverMediaFeature 180 || hashEquals(mediaFeatureHash, hoverMediaFeature)
172 || mediaFeature == MediaFeatureNames::transform2dMediaFeature 181 || hashEquals(mediaFeatureHash, transform2dMediaFeature)
173 || mediaFeature == MediaFeatureNames::transform3dMediaFeature 182 || hashEquals(mediaFeatureHash, transform3dMediaFeature)
174 || mediaFeature == MediaFeatureNames::animationMediaFeature 183 || hashEquals(mediaFeatureHash, animationMediaFeature)
175 || mediaFeature == MediaFeatureNames::viewModeMediaFeature 184 || hashEquals(mediaFeatureHash, viewModeMediaFeature)
176 || mediaFeature == MediaFeatureNames::pointerMediaFeature 185 || hashEquals(mediaFeatureHash, pointerMediaFeature)
177 || mediaFeature == MediaFeatureNames::devicePixelRatioMediaFeature 186 || hashEquals(mediaFeatureHash, devicePixelRatioMediaFeature)
178 || mediaFeature == MediaFeatureNames::resolutionMediaFeature 187 || hashEquals(mediaFeatureHash, resolutionMediaFeature)
179 || mediaFeature == MediaFeatureNames::scanMediaFeature; 188 || hashEquals(mediaFeatureHash, scanMediaFeature);
180 } 189 }
181 190
182 bool MediaQueryExp::isViewportDependent() const 191 bool MediaQueryExp::isViewportDependent() const
183 { 192 {
184 return m_mediaFeature == MediaFeatureNames::widthMediaFeature 193 return hashEquals(m_mediaFeatureHash, widthMediaFeature)
185 || m_mediaFeature == MediaFeatureNames::heightMediaFeature 194 || hashEquals(m_mediaFeatureHash, heightMediaFeature)
186 || m_mediaFeature == MediaFeatureNames::minWidthMediaFeature 195 || hashEquals(m_mediaFeatureHash, minWidthMediaFeature)
187 || m_mediaFeature == MediaFeatureNames::minHeightMediaFeature 196 || hashEquals(m_mediaFeatureHash, minHeightMediaFeature)
188 || m_mediaFeature == MediaFeatureNames::maxWidthMediaFeature 197 || hashEquals(m_mediaFeatureHash, maxWidthMediaFeature)
189 || m_mediaFeature == MediaFeatureNames::maxHeightMediaFeature 198 || hashEquals(m_mediaFeatureHash, maxHeightMediaFeature)
190 || m_mediaFeature == MediaFeatureNames::orientationMediaFeature 199 || hashEquals(m_mediaFeatureHash, orientationMediaFeature)
191 || m_mediaFeature == MediaFeatureNames::aspectRatioMediaFeature 200 || hashEquals(m_mediaFeatureHash, aspectRatioMediaFeature)
192 || m_mediaFeature == MediaFeatureNames::minAspectRatioMediaFeature 201 || hashEquals(m_mediaFeatureHash, minAspectRatioMediaFeature)
193 || m_mediaFeature == MediaFeatureNames::devicePixelRatioMediaFeature 202 || hashEquals(m_mediaFeatureHash, devicePixelRatioMediaFeature)
194 || m_mediaFeature == MediaFeatureNames::resolutionMediaFeature 203 || hashEquals(m_mediaFeatureHash, resolutionMediaFeature)
195 || m_mediaFeature == MediaFeatureNames::maxAspectRatioMediaFeature; 204 || hashEquals(m_mediaFeatureHash, maxAspectRatioMediaFeature);
196 } 205 }
197 206
198 MediaQueryExp::MediaQueryExp(const AtomicString& mediaFeature, PassRefPtrWillBeR awPtr<CSSValue> value) 207 MediaQueryExp::MediaQueryExp(StringImpl* mediaFeatureImpl, PassRefPtrWillBeRawPt r<CSSValue> value)
199 : m_mediaFeature(mediaFeature) 208 : m_mediaFeature(mediaFeatureImpl)
209 , m_mediaFeatureHash(mediaFeatureImpl->existingHash())
200 , m_value(value) 210 , m_value(value)
201 { 211 {
202 } 212 }
203 213
204 PassOwnPtr<MediaQueryExp> MediaQueryExp::create(const AtomicString& mediaFeature , CSSParserValueList* valueList) 214 PassOwnPtr<MediaQueryExp> MediaQueryExp::create(const String& mediaFeature, CSSP arserValueList* valueList)
205 { 215 {
206 RefPtrWillBeRawPtr<CSSValue> cssValue; 216 RefPtrWillBeRawPtr<CSSValue> cssValue;
207 bool isValid = false; 217 bool isValid = false;
218 String mediaFeatureLower(mediaFeature.lower());
219 mediaFeatureLower.ensure16Bit();
220 StringImpl* mediaFeatureImpl = attemptStaticStringCreation(mediaFeatureLower , Likely8Bit).impl();
221 unsigned mediaFeatureHash = mediaFeatureImpl->existingHash();
208 222
209 // Create value for media query expression that must have 1 or more values. 223 // Create value for media query expression that must have 1 or more values.
210 if (valueList) { 224 if (valueList && valueList->size() > 0) {
211 if (valueList->size() == 1) { 225 if (valueList->size() == 1) {
212 CSSParserValue* value = valueList->current(); 226 CSSParserValue* value = valueList->current();
213 227
214 if (featureWithCSSValueID(mediaFeature, value)) { 228 if (featureWithCSSValueID(mediaFeatureHash, value)) {
215 // Media features that use CSSValueIDs. 229 // Media features that use CSSValueIDs.
216 cssValue = CSSPrimitiveValue::createIdentifier(value->id); 230 cssValue = CSSPrimitiveValue::createIdentifier(value->id);
217 if (!featureWithValidIdent(mediaFeature, toCSSPrimitiveValue(css Value.get())->getValueID())) 231 if (!featureWithValidIdent(mediaFeatureHash, toCSSPrimitiveValue (cssValue.get())->getValueID()))
218 cssValue.clear(); 232 cssValue.clear();
219 } else if (featureWithValidDensity(mediaFeature, value)) { 233 } else if (featureWithValidDensity(mediaFeatureHash, value)) {
220 // Media features that must have non-negative <density>, ie. dpp x, dpi or dpcm. 234 // Media features that must have non-negative <density>, ie. dpp x, dpi or dpcm.
221 cssValue = CSSPrimitiveValue::create(value->fValue, (CSSPrimitiv eValue::UnitTypes) value->unit); 235 cssValue = CSSPrimitiveValue::create(value->fValue, (CSSPrimitiv eValue::UnitTypes) value->unit);
222 } else if (featureWithValidPositiveLenghtOrNumber(mediaFeature, valu e)) { 236 } else if (featureWithValidPositiveLengthOrNumber(mediaFeatureHash, value)) {
223 // Media features that must have non-negative <lenght> or number value. 237 // Media features that must have non-negative <lenght> or number value.
224 cssValue = CSSPrimitiveValue::create(value->fValue, (CSSPrimitiv eValue::UnitTypes) value->unit); 238 cssValue = CSSPrimitiveValue::create(value->fValue, (CSSPrimitiv eValue::UnitTypes) value->unit);
225 } else if (featureWithPositiveInteger(mediaFeature, value)) { 239 } else if (featureWithPositiveInteger(mediaFeatureHash, value)) {
226 // Media features that must have non-negative integer value. 240 // Media features that must have non-negative integer value.
227 cssValue = CSSPrimitiveValue::create(value->fValue, CSSPrimitive Value::CSS_NUMBER); 241 cssValue = CSSPrimitiveValue::create(value->fValue, CSSPrimitive Value::CSS_NUMBER);
228 } else if (featureWithPositiveNumber(mediaFeature, value)) { 242 } else if (featureWithPositiveNumber(mediaFeatureHash, value)) {
229 // Media features that must have non-negative number value. 243 // Media features that must have non-negative number value.
230 cssValue = CSSPrimitiveValue::create(value->fValue, CSSPrimitive Value::CSS_NUMBER); 244 cssValue = CSSPrimitiveValue::create(value->fValue, CSSPrimitive Value::CSS_NUMBER);
231 } else if (featureWithZeroOrOne(mediaFeature, value)) { 245 } else if (featureWithZeroOrOne(mediaFeatureHash, value)) {
232 // Media features that must have (0|1) value. 246 // Media features that must have (0|1) value.
233 cssValue = CSSPrimitiveValue::create(value->fValue, CSSPrimitive Value::CSS_NUMBER); 247 cssValue = CSSPrimitiveValue::create(value->fValue, CSSPrimitive Value::CSS_NUMBER);
234 } 248 }
235 249
236 isValid = cssValue; 250 isValid = cssValue;
237 251
238 } else if (valueList->size() == 3 && featureWithAspectRatio(mediaFeature )) { 252 } else if (valueList->size() == 3 && featureWithAspectRatio(mediaFeature Hash)) {
239 // Create list of values. 253 // Create list of values.
240 // Currently accepts only <integer>/<integer>. 254 // Currently accepts only <integer>/<integer>.
241 // Applicable to device-aspect-ratio and aspec-ratio. 255 // Applicable to device-aspect-ratio and aspec-ratio.
242 isValid = true; 256 isValid = true;
243 float numeratorValue = 0; 257 float numeratorValue = 0;
244 float denominatorValue = 0; 258 float denominatorValue = 0;
245 // The aspect-ratio must be <integer> (whitespace)? / (whitespace)? <integer>. 259 // The aspect-ratio must be <integer> (whitespace)? / (whitespace)? <integer>.
246 for (unsigned i = 0; i < 3; ++i, valueList->next()) { 260 for (unsigned i = 0; i < 3; ++i, valueList->next()) {
247 const CSSParserValue* value = valueList->current(); 261 const CSSParserValue* value = valueList->current();
248 if (i != 1 && value->unit == CSSPrimitiveValue::CSS_NUMBER && va lue->fValue > 0 && value->isInt) { 262 if (i != 1 && value->unit == CSSPrimitiveValue::CSS_NUMBER && va lue->fValue > 0 && value->isInt) {
249 if (!i) 263 if (!i)
250 numeratorValue = value->fValue; 264 numeratorValue = value->fValue;
251 else 265 else
252 denominatorValue = value->fValue; 266 denominatorValue = value->fValue;
253 } else if (i == 1 && value->unit == CSSParserValue::Operator && value->iValue == '/') { 267 } else if (i == 1 && value->unit == CSSParserValue::Operator && value->iValue == '/') {
254 continue; 268 continue;
255 } else { 269 } else {
256 isValid = false; 270 isValid = false;
257 break; 271 break;
258 } 272 }
259 } 273 }
260 274
261 if (isValid) 275 if (isValid)
262 cssValue = CSSAspectRatioValue::create(numeratorValue, denominat orValue); 276 cssValue = CSSAspectRatioValue::create(numeratorValue, denominat orValue);
263 } 277 }
264 } else if (featureWithoutValue(mediaFeature)) { 278 } else if (featureWithoutValue(mediaFeatureHash)) {
265 isValid = true; 279 isValid = true;
266 } 280 }
267 281
268 if (!isValid) 282 if (!isValid)
269 return nullptr; 283 return nullptr;
270 284
271 return adoptPtr(new MediaQueryExp(mediaFeature, cssValue)); 285 return adoptPtr(new MediaQueryExp(mediaFeatureImpl, cssValue));
272 } 286 }
273 287
274 MediaQueryExp::~MediaQueryExp() 288 MediaQueryExp::~MediaQueryExp()
275 { 289 {
276 } 290 }
277 291
278 String MediaQueryExp::serialize() const 292 String MediaQueryExp::serialize() const
279 { 293 {
280 StringBuilder result; 294 StringBuilder result;
281 result.append("("); 295 result.append("(");
282 result.append(m_mediaFeature.lower()); 296 result.append(m_mediaFeature.lower());
283 if (m_value) { 297 if (m_value) {
284 result.append(": "); 298 result.append(": ");
285 result.append(m_value->cssText()); 299 result.append(m_value->cssText());
286 } 300 }
287 result.append(")"); 301 result.append(")");
288 302
289 return result.toString(); 303 return result.toString();
290 } 304 }
291 305
292 } // namespace 306 } // namespace
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698