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 200 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
211 media_feature_ == shapeMediaFeature; | 211 media_feature_ == shapeMediaFeature; |
212 } | 212 } |
213 | 213 |
214 MediaQueryExp::MediaQueryExp(const MediaQueryExp& other) | 214 MediaQueryExp::MediaQueryExp(const MediaQueryExp& other) |
215 : media_feature_(other.MediaFeature()), exp_value_(other.ExpValue()) {} | 215 : media_feature_(other.MediaFeature()), exp_value_(other.ExpValue()) {} |
216 | 216 |
217 MediaQueryExp::MediaQueryExp(const String& media_feature, | 217 MediaQueryExp::MediaQueryExp(const String& media_feature, |
218 const MediaQueryExpValue& exp_value) | 218 const MediaQueryExpValue& exp_value) |
219 : media_feature_(media_feature), exp_value_(exp_value) {} | 219 : media_feature_(media_feature), exp_value_(exp_value) {} |
220 | 220 |
221 MediaQueryExp* MediaQueryExp::CreateIfValid( | 221 MediaQueryExp MediaQueryExp::Create( |
222 const String& media_feature, | 222 const String& media_feature, |
223 const Vector<CSSParserToken, 4>& token_list) { | 223 const Vector<CSSParserToken, 4>& token_list) { |
224 DCHECK(!media_feature.IsNull()); | 224 DCHECK(!media_feature.IsNull()); |
225 | 225 |
226 MediaQueryExpValue exp_value; | 226 MediaQueryExpValue exp_value; |
227 String lower_media_feature = | 227 String lower_media_feature = |
228 AttemptStaticStringCreation(media_feature.DeprecatedLower()); | 228 AttemptStaticStringCreation(media_feature.DeprecatedLower()); |
229 | 229 |
230 // Create value for media query expression that must have 1 or more values. | 230 // Create value for media query expression that must have 1 or more values. |
231 if (token_list.size() == 0 && FeatureWithoutValue(lower_media_feature)) { | 231 if (token_list.size() == 0 && FeatureWithoutValue(lower_media_feature)) { |
232 // Valid, creates a MediaQueryExp with an 'invalid' MediaQueryExpValue | 232 // Valid, creates a MediaQueryExp with an 'invalid' MediaQueryExpValue |
233 } else if (token_list.size() == 1) { | 233 } else if (token_list.size() == 1) { |
234 CSSParserToken token = token_list.front(); | 234 CSSParserToken token = token_list.front(); |
235 | 235 |
236 if (token.GetType() == kIdentToken) { | 236 if (token.GetType() == kIdentToken) { |
237 CSSValueID ident = token.Id(); | 237 CSSValueID ident = token.Id(); |
238 if (!FeatureWithValidIdent(lower_media_feature, ident)) | 238 if (!FeatureWithValidIdent(lower_media_feature, ident)) |
239 return nullptr; | 239 return Invalid(); |
240 exp_value.id = ident; | 240 exp_value.id = ident; |
241 exp_value.is_id = true; | 241 exp_value.is_id = true; |
242 } else if (token.GetType() == kNumberToken || | 242 } else if (token.GetType() == kNumberToken || |
243 token.GetType() == kPercentageToken || | 243 token.GetType() == kPercentageToken || |
244 token.GetType() == kDimensionToken) { | 244 token.GetType() == kDimensionToken) { |
245 // Check for numeric token types since it is only safe for these types to | 245 // Check for numeric token types since it is only safe for these types to |
246 // call numericValue. | 246 // call numericValue. |
247 if (FeatureWithValidDensity(lower_media_feature, token) || | 247 if (FeatureWithValidDensity(lower_media_feature, token) || |
248 FeatureWithValidPositiveLength(lower_media_feature, token)) { | 248 FeatureWithValidPositiveLength(lower_media_feature, token)) { |
249 // Media features that must have non-negative <density>, ie. dppx, dpi | 249 // Media features that must have non-negative <density>, ie. dppx, dpi |
250 // or dpcm, or Media features that must have non-negative <length> or | 250 // or dpcm, or Media features that must have non-negative <length> or |
251 // number value. | 251 // number value. |
252 exp_value.value = token.NumericValue(); | 252 exp_value.value = token.NumericValue(); |
253 exp_value.unit = token.GetUnitType(); | 253 exp_value.unit = token.GetUnitType(); |
254 exp_value.is_value = true; | 254 exp_value.is_value = true; |
255 } else if (FeatureWithPositiveInteger(lower_media_feature, token) || | 255 } else if (FeatureWithPositiveInteger(lower_media_feature, token) || |
256 FeatureWithPositiveNumber(lower_media_feature, token) || | 256 FeatureWithPositiveNumber(lower_media_feature, token) || |
257 FeatureWithZeroOrOne(lower_media_feature, token)) { | 257 FeatureWithZeroOrOne(lower_media_feature, token)) { |
258 // Media features that must have non-negative integer value, | 258 // Media features that must have non-negative integer value, |
259 // or media features that must have non-negative number value, | 259 // or media features that must have non-negative number value, |
260 // or media features that must have (0|1) value. | 260 // or media features that must have (0|1) value. |
261 exp_value.value = token.NumericValue(); | 261 exp_value.value = token.NumericValue(); |
262 exp_value.unit = CSSPrimitiveValue::UnitType::kNumber; | 262 exp_value.unit = CSSPrimitiveValue::UnitType::kNumber; |
263 exp_value.is_value = true; | 263 exp_value.is_value = true; |
264 } else { | 264 } else { |
265 return nullptr; | 265 return Invalid(); |
266 } | 266 } |
267 } else { | 267 } else { |
268 return nullptr; | 268 return Invalid(); |
269 } | 269 } |
270 } else if (token_list.size() == 3 && | 270 } else if (token_list.size() == 3 && |
271 FeatureWithAspectRatio(lower_media_feature)) { | 271 FeatureWithAspectRatio(lower_media_feature)) { |
272 // TODO(timloh): <ratio> is supposed to allow whitespace around the '/' | 272 // TODO(timloh): <ratio> is supposed to allow whitespace around the '/' |
273 // Applicable to device-aspect-ratio and aspect-ratio. | 273 // Applicable to device-aspect-ratio and aspect-ratio. |
274 const CSSParserToken& numerator = token_list[0]; | 274 const CSSParserToken& numerator = token_list[0]; |
275 const CSSParserToken& delimiter = token_list[1]; | 275 const CSSParserToken& delimiter = token_list[1]; |
276 const CSSParserToken& denominator = token_list[2]; | 276 const CSSParserToken& denominator = token_list[2]; |
277 if (delimiter.GetType() != kDelimiterToken || delimiter.Delimiter() != '/') | 277 if (delimiter.GetType() != kDelimiterToken || delimiter.Delimiter() != '/') |
278 return nullptr; | 278 return Invalid(); |
279 if (numerator.GetType() != kNumberToken || numerator.NumericValue() <= 0 || | 279 if (numerator.GetType() != kNumberToken || numerator.NumericValue() <= 0 || |
280 numerator.GetNumericValueType() != kIntegerValueType) | 280 numerator.GetNumericValueType() != kIntegerValueType) |
281 return nullptr; | 281 return Invalid(); |
282 if (denominator.GetType() != kNumberToken || | 282 if (denominator.GetType() != kNumberToken || |
283 denominator.NumericValue() <= 0 || | 283 denominator.NumericValue() <= 0 || |
284 denominator.GetNumericValueType() != kIntegerValueType) | 284 denominator.GetNumericValueType() != kIntegerValueType) |
285 return nullptr; | 285 return Invalid(); |
286 | 286 |
287 exp_value.numerator = (unsigned)numerator.NumericValue(); | 287 exp_value.numerator = (unsigned)numerator.NumericValue(); |
288 exp_value.denominator = (unsigned)denominator.NumericValue(); | 288 exp_value.denominator = (unsigned)denominator.NumericValue(); |
289 exp_value.is_ratio = true; | 289 exp_value.is_ratio = true; |
290 } else { | 290 } else { |
291 return nullptr; | 291 return Invalid(); |
292 } | 292 } |
293 | 293 |
294 return new MediaQueryExp(lower_media_feature, exp_value); | 294 return MediaQueryExp(lower_media_feature, exp_value); |
295 } | 295 } |
296 | 296 |
297 MediaQueryExp::~MediaQueryExp() {} | 297 MediaQueryExp::~MediaQueryExp() {} |
298 | 298 |
299 bool MediaQueryExp::operator==(const MediaQueryExp& other) const { | 299 bool MediaQueryExp::operator==(const MediaQueryExp& other) const { |
300 return (other.media_feature_ == media_feature_) && | 300 return (other.media_feature_ == media_feature_) && |
301 ((!other.exp_value_.IsValid() && !exp_value_.IsValid()) || | 301 ((!other.exp_value_.IsValid() && !exp_value_.IsValid()) || |
302 (other.exp_value_.IsValid() && exp_value_.IsValid() && | 302 (other.exp_value_.IsValid() && exp_value_.IsValid() && |
303 other.exp_value_.Equals(exp_value_))); | 303 other.exp_value_.Equals(exp_value_))); |
304 } | 304 } |
(...skipping 25 matching lines...) Expand all Loading... |
330 output.Append('/'); | 330 output.Append('/'); |
331 output.Append(PrintNumber(denominator)); | 331 output.Append(PrintNumber(denominator)); |
332 } else if (is_id) { | 332 } else if (is_id) { |
333 output.Append(getValueName(id)); | 333 output.Append(getValueName(id)); |
334 } | 334 } |
335 | 335 |
336 return output.ToString(); | 336 return output.ToString(); |
337 } | 337 } |
338 | 338 |
339 } // namespace blink | 339 } // namespace blink |
OLD | NEW |