OLD | NEW |
1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "core/css/parser/CSSPropertyParserHelpers.h" | 5 #include "core/css/parser/CSSPropertyParserHelpers.h" |
6 | 6 |
7 #include "core/css/CSSCalculationValue.h" | 7 #include "core/css/CSSCalculationValue.h" |
8 #include "core/css/CSSColorValue.h" | 8 #include "core/css/CSSColorValue.h" |
9 #include "core/css/CSSCrossfadeValue.h" | 9 #include "core/css/CSSCrossfadeValue.h" |
10 #include "core/css/CSSGradientValue.h" | 10 #include "core/css/CSSGradientValue.h" |
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
89 | 89 |
90 bool consumeSlashIncludingWhitespace(CSSParserTokenRange& range) { | 90 bool consumeSlashIncludingWhitespace(CSSParserTokenRange& range) { |
91 CSSParserToken value = range.peek(); | 91 CSSParserToken value = range.peek(); |
92 if (value.type() != DelimiterToken || value.delimiter() != '/') | 92 if (value.type() != DelimiterToken || value.delimiter() != '/') |
93 return false; | 93 return false; |
94 range.consumeIncludingWhitespace(); | 94 range.consumeIncludingWhitespace(); |
95 return true; | 95 return true; |
96 } | 96 } |
97 | 97 |
98 CSSParserTokenRange consumeFunction(CSSParserTokenRange& range) { | 98 CSSParserTokenRange consumeFunction(CSSParserTokenRange& range) { |
99 ASSERT(range.peek().type() == FunctionToken); | 99 DCHECK_EQ(range.peek().type(), FunctionToken); |
100 CSSParserTokenRange contents = range.consumeBlock(); | 100 CSSParserTokenRange contents = range.consumeBlock(); |
101 range.consumeWhitespace(); | 101 range.consumeWhitespace(); |
102 contents.consumeWhitespace(); | 102 contents.consumeWhitespace(); |
103 return contents; | 103 return contents; |
104 } | 104 } |
105 | 105 |
106 // TODO(rwlbuis): consider pulling in the parsing logic from | 106 // TODO(rwlbuis): consider pulling in the parsing logic from |
107 // CSSCalculationValue.cpp. | 107 // CSSCalculationValue.cpp. |
108 class CalcParser { | 108 class CalcParser { |
109 STACK_ALLOCATED(); | 109 STACK_ALLOCATED(); |
(...skipping 311 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
421 if (token.type() == UrlToken) { | 421 if (token.type() == UrlToken) { |
422 range.consumeIncludingWhitespace(); | 422 range.consumeIncludingWhitespace(); |
423 return token.value(); | 423 return token.value(); |
424 } | 424 } |
425 if (token.functionId() == CSSValueUrl) { | 425 if (token.functionId() == CSSValueUrl) { |
426 CSSParserTokenRange urlRange = range; | 426 CSSParserTokenRange urlRange = range; |
427 CSSParserTokenRange urlArgs = urlRange.consumeBlock(); | 427 CSSParserTokenRange urlArgs = urlRange.consumeBlock(); |
428 const CSSParserToken& next = urlArgs.consumeIncludingWhitespace(); | 428 const CSSParserToken& next = urlArgs.consumeIncludingWhitespace(); |
429 if (next.type() == BadStringToken || !urlArgs.atEnd()) | 429 if (next.type() == BadStringToken || !urlArgs.atEnd()) |
430 return StringView(); | 430 return StringView(); |
431 ASSERT(next.type() == StringToken); | 431 DCHECK_EQ(next.type(), StringToken); |
432 range = urlRange; | 432 range = urlRange; |
433 range.consumeWhitespace(); | 433 range.consumeWhitespace(); |
434 return next.value(); | 434 return next.value(); |
435 } | 435 } |
436 | 436 |
437 return StringView(); | 437 return StringView(); |
438 } | 438 } |
439 | 439 |
440 CSSURIValue* consumeUrl(CSSParserTokenRange& range, | 440 CSSURIValue* consumeUrl(CSSParserTokenRange& range, |
441 const CSSParserContext* context) { | 441 const CSSParserContext* context) { |
442 StringView url = consumeUrlAsStringView(range); | 442 StringView url = consumeUrlAsStringView(range); |
443 if (url.isNull()) | 443 if (url.isNull()) |
444 return nullptr; | 444 return nullptr; |
445 String urlString = url.toString(); | 445 String urlString = url.toString(); |
446 return CSSURIValue::create(urlString, context->completeURL(urlString)); | 446 return CSSURIValue::create(urlString, context->completeURL(urlString)); |
447 } | 447 } |
448 | 448 |
449 static int clampRGBComponent(const CSSPrimitiveValue& value) { | 449 static int clampRGBComponent(const CSSPrimitiveValue& value) { |
450 double result = value.getDoubleValue(); | 450 double result = value.getDoubleValue(); |
451 // TODO(timloh): Multiply by 2.55 and round instead of floor. | 451 // TODO(timloh): Multiply by 2.55 and round instead of floor. |
452 if (value.isPercentage()) | 452 if (value.isPercentage()) |
453 result *= 2.56; | 453 result *= 2.56; |
454 return clampTo<int>(result, 0, 255); | 454 return clampTo<int>(result, 0, 255); |
455 } | 455 } |
456 | 456 |
457 static bool parseRGBParameters(CSSParserTokenRange& range, | 457 static bool parseRGBParameters(CSSParserTokenRange& range, |
458 RGBA32& result, | 458 RGBA32& result, |
459 bool parseAlpha) { | 459 bool parseAlpha) { |
460 ASSERT(range.peek().functionId() == CSSValueRgb || | 460 DCHECK(range.peek().functionId() == CSSValueRgb || |
461 range.peek().functionId() == CSSValueRgba); | 461 range.peek().functionId() == CSSValueRgba); |
462 CSSParserTokenRange args = consumeFunction(range); | 462 CSSParserTokenRange args = consumeFunction(range); |
463 CSSPrimitiveValue* colorParameter = consumeInteger(args); | 463 CSSPrimitiveValue* colorParameter = consumeInteger(args); |
464 if (!colorParameter) | 464 if (!colorParameter) |
465 colorParameter = consumePercent(args, ValueRangeAll); | 465 colorParameter = consumePercent(args, ValueRangeAll); |
466 if (!colorParameter) | 466 if (!colorParameter) |
467 return false; | 467 return false; |
468 const bool isPercent = colorParameter->isPercentage(); | 468 const bool isPercent = colorParameter->isPercentage(); |
469 int colorArray[3]; | 469 int colorArray[3]; |
470 colorArray[0] = clampRGBComponent(*colorParameter); | 470 colorArray[0] = clampRGBComponent(*colorParameter); |
(...skipping 19 matching lines...) Expand all Loading... |
490 makeRGBA(colorArray[0], colorArray[1], colorArray[2], alphaComponent); | 490 makeRGBA(colorArray[0], colorArray[1], colorArray[2], alphaComponent); |
491 } else { | 491 } else { |
492 result = makeRGB(colorArray[0], colorArray[1], colorArray[2]); | 492 result = makeRGB(colorArray[0], colorArray[1], colorArray[2]); |
493 } | 493 } |
494 return args.atEnd(); | 494 return args.atEnd(); |
495 } | 495 } |
496 | 496 |
497 static bool parseHSLParameters(CSSParserTokenRange& range, | 497 static bool parseHSLParameters(CSSParserTokenRange& range, |
498 RGBA32& result, | 498 RGBA32& result, |
499 bool parseAlpha) { | 499 bool parseAlpha) { |
500 ASSERT(range.peek().functionId() == CSSValueHsl || | 500 DCHECK(range.peek().functionId() == CSSValueHsl || |
501 range.peek().functionId() == CSSValueHsla); | 501 range.peek().functionId() == CSSValueHsla); |
502 CSSParserTokenRange args = consumeFunction(range); | 502 CSSParserTokenRange args = consumeFunction(range); |
503 CSSPrimitiveValue* hslValue = consumeNumber(args, ValueRangeAll); | 503 CSSPrimitiveValue* hslValue = consumeNumber(args, ValueRangeAll); |
504 if (!hslValue) | 504 if (!hslValue) |
505 return false; | 505 return false; |
506 double colorArray[3]; | 506 double colorArray[3]; |
507 colorArray[0] = (((hslValue->getIntValue() % 360) + 360) % 360) / 360.0; | 507 colorArray[0] = (((hslValue->getIntValue() % 360) + 360) % 360) / 360.0; |
508 for (int i = 1; i < 3; i++) { | 508 for (int i = 1; i < 3; i++) { |
509 if (!consumeCommaIncludingWhitespace(args)) | 509 if (!consumeCommaIncludingWhitespace(args)) |
510 return false; | 510 return false; |
(...skipping 894 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1405 | 1405 |
1406 // https://drafts.csswg.org/css-shapes-1/#typedef-shape-box | 1406 // https://drafts.csswg.org/css-shapes-1/#typedef-shape-box |
1407 CSSIdentifierValue* consumeShapeBox(CSSParserTokenRange& range) { | 1407 CSSIdentifierValue* consumeShapeBox(CSSParserTokenRange& range) { |
1408 return consumeIdent<CSSValueContentBox, CSSValuePaddingBox, CSSValueBorderBox, | 1408 return consumeIdent<CSSValueContentBox, CSSValuePaddingBox, CSSValueBorderBox, |
1409 CSSValueMarginBox>(range); | 1409 CSSValueMarginBox>(range); |
1410 } | 1410 } |
1411 | 1411 |
1412 } // namespace CSSPropertyParserHelpers | 1412 } // namespace CSSPropertyParserHelpers |
1413 | 1413 |
1414 } // namespace blink | 1414 } // namespace blink |
OLD | NEW |