| 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, toCSSPrimitiveValue(m_v
alue.get())->getIdent())) |
| 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 |