OLD | NEW |
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 Loading... |
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); |
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 StringImpl* mediaFeatureImpl = attemptStaticStringCreation(mediaFeature.lowe
r()).impl(); |
| 219 unsigned mediaFeatureHash = mediaFeatureImpl->existingHash(); |
208 | 220 |
209 // Create value for media query expression that must have 1 or more values. | 221 // Create value for media query expression that must have 1 or more values. |
210 if (valueList) { | 222 if (valueList && valueList->size() > 0) { |
211 if (valueList->size() == 1) { | 223 if (valueList->size() == 1) { |
212 CSSParserValue* value = valueList->current(); | 224 CSSParserValue* value = valueList->current(); |
213 | 225 |
214 if (featureWithCSSValueID(mediaFeature, value)) { | 226 if (featureWithCSSValueID(mediaFeatureHash, value)) { |
215 // Media features that use CSSValueIDs. | 227 // Media features that use CSSValueIDs. |
216 cssValue = CSSPrimitiveValue::createIdentifier(value->id); | 228 cssValue = CSSPrimitiveValue::createIdentifier(value->id); |
217 if (!featureWithValidIdent(mediaFeature, toCSSPrimitiveValue(css
Value.get())->getValueID())) | 229 if (!featureWithValidIdent(mediaFeatureHash, toCSSPrimitiveValue
(cssValue.get())->getValueID())) |
218 cssValue.clear(); | 230 cssValue.clear(); |
219 } else if (featureWithValidDensity(mediaFeature, value)) { | 231 } else if (featureWithValidDensity(mediaFeatureHash, value)) { |
220 // Media features that must have non-negative <density>, ie. dpp
x, dpi or dpcm. | 232 // 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); | 233 cssValue = CSSPrimitiveValue::create(value->fValue, (CSSPrimitiv
eValue::UnitTypes) value->unit); |
222 } else if (featureWithValidPositiveLenghtOrNumber(mediaFeature, valu
e)) { | 234 } else if (featureWithValidPositiveLengthOrNumber(mediaFeatureHash,
value)) { |
223 // Media features that must have non-negative <lenght> or number
value. | 235 // Media features that must have non-negative <lenght> or number
value. |
224 cssValue = CSSPrimitiveValue::create(value->fValue, (CSSPrimitiv
eValue::UnitTypes) value->unit); | 236 cssValue = CSSPrimitiveValue::create(value->fValue, (CSSPrimitiv
eValue::UnitTypes) value->unit); |
225 } else if (featureWithPositiveInteger(mediaFeature, value)) { | 237 } else if (featureWithPositiveInteger(mediaFeatureHash, value)) { |
226 // Media features that must have non-negative integer value. | 238 // Media features that must have non-negative integer value. |
227 cssValue = CSSPrimitiveValue::create(value->fValue, CSSPrimitive
Value::CSS_NUMBER); | 239 cssValue = CSSPrimitiveValue::create(value->fValue, CSSPrimitive
Value::CSS_NUMBER); |
228 } else if (featureWithPositiveNumber(mediaFeature, value)) { | 240 } else if (featureWithPositiveNumber(mediaFeatureHash, value)) { |
229 // Media features that must have non-negative number value. | 241 // Media features that must have non-negative number value. |
230 cssValue = CSSPrimitiveValue::create(value->fValue, CSSPrimitive
Value::CSS_NUMBER); | 242 cssValue = CSSPrimitiveValue::create(value->fValue, CSSPrimitive
Value::CSS_NUMBER); |
231 } else if (featureWithZeroOrOne(mediaFeature, value)) { | 243 } else if (featureWithZeroOrOne(mediaFeatureHash, value)) { |
232 // Media features that must have (0|1) value. | 244 // Media features that must have (0|1) value. |
233 cssValue = CSSPrimitiveValue::create(value->fValue, CSSPrimitive
Value::CSS_NUMBER); | 245 cssValue = CSSPrimitiveValue::create(value->fValue, CSSPrimitive
Value::CSS_NUMBER); |
234 } | 246 } |
235 | 247 |
236 isValid = cssValue; | 248 isValid = cssValue; |
237 | 249 |
238 } else if (valueList->size() == 3 && featureWithAspectRatio(mediaFeature
)) { | 250 } else if (valueList->size() == 3 && featureWithAspectRatio(mediaFeature
Hash)) { |
239 // Create list of values. | 251 // Create list of values. |
240 // Currently accepts only <integer>/<integer>. | 252 // Currently accepts only <integer>/<integer>. |
241 // Applicable to device-aspect-ratio and aspec-ratio. | 253 // Applicable to device-aspect-ratio and aspec-ratio. |
242 isValid = true; | 254 isValid = true; |
243 float numeratorValue = 0; | 255 float numeratorValue = 0; |
244 float denominatorValue = 0; | 256 float denominatorValue = 0; |
245 // The aspect-ratio must be <integer> (whitespace)? / (whitespace)?
<integer>. | 257 // The aspect-ratio must be <integer> (whitespace)? / (whitespace)?
<integer>. |
246 for (unsigned i = 0; i < 3; ++i, valueList->next()) { | 258 for (unsigned i = 0; i < 3; ++i, valueList->next()) { |
247 const CSSParserValue* value = valueList->current(); | 259 const CSSParserValue* value = valueList->current(); |
248 if (i != 1 && value->unit == CSSPrimitiveValue::CSS_NUMBER && va
lue->fValue > 0 && value->isInt) { | 260 if (i != 1 && value->unit == CSSPrimitiveValue::CSS_NUMBER && va
lue->fValue > 0 && value->isInt) { |
249 if (!i) | 261 if (!i) |
250 numeratorValue = value->fValue; | 262 numeratorValue = value->fValue; |
251 else | 263 else |
252 denominatorValue = value->fValue; | 264 denominatorValue = value->fValue; |
253 } else if (i == 1 && value->unit == CSSParserValue::Operator &&
value->iValue == '/') { | 265 } else if (i == 1 && value->unit == CSSParserValue::Operator &&
value->iValue == '/') { |
254 continue; | 266 continue; |
255 } else { | 267 } else { |
256 isValid = false; | 268 isValid = false; |
257 break; | 269 break; |
258 } | 270 } |
259 } | 271 } |
260 | 272 |
261 if (isValid) | 273 if (isValid) |
262 cssValue = CSSAspectRatioValue::create(numeratorValue, denominat
orValue); | 274 cssValue = CSSAspectRatioValue::create(numeratorValue, denominat
orValue); |
263 } | 275 } |
264 } else if (featureWithoutValue(mediaFeature)) { | 276 } else if (featureWithoutValue(mediaFeatureHash)) { |
265 isValid = true; | 277 isValid = true; |
266 } | 278 } |
267 | 279 |
268 if (!isValid) | 280 if (!isValid) |
269 return nullptr; | 281 return nullptr; |
270 | 282 |
271 return adoptPtr(new MediaQueryExp(mediaFeature, cssValue)); | 283 return adoptPtr(new MediaQueryExp(mediaFeatureImpl, cssValue)); |
272 } | 284 } |
273 | 285 |
274 MediaQueryExp::~MediaQueryExp() | 286 MediaQueryExp::~MediaQueryExp() |
275 { | 287 { |
276 } | 288 } |
277 | 289 |
278 String MediaQueryExp::serialize() const | 290 String MediaQueryExp::serialize() const |
279 { | 291 { |
280 StringBuilder result; | 292 StringBuilder result; |
281 result.append("("); | 293 result.append("("); |
282 result.append(m_mediaFeature.lower()); | 294 result.append(m_mediaFeature.lower()); |
283 if (m_value) { | 295 if (m_value) { |
284 result.append(": "); | 296 result.append(": "); |
285 result.append(m_value->cssText()); | 297 result.append(m_value->cssText()); |
286 } | 298 } |
287 result.append(")"); | 299 result.append(")"); |
288 | 300 |
289 return result.toString(); | 301 return result.toString(); |
290 } | 302 } |
291 | 303 |
292 } // namespace | 304 } // namespace |
OLD | NEW |