| 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 198 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 209 m_mediaFeature == shapeMediaFeature; | 209 m_mediaFeature == shapeMediaFeature; |
| 210 } | 210 } |
| 211 | 211 |
| 212 MediaQueryExp::MediaQueryExp(const MediaQueryExp& other) | 212 MediaQueryExp::MediaQueryExp(const MediaQueryExp& other) |
| 213 : m_mediaFeature(other.mediaFeature()), m_expValue(other.expValue()) {} | 213 : m_mediaFeature(other.mediaFeature()), m_expValue(other.expValue()) {} |
| 214 | 214 |
| 215 MediaQueryExp::MediaQueryExp(const String& mediaFeature, | 215 MediaQueryExp::MediaQueryExp(const String& mediaFeature, |
| 216 const MediaQueryExpValue& expValue) | 216 const MediaQueryExpValue& expValue) |
| 217 : m_mediaFeature(mediaFeature), m_expValue(expValue) {} | 217 : m_mediaFeature(mediaFeature), m_expValue(expValue) {} |
| 218 | 218 |
| 219 MediaQueryExp* MediaQueryExp::createIfValid( | 219 MediaQueryExp MediaQueryExp::create( |
| 220 const String& mediaFeature, | 220 const String& mediaFeature, |
| 221 const Vector<CSSParserToken, 4>& tokenList) { | 221 const Vector<CSSParserToken, 4>& tokenList) { |
| 222 ASSERT(!mediaFeature.isNull()); | 222 ASSERT(!mediaFeature.isNull()); |
| 223 | 223 |
| 224 MediaQueryExpValue expValue; | 224 MediaQueryExpValue expValue; |
| 225 String lowerMediaFeature = attemptStaticStringCreation(mediaFeature.lower()); | 225 String lowerMediaFeature = attemptStaticStringCreation(mediaFeature.lower()); |
| 226 | 226 |
| 227 // Create value for media query expression that must have 1 or more values. | 227 // Create value for media query expression that must have 1 or more values. |
| 228 if (tokenList.size() == 0 && featureWithoutValue(lowerMediaFeature)) { | 228 if (tokenList.size() == 0 && featureWithoutValue(lowerMediaFeature)) { |
| 229 // Valid, creates a MediaQueryExp with an 'invalid' MediaQueryExpValue | 229 // Valid, creates a MediaQueryExp with an 'invalid' MediaQueryExpValue |
| 230 } else if (tokenList.size() == 1) { | 230 } else if (tokenList.size() == 1) { |
| 231 CSSParserToken token = tokenList.front(); | 231 CSSParserToken token = tokenList.front(); |
| 232 | 232 |
| 233 if (token.type() == IdentToken) { | 233 if (token.type() == IdentToken) { |
| 234 CSSValueID ident = token.id(); | 234 CSSValueID ident = token.id(); |
| 235 if (!featureWithValidIdent(lowerMediaFeature, ident)) | 235 if (!featureWithValidIdent(lowerMediaFeature, ident)) |
| 236 return nullptr; | 236 return invalid(); |
| 237 expValue.id = ident; | 237 expValue.id = ident; |
| 238 expValue.isID = true; | 238 expValue.isID = true; |
| 239 } else if (token.type() == NumberToken || token.type() == PercentageToken || | 239 } else if (token.type() == NumberToken || token.type() == PercentageToken || |
| 240 token.type() == DimensionToken) { | 240 token.type() == DimensionToken) { |
| 241 // Check for numeric token types since it is only safe for these types to | 241 // Check for numeric token types since it is only safe for these types to |
| 242 // call numericValue. | 242 // call numericValue. |
| 243 if (featureWithValidDensity(lowerMediaFeature, token) || | 243 if (featureWithValidDensity(lowerMediaFeature, token) || |
| 244 featureWithValidPositiveLength(lowerMediaFeature, token)) { | 244 featureWithValidPositiveLength(lowerMediaFeature, token)) { |
| 245 // Media features that must have non-negative <density>, ie. dppx, dpi | 245 // Media features that must have non-negative <density>, ie. dppx, dpi |
| 246 // or dpcm, or Media features that must have non-negative <length> or | 246 // or dpcm, or Media features that must have non-negative <length> or |
| 247 // number value. | 247 // number value. |
| 248 expValue.value = token.numericValue(); | 248 expValue.value = token.numericValue(); |
| 249 expValue.unit = token.unitType(); | 249 expValue.unit = token.unitType(); |
| 250 expValue.isValue = true; | 250 expValue.isValue = true; |
| 251 } else if (featureWithPositiveInteger(lowerMediaFeature, token) || | 251 } else if (featureWithPositiveInteger(lowerMediaFeature, token) || |
| 252 featureWithPositiveNumber(lowerMediaFeature, token) || | 252 featureWithPositiveNumber(lowerMediaFeature, token) || |
| 253 featureWithZeroOrOne(lowerMediaFeature, token)) { | 253 featureWithZeroOrOne(lowerMediaFeature, token)) { |
| 254 // Media features that must have non-negative integer value, | 254 // Media features that must have non-negative integer value, |
| 255 // or media features that must have non-negative number value, | 255 // or media features that must have non-negative number value, |
| 256 // or media features that must have (0|1) value. | 256 // or media features that must have (0|1) value. |
| 257 expValue.value = token.numericValue(); | 257 expValue.value = token.numericValue(); |
| 258 expValue.unit = CSSPrimitiveValue::UnitType::Number; | 258 expValue.unit = CSSPrimitiveValue::UnitType::Number; |
| 259 expValue.isValue = true; | 259 expValue.isValue = true; |
| 260 } else { | 260 } else { |
| 261 return nullptr; | 261 return invalid(); |
| 262 } | 262 } |
| 263 } else { | 263 } else { |
| 264 return nullptr; | 264 return invalid(); |
| 265 } | 265 } |
| 266 } else if (tokenList.size() == 3 && | 266 } else if (tokenList.size() == 3 && |
| 267 featureWithAspectRatio(lowerMediaFeature)) { | 267 featureWithAspectRatio(lowerMediaFeature)) { |
| 268 // TODO(timloh): <ratio> is supposed to allow whitespace around the '/' | 268 // TODO(timloh): <ratio> is supposed to allow whitespace around the '/' |
| 269 // Applicable to device-aspect-ratio and aspect-ratio. | 269 // Applicable to device-aspect-ratio and aspect-ratio. |
| 270 const CSSParserToken& numerator = tokenList[0]; | 270 const CSSParserToken& numerator = tokenList[0]; |
| 271 const CSSParserToken& delimiter = tokenList[1]; | 271 const CSSParserToken& delimiter = tokenList[1]; |
| 272 const CSSParserToken& denominator = tokenList[2]; | 272 const CSSParserToken& denominator = tokenList[2]; |
| 273 if (delimiter.type() != DelimiterToken || delimiter.delimiter() != '/') | 273 if (delimiter.type() != DelimiterToken || delimiter.delimiter() != '/') |
| 274 return nullptr; | 274 return invalid(); |
| 275 if (numerator.type() != NumberToken || numerator.numericValue() <= 0 || | 275 if (numerator.type() != NumberToken || numerator.numericValue() <= 0 || |
| 276 numerator.numericValueType() != IntegerValueType) | 276 numerator.numericValueType() != IntegerValueType) |
| 277 return nullptr; | 277 return invalid(); |
| 278 if (denominator.type() != NumberToken || denominator.numericValue() <= 0 || | 278 if (denominator.type() != NumberToken || denominator.numericValue() <= 0 || |
| 279 denominator.numericValueType() != IntegerValueType) | 279 denominator.numericValueType() != IntegerValueType) |
| 280 return nullptr; | 280 return invalid(); |
| 281 | 281 |
| 282 expValue.numerator = (unsigned)numerator.numericValue(); | 282 expValue.numerator = (unsigned)numerator.numericValue(); |
| 283 expValue.denominator = (unsigned)denominator.numericValue(); | 283 expValue.denominator = (unsigned)denominator.numericValue(); |
| 284 expValue.isRatio = true; | 284 expValue.isRatio = true; |
| 285 } else { | 285 } else { |
| 286 return nullptr; | 286 return invalid(); |
| 287 } | 287 } |
| 288 | 288 |
| 289 return new MediaQueryExp(lowerMediaFeature, expValue); | 289 return MediaQueryExp(lowerMediaFeature, expValue); |
| 290 } | 290 } |
| 291 | 291 |
| 292 MediaQueryExp::~MediaQueryExp() {} | 292 MediaQueryExp::~MediaQueryExp() {} |
| 293 | 293 |
| 294 bool MediaQueryExp::operator==(const MediaQueryExp& other) const { | 294 bool MediaQueryExp::operator==(const MediaQueryExp& other) const { |
| 295 return (other.m_mediaFeature == m_mediaFeature) && | 295 return (other.m_mediaFeature == m_mediaFeature) && |
| 296 ((!other.m_expValue.isValid() && !m_expValue.isValid()) || | 296 ((!other.m_expValue.isValid() && !m_expValue.isValid()) || |
| 297 (other.m_expValue.isValid() && m_expValue.isValid() && | 297 (other.m_expValue.isValid() && m_expValue.isValid() && |
| 298 other.m_expValue.equals(m_expValue))); | 298 other.m_expValue.equals(m_expValue))); |
| 299 } | 299 } |
| (...skipping 25 matching lines...) Expand all Loading... |
| 325 output.append('/'); | 325 output.append('/'); |
| 326 output.append(printNumber(denominator)); | 326 output.append(printNumber(denominator)); |
| 327 } else if (isID) { | 327 } else if (isID) { |
| 328 output.append(getValueName(id)); | 328 output.append(getValueName(id)); |
| 329 } | 329 } |
| 330 | 330 |
| 331 return output.toString(); | 331 return output.toString(); |
| 332 } | 332 } |
| 333 | 333 |
| 334 } // namespace blink | 334 } // namespace blink |
| OLD | NEW |