Chromium Code Reviews| 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 16 matching lines...) Expand all Loading... | |
| 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 |
| OLD | NEW |