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

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: Refactored and passes tests Created 6 years, 10 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
« no previous file with comments | « Source/core/css/MediaQueryExp.h ('k') | Source/core/css/parser/CSSInputStream.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 16 matching lines...) Expand all
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/parser/BisonCSSParser.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 static inline bool featureWithCSSValueID(const unsigned mediaFeatureHash, const CSSParserValue* value)
42 { 43 {
44 // FIXME - We have no more IDs, since the CSSValuePool is a singleton!!!
43 if (!value->id) 45 if (!value->id)
44 return false; 46 return false;
45 47
46 return mediaFeature == MediaFeatureNames::orientationMediaFeature 48 return mediaFeatureHash == MediaFeatureNames::orientationMediaFeature.impl() ->existingHash()
eseidel 2014/02/26 10:18:41 Consider writing an hashEquals() helper which take
47 || mediaFeature == MediaFeatureNames::viewModeMediaFeature 49 || mediaFeatureHash == MediaFeatureNames::viewModeMediaFeature.impl()->e xistingHash()
48 || mediaFeature == MediaFeatureNames::pointerMediaFeature 50 || mediaFeatureHash == MediaFeatureNames::pointerMediaFeature.impl()->ex istingHash()
49 || mediaFeature == MediaFeatureNames::scanMediaFeature; 51 || mediaFeatureHash == MediaFeatureNames::scanMediaFeature.impl()->exist ingHash();
50 } 52 }
51 53
52 static inline bool featureWithValidIdent(const AtomicString& mediaFeature, CSSVa lueID ident) 54 static inline bool featureWithValidIdent(const unsigned mediaFeatureHash, CSSVal ueID ident)
53 { 55 {
54 if (mediaFeature == MediaFeatureNames::orientationMediaFeature) 56 if (mediaFeatureHash == MediaFeatureNames::orientationMediaFeature.impl()->e xistingHash())
55 return ident == CSSValuePortrait || ident == CSSValueLandscape; 57 return ident == CSSValuePortrait || ident == CSSValueLandscape;
56 58
57 if (mediaFeature == MediaFeatureNames::viewModeMediaFeature) { 59 if (mediaFeatureHash == MediaFeatureNames::viewModeMediaFeature.impl()->exis tingHash()) {
58 switch (ident) { 60 switch (ident) {
59 case CSSValueWindowed: 61 case CSSValueWindowed:
60 case CSSValueFloating: 62 case CSSValueFloating:
61 case CSSValueFullscreen: 63 case CSSValueFullscreen:
62 case CSSValueMaximized: 64 case CSSValueMaximized:
63 case CSSValueMinimized: 65 case CSSValueMinimized:
64 return true; 66 return true;
65 default: 67 default:
66 return false; 68 return false;
67 } 69 }
68 } 70 }
69 71
70 if (mediaFeature == MediaFeatureNames::pointerMediaFeature) 72 if (mediaFeatureHash == MediaFeatureNames::pointerMediaFeature.impl()->exist ingHash())
71 return ident == CSSValueNone || ident == CSSValueCoarse || ident == CSSV alueFine; 73 return ident == CSSValueNone || ident == CSSValueCoarse || ident == CSSV alueFine;
72 74
73 if (mediaFeature == MediaFeatureNames::scanMediaFeature) 75 if (mediaFeatureHash == MediaFeatureNames::scanMediaFeature.impl()->existing Hash())
74 return ident == CSSValueInterlace || ident == CSSValueProgressive; 76 return ident == CSSValueInterlace || ident == CSSValueProgressive;
75 77
76 ASSERT_NOT_REACHED(); 78 ASSERT_NOT_REACHED();
77 return false; 79 return false;
78 } 80 }
79 81
80 static inline bool featureWithValidPositiveLenghtOrNumber(const AtomicString& me diaFeature, const CSSParserValue* value) 82 static inline bool featureWithValidPositiveLengthOrNumber(const unsigned mediaFe atureHash, const CSSParserValue* value)
81 { 83 {
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) 84 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; 85 return false;
84 86
85 return mediaFeature == MediaFeatureNames::heightMediaFeature 87
86 || mediaFeature == MediaFeatureNames::maxHeightMediaFeature 88 return mediaFeatureHash == MediaFeatureNames::heightMediaFeature.impl()->exi stingHash()
87 || mediaFeature == MediaFeatureNames::minHeightMediaFeature 89 || mediaFeatureHash == MediaFeatureNames::maxHeightMediaFeature.impl()-> existingHash()
88 || mediaFeature == MediaFeatureNames::widthMediaFeature 90 || mediaFeatureHash == MediaFeatureNames::minHeightMediaFeature.impl()-> existingHash()
89 || mediaFeature == MediaFeatureNames::maxWidthMediaFeature 91 || mediaFeatureHash == MediaFeatureNames::widthMediaFeature.impl()->exis tingHash()
90 || mediaFeature == MediaFeatureNames::minWidthMediaFeature 92 || mediaFeatureHash == MediaFeatureNames::maxWidthMediaFeature.impl()->e xistingHash()
91 || mediaFeature == MediaFeatureNames::deviceHeightMediaFeature 93 || mediaFeatureHash == MediaFeatureNames::minWidthMediaFeature.impl()->e xistingHash()
92 || mediaFeature == MediaFeatureNames::maxDeviceHeightMediaFeature 94 || mediaFeatureHash == MediaFeatureNames::deviceHeightMediaFeature.impl( )->existingHash()
93 || mediaFeature == MediaFeatureNames::minDeviceHeightMediaFeature 95 || mediaFeatureHash == MediaFeatureNames::maxDeviceHeightMediaFeature.im pl()->existingHash()
94 || mediaFeature == MediaFeatureNames::deviceWidthMediaFeature 96 || mediaFeatureHash == MediaFeatureNames::minDeviceHeightMediaFeature.im pl()->existingHash()
95 || mediaFeature == MediaFeatureNames::maxDeviceWidthMediaFeature 97 || mediaFeatureHash == MediaFeatureNames::deviceWidthMediaFeature.impl() ->existingHash()
96 || mediaFeature == MediaFeatureNames::minDeviceWidthMediaFeature; 98 || mediaFeatureHash == MediaFeatureNames::maxDeviceWidthMediaFeature.imp l()->existingHash()
99 || mediaFeatureHash == MediaFeatureNames::minDeviceWidthMediaFeature.imp l()->existingHash();
97 } 100 }
98 101
99 static inline bool featureWithValidDensity(const AtomicString& mediaFeature, con st CSSParserValue* value) 102 static inline bool featureWithValidDensity(const unsigned mediaFeatureHash, cons t CSSParserValue* value)
100 { 103 {
101 if ((value->unit != CSSPrimitiveValue::CSS_DPPX && value->unit != CSSPrimiti veValue::CSS_DPI && value->unit != CSSPrimitiveValue::CSS_DPCM) || value->fValue <= 0) 104 if ((value->unit != CSSPrimitiveValue::CSS_DPPX && value->unit != CSSPrimiti veValue::CSS_DPI && value->unit != CSSPrimitiveValue::CSS_DPCM) || value->fValue <= 0)
102 return false; 105 return false;
103 106
104 return mediaFeature == MediaFeatureNames::resolutionMediaFeature 107 return mediaFeatureHash == MediaFeatureNames::resolutionMediaFeature.impl()- >existingHash()
105 || mediaFeature == MediaFeatureNames::maxResolutionMediaFeature 108 || mediaFeatureHash == MediaFeatureNames::maxResolutionMediaFeature.impl ()->existingHash()
106 || mediaFeature == MediaFeatureNames::minResolutionMediaFeature; 109 || mediaFeatureHash == MediaFeatureNames::minResolutionMediaFeature.impl ()->existingHash();
107 } 110 }
108 111
109 static inline bool featureWithPositiveInteger(const AtomicString& mediaFeature, const CSSParserValue* value) 112 static inline bool featureWithPositiveInteger(const unsigned mediaFeatureHash, c onst CSSParserValue* value)
110 { 113 {
111 if (!value->isInt || value->fValue < 0) 114 if (!value->isInt || value->fValue < 0)
112 return false; 115 return false;
113 116
114 return mediaFeature == MediaFeatureNames::colorMediaFeature 117 return mediaFeatureHash == MediaFeatureNames::colorMediaFeature.impl()->exis tingHash()
115 || mediaFeature == MediaFeatureNames::maxColorMediaFeature 118 || mediaFeatureHash == MediaFeatureNames::maxColorMediaFeature.impl()->e xistingHash()
116 || mediaFeature == MediaFeatureNames::minColorMediaFeature 119 || mediaFeatureHash == MediaFeatureNames::minColorMediaFeature.impl()->e xistingHash()
117 || mediaFeature == MediaFeatureNames::colorIndexMediaFeature 120 || mediaFeatureHash == MediaFeatureNames::colorIndexMediaFeature.impl()- >existingHash()
118 || mediaFeature == MediaFeatureNames::maxColorIndexMediaFeature 121 || mediaFeatureHash == MediaFeatureNames::maxColorIndexMediaFeature.impl ()->existingHash()
119 || mediaFeature == MediaFeatureNames::minColorIndexMediaFeature 122 || mediaFeatureHash == MediaFeatureNames::minColorIndexMediaFeature.impl ()->existingHash()
120 || mediaFeature == MediaFeatureNames::monochromeMediaFeature 123 || mediaFeatureHash == MediaFeatureNames::monochromeMediaFeature.impl()- >existingHash()
121 || mediaFeature == MediaFeatureNames::minMonochromeMediaFeature 124 || mediaFeatureHash == MediaFeatureNames::minMonochromeMediaFeature.impl ()->existingHash()
122 || mediaFeature == MediaFeatureNames::maxMonochromeMediaFeature; 125 || mediaFeatureHash == MediaFeatureNames::maxMonochromeMediaFeature.impl ()->existingHash();
123 } 126 }
124 127
125 static inline bool featureWithPositiveNumber(const AtomicString& mediaFeature, c onst CSSParserValue* value) 128 static inline bool featureWithPositiveNumber(const unsigned mediaFeatureHash, co nst CSSParserValue* value)
126 { 129 {
127 if (value->unit != CSSPrimitiveValue::CSS_NUMBER || value->fValue < 0) 130 if (value->unit != CSSPrimitiveValue::CSS_NUMBER || value->fValue < 0)
128 return false; 131 return false;
129 132
130 return mediaFeature == MediaFeatureNames::transform2dMediaFeature 133 return mediaFeatureHash == MediaFeatureNames::transform2dMediaFeature.impl() ->existingHash()
131 || mediaFeature == MediaFeatureNames::transform3dMediaFeature 134 || mediaFeatureHash == MediaFeatureNames::transform3dMediaFeature.impl() ->existingHash()
132 || mediaFeature == MediaFeatureNames::animationMediaFeature 135 || mediaFeatureHash == MediaFeatureNames::animationMediaFeature.impl()-> existingHash()
133 || mediaFeature == MediaFeatureNames::devicePixelRatioMediaFeature 136 || mediaFeatureHash == MediaFeatureNames::devicePixelRatioMediaFeature.i mpl()->existingHash()
134 || mediaFeature == MediaFeatureNames::maxDevicePixelRatioMediaFeature 137 || mediaFeatureHash == MediaFeatureNames::maxDevicePixelRatioMediaFeatur e.impl()->existingHash()
135 || mediaFeature == MediaFeatureNames::minDevicePixelRatioMediaFeature; 138 || mediaFeatureHash == MediaFeatureNames::minDevicePixelRatioMediaFeatur e.impl()->existingHash();
136 } 139 }
137 140
138 static inline bool featureWithZeroOrOne(const AtomicString& mediaFeature, const CSSParserValue* value) 141 static inline bool featureWithZeroOrOne(const unsigned mediaFeatureHash, const C SSParserValue* value)
139 { 142 {
140 if (!value->isInt || !(value->fValue == 1 || !value->fValue)) 143 if (!value->isInt || !(value->fValue == 1 || !value->fValue))
141 return false; 144 return false;
142 145
143 return mediaFeature == MediaFeatureNames::gridMediaFeature 146 return mediaFeatureHash == MediaFeatureNames::gridMediaFeature.impl()->exist ingHash()
144 || mediaFeature == MediaFeatureNames::hoverMediaFeature; 147 || mediaFeatureHash == MediaFeatureNames::hoverMediaFeature.impl()->exis tingHash();
145 } 148 }
146 149
147 static inline bool featureWithAspectRatio(const AtomicString& mediaFeature) 150 static inline bool featureWithAspectRatio(const unsigned mediaFeatureHash)
148 { 151 {
149 return mediaFeature == MediaFeatureNames::aspectRatioMediaFeature 152 return mediaFeatureHash == MediaFeatureNames::aspectRatioMediaFeature.impl() ->existingHash()
150 || mediaFeature == MediaFeatureNames::deviceAspectRatioMediaFeature 153 || mediaFeatureHash == MediaFeatureNames::deviceAspectRatioMediaFeature. impl()->existingHash()
151 || mediaFeature == MediaFeatureNames::minAspectRatioMediaFeature 154 || mediaFeatureHash == MediaFeatureNames::minAspectRatioMediaFeature.imp l()->existingHash()
152 || mediaFeature == MediaFeatureNames::maxAspectRatioMediaFeature 155 || mediaFeatureHash == MediaFeatureNames::maxAspectRatioMediaFeature.imp l()->existingHash()
153 || mediaFeature == MediaFeatureNames::minDeviceAspectRatioMediaFeature 156 || mediaFeatureHash == MediaFeatureNames::minDeviceAspectRatioMediaFeatu re.impl()->existingHash()
154 || mediaFeature == MediaFeatureNames::maxDeviceAspectRatioMediaFeature; 157 || mediaFeatureHash == MediaFeatureNames::maxDeviceAspectRatioMediaFeatu re.impl()->existingHash();
155 } 158 }
156 159
157 static inline bool featureWithoutValue(const AtomicString& mediaFeature) 160 static inline bool featureWithoutValue(const unsigned mediaFeatureHash)
158 { 161 {
159 // Media features that are prefixed by min/max cannot be used without a valu e. 162 // Media features that are prefixed by min/max cannot be used without a valu e.
160 return mediaFeature == MediaFeatureNames::monochromeMediaFeature 163 return mediaFeatureHash == MediaFeatureNames::monochromeMediaFeature.impl()- >existingHash()
161 || mediaFeature == MediaFeatureNames::colorMediaFeature 164 || mediaFeatureHash == MediaFeatureNames::colorMediaFeature.impl()->exis tingHash()
162 || mediaFeature == MediaFeatureNames::colorIndexMediaFeature 165 || mediaFeatureHash == MediaFeatureNames::colorIndexMediaFeature.impl()- >existingHash()
163 || mediaFeature == MediaFeatureNames::gridMediaFeature 166 || mediaFeatureHash == MediaFeatureNames::gridMediaFeature.impl()->exist ingHash()
164 || mediaFeature == MediaFeatureNames::heightMediaFeature 167 || mediaFeatureHash == MediaFeatureNames::heightMediaFeature.impl()->exi stingHash()
165 || mediaFeature == MediaFeatureNames::widthMediaFeature 168 || mediaFeatureHash == MediaFeatureNames::widthMediaFeature.impl()->exis tingHash()
166 || mediaFeature == MediaFeatureNames::deviceHeightMediaFeature 169 || mediaFeatureHash == MediaFeatureNames::deviceHeightMediaFeature.impl( )->existingHash()
167 || mediaFeature == MediaFeatureNames::deviceWidthMediaFeature 170 || mediaFeatureHash == MediaFeatureNames::deviceWidthMediaFeature.impl() ->existingHash()
168 || mediaFeature == MediaFeatureNames::orientationMediaFeature 171 || mediaFeatureHash == MediaFeatureNames::orientationMediaFeature.impl() ->existingHash()
169 || mediaFeature == MediaFeatureNames::aspectRatioMediaFeature 172 || mediaFeatureHash == MediaFeatureNames::aspectRatioMediaFeature.impl() ->existingHash()
170 || mediaFeature == MediaFeatureNames::deviceAspectRatioMediaFeature 173 || mediaFeatureHash == MediaFeatureNames::deviceAspectRatioMediaFeature. impl()->existingHash()
171 || mediaFeature == MediaFeatureNames::hoverMediaFeature 174 || mediaFeatureHash == MediaFeatureNames::hoverMediaFeature.impl()->exis tingHash()
172 || mediaFeature == MediaFeatureNames::transform2dMediaFeature 175 || mediaFeatureHash == MediaFeatureNames::transform2dMediaFeature.impl() ->existingHash()
173 || mediaFeature == MediaFeatureNames::transform3dMediaFeature 176 || mediaFeatureHash == MediaFeatureNames::transform3dMediaFeature.impl() ->existingHash()
174 || mediaFeature == MediaFeatureNames::animationMediaFeature 177 || mediaFeatureHash == MediaFeatureNames::animationMediaFeature.impl()-> existingHash()
175 || mediaFeature == MediaFeatureNames::viewModeMediaFeature 178 || mediaFeatureHash == MediaFeatureNames::viewModeMediaFeature.impl()->e xistingHash()
176 || mediaFeature == MediaFeatureNames::pointerMediaFeature 179 || mediaFeatureHash == MediaFeatureNames::pointerMediaFeature.impl()->ex istingHash()
177 || mediaFeature == MediaFeatureNames::devicePixelRatioMediaFeature 180 || mediaFeatureHash == MediaFeatureNames::devicePixelRatioMediaFeature.i mpl()->existingHash()
178 || mediaFeature == MediaFeatureNames::resolutionMediaFeature 181 || mediaFeatureHash == MediaFeatureNames::resolutionMediaFeature.impl()- >existingHash()
179 || mediaFeature == MediaFeatureNames::scanMediaFeature; 182 || mediaFeatureHash == MediaFeatureNames::scanMediaFeature.impl()->exist ingHash();
180 } 183 }
181 184
182 bool MediaQueryExp::isViewportDependent() const 185 bool MediaQueryExp::isViewportDependent() const
183 { 186 {
184 return m_mediaFeature == MediaFeatureNames::widthMediaFeature 187 return m_mediaFeatureHash == MediaFeatureNames::widthMediaFeature.impl()->ex istingHash()
185 || m_mediaFeature == MediaFeatureNames::heightMediaFeature 188 || m_mediaFeatureHash == MediaFeatureNames::heightMediaFeature.impl()->e xistingHash()
186 || m_mediaFeature == MediaFeatureNames::minWidthMediaFeature 189 || m_mediaFeatureHash == MediaFeatureNames::minWidthMediaFeature.impl()- >existingHash()
187 || m_mediaFeature == MediaFeatureNames::minHeightMediaFeature 190 || m_mediaFeatureHash == MediaFeatureNames::minHeightMediaFeature.impl() ->existingHash()
188 || m_mediaFeature == MediaFeatureNames::maxWidthMediaFeature 191 || m_mediaFeatureHash == MediaFeatureNames::maxWidthMediaFeature.impl()- >existingHash()
189 || m_mediaFeature == MediaFeatureNames::maxHeightMediaFeature 192 || m_mediaFeatureHash == MediaFeatureNames::maxHeightMediaFeature.impl() ->existingHash()
190 || m_mediaFeature == MediaFeatureNames::orientationMediaFeature 193 || m_mediaFeatureHash == MediaFeatureNames::orientationMediaFeature.impl ()->existingHash()
191 || m_mediaFeature == MediaFeatureNames::aspectRatioMediaFeature 194 || m_mediaFeatureHash == MediaFeatureNames::aspectRatioMediaFeature.impl ()->existingHash()
192 || m_mediaFeature == MediaFeatureNames::minAspectRatioMediaFeature 195 || m_mediaFeatureHash == MediaFeatureNames::minAspectRatioMediaFeature.i mpl()->existingHash()
193 || m_mediaFeature == MediaFeatureNames::devicePixelRatioMediaFeature 196 || m_mediaFeatureHash == MediaFeatureNames::devicePixelRatioMediaFeature .impl()->existingHash()
194 || m_mediaFeature == MediaFeatureNames::resolutionMediaFeature 197 || m_mediaFeatureHash == MediaFeatureNames::resolutionMediaFeature.impl( )->existingHash()
195 || m_mediaFeature == MediaFeatureNames::maxAspectRatioMediaFeature; 198 || m_mediaFeatureHash == MediaFeatureNames::maxAspectRatioMediaFeature.i mpl()->existingHash();
196 } 199 }
197 200
198 MediaQueryExp::MediaQueryExp(const AtomicString& mediaFeature, PassRefPtr<CSSVal ue> value) 201 MediaQueryExp::MediaQueryExp(StringImpl* mediaFeatureImpl, PassRefPtr<CSSValue> value)
199 : m_mediaFeature(mediaFeature) 202 : m_mediaFeature(mediaFeatureImpl)
203 , m_mediaFeatureHash(mediaFeatureImpl->existingHash())
200 , m_value(value) 204 , m_value(value)
201 { 205 {
202 } 206 }
203 207
204 PassOwnPtr<MediaQueryExp> MediaQueryExp::create(const AtomicString& mediaFeature , CSSParserValueList* valueList) 208 PassOwnPtr<MediaQueryExp> MediaQueryExp::create(const String& mediaFeature, CSSP arserValueList* valueList)
205 { 209 {
206 RefPtr<CSSValue> cssValue; 210 RefPtr<CSSValue> cssValue;
207 bool isValid = false; 211 bool isValid = false;
212 String mediaFeatureLower(mediaFeature.lower());
213 mediaFeatureLower.ensure16Bit();
214 StringImpl* mediaFeatureImpl = attemptStaticStringCreation(mediaFeatureLower , Likely8Bit).impl();
215 unsigned mediaFeatureHash = mediaFeatureImpl->existingHash();
208 216
209 // Create value for media query expression that must have 1 or more values. 217 // Create value for media query expression that must have 1 or more values.
210 if (valueList) { 218 if (valueList && valueList->size() > 0) {
211 if (valueList->size() == 1) { 219 if (valueList->size() == 1) {
212 CSSParserValue* value = valueList->current(); 220 CSSParserValue* value = valueList->current();
213 221
214 if (featureWithCSSValueID(mediaFeature, value)) { 222 if (featureWithCSSValueID(mediaFeatureHash, value)) {
215 // Media features that use CSSValueIDs. 223 // Media features that use CSSValueIDs.
216 cssValue = CSSPrimitiveValue::createIdentifier(value->id); 224 cssValue = CSSPrimitiveValue::createIdentifier(value->id);
217 if (!featureWithValidIdent(mediaFeature, toCSSPrimitiveValue(css Value.get())->getValueID())) 225 if (!featureWithValidIdent(mediaFeatureHash, toCSSPrimitiveValue (cssValue.get())->getValueID()))
218 cssValue.clear(); 226 cssValue.clear();
219 } else if (featureWithValidDensity(mediaFeature, value)) { 227 } else if (featureWithValidDensity(mediaFeatureHash, value)) {
220 // Media features that must have non-negative <density>, ie. dpp x, dpi or dpcm. 228 // 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); 229 cssValue = CSSPrimitiveValue::create(value->fValue, (CSSPrimitiv eValue::UnitTypes) value->unit);
222 } else if (featureWithValidPositiveLenghtOrNumber(mediaFeature, valu e)) { 230 } else if (featureWithValidPositiveLengthOrNumber(mediaFeatureHash, value)) {
223 // Media features that must have non-negative <lenght> or number value. 231 // Media features that must have non-negative <lenght> or number value.
224 cssValue = CSSPrimitiveValue::create(value->fValue, (CSSPrimitiv eValue::UnitTypes) value->unit); 232 cssValue = CSSPrimitiveValue::create(value->fValue, (CSSPrimitiv eValue::UnitTypes) value->unit);
225 } else if (featureWithPositiveInteger(mediaFeature, value)) { 233 } else if (featureWithPositiveInteger(mediaFeatureHash, value)) {
226 // Media features that must have non-negative integer value. 234 // Media features that must have non-negative integer value.
227 cssValue = CSSPrimitiveValue::create(value->fValue, CSSPrimitive Value::CSS_NUMBER); 235 cssValue = CSSPrimitiveValue::create(value->fValue, CSSPrimitive Value::CSS_NUMBER);
228 } else if (featureWithPositiveNumber(mediaFeature, value)) { 236 } else if (featureWithPositiveNumber(mediaFeatureHash, value)) {
229 // Media features that must have non-negative number value. 237 // Media features that must have non-negative number value.
230 cssValue = CSSPrimitiveValue::create(value->fValue, CSSPrimitive Value::CSS_NUMBER); 238 cssValue = CSSPrimitiveValue::create(value->fValue, CSSPrimitive Value::CSS_NUMBER);
231 } else if (featureWithZeroOrOne(mediaFeature, value)) { 239 } else if (featureWithZeroOrOne(mediaFeatureHash, value)) {
232 // Media features that must have (0|1) value. 240 // Media features that must have (0|1) value.
233 cssValue = CSSPrimitiveValue::create(value->fValue, CSSPrimitive Value::CSS_NUMBER); 241 cssValue = CSSPrimitiveValue::create(value->fValue, CSSPrimitive Value::CSS_NUMBER);
234 } 242 }
235 243
236 isValid = cssValue; 244 isValid = cssValue;
237 245
238 } else if (valueList->size() == 3 && featureWithAspectRatio(mediaFeature )) { 246 } else if (valueList->size() == 3 && featureWithAspectRatio(mediaFeature Hash)) {
239 // Create list of values. 247 // Create list of values.
240 // Currently accepts only <integer>/<integer>. 248 // Currently accepts only <integer>/<integer>.
241 // Applicable to device-aspect-ratio and aspec-ratio. 249 // Applicable to device-aspect-ratio and aspec-ratio.
242 isValid = true; 250 isValid = true;
243 float numeratorValue = 0; 251 float numeratorValue = 0;
244 float denominatorValue = 0; 252 float denominatorValue = 0;
245 // The aspect-ratio must be <integer> (whitespace)? / (whitespace)? <integer>. 253 // The aspect-ratio must be <integer> (whitespace)? / (whitespace)? <integer>.
246 for (unsigned i = 0; i < 3; ++i, valueList->next()) { 254 for (unsigned i = 0; i < 3; ++i, valueList->next()) {
247 const CSSParserValue* value = valueList->current(); 255 const CSSParserValue* value = valueList->current();
248 if (i != 1 && value->unit == CSSPrimitiveValue::CSS_NUMBER && va lue->fValue > 0 && value->isInt) { 256 if (i != 1 && value->unit == CSSPrimitiveValue::CSS_NUMBER && va lue->fValue > 0 && value->isInt) {
249 if (!i) 257 if (!i)
250 numeratorValue = value->fValue; 258 numeratorValue = value->fValue;
251 else 259 else
252 denominatorValue = value->fValue; 260 denominatorValue = value->fValue;
253 } else if (i == 1 && value->unit == CSSParserValue::Operator && value->iValue == '/') { 261 } else if (i == 1 && value->unit == CSSParserValue::Operator && value->iValue == '/') {
254 continue; 262 continue;
255 } else { 263 } else {
256 isValid = false; 264 isValid = false;
257 break; 265 break;
258 } 266 }
259 } 267 }
260 268
261 if (isValid) 269 if (isValid)
262 cssValue = CSSAspectRatioValue::create(numeratorValue, denominat orValue); 270 cssValue = CSSAspectRatioValue::create(numeratorValue, denominat orValue);
263 } 271 }
264 } else if (featureWithoutValue(mediaFeature)) { 272 } else if (featureWithoutValue(mediaFeatureHash)) {
265 isValid = true; 273 isValid = true;
266 } 274 }
267 275
268 if (!isValid) 276 if (!isValid)
269 return nullptr; 277 return nullptr;
270 278
271 return adoptPtr(new MediaQueryExp(mediaFeature, cssValue)); 279 return adoptPtr(new MediaQueryExp(mediaFeatureImpl, cssValue));
272 } 280 }
273 281
274 MediaQueryExp::~MediaQueryExp() 282 MediaQueryExp::~MediaQueryExp()
275 { 283 {
276 } 284 }
277 285
278 String MediaQueryExp::serialize() const 286 String MediaQueryExp::serialize() const
279 { 287 {
280 StringBuilder result; 288 StringBuilder result;
281 result.append("("); 289 result.append("(");
282 result.append(m_mediaFeature.lower()); 290 result.append(m_mediaFeature.lower());
283 if (m_value) { 291 if (m_value) {
284 result.append(": "); 292 result.append(": ");
285 result.append(m_value->cssText()); 293 result.append(m_value->cssText());
286 } 294 }
287 result.append(")"); 295 result.append(")");
288 296
289 return result.toString(); 297 return result.toString();
290 } 298 }
291 299
292 } // namespace 300 } // namespace
OLDNEW
« no previous file with comments | « Source/core/css/MediaQueryExp.h ('k') | Source/core/css/parser/CSSInputStream.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698