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 12 matching lines...) Expand all Loading... | |
23 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR | 23 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR |
24 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY | 24 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY |
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 "core/css/CSSAspectRatioValue.h" | 34 #include "core/css/CSSAspectRatioValue.h" |
34 #include "core/css/CSSParser.h" | 35 #include "core/css/CSSParser.h" |
35 #include "core/css/CSSPrimitiveValue.h" | 36 #include "core/css/CSSPrimitiveValue.h" |
36 #include "core/css/CSSValueList.h" | 37 #include "core/css/CSSValueList.h" |
37 #include "core/dom/WebCoreMemoryInstrumentation.h" | 38 #include "core/dom/WebCoreMemoryInstrumentation.h" |
38 #include "wtf/text/StringBuilder.h" | 39 #include "wtf/text/StringBuilder.h" |
39 | 40 |
40 namespace WebCore { | 41 namespace WebCore { |
41 | 42 |
42 static inline bool featureWithCSSValueID(const AtomicString& mediaFeature, const CSSParserValue* value) | 43 static inline bool featureWithCSSValueID(const AtomicString& mediaFeature, const CSSParserValue* value) |
43 { | 44 { |
44 if (!value->id) | 45 if (!value->id) |
45 return false; | 46 return false; |
46 | 47 |
47 return mediaFeature == MediaFeatureNames::orientationMediaFeature | 48 return mediaFeature == MediaFeatureNames::orientationMediaFeature |
48 || mediaFeature == MediaFeatureNames::viewModeMediaFeature | 49 || mediaFeature == MediaFeatureNames::viewModeMediaFeature |
49 || mediaFeature == MediaFeatureNames::pointerMediaFeature; | 50 || mediaFeature == MediaFeatureNames::pointerMediaFeature |
51 || mediaFeature == MediaFeatureNames::scanMediaFeature; | |
52 } | |
53 | |
54 static inline bool featureWithValidIdent(const AtomicString& mediaFeature, int i dent) | |
55 { | |
56 if (mediaFeature == MediaFeatureNames::orientationMediaFeature) | |
57 return ident == CSSValuePortrait || ident == CSSValueLandscape; | |
58 | |
59 if (mediaFeature == MediaFeatureNames::viewModeMediaFeature) { | |
60 switch (ident) { | |
61 case CSSValueWindowed: | |
62 case CSSValueFloating: | |
63 case CSSValueFullscreen: | |
64 case CSSValueMaximized: | |
65 case CSSValueMinimized: | |
66 return true; | |
67 default: | |
68 return false; | |
69 } | |
70 } | |
71 | |
72 if (mediaFeature == MediaFeatureNames::pointerMediaFeature) | |
73 return ident == CSSValueNone || ident == CSSValueCoarse || ident == CSSV alueFine; | |
74 | |
75 if (mediaFeature == MediaFeatureNames::scanMediaFeature) | |
76 return ident == CSSValueInterlace || ident == CSSValueProgressive; | |
77 | |
78 ASSERT_NOT_REACHED(); | |
79 return false; | |
50 } | 80 } |
51 | 81 |
52 static inline bool featureWithValidPositiveLenghtOrNumber(const AtomicString& me diaFeature, const CSSParserValue* value) | 82 static inline bool featureWithValidPositiveLenghtOrNumber(const AtomicString& me diaFeature, const CSSParserValue* value) |
53 { | 83 { |
54 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_EMS && value->unit <= CSSPrimi tiveValue::CSS_PC) || value->unit == CSSPrimitiveValue::CSS_REMS) || value->unit == CSSPrimitiveValue::CSS_NUMBER) || value->fValue < 0) |
55 return false; | 85 return false; |
56 | 86 |
57 return mediaFeature == MediaFeatureNames::heightMediaFeature | 87 return mediaFeature == MediaFeatureNames::heightMediaFeature |
58 || mediaFeature == MediaFeatureNames::maxHeightMediaFeature | 88 || mediaFeature == MediaFeatureNames::maxHeightMediaFeature |
59 || mediaFeature == MediaFeatureNames::minHeightMediaFeature | 89 || mediaFeature == MediaFeatureNames::minHeightMediaFeature |
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
141 || mediaFeature == MediaFeatureNames::aspectRatioMediaFeature | 171 || mediaFeature == MediaFeatureNames::aspectRatioMediaFeature |
142 || mediaFeature == MediaFeatureNames::deviceAspectRatioMediaFeature | 172 || mediaFeature == MediaFeatureNames::deviceAspectRatioMediaFeature |
143 || mediaFeature == MediaFeatureNames::hoverMediaFeature | 173 || mediaFeature == MediaFeatureNames::hoverMediaFeature |
144 || mediaFeature == MediaFeatureNames::transform2dMediaFeature | 174 || mediaFeature == MediaFeatureNames::transform2dMediaFeature |
145 || mediaFeature == MediaFeatureNames::transform3dMediaFeature | 175 || mediaFeature == MediaFeatureNames::transform3dMediaFeature |
146 || mediaFeature == MediaFeatureNames::transitionMediaFeature | 176 || mediaFeature == MediaFeatureNames::transitionMediaFeature |
147 || mediaFeature == MediaFeatureNames::animationMediaFeature | 177 || mediaFeature == MediaFeatureNames::animationMediaFeature |
148 || mediaFeature == MediaFeatureNames::viewModeMediaFeature | 178 || mediaFeature == MediaFeatureNames::viewModeMediaFeature |
149 || mediaFeature == MediaFeatureNames::pointerMediaFeature | 179 || mediaFeature == MediaFeatureNames::pointerMediaFeature |
150 || mediaFeature == MediaFeatureNames::devicePixelRatioMediaFeature | 180 || mediaFeature == MediaFeatureNames::devicePixelRatioMediaFeature |
151 || mediaFeature == MediaFeatureNames::resolutionMediaFeature; | 181 || mediaFeature == MediaFeatureNames::resolutionMediaFeature |
182 || mediaFeature == MediaFeatureNames::scanMediaFeature; | |
152 } | 183 } |
153 | 184 |
154 bool MediaQueryExp::isViewportDependent() const | 185 bool MediaQueryExp::isViewportDependent() const |
155 { | 186 { |
156 return m_mediaFeature == MediaFeatureNames::widthMediaFeature | 187 return m_mediaFeature == MediaFeatureNames::widthMediaFeature |
157 || m_mediaFeature == MediaFeatureNames::heightMediaFeature | 188 || m_mediaFeature == MediaFeatureNames::heightMediaFeature |
158 || m_mediaFeature == MediaFeatureNames::minWidthMediaFeature | 189 || m_mediaFeature == MediaFeatureNames::minWidthMediaFeature |
159 || m_mediaFeature == MediaFeatureNames::minHeightMediaFeature | 190 || m_mediaFeature == MediaFeatureNames::minHeightMediaFeature |
160 || m_mediaFeature == MediaFeatureNames::maxWidthMediaFeature | 191 || m_mediaFeature == MediaFeatureNames::maxWidthMediaFeature |
161 || m_mediaFeature == MediaFeatureNames::maxHeightMediaFeature | 192 || m_mediaFeature == MediaFeatureNames::maxHeightMediaFeature |
162 || m_mediaFeature == MediaFeatureNames::orientationMediaFeature | 193 || m_mediaFeature == MediaFeatureNames::orientationMediaFeature |
163 || m_mediaFeature == MediaFeatureNames::aspectRatioMediaFeature | 194 || m_mediaFeature == MediaFeatureNames::aspectRatioMediaFeature |
164 || m_mediaFeature == MediaFeatureNames::minAspectRatioMediaFeature | 195 || m_mediaFeature == MediaFeatureNames::minAspectRatioMediaFeature |
165 || m_mediaFeature == MediaFeatureNames::maxAspectRatioMediaFeature; | 196 || m_mediaFeature == MediaFeatureNames::maxAspectRatioMediaFeature; |
166 } | 197 } |
167 | 198 |
168 inline MediaQueryExp::MediaQueryExp(const AtomicString& mediaFeature, CSSParserV alueList* valueList) | 199 inline MediaQueryExp::MediaQueryExp(const AtomicString& mediaFeature, CSSParserV alueList* valueList) |
169 : m_mediaFeature(mediaFeature) | 200 : m_mediaFeature(mediaFeature) |
170 , m_value(0) | 201 , m_value(0) |
171 , m_isValid(false) | 202 , m_isValid(false) |
172 { | 203 { |
173 // Initialize media query expression that must have 1 or more values. | 204 // Initialize media query expression that must have 1 or more values. |
174 if (valueList) { | 205 if (valueList) { |
175 if (valueList->size() == 1) { | 206 if (valueList->size() == 1) { |
176 CSSParserValue* value = valueList->current(); | 207 CSSParserValue* value = valueList->current(); |
177 | 208 |
178 // Media features that use CSSValueIDs. | 209 // Media features that use CSSValueIDs. |
179 if (featureWithCSSValueID(mediaFeature, value)) | 210 if (featureWithCSSValueID(mediaFeature, value)) { |
180 m_value = CSSPrimitiveValue::createIdentifier(value->id); | 211 m_value = CSSPrimitiveValue::createIdentifier(value->id); |
212 if (!featureWithValidIdent(mediaFeature, static_cast<CSSPrimitiv eValue*>(m_value.get())->getIdent())) | |
apavlov
2013/05/15 12:38:46
Argh, sorry, I totally forgot that a few days ago
| |
213 m_value.clear(); | |
214 } | |
181 | 215 |
182 // Media features that must have non-negative <density>, ie. dppx, d pi or dpcm. | 216 // Media features that must have non-negative <density>, ie. dppx, d pi or dpcm. |
183 else if (featureWithValidDensity(mediaFeature, value)) | 217 else if (featureWithValidDensity(mediaFeature, value)) |
184 m_value = CSSPrimitiveValue::create(value->fValue, (CSSPrimitive Value::UnitTypes) value->unit); | 218 m_value = CSSPrimitiveValue::create(value->fValue, (CSSPrimitive Value::UnitTypes) value->unit); |
185 | 219 |
186 // Media features that must have non-negative <lenght> or number val ue. | 220 // Media features that must have non-negative <lenght> or number val ue. |
187 else if (featureWithValidPositiveLenghtOrNumber(mediaFeature, value) ) | 221 else if (featureWithValidPositiveLenghtOrNumber(mediaFeature, value) ) |
188 m_value = CSSPrimitiveValue::create(value->fValue, (CSSPrimitive Value::UnitTypes) value->unit); | 222 m_value = CSSPrimitiveValue::create(value->fValue, (CSSPrimitive Value::UnitTypes) value->unit); |
189 | 223 |
190 // Media features that must have non-negative integer value. | 224 // Media features that must have non-negative integer value. |
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
262 | 296 |
263 void MediaQueryExp::reportMemoryUsage(MemoryObjectInfo* memoryObjectInfo) const | 297 void MediaQueryExp::reportMemoryUsage(MemoryObjectInfo* memoryObjectInfo) const |
264 { | 298 { |
265 MemoryClassInfo info(memoryObjectInfo, this, WebCoreMemoryTypes::CSS); | 299 MemoryClassInfo info(memoryObjectInfo, this, WebCoreMemoryTypes::CSS); |
266 info.addMember(m_mediaFeature, "mediaFeature"); | 300 info.addMember(m_mediaFeature, "mediaFeature"); |
267 info.addMember(m_serializationCache, "serializationCache"); | 301 info.addMember(m_serializationCache, "serializationCache"); |
268 info.addMember(m_value, "value"); | 302 info.addMember(m_value, "value"); |
269 } | 303 } |
270 | 304 |
271 } // namespace | 305 } // namespace |
OLD | NEW |