Changeset 206043 in webkit
- Timestamp:
- Sep 16, 2016 1:24:23 PM (8 years ago)
- Location:
- trunk
- Files:
-
- 23 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r206037 r206043 1 2016-09-16 Dave Hyatt <hyatt@apple.com> 2 3 [CSS Parser] Get CSSPropertyParserHelpers.cpp compiling 4 https://bugs.webkit.org/show_bug.cgi?id=162078 5 6 Reviewed by Dean Jackson. 7 8 * css/CSSCalculationValue.cpp: 9 (WebCore::hasDoubleValue): 10 (WebCore::checkDepthAndIndex): 11 (WebCore::CSSCalcExpressionNodeParser::parseCalc): 12 (WebCore::CSSCalcExpressionNodeParser::operatorValue): 13 (WebCore::CSSCalcExpressionNodeParser::parseValue): 14 (WebCore::CSSCalcExpressionNodeParser::parseValueTerm): 15 (WebCore::CSSCalcExpressionNodeParser::parseValueMultiplicativeExpression): 16 (WebCore::CSSCalcExpressionNodeParser::parseAdditiveValueExpression): 17 (WebCore::CSSCalcExpressionNodeParser::parseValueExpression): 18 (WebCore::checkDepthAndIndexDeprecated): 19 (WebCore::CSSCalcExpressionNodeParserDeprecated::parseValueTerm): 20 (WebCore::CSSCalcExpressionNodeParserDeprecated::parseValueMultiplicativeExpression): 21 (WebCore::CSSCalcExpressionNodeParserDeprecated::parseAdditiveValueExpression): 22 (WebCore::CSSCalcValue::create): 23 * css/CSSCalculationValue.h: 24 (WebCore::CSSCalcValue::createCalculationValue): 25 (WebCore::CSSCalcValue::setPermittedValueRange): 26 Switch off the permitted calc value range enum, since we can just use the identical ValueRange enum. 27 Deprecate the CSSParserValueList-based parser by renaming it, and add a new parser that operates 28 on tokens. 29 30 * css/CSSPrimitiveValue.cpp: 31 (WebCore::isValidCSSUnitTypeForDoubleConversion): 32 (WebCore::isStringType): 33 (WebCore::CSSPrimitiveValue::cleanup): 34 (WebCore::CSSPrimitiveValue::computeNonCalcLengthDouble): 35 (WebCore::CSSPrimitiveValue::formatNumberForCustomCSSText): 36 (WebCore::CSSPrimitiveValue::cloneForCSSOM): 37 (WebCore::CSSPrimitiveValue::equals): 38 (WebCore::CSSPrimitiveValue::buildParserValue): 39 * css/CSSPrimitiveValue.h: 40 Add support for CSS_QUIRKY_EMS as a unit type. This will let us eliminate the extra m_isQuirkValue boolean 41 eventually. 42 43 * css/parser/CSSParser.cpp: 44 (WebCore::CSSParser::validateCalculationUnit): 45 (WebCore::CSSParser::parseCalculation): 46 * css/parser/CSSParser.h: 47 Switch to ValueRange. 48 49 * css/parser/CSSParserIdioms.cpp: 50 (WebCore::completeURL): 51 * css/parser/CSSParserIdioms.h: 52 Make the URL completion function from CSSParser.cpp available to all. 53 54 * css/parser/CSSParserMode.h: 55 (WebCore::isUnitLessValueParsingEnabledForMode): 56 (WebCore::isUnitLessLengthParsingEnabledForMode): Deleted. 57 Rename this to value, since for now we're not supporting Blink's UserUnits. This means we need to support 58 unitless parsing for times and angles in addition to lengths, making the name of the function inappropriate. 59 60 * css/parser/CSSParserToken.cpp: 61 (WebCore::cssPrimitiveValueUnitFromTrie): 62 Turn quirky ems support back on. 63 64 * css/parser/CSSParserValues.cpp: 65 (WebCore::CSSParserValue::createCSSValue): 66 Support quirky ems. 67 68 * css/parser/CSSPropertyParserHelpers.cpp: 69 (WebCore::CSSPropertyParserHelpers::CalcParser::consumeValue): 70 (WebCore::CSSPropertyParserHelpers::CalcParser::consumeNumber): 71 (WebCore::CSSPropertyParserHelpers::consumeInteger): 72 (WebCore::CSSPropertyParserHelpers::consumePositiveInteger): 73 (WebCore::CSSPropertyParserHelpers::consumeNumber): 74 (WebCore::CSSPropertyParserHelpers::shouldAcceptUnitlessValue): 75 (WebCore::CSSPropertyParserHelpers::consumeLength): 76 (WebCore::CSSPropertyParserHelpers::consumePercent): 77 (WebCore::CSSPropertyParserHelpers::canConsumeCalcValue): 78 (WebCore::CSSPropertyParserHelpers::consumeLengthOrPercent): 79 (WebCore::CSSPropertyParserHelpers::consumeAngle): 80 (WebCore::CSSPropertyParserHelpers::consumeTime): 81 (WebCore::CSSPropertyParserHelpers::consumeIdent): 82 (WebCore::CSSPropertyParserHelpers::consumeIdentRange): 83 (WebCore::CSSPropertyParserHelpers::consumeCustomIdent): 84 (WebCore::CSSPropertyParserHelpers::consumeString): 85 (WebCore::CSSPropertyParserHelpers::consumeUrl): 86 (WebCore::CSSPropertyParserHelpers::parseRGBParameters): 87 (WebCore::CSSPropertyParserHelpers::parseHSLParameters): 88 (WebCore::CSSPropertyParserHelpers::consumeColor): 89 (WebCore::CSSPropertyParserHelpers::consumePositionComponent): 90 (WebCore::CSSPropertyParserHelpers::positionFromOneValue): 91 (WebCore::CSSPropertyParserHelpers::positionFromTwoValues): 92 (WebCore::CSSPropertyParserHelpers::createPrimitiveValuePair): 93 (WebCore::CSSPropertyParserHelpers::positionFromThreeOrFourValues): 94 (WebCore::CSSPropertyParserHelpers::consumePosition): 95 (WebCore::CSSPropertyParserHelpers::consumeOneOrTwoValuedPosition): 96 (WebCore::CSSPropertyParserHelpers::consumeDeprecatedGradientPoint): 97 (WebCore::CSSPropertyParserHelpers::consumeDeprecatedGradientStopColor): 98 (WebCore::CSSPropertyParserHelpers::consumeDeprecatedGradientColorStop): 99 (WebCore::CSSPropertyParserHelpers::consumeDeprecatedGradient): 100 (WebCore::CSSPropertyParserHelpers::consumeDeprecatedRadialGradient): 101 (WebCore::CSSPropertyParserHelpers::consumeRadialGradient): 102 (WebCore::CSSPropertyParserHelpers::consumeLinearGradient): 103 (WebCore::CSSPropertyParserHelpers::consumeImageOrNone): 104 (WebCore::CSSPropertyParserHelpers::consumeCrossFade): 105 (WebCore::CSSPropertyParserHelpers::consumeGeneratedImage): 106 (WebCore::CSSPropertyParserHelpers::consumeImageSet): 107 (WebCore::CSSPropertyParserHelpers::consumeImage): 108 * css/parser/CSSPropertyParserHelpers.h: 109 (WebCore::CSSPropertyParserHelpers::isCSSWideKeyword): 110 Lots of changes here. The most important is switching over to RefPtrs and Refs where appropriate, with the 111 requisite WTFMoves. Unit types also have to be converted back to our values, and unitless parsing has 112 to work with consumeTime and consumeAngle. 113 114 * platform/CalculationValue.cpp: 115 (WebCore::CalculationValue::create): 116 * platform/CalculationValue.h: 117 (WebCore::CalculationValue::CalculationValue): 118 Use ValueRange. 119 120 * platform/graphics/Color.cpp: 121 (WebCore::Color::parseHexColor): 122 (WebCore::Color::Color): 123 * platform/graphics/Color.h: 124 Add a StringView-based parseHexColor function. 125 126 * rendering/style/BasicShapes.cpp: 127 (WebCore::BasicShapeCenterCoordinate::updateComputedLength): 128 Use ValueRange 129 1 130 2016-09-16 Jer Noble <jer.noble@apple.com> 2 131 -
trunk/Source/WebCore/css/CSSCalculationValue.cpp
r205093 r206043 34 34 35 35 #include "CSSParser.h" 36 #include "CSSParserTokenRange.h" 36 37 #include "CSSPrimitiveValueMappings.h" 37 38 #include "StyleResolver.h" … … 143 144 case CSSPrimitiveValue::CSS_SHAPE: 144 145 case CSSPrimitiveValue::CSS_QUAD: 146 case CSSPrimitiveValue::CSS_QUIRKY_EMS: 145 147 #if ENABLE(CSS_SCROLL_SNAP) 146 148 case CSSPrimitiveValue::CSS_LENGTH_REPEAT: … … 560 562 }; 561 563 562 static ParseState checkDepthAndIndex(int* depth, unsigned index, CSSParserValueList* tokens) 564 static ParseState checkDepthAndIndex(int* depth, CSSParserTokenRange tokens) 565 { 566 (*depth)++; 567 if (tokens.atEnd()) 568 return NoMoreTokens; 569 if (*depth > maxExpressionDepth) 570 return TooDeep; 571 return OK; 572 } 573 574 class CSSCalcExpressionNodeParser { 575 public: 576 RefPtr<CSSCalcExpressionNode> parseCalc(CSSParserTokenRange tokens) 577 { 578 Value result; 579 tokens.consumeWhitespace(); 580 bool ok = parseValueExpression(tokens, 0, &result); 581 if (!ok || !tokens.atEnd()) 582 return nullptr; 583 return result.value; 584 } 585 586 private: 587 struct Value { 588 RefPtr<CSSCalcExpressionNode> value; 589 }; 590 591 char operatorValue(const CSSParserToken& token) 592 { 593 if (token.type() == DelimiterToken) 594 return token.delimiter(); 595 return 0; 596 } 597 598 bool parseValue(CSSParserTokenRange& tokens, Value* result) 599 { 600 CSSParserToken token = tokens.consumeIncludingWhitespace(); 601 if (!(token.type() == NumberToken || token.type() == PercentageToken || token.type() == DimensionToken)) 602 return false; 603 604 CSSPrimitiveValue::UnitTypes type = token.unitType(); 605 if (unitCategory(type) == CalcOther) 606 return false; 607 608 result->value = CSSCalcPrimitiveValue::create(CSSPrimitiveValue::create(token.numericValue(), type), token.numericValueType() == IntegerValueType); 609 610 return true; 611 } 612 613 bool parseValueTerm(CSSParserTokenRange& tokens, int depth, Value* result) 614 { 615 if (checkDepthAndIndex(&depth, tokens) != OK) 616 return false; 617 618 if (tokens.peek().type() == LeftParenthesisToken || tokens.peek().functionId() == CSSValueCalc) { 619 CSSParserTokenRange innerRange = tokens.consumeBlock(); 620 tokens.consumeWhitespace(); 621 innerRange.consumeWhitespace(); 622 return parseValueExpression(innerRange, depth, result); 623 } 624 625 return parseValue(tokens, result); 626 } 627 628 bool parseValueMultiplicativeExpression(CSSParserTokenRange& tokens, int depth, Value* result) 629 { 630 if (checkDepthAndIndex(&depth, tokens) != OK) 631 return false; 632 633 if (!parseValueTerm(tokens, depth, result)) 634 return false; 635 636 while (!tokens.atEnd()) { 637 char operatorCharacter = operatorValue(tokens.peek()); 638 if (operatorCharacter != CalcMultiply && operatorCharacter != CalcDivide) 639 break; 640 tokens.consumeIncludingWhitespace(); 641 642 Value rhs; 643 if (!parseValueTerm(tokens, depth, &rhs)) 644 return false; 645 646 result->value = CSSCalcBinaryOperation::createSimplified(static_cast<CalcOperator>(operatorCharacter), result->value, rhs.value); 647 648 if (!result->value) 649 return false; 650 } 651 652 return true; 653 } 654 655 bool parseAdditiveValueExpression(CSSParserTokenRange& tokens, int depth, Value* result) 656 { 657 if (checkDepthAndIndex(&depth, tokens) != OK) 658 return false; 659 660 if (!parseValueMultiplicativeExpression(tokens, depth, result)) 661 return false; 662 663 while (!tokens.atEnd()) { 664 char operatorCharacter = operatorValue(tokens.peek()); 665 if (operatorCharacter != CalcAdd && operatorCharacter != CalcSubtract) 666 break; 667 if ((&tokens.peek() - 1)->type() != WhitespaceToken) 668 return false; // calc(1px+ 2px) is invalid 669 tokens.consume(); 670 if (tokens.peek().type() != WhitespaceToken) 671 return false; // calc(1px +2px) is invalid 672 tokens.consumeIncludingWhitespace(); 673 674 Value rhs; 675 if (!parseValueMultiplicativeExpression(tokens, depth, &rhs)) 676 return false; 677 678 result->value = CSSCalcBinaryOperation::createSimplified(static_cast<CalcOperator>(operatorCharacter), result->value, rhs.value); 679 if (!result->value) 680 return false; 681 } 682 683 return true; 684 } 685 686 bool parseValueExpression(CSSParserTokenRange& tokens, int depth, Value* result) 687 { 688 return parseAdditiveValueExpression(tokens, depth, result); 689 } 690 }; 691 692 static ParseState checkDepthAndIndexDeprecated(int* depth, unsigned index, CSSParserValueList* tokens) 563 693 { 564 694 (*depth)++; … … 570 700 } 571 701 572 class CSSCalcExpressionNodeParser {702 class CSSCalcExpressionNodeParserDeprecated { 573 703 public: 574 704 RefPtr<CSSCalcExpressionNode> parseCalc(CSSParserValueList* tokens) … … 617 747 bool parseValueTerm(CSSParserValueList* tokens, int depth, unsigned* index, Value* result) 618 748 { 619 if (checkDepthAndIndex (&depth, *index, tokens) != OK)749 if (checkDepthAndIndexDeprecated(&depth, *index, tokens) != OK) 620 750 return false; 621 751 … … 636 766 bool parseValueMultiplicativeExpression(CSSParserValueList* tokens, int depth, unsigned* index, Value* result) 637 767 { 638 if (checkDepthAndIndex (&depth, *index, tokens) != OK)768 if (checkDepthAndIndexDeprecated(&depth, *index, tokens) != OK) 639 769 return false; 640 770 … … 663 793 bool parseAdditiveValueExpression(CSSParserValueList* tokens, int depth, unsigned* index, Value* result) 664 794 { 665 if (checkDepthAndIndex (&depth, *index, tokens) != OK)795 if (checkDepthAndIndexDeprecated(&depth, *index, tokens) != OK) 666 796 return false; 667 797 … … 751 881 } 752 882 753 RefPtr<CSSCalcValue> CSSCalcValue::create(CSSParserString name, CSSParserValueList& parserValueList, CalculationPermittedValueRange range)754 { 755 CSSCalcExpressionNodeParser parser;883 RefPtr<CSSCalcValue> CSSCalcValue::create(CSSParserString name, CSSParserValueList& parserValueList, ValueRange range) 884 { 885 CSSCalcExpressionNodeParserDeprecated parser; 756 886 RefPtr<CSSCalcExpressionNode> expression; 757 887 … … 759 889 expression = parser.parseCalc(&parserValueList); 760 890 761 return expression ? adoptRef(new CSSCalcValue(expression.releaseNonNull(), range != CalculationRangeAll)) : nullptr; 762 } 763 891 return expression ? adoptRef(new CSSCalcValue(expression.releaseNonNull(), range != ValueRangeAll)) : nullptr; 892 } 893 894 RefPtr<CSSCalcValue> CSSCalcValue::create(const CSSParserTokenRange& tokens, ValueRange range) 895 { 896 CSSCalcExpressionNodeParser parser; 897 RefPtr<CSSCalcExpressionNode> expression = parser.parseCalc(tokens); 898 return expression ? adoptRef(new CSSCalcValue(expression.releaseNonNull(), range != ValueRangeAll)) : nullptr; 899 900 } 901 764 902 RefPtr<CSSCalcValue> CSSCalcValue::create(const CalculationValue& value, const RenderStyle& style) 765 903 { -
trunk/Source/WebCore/css/CSSCalculationValue.h
r205093 r206043 36 36 namespace WebCore { 37 37 38 class CSSParserTokenRange; 38 39 class CSSParserValueList; 39 40 class CSSToLengthConversionData; … … 88 89 class CSSCalcValue final : public CSSValue { 89 90 public: 90 static RefPtr<CSSCalcValue> create(CSSParserString name, CSSParserValueList& arguments, CalculationPermittedValueRange); 91 // FIXME-NEWPARSER: Remove the CSSParserString create when old parser goes away. 92 static RefPtr<CSSCalcValue> create(CSSParserString name, CSSParserValueList& arguments, ValueRange); 93 static RefPtr<CSSCalcValue> create(const CSSParserTokenRange&, ValueRange); 94 91 95 static RefPtr<CSSCalcValue> create(const CalculationValue&, const RenderStyle&); 92 96 … … 95 99 double doubleValue() const; 96 100 bool isPositive() const { return m_expression->doubleValue() > 0; } 101 bool isNegative() const { return m_expression->doubleValue() < 0; } 97 102 double computeLengthPx(const CSSToLengthConversionData&) const; 98 103 unsigned short primitiveType() const { return m_expression->primitiveType(); } 99 104 100 105 Ref<CalculationValue> createCalculationValue(const CSSToLengthConversionData&) const; 101 void setPermittedValueRange( CalculationPermittedValueRange);106 void setPermittedValueRange(ValueRange); 102 107 103 108 String customCSSText() const; … … 123 128 { 124 129 return CalculationValue::create(m_expression->createCalcExpression(conversionData), 125 m_shouldClampToNonNegative ? CalculationRangeNonNegative : CalculationRangeAll);130 m_shouldClampToNonNegative ? ValueRangeNonNegative : ValueRangeAll); 126 131 } 127 132 128 inline void CSSCalcValue::setPermittedValueRange( CalculationPermittedValueRange range)133 inline void CSSCalcValue::setPermittedValueRange(ValueRange range) 129 134 { 130 m_shouldClampToNonNegative = range != CalculationRangeAll;135 m_shouldClampToNonNegative = range != ValueRangeAll; 131 136 } 132 137 -
trunk/Source/WebCore/css/CSSPrimitiveValue.cpp
r201782 r206043 72 72 case CSSPrimitiveValue::CSS_DIMENSION: 73 73 case CSSPrimitiveValue::CSS_EMS: 74 case CSSPrimitiveValue::CSS_QUIRKY_EMS: 74 75 case CSSPrimitiveValue::CSS_EXS: 75 76 case CSSPrimitiveValue::CSS_FR: … … 161 162 case CSSPrimitiveValue::CSS_DPPX: 162 163 case CSSPrimitiveValue::CSS_EMS: 164 case CSSPrimitiveValue::CSS_QUIRKY_EMS: 163 165 case CSSPrimitiveValue::CSS_EXS: 164 166 case CSSPrimitiveValue::CSS_FONT_FAMILY: … … 577 579 case CSS_PERCENTAGE: 578 580 case CSS_EMS: 581 case CSS_QUIRKY_EMS: 579 582 case CSS_EXS: 580 583 case CSS_REMS: … … 686 689 switch (primitiveType) { 687 690 case CSS_EMS: 691 case CSS_QUIRKY_EMS: 688 692 ASSERT(conversionData.style()); 689 693 factor = conversionData.computingFontSize() ? conversionData.style()->fontDescription().specifiedSize() : conversionData.style()->fontDescription().computedSize(); … … 1072 1076 return formatNumberValue("%"); 1073 1077 case CSS_EMS: 1078 case CSS_QUIRKY_EMS: 1074 1079 return formatNumberValue("em"); 1075 1080 case CSS_EXS: … … 1175 1180 RGBA32 rgbColor = m_value.rgbcolor; 1176 1181 if (m_primitiveUnitType == CSS_PARSER_HEXCOLOR) 1177 Color::parseHexColor( m_value.string, rgbColor);1182 Color::parseHexColor((String)m_value.string, rgbColor); 1178 1183 return Color(rgbColor).cssText(); 1179 1184 } … … 1316 1321 case CSS_PERCENTAGE: 1317 1322 case CSS_EMS: 1323 case CSS_QUIRKY_EMS: 1318 1324 case CSS_EXS: 1319 1325 case CSS_REMS: … … 1380 1386 case CSS_PERCENTAGE: 1381 1387 case CSS_EMS: 1388 case CSS_QUIRKY_EMS: 1382 1389 case CSS_EXS: 1383 1390 case CSS_REMS: … … 1465 1472 case CSS_PERCENTAGE: 1466 1473 case CSS_EMS: 1474 case CSS_QUIRKY_EMS: 1467 1475 case CSS_EXS: 1468 1476 case CSS_REMS: -
trunk/Source/WebCore/css/CSSPrimitiveValue.h
r205093 r206043 157 157 158 158 // More internal parse stuff for CSS variables 159 CSS_PARSER_WHITESPACE = 119 159 CSS_PARSER_WHITESPACE = 119, 160 161 // This value is used to handle quirky margins in reflow roots (body, td, and th) like WinIE. 162 // The basic idea is that a stylesheet can use the value __qem (for quirky em) instead of em. 163 // When the quirky value is used, if you're in quirks mode, the margin will collapse away 164 // inside a table cell. This quirk is specified in the HTML spec but our impl is different. 165 CSS_QUIRKY_EMS = 120 160 166 }; 161 167 … … 190 196 || primitiveUnitType == CSS_EXS 191 197 || primitiveUnitType == CSS_REMS 192 || primitiveUnitType == CSS_CHS; 198 || primitiveUnitType == CSS_CHS 199 || primitiveUnitType == CSS_QUIRKY_EMS; 193 200 } 194 201 bool isFontRelativeLength() const { return isFontRelativeLength(m_primitiveUnitType); } 202 203 bool isQuirkyEms() const { return primitiveType() == UnitTypes::CSS_QUIRKY_EMS; } 195 204 196 205 static bool isViewportPercentageLength(unsigned short type) { return type >= CSS_VW && type <= CSS_VMAX; } … … 199 208 static bool isLength(unsigned short type) 200 209 { 201 return (type >= CSS_EMS && type <= CSS_PC) || type == CSS_REMS || type == CSS_CHS || isViewportPercentageLength(type) ;210 return (type >= CSS_EMS && type <= CSS_PC) || type == CSS_REMS || type == CSS_CHS || isViewportPercentageLength(type) || type == CSS_QUIRKY_EMS; 202 211 } 203 212 … … 370 379 String customCSSText() const; 371 380 372 bool isQuirkValue() const { return m_isQuirkValue; } 381 // FIXME-NEWPARSER: Can ditch the boolean and just use the unit type once old parser is gone. 382 bool isQuirkValue() const { return m_isQuirkValue || primitiveType() == CSS_QUIRKY_EMS; } 373 383 374 384 void addSubresourceStyleURLs(ListHashSet<URL>&, const StyleSheetContents*) const; -
trunk/Source/WebCore/css/StyleBuilderConverter.h
r205977 r206043 319 319 auto rhs = std::make_unique<CalcExpressionLength>(length); 320 320 auto op = std::make_unique<CalcExpressionBinaryOperation>(WTFMove(lhs), WTFMove(rhs), CalcSubtract); 321 return Length(CalculationValue::create(WTFMove(op), CalculationRangeAll));321 return Length(CalculationValue::create(WTFMove(op), ValueRangeAll)); 322 322 } 323 323 -
trunk/Source/WebCore/css/parser/CSSParser.cpp
r205984 r206043 1621 1621 // The calculation value was already parsed so we reuse it. However, we may need to update its range. 1622 1622 calculation = valueWithCalculation.calculation(); 1623 calculation->setPermittedValueRange(mustBeNonNegative ? CalculationRangeNonNegative : CalculationRangeAll);1623 calculation->setPermittedValueRange(mustBeNonNegative ? ValueRangeNonNegative : ValueRangeAll); 1624 1624 } else { 1625 valueWithCalculation.setCalculation(parseCalculation(valueWithCalculation, mustBeNonNegative ? CalculationRangeNonNegative : CalculationRangeAll));1625 valueWithCalculation.setCalculation(parseCalculation(valueWithCalculation, mustBeNonNegative ? ValueRangeNonNegative : ValueRangeAll)); 1626 1626 calculation = valueWithCalculation.calculation(); 1627 1627 if (!calculation) … … 11043 11043 } 11044 11044 11045 RefPtr<CSSCalcValue> CSSParser::parseCalculation(CSSParserValue& value, CalculationPermittedValueRange range)11045 RefPtr<CSSCalcValue> CSSParser::parseCalculation(CSSParserValue& value, ValueRange range) 11046 11046 { 11047 11047 ASSERT(isCalculation(value)); -
trunk/Source/WebCore/css/parser/CSSParser.h
r205924 r206043 360 360 361 361 bool parseLineBoxContain(bool important); 362 RefPtr<CSSCalcValue> parseCalculation(CSSParserValue&, CalculationPermittedValueRange);362 RefPtr<CSSCalcValue> parseCalculation(CSSParserValue&, ValueRange); 363 363 364 364 bool parseFontFeatureTag(CSSValueList&); -
trunk/Source/WebCore/css/parser/CSSParserIdioms.cpp
r206007 r206043 31 31 #include "CSSParserIdioms.h" 32 32 #include "CSSValueKeywords.h" 33 #include "TextEncoding.h" 33 34 34 35 namespace WebCore { … … 62 63 } 63 64 65 URL completeURL(const CSSParserContext& context, const String& url) 66 { 67 if (url.isNull()) 68 return URL(); 69 if (context.charset.isEmpty()) 70 return URL(context.baseURL, url); 71 return URL(context.baseURL, url, context.charset); 72 } 73 64 74 } // namespace WebCore -
trunk/Source/WebCore/css/parser/CSSParserIdioms.h
r206007 r206043 39 39 namespace WebCore { 40 40 41 class URL; 42 41 43 // Space characters as defined by the CSS specification. 42 44 // http://www.w3.org/TR/css3-syntax/#whitespace … … 63 65 64 66 bool isValueAllowedInMode(unsigned short, CSSParserMode); 65 67 68 URL completeURL(const CSSParserContext&, const String& url); 69 66 70 } 67 71 -
trunk/Source/WebCore/css/parser/CSSParserMode.h
r205984 r206043 63 63 } 64 64 65 inline bool isUnitLess LengthParsingEnabledForMode(CSSParserMode mode)65 inline bool isUnitLessValueParsingEnabledForMode(CSSParserMode mode) 66 66 { 67 67 return mode == HTMLAttributeMode || mode == SVGAttributeMode; -
trunk/Source/WebCore/css/parser/CSSParserToken.cpp
r205103 r206043 190 190 case '_': 191 191 if (toASCIILower(data[1]) == '_' && toASCIILower(data[2]) == 'q' && toASCIILower(data[3]) == 'e' && toASCIILower(data[4]) == 'm') 192 return CSSPrimitiveValue::UnitTypes::CSS_ EMS; // FIXME-NEWPARSER: Need quirky ems.192 return CSSPrimitiveValue::UnitTypes::CSS_QUIRKY_EMS; 193 193 break; 194 194 } -
trunk/Source/WebCore/css/parser/CSSParserValues.cpp
r205790 r206043 127 127 case CSSPrimitiveValue::CSS_PERCENTAGE: 128 128 case CSSPrimitiveValue::CSS_EMS: 129 case CSSPrimitiveValue::CSS_QUIRKY_EMS: 129 130 case CSSPrimitiveValue::CSS_EXS: 130 131 case CSSPrimitiveValue::CSS_PX: -
trunk/Source/WebCore/css/parser/CSSPropertyParserHelpers.cpp
r205103 r206043 32 32 33 33 #include "CSSCalculationValue.h" 34 // FIXME-NEWPARSER: #include "CSSColorValue.h"35 34 #include "CSSCrossfadeValue.h" 36 35 #include "CSSGradientValue.h" 37 36 #include "CSSImageSetValue.h" 38 37 #include "CSSImageValue.h" 39 // FIXME-NEWPARSER: #include "CSSPaintValue.h"40 // FIXME_NEWPARSER: #include "CSSStringValue.h"41 // FIXME-NEWPARSER: #include "CSSURIValue.h"42 // FIXME_NEWPARSER: #include "CSSValuePair.h"38 #include "CSSParserIdioms.h" 39 #include "CSSValuePool.h" 40 #include "Pair.h" 41 #include "StyleColor.h" 43 42 44 43 namespace WebCore { 45 44 46 /* FIXME-NEWPARSER: Disable for now.47 48 45 namespace CSSPropertyParserHelpers { 49 46 … … 89 86 90 87 const CSSCalcValue* value() const { return m_calcValue.get(); } 91 CSSPrimitiveValue*consumeValue()88 RefPtr<CSSPrimitiveValue> consumeValue() 92 89 { 93 90 if (!m_calcValue) … … 96 93 return CSSPrimitiveValue::create(m_calcValue.release()); 97 94 } 98 CSSPrimitiveValue*consumeNumber()95 RefPtr<CSSPrimitiveValue> consumeNumber() 99 96 { 100 97 if (!m_calcValue) 101 98 return nullptr; 102 99 m_sourceRange = m_range; 103 CSSPrimitiveValue::UnitType unitType = m_calcValue->isInt() ? CSSPrimitiveValue::UnitType::Integer : CSSPrimitiveValue::UnitType::Number;100 CSSPrimitiveValue::UnitTypes unitType = m_calcValue->isInt() ? CSSPrimitiveValue::UnitTypes::CSS_PARSER_INTEGER : CSSPrimitiveValue::UnitTypes::CSS_NUMBER; 104 101 return CSSPrimitiveValue::create(m_calcValue->doubleValue(), unitType); 105 102 } … … 117 114 CSSParserTokenRange& m_sourceRange; 118 115 CSSParserTokenRange m_range; 119 Member<CSSCalcValue> m_calcValue;116 RefPtr<CSSCalcValue> m_calcValue; 120 117 }; 121 118 122 CSSPrimitiveValue*consumeInteger(CSSParserTokenRange& range, double minimumValue)119 RefPtr<CSSPrimitiveValue> consumeInteger(CSSParserTokenRange& range, double minimumValue) 123 120 { 124 121 const CSSParserToken& token = range.peek(); … … 126 123 if (token.numericValueType() == NumberValueType || token.numericValue() < minimumValue) 127 124 return nullptr; 128 return CSSPrimitiveValue::create(range.consumeIncludingWhitespace().numericValue(), CSSPrimitiveValue::UnitType ::Integer);125 return CSSPrimitiveValue::create(range.consumeIncludingWhitespace().numericValue(), CSSPrimitiveValue::UnitTypes::CSS_PARSER_INTEGER); 129 126 } 130 127 CalcParser calcParser(range); … … 140 137 } 141 138 142 CSSPrimitiveValue*consumePositiveInteger(CSSParserTokenRange& range)139 RefPtr<CSSPrimitiveValue> consumePositiveInteger(CSSParserTokenRange& range) 143 140 { 144 141 return consumeInteger(range, 1); … … 156 153 157 154 // FIXME: Work out if this can just call consumeNumberRaw 158 CSSPrimitiveValue*consumeNumber(CSSParserTokenRange& range, ValueRange valueRange)155 RefPtr<CSSPrimitiveValue> consumeNumber(CSSParserTokenRange& range, ValueRange valueRange) 159 156 { 160 157 const CSSParserToken& token = range.peek(); … … 175 172 } 176 173 177 inline bool shouldAcceptUnitless Length(double value, CSSParserMode cssParserMode, UnitlessQuirk unitless)174 inline bool shouldAcceptUnitlessValue(double value, CSSParserMode cssParserMode, UnitlessQuirk unitless) 178 175 { 179 176 // FIXME: Presentational HTML attributes shouldn't use the CSS parser for lengths 180 177 return value == 0 181 || isUnitLess LengthParsingEnabledForMode(cssParserMode)178 || isUnitLessValueParsingEnabledForMode(cssParserMode) 182 179 || (cssParserMode == HTMLQuirksMode && unitless == UnitlessQuirk::Allow); 183 180 } 184 181 185 CSSPrimitiveValue*consumeLength(CSSParserTokenRange& range, CSSParserMode cssParserMode, ValueRange valueRange, UnitlessQuirk unitless)182 RefPtr<CSSPrimitiveValue> consumeLength(CSSParserTokenRange& range, CSSParserMode cssParserMode, ValueRange valueRange, UnitlessQuirk unitless) 186 183 { 187 184 const CSSParserToken& token = range.peek(); 188 185 if (token.type() == DimensionToken) { 189 186 switch (token.unitType()) { 190 case CSSPrimitiveValue::UnitType ::QuirkyEms:187 case CSSPrimitiveValue::UnitTypes::CSS_QUIRKY_EMS: 191 188 if (cssParserMode != UASheetMode) 192 189 return nullptr; 193 190 FALLTHROUGH; 194 case CSSPrimitiveValue::UnitType::Ems: 195 case CSSPrimitiveValue::UnitType::Rems: 196 case CSSPrimitiveValue::UnitType::Chs: 197 case CSSPrimitiveValue::UnitType::Exs: 198 case CSSPrimitiveValue::UnitType::Pixels: 199 case CSSPrimitiveValue::UnitType::Centimeters: 200 case CSSPrimitiveValue::UnitType::Millimeters: 201 case CSSPrimitiveValue::UnitType::Inches: 202 case CSSPrimitiveValue::UnitType::Points: 203 case CSSPrimitiveValue::UnitType::Picas: 204 case CSSPrimitiveValue::UnitType::UserUnits: 205 case CSSPrimitiveValue::UnitType::ViewportWidth: 206 case CSSPrimitiveValue::UnitType::ViewportHeight: 207 case CSSPrimitiveValue::UnitType::ViewportMin: 208 case CSSPrimitiveValue::UnitType::ViewportMax: 191 case CSSPrimitiveValue::UnitTypes::CSS_EMS: 192 case CSSPrimitiveValue::UnitTypes::CSS_REMS: 193 case CSSPrimitiveValue::UnitTypes::CSS_CHS: 194 case CSSPrimitiveValue::UnitTypes::CSS_EXS: 195 case CSSPrimitiveValue::UnitTypes::CSS_PX: 196 case CSSPrimitiveValue::UnitTypes::CSS_CM: 197 case CSSPrimitiveValue::UnitTypes::CSS_MM: 198 case CSSPrimitiveValue::UnitTypes::CSS_IN: 199 case CSSPrimitiveValue::UnitTypes::CSS_PT: 200 case CSSPrimitiveValue::UnitTypes::CSS_PC: 201 case CSSPrimitiveValue::UnitTypes::CSS_VW: 202 case CSSPrimitiveValue::UnitTypes::CSS_VH: 203 case CSSPrimitiveValue::UnitTypes::CSS_VMIN: 204 case CSSPrimitiveValue::UnitTypes::CSS_VMAX: 209 205 break; 210 206 default: … … 216 212 } 217 213 if (token.type() == NumberToken) { 218 if (!shouldAcceptUnitless Length(token.numericValue(), cssParserMode, unitless)214 if (!shouldAcceptUnitlessValue(token.numericValue(), cssParserMode, unitless) 219 215 || (valueRange == ValueRangeNonNegative && token.numericValue() < 0)) 220 216 return nullptr; 221 CSSPrimitiveValue::UnitType unitType = CSSPrimitiveValue::UnitType::Pixels; 222 if (cssParserMode == SVGAttributeMode) 223 unitType = CSSPrimitiveValue::UnitType::UserUnits; 217 CSSPrimitiveValue::UnitTypes unitType = CSSPrimitiveValue::UnitTypes::CSS_PX; 224 218 return CSSPrimitiveValue::create(range.consumeIncludingWhitespace().numericValue(), unitType); 225 219 } … … 232 226 } 233 227 234 CSSPrimitiveValue*consumePercent(CSSParserTokenRange& range, ValueRange valueRange)228 RefPtr<CSSPrimitiveValue> consumePercent(CSSParserTokenRange& range, ValueRange valueRange) 235 229 { 236 230 const CSSParserToken& token = range.peek(); … … 238 232 if (valueRange == ValueRangeNonNegative && token.numericValue() < 0) 239 233 return nullptr; 240 return CSSPrimitiveValue::create(range.consumeIncludingWhitespace().numericValue(), CSSPrimitiveValue::UnitType ::Percentage);234 return CSSPrimitiveValue::create(range.consumeIncludingWhitespace().numericValue(), CSSPrimitiveValue::UnitTypes::CSS_PERCENTAGE); 241 235 } 242 236 CalcParser calcParser(range, valueRange); … … 248 242 } 249 243 250 bool canConsumeCalcValue(CalculationCategory category, CSSParserMode cssParserMode)244 static bool canConsumeCalcValue(CalculationCategory category, CSSParserMode cssParserMode) 251 245 { 252 246 if (category == CalcLength || category == CalcPercent || category == CalcPercentLength) … … 256 250 return false; 257 251 258 if (category == CalcNumber || category == CalcPercentNumber || category == CalcLengthNumber || category == CalcPercentLengthNumber)252 if (category == CalcNumber || category == CalcPercentNumber) 259 253 return true; 260 254 … … 262 256 } 263 257 264 CSSPrimitiveValue*consumeLengthOrPercent(CSSParserTokenRange& range, CSSParserMode cssParserMode, ValueRange valueRange, UnitlessQuirk unitless)258 RefPtr<CSSPrimitiveValue> consumeLengthOrPercent(CSSParserTokenRange& range, CSSParserMode cssParserMode, ValueRange valueRange, UnitlessQuirk unitless) 265 259 { 266 260 const CSSParserToken& token = range.peek(); … … 277 271 } 278 272 279 CSSPrimitiveValue* consumeAngle(CSSParserTokenRange& range)273 RefPtr<CSSPrimitiveValue> consumeAngle(CSSParserTokenRange& range, CSSParserMode cssParserMode, UnitlessQuirk unitless) 280 274 { 281 275 const CSSParserToken& token = range.peek(); 282 276 if (token.type() == DimensionToken) { 283 277 switch (token.unitType()) { 284 case CSSPrimitiveValue::UnitType ::Degrees:285 case CSSPrimitiveValue::UnitType ::Radians:286 case CSSPrimitiveValue::UnitType ::Gradians:287 case CSSPrimitiveValue::UnitType ::Turns:278 case CSSPrimitiveValue::UnitTypes::CSS_DEG: 279 case CSSPrimitiveValue::UnitTypes::CSS_RAD: 280 case CSSPrimitiveValue::UnitTypes::CSS_GRAD: 281 case CSSPrimitiveValue::UnitTypes::CSS_TURN: 288 282 return CSSPrimitiveValue::create(range.consumeIncludingWhitespace().numericValue(), token.unitType()); 289 283 default: … … 291 285 } 292 286 } 293 if (token.type() == NumberToken && token.numericValue() == 0) {287 if (token.type() == NumberToken && shouldAcceptUnitlessValue(token.numericValue(), cssParserMode, unitless)) { 294 288 range.consumeIncludingWhitespace(); 295 return CSSPrimitiveValue::create(0, CSSPrimitiveValue::UnitType::Degrees); 296 } 289 return CSSPrimitiveValue::create(0, CSSPrimitiveValue::UnitTypes::CSS_DEG); 290 } 291 297 292 CalcParser calcParser(range, ValueRangeAll); 298 293 if (const CSSCalcValue* calculation = calcParser.value()) { … … 303 298 } 304 299 305 CSSPrimitiveValue* consumeTime(CSSParserTokenRange& range, ValueRange valueRange)300 RefPtr<CSSPrimitiveValue> consumeTime(CSSParserTokenRange& range, CSSParserMode cssParserMode, ValueRange valueRange, UnitlessQuirk unitless) 306 301 { 307 302 const CSSParserToken& token = range.peek(); 308 if (token.type() == DimensionToken) { 303 CSSPrimitiveValue::UnitTypes unit = token.unitType(); 304 bool acceptUnitless = token.type() == NumberToken && shouldAcceptUnitlessValue(token.numericValue(), cssParserMode, unitless); 305 if (acceptUnitless) 306 unit = CSSPrimitiveValue::UnitTypes::CSS_MS; 307 if (token.type() == DimensionToken || acceptUnitless) { 309 308 if (valueRange == ValueRangeNonNegative && token.numericValue() < 0) 310 309 return nullptr; 311 CSSPrimitiveValue::UnitType unit = token.unitType(); 312 if (unit == CSSPrimitiveValue::UnitType::Milliseconds || unit == CSSPrimitiveValue::UnitType::Seconds) 310 if (unit == CSSPrimitiveValue::UnitTypes::CSS_MS || unit == CSSPrimitiveValue::UnitTypes::CSS_S) 313 311 return CSSPrimitiveValue::create(range.consumeIncludingWhitespace().numericValue(), token.unitType()); 314 312 return nullptr; … … 322 320 } 323 321 324 CSSPrimitiveValue*consumeIdent(CSSParserTokenRange& range)322 RefPtr<CSSPrimitiveValue> consumeIdent(CSSParserTokenRange& range) 325 323 { 326 324 if (range.peek().type() != IdentToken) … … 329 327 } 330 328 331 CSSPrimitiveValue*consumeIdentRange(CSSParserTokenRange& range, CSSValueID lower, CSSValueID upper)329 RefPtr<CSSPrimitiveValue> consumeIdentRange(CSSParserTokenRange& range, CSSValueID lower, CSSValueID upper) 332 330 { 333 331 if (range.peek().id() < lower || range.peek().id() > upper) … … 336 334 } 337 335 338 CSSCustomIdentValue*consumeCustomIdent(CSSParserTokenRange& range)336 RefPtr<CSSCustomIdentValue> consumeCustomIdent(CSSParserTokenRange& range) 339 337 { 340 338 if (range.peek().type() != IdentToken || isCSSWideKeyword(range.peek().id())) … … 343 341 } 344 342 345 CSSStringValue*consumeString(CSSParserTokenRange& range)343 RefPtr<CSSPrimitiveValue> consumeString(CSSParserTokenRange& range) 346 344 { 347 345 if (range.peek().type() != StringToken) 348 346 return nullptr; 349 return CSS StringValue::create(range.consumeIncludingWhitespace().value().toString());347 return CSSPrimitiveValue::create(range.consumeIncludingWhitespace().value().toString(), CSSPrimitiveValue::UnitTypes::CSS_STRING); 350 348 } 351 349 … … 372 370 } 373 371 374 CSSURIValue*consumeUrl(CSSParserTokenRange& range)372 RefPtr<CSSPrimitiveValue> consumeUrl(CSSParserTokenRange& range) 375 373 { 376 374 StringView url = consumeUrlAsStringView(range); 377 375 if (url.isNull()) 378 376 return nullptr; 379 return CSS URIValue::create(url.toString());377 return CSSPrimitiveValue::create(url.toString(), CSSPrimitiveValue::UnitTypes::CSS_URI); 380 378 } 381 379 … … 393 391 ASSERT(range.peek().functionId() == CSSValueRgb || range.peek().functionId() == CSSValueRgba); 394 392 CSSParserTokenRange args = consumeFunction(range); 395 CSSPrimitiveValue*colorParameter = consumeInteger(args);393 RefPtr<CSSPrimitiveValue> colorParameter = consumeInteger(args); 396 394 if (!colorParameter) 397 395 colorParameter = consumePercent(args, ValueRangeAll); … … 429 427 ASSERT(range.peek().functionId() == CSSValueHsl || range.peek().functionId() == CSSValueHsla); 430 428 CSSParserTokenRange args = consumeFunction(range); 431 CSSPrimitiveValue*hslValue = consumeNumber(args, ValueRangeAll);429 RefPtr<CSSPrimitiveValue> hslValue = consumeNumber(args, ValueRangeAll); 432 430 if (!hslValue) 433 431 return false; … … 501 499 } 502 500 503 CSSValue*consumeColor(CSSParserTokenRange& range, CSSParserMode cssParserMode, bool acceptQuirkyColors)501 RefPtr<CSSPrimitiveValue> consumeColor(CSSParserTokenRange& range, CSSParserMode cssParserMode, bool acceptQuirkyColors) 504 502 { 505 503 CSSValueID id = range.peek().id(); … … 512 510 if (!parseHexColor(range, color, acceptQuirkyColors) && !parseColorFunction(range, color)) 513 511 return nullptr; 514 return CSS ColorValue::create(color);515 } 516 517 static CSSPrimitiveValue*consumePositionComponent(CSSParserTokenRange& range, CSSParserMode cssParserMode, UnitlessQuirk unitless)512 return CSSPrimitiveValue::createColor(color); 513 } 514 515 static RefPtr<CSSPrimitiveValue> consumePositionComponent(CSSParserTokenRange& range, CSSParserMode cssParserMode, UnitlessQuirk unitless) 518 516 { 519 517 if (range.peek().type() == IdentToken) … … 532 530 } 533 531 534 static void positionFromOneValue(CSSPrimitiveValue * value, CSSValue*& resultX, CSSValue*& resultY)535 { 536 bool valueAppliesToYAxisOnly = isVerticalPositionKeywordOnly( *value);537 resultX = value;532 static void positionFromOneValue(CSSPrimitiveValue& value, RefPtr<CSSPrimitiveValue>& resultX, RefPtr<CSSPrimitiveValue>& resultY) 533 { 534 bool valueAppliesToYAxisOnly = isVerticalPositionKeywordOnly(value); 535 resultX = &value; 538 536 resultY = CSSPrimitiveValue::createIdentifier(CSSValueCenter); 539 537 if (valueAppliesToYAxisOnly) … … 541 539 } 542 540 543 static bool positionFromTwoValues(CSSPrimitiveValue * value1, CSSPrimitiveValue*value2,544 CSSValue*& resultX, CSSValue*& resultY)545 { 546 bool mustOrderAsXY = isHorizontalPositionKeywordOnly( *value1) || isVerticalPositionKeywordOnly(*value2)547 || !value1 ->isValueID() || !value2->isValueID();548 bool mustOrderAsYX = isVerticalPositionKeywordOnly( *value1) || isHorizontalPositionKeywordOnly(*value2);541 static bool positionFromTwoValues(CSSPrimitiveValue& value1, CSSPrimitiveValue& value2, 542 RefPtr<CSSPrimitiveValue>& resultX, RefPtr<CSSPrimitiveValue>& resultY) 543 { 544 bool mustOrderAsXY = isHorizontalPositionKeywordOnly(value1) || isVerticalPositionKeywordOnly(value2) 545 || !value1.isValueID() || !value2.isValueID(); 546 bool mustOrderAsYX = isVerticalPositionKeywordOnly(value1) || isHorizontalPositionKeywordOnly(value2); 549 547 if (mustOrderAsXY && mustOrderAsYX) 550 548 return false; 551 resultX = value1;552 resultY = value2;549 resultX = &value1; 550 resultY = &value2; 553 551 if (mustOrderAsYX) 554 552 std::swap(resultX, resultY); … … 556 554 } 557 555 558 static bool positionFromThreeOrFourValues(CSSPrimitiveValue** values, CSSValue*& resultX, CSSValue*& resultY) 556 557 template<typename... Args> 558 static Ref<CSSPrimitiveValue> createPrimitiveValuePair(Args&&... args) 559 { 560 return CSSValuePool::singleton().createValue(Pair::create(std::forward<Args>(args)...)); 561 } 562 563 static bool positionFromThreeOrFourValues(CSSPrimitiveValue** values, RefPtr<CSSPrimitiveValue>& resultX, RefPtr<CSSPrimitiveValue>& resultY) 559 564 { 560 565 CSSPrimitiveValue* center = nullptr; … … 572 577 } 573 578 574 CSSValue* result = nullptr;575 if (values[i + 1] && !values[i + 1]->isValueID()) {576 result = CSSValuePair::create(currentValue, values[++i], CSSValuePair::KeepIdenticalValues);577 } else {579 RefPtr<CSSPrimitiveValue> result; 580 if (values[i + 1] && !values[i + 1]->isValueID()) 581 result = createPrimitiveValuePair(currentValue, values[++i]); 582 else 578 583 result = currentValue; 579 }580 584 581 585 if (id == CSSValueLeft || id == CSSValueRight) { … … 607 611 // FIXME: This may consume from the range upon failure. The background 608 612 // shorthand works around it, but we should just fix it here. 609 bool consumePosition(CSSParserTokenRange& range, CSSParserMode cssParserMode, UnitlessQuirk unitless, CSSValue*& resultX, CSSValue*& resultY)610 { 611 CSSPrimitiveValue*value1 = consumePositionComponent(range, cssParserMode, unitless);613 bool consumePosition(CSSParserTokenRange& range, CSSParserMode cssParserMode, UnitlessQuirk unitless, RefPtr<CSSPrimitiveValue>& resultX, RefPtr<CSSPrimitiveValue>& resultY) 614 { 615 RefPtr<CSSPrimitiveValue> value1 = consumePositionComponent(range, cssParserMode, unitless); 612 616 if (!value1) 613 617 return false; 614 618 615 CSSPrimitiveValue*value2 = consumePositionComponent(range, cssParserMode, unitless);619 RefPtr<CSSPrimitiveValue> value2 = consumePositionComponent(range, cssParserMode, unitless); 616 620 if (!value2) { 617 positionFromOneValue( value1, resultX, resultY);621 positionFromOneValue(*value1, resultX, resultY); 618 622 return true; 619 623 } 620 624 621 CSSPrimitiveValue*value3 = consumePositionComponent(range, cssParserMode, unitless);625 RefPtr<CSSPrimitiveValue> value3 = consumePositionComponent(range, cssParserMode, unitless); 622 626 if (!value3) 623 return positionFromTwoValues( value1,value2, resultX, resultY);624 625 CSSPrimitiveValue*value4 = consumePositionComponent(range, cssParserMode, unitless);627 return positionFromTwoValues(*value1, *value2, resultX, resultY); 628 629 RefPtr<CSSPrimitiveValue> value4 = consumePositionComponent(range, cssParserMode, unitless); 626 630 CSSPrimitiveValue* values[5]; 627 values[0] = value1 ;628 values[1] = value2 ;629 values[2] = value3 ;630 values[3] = value4 ;631 values[0] = value1.get(); 632 values[1] = value2.get(); 633 values[2] = value3.get(); 634 values[3] = value4.get(); 631 635 values[4] = nullptr; 632 636 return positionFromThreeOrFourValues(values, resultX, resultY); 633 637 } 634 638 635 CSSValuePair*consumePosition(CSSParserTokenRange& range, CSSParserMode cssParserMode, UnitlessQuirk unitless)636 { 637 CSSValue* resultX = nullptr;638 CSSValue* resultY = nullptr;639 RefPtr<CSSPrimitiveValue> consumePosition(CSSParserTokenRange& range, CSSParserMode cssParserMode, UnitlessQuirk unitless) 640 { 641 RefPtr<CSSPrimitiveValue> resultX; 642 RefPtr<CSSPrimitiveValue> resultY; 639 643 if (consumePosition(range, cssParserMode, unitless, resultX, resultY)) 640 return CSSValuePair::create(resultX, resultY, CSSValuePair::KeepIdenticalValues);644 return createPrimitiveValuePair(resultX.releaseNonNull(), resultY.releaseNonNull()); 641 645 return nullptr; 642 646 } 643 647 644 bool consumeOneOrTwoValuedPosition(CSSParserTokenRange& range, CSSParserMode cssParserMode, UnitlessQuirk unitless, CSSValue*& resultX, CSSValue*& resultY)645 { 646 CSSPrimitiveValue*value1 = consumePositionComponent(range, cssParserMode, unitless);648 bool consumeOneOrTwoValuedPosition(CSSParserTokenRange& range, CSSParserMode cssParserMode, UnitlessQuirk unitless, RefPtr<CSSPrimitiveValue>& resultX, RefPtr<CSSPrimitiveValue>& resultY) 649 { 650 RefPtr<CSSPrimitiveValue> value1 = consumePositionComponent(range, cssParserMode, unitless); 647 651 if (!value1) 648 652 return false; 649 CSSPrimitiveValue*value2 = consumePositionComponent(range, cssParserMode, unitless);653 RefPtr<CSSPrimitiveValue> value2 = consumePositionComponent(range, cssParserMode, unitless); 650 654 if (!value2) { 651 positionFromOneValue( value1, resultX, resultY);655 positionFromOneValue(*value1, resultX, resultY); 652 656 return true; 653 657 } 654 return positionFromTwoValues( value1,value2, resultX, resultY);658 return positionFromTwoValues(*value1, *value2, resultX, resultY); 655 659 } 656 660 657 661 // This should go away once we drop support for -webkit-gradient 658 static CSSPrimitiveValue*consumeDeprecatedGradientPoint(CSSParserTokenRange& args, bool horizontal)662 static RefPtr<CSSPrimitiveValue> consumeDeprecatedGradientPoint(CSSParserTokenRange& args, bool horizontal) 659 663 { 660 664 if (args.peek().type() == IdentToken) { 661 665 if ((horizontal && consumeIdent<CSSValueLeft>(args)) || (!horizontal && consumeIdent<CSSValueTop>(args))) 662 return CSSPrimitiveValue::create(0., CSSPrimitiveValue::UnitType ::Percentage);666 return CSSPrimitiveValue::create(0., CSSPrimitiveValue::UnitTypes::CSS_PERCENTAGE); 663 667 if ((horizontal && consumeIdent<CSSValueRight>(args)) || (!horizontal && consumeIdent<CSSValueBottom>(args))) 664 return CSSPrimitiveValue::create(100., CSSPrimitiveValue::UnitType ::Percentage);668 return CSSPrimitiveValue::create(100., CSSPrimitiveValue::UnitTypes::CSS_PERCENTAGE); 665 669 if (consumeIdent<CSSValueCenter>(args)) 666 return CSSPrimitiveValue::create(50., CSSPrimitiveValue::UnitType ::Percentage);667 return nullptr; 668 } 669 CSSPrimitiveValue*result = consumePercent(args, ValueRangeAll);670 return CSSPrimitiveValue::create(50., CSSPrimitiveValue::UnitTypes::CSS_PERCENTAGE); 671 return nullptr; 672 } 673 RefPtr<CSSPrimitiveValue> result = consumePercent(args, ValueRangeAll); 670 674 if (!result) 671 675 result = consumeNumber(args, ValueRangeAll); … … 674 678 675 679 // Used to parse colors for -webkit-gradient(...). 676 static CSSValue*consumeDeprecatedGradientStopColor(CSSParserTokenRange& args, CSSParserMode cssParserMode)680 static RefPtr<CSSPrimitiveValue> consumeDeprecatedGradientStopColor(CSSParserTokenRange& args, CSSParserMode cssParserMode) 677 681 { 678 682 if (args.peek().id() == CSSValueCurrentcolor) … … 692 696 position = (id == CSSValueFrom) ? 0 : 1; 693 697 } else { 694 DCHECK(id == CSSValueColorStop);698 ASSERT(id == CSSValueColorStop); 695 699 const CSSParserToken& arg = args.consumeIncludingWhitespace(); 696 700 if (arg.type() == PercentageToken) … … 705 709 } 706 710 707 stop.m_position = CSSPrimitiveValue::create(position, CSSPrimitiveValue::UnitType ::Number);711 stop.m_position = CSSPrimitiveValue::create(position, CSSPrimitiveValue::UnitTypes::CSS_NUMBER); 708 712 stop.m_color = consumeDeprecatedGradientStopColor(args, cssParserMode); 709 713 return stop.m_color && args.atEnd(); 710 714 } 711 715 712 static CSSValue*consumeDeprecatedGradient(CSSParserTokenRange& args, CSSParserMode cssParserMode)713 { 714 CSSGradientValue* result = nullptr;716 static RefPtr<CSSValue> consumeDeprecatedGradient(CSSParserTokenRange& args, CSSParserMode cssParserMode) 717 { 718 RefPtr<CSSGradientValue> result; 715 719 CSSValueID id = args.consumeIncludingWhitespace().id(); 716 720 bool isDeprecatedRadialGradient = (id == CSSValueRadial); … … 722 726 return nullptr; 723 727 724 CSSPrimitiveValue*point = consumeDeprecatedGradientPoint(args, true);728 RefPtr<CSSPrimitiveValue> point = consumeDeprecatedGradientPoint(args, true); 725 729 if (!point) 726 730 return nullptr; 727 result->setFirstX( point);731 result->setFirstX(WTFMove(point)); 728 732 point = consumeDeprecatedGradientPoint(args, false); 729 733 if (!point) 730 734 return nullptr; 731 result->setFirstY( point);735 result->setFirstY(WTFMove(point)); 732 736 733 737 if (!consumeCommaIncludingWhitespace(args)) … … 736 740 // For radial gradients only, we now expect a numeric radius. 737 741 if (isDeprecatedRadialGradient) { 738 CSSPrimitiveValue*radius = consumeNumber(args, ValueRangeAll);742 RefPtr<CSSPrimitiveValue> radius = consumeNumber(args, ValueRangeAll); 739 743 if (!radius || !consumeCommaIncludingWhitespace(args)) 740 744 return nullptr; 741 toCSSRadialGradientValue(result)->setFirstRadius(radius);745 downcast<CSSRadialGradientValue>(result.get())->setFirstRadius(WTFMove(radius)); 742 746 } 743 747 … … 745 749 if (!point) 746 750 return nullptr; 747 result->setSecondX( point);751 result->setSecondX(WTFMove(point)); 748 752 point = consumeDeprecatedGradientPoint(args, false); 749 753 if (!point) 750 754 return nullptr; 751 result->setSecondY( point);755 result->setSecondY(WTFMove(point)); 752 756 753 757 // For radial gradients only, we now expect the second radius. … … 755 759 if (!consumeCommaIncludingWhitespace(args)) 756 760 return nullptr; 757 CSSPrimitiveValue*radius = consumeNumber(args, ValueRangeAll);761 RefPtr<CSSPrimitiveValue> radius = consumeNumber(args, ValueRangeAll); 758 762 if (!radius) 759 763 return nullptr; 760 toCSSRadialGradientValue(result)->setSecondRadius(radius);764 downcast<CSSRadialGradientValue>(result.get())->setSecondRadius(WTFMove(radius)); 761 765 } 762 766 … … 798 802 } 799 803 800 static CSSValue*consumeDeprecatedRadialGradient(CSSParserTokenRange& args, CSSParserMode cssParserMode, CSSGradientRepeat repeating)801 { 802 CSSRadialGradientValue*result = CSSRadialGradientValue::create(repeating, CSSPrefixedRadialGradient);803 CSSValue* centerX = nullptr;804 CSSValue* centerY = nullptr;804 static RefPtr<CSSValue> consumeDeprecatedRadialGradient(CSSParserTokenRange& args, CSSParserMode cssParserMode, CSSGradientRepeat repeating) 805 { 806 RefPtr<CSSRadialGradientValue> result = CSSRadialGradientValue::create(repeating, CSSPrefixedRadialGradient); 807 RefPtr<CSSPrimitiveValue> centerX; 808 RefPtr<CSSPrimitiveValue> centerY; 805 809 consumeOneOrTwoValuedPosition(args, cssParserMode, UnitlessQuirk::Forbid, centerX, centerY); 806 810 if ((centerX || centerY) && !consumeCommaIncludingWhitespace(args)) 807 811 return nullptr; 808 812 809 result->setFirstX( toCSSPrimitiveValue(centerX));810 result->set SecondX(toCSSPrimitiveValue(centerX));811 result->set FirstY(toCSSPrimitiveValue(centerY));812 result->setSecondY( toCSSPrimitiveValue(centerY));813 814 CSSPrimitiveValue*shape = consumeIdent<CSSValueCircle, CSSValueEllipse>(args);815 CSSPrimitiveValue*sizeKeyword = consumeIdent<CSSValueClosestSide, CSSValueClosestCorner, CSSValueFarthestSide, CSSValueFarthestCorner, CSSValueContain, CSSValueCover>(args);813 result->setFirstX(WTFMove(centerX)); 814 result->setFirstY(WTFMove(centerY)); 815 result->setSecondX(WTFMove(centerX)); 816 result->setSecondY(WTFMove(centerY)); 817 818 RefPtr<CSSPrimitiveValue> shape = consumeIdent<CSSValueCircle, CSSValueEllipse>(args); 819 RefPtr<CSSPrimitiveValue> sizeKeyword = consumeIdent<CSSValueClosestSide, CSSValueClosestCorner, CSSValueFarthestSide, CSSValueFarthestCorner, CSSValueContain, CSSValueCover>(args); 816 820 if (!shape) 817 821 shape = consumeIdent<CSSValueCircle, CSSValueEllipse>(args); 818 result->setShape( shape);819 result->setSizingBehavior( sizeKeyword);822 result->setShape(WTFMove(shape)); 823 result->setSizingBehavior(WTFMove(sizeKeyword)); 820 824 821 825 // Or, two lengths or percentages 822 826 if (!shape && !sizeKeyword) { 823 CSSPrimitiveValue*horizontalSize = consumeLengthOrPercent(args, cssParserMode, ValueRangeAll);824 CSSPrimitiveValue* verticalSize = nullptr;827 RefPtr<CSSPrimitiveValue> horizontalSize = consumeLengthOrPercent(args, cssParserMode, ValueRangeAll); 828 RefPtr<CSSPrimitiveValue> verticalSize; 825 829 if (horizontalSize) { 826 830 verticalSize = consumeLengthOrPercent(args, cssParserMode, ValueRangeAll); … … 828 832 return nullptr; 829 833 consumeCommaIncludingWhitespace(args); 830 result->setEndHorizontalSize( horizontalSize);831 result->setEndVerticalSize( verticalSize);834 result->setEndHorizontalSize(WTFMove(horizontalSize)); 835 result->setEndVerticalSize(WTFMove(verticalSize)); 832 836 } 833 837 } else { 834 838 consumeCommaIncludingWhitespace(args); 835 839 } 836 if (!consumeGradientColorStops(args, cssParserMode, result ))840 if (!consumeGradientColorStops(args, cssParserMode, result.get())) 837 841 return nullptr; 838 842 … … 840 844 } 841 845 842 static CSSValue*consumeRadialGradient(CSSParserTokenRange& args, CSSParserMode cssParserMode, CSSGradientRepeat repeating)843 { 844 CSSRadialGradientValue*result = CSSRadialGradientValue::create(repeating, CSSRadialGradient);845 846 CSSPrimitiveValue* shape = nullptr;847 CSSPrimitiveValue* sizeKeyword = nullptr;848 CSSPrimitiveValue* horizontalSize = nullptr;849 CSSPrimitiveValue* verticalSize = nullptr;846 static RefPtr<CSSValue> consumeRadialGradient(CSSParserTokenRange& args, CSSParserMode cssParserMode, CSSGradientRepeat repeating) 847 { 848 RefPtr<CSSRadialGradientValue> result = CSSRadialGradientValue::create(repeating, CSSRadialGradient); 849 850 RefPtr<CSSPrimitiveValue> shape; 851 RefPtr<CSSPrimitiveValue> sizeKeyword; 852 RefPtr<CSSPrimitiveValue> horizontalSize; 853 RefPtr<CSSPrimitiveValue> verticalSize; 850 854 851 855 // First part of grammar, the size/shape clause: … … 868 872 } 869 873 } else { 870 CSSPrimitiveValue*center = consumeLengthOrPercent(args, cssParserMode, ValueRangeAll);874 RefPtr<CSSPrimitiveValue> center = consumeLengthOrPercent(args, cssParserMode, ValueRangeAll); 871 875 if (!center) 872 876 break; … … 898 902 return nullptr; 899 903 900 result->setShape( shape);901 result->setSizingBehavior( sizeKeyword);902 result->setEndHorizontalSize( horizontalSize);903 result->setEndVerticalSize( verticalSize);904 905 CSSValue* centerX = nullptr;906 CSSValue* centerY = nullptr;904 result->setShape(WTFMove(shape)); 905 result->setSizingBehavior(WTFMove(sizeKeyword)); 906 result->setEndHorizontalSize(WTFMove(horizontalSize)); 907 result->setEndVerticalSize(WTFMove(verticalSize)); 908 909 RefPtr<CSSPrimitiveValue> centerX; 910 RefPtr<CSSPrimitiveValue> centerY; 907 911 if (args.peek().id() == CSSValueAt) { 908 912 args.consumeIncludingWhitespace(); … … 910 914 if (!(centerX && centerY)) 911 915 return nullptr; 912 result->setFirstX(centerX); 913 result->setFirstY(centerY); 916 917 result->setFirstX(WTFMove(centerX)); 918 result->setFirstY(WTFMove(centerY)); 919 914 920 // Right now, CSS radial gradients have the same start and end centers. 915 result->setSecondX( centerX);916 result->setSecondY( centerY);921 result->setSecondX(WTFMove(centerX)); 922 result->setSecondY(WTFMove(centerY)); 917 923 } 918 924 919 925 if ((shape || sizeKeyword || horizontalSize || centerX || centerY) && !consumeCommaIncludingWhitespace(args)) 920 926 return nullptr; 921 if (!consumeGradientColorStops(args, cssParserMode, result ))927 if (!consumeGradientColorStops(args, cssParserMode, result.get())) 922 928 return nullptr; 923 929 return result; 924 930 } 925 931 926 static CSSValue*consumeLinearGradient(CSSParserTokenRange& args, CSSParserMode cssParserMode, CSSGradientRepeat repeating, CSSGradientType gradientType)927 { 928 CSSLinearGradientValue*result = CSSLinearGradientValue::create(repeating, gradientType);932 static RefPtr<CSSValue> consumeLinearGradient(CSSParserTokenRange& args, CSSParserMode cssParserMode, CSSGradientRepeat repeating, CSSGradientType gradientType) 933 { 934 RefPtr<CSSLinearGradientValue> result = CSSLinearGradientValue::create(repeating, gradientType); 929 935 930 936 bool expectComma = true; 931 CSSPrimitiveValue* angle = consumeAngle(args);932 if (angle) {933 result->setAngle(angle );934 }else if (gradientType == CSSPrefixedLinearGradient || consumeIdent<CSSValueTo>(args)) {935 CSSPrimitiveValue*endX = consumeIdent<CSSValueLeft, CSSValueRight>(args);936 CSSPrimitiveValue*endY = consumeIdent<CSSValueBottom, CSSValueTop>(args);937 RefPtr<CSSPrimitiveValue> angle = consumeAngle(args, cssParserMode, UnitlessQuirk::Forbid); 938 if (angle) 939 result->setAngle(angle.releaseNonNull()); 940 else if (gradientType == CSSPrefixedLinearGradient || consumeIdent<CSSValueTo>(args)) { 941 RefPtr<CSSPrimitiveValue> endX = consumeIdent<CSSValueLeft, CSSValueRight>(args); 942 RefPtr<CSSPrimitiveValue> endY = consumeIdent<CSSValueBottom, CSSValueTop>(args); 937 943 if (!endX && !endY) { 938 944 if (gradientType == CSSLinearGradient) … … 944 950 } 945 951 946 result->setFirstX( endX);947 result->setFirstY( endY);952 result->setFirstX(WTFMove(endX)); 953 result->setFirstY(WTFMove(endY)); 948 954 } else { 949 955 expectComma = false; … … 952 958 if (expectComma && !consumeCommaIncludingWhitespace(args)) 953 959 return nullptr; 954 if (!consumeGradientColorStops(args, cssParserMode, result ))960 if (!consumeGradientColorStops(args, cssParserMode, result.get())) 955 961 return nullptr; 956 962 return result; 957 963 } 958 964 959 CSSValue*consumeImageOrNone(CSSParserTokenRange& range, CSSParserContext context)965 RefPtr<CSSValue> consumeImageOrNone(CSSParserTokenRange& range, CSSParserContext context) 960 966 { 961 967 if (range.peek().id() == CSSValueNone) … … 964 970 } 965 971 966 static CSSValue*consumeCrossFade(CSSParserTokenRange& args, CSSParserContext context)967 { 968 CSSValue*fromImageValue = consumeImageOrNone(args, context);972 static RefPtr<CSSValue> consumeCrossFade(CSSParserTokenRange& args, CSSParserContext context) 973 { 974 RefPtr<CSSValue> fromImageValue = consumeImageOrNone(args, context); 969 975 if (!fromImageValue || !consumeCommaIncludingWhitespace(args)) 970 976 return nullptr; 971 CSSValue*toImageValue = consumeImageOrNone(args, context);977 RefPtr<CSSValue> toImageValue = consumeImageOrNone(args, context); 972 978 if (!toImageValue || !consumeCommaIncludingWhitespace(args)) 973 979 return nullptr; 974 980 975 CSSPrimitiveValue* percentage = nullptr;981 RefPtr<CSSPrimitiveValue> percentage; 976 982 const CSSParserToken& percentageArg = args.consumeIncludingWhitespace(); 977 983 if (percentageArg.type() == PercentageToken) 978 percentage = CSSPrimitiveValue::create(clampTo<double>(percentageArg.numericValue() / 100, 0, 1), CSSPrimitiveValue::UnitType ::Number);984 percentage = CSSPrimitiveValue::create(clampTo<double>(percentageArg.numericValue() / 100, 0, 1), CSSPrimitiveValue::UnitTypes::CSS_NUMBER); 979 985 else if (percentageArg.type() == NumberToken) 980 percentage = CSSPrimitiveValue::create(clampTo<double>(percentageArg.numericValue(), 0, 1), CSSPrimitiveValue::UnitType ::Number);986 percentage = CSSPrimitiveValue::create(clampTo<double>(percentageArg.numericValue(), 0, 1), CSSPrimitiveValue::UnitTypes::CSS_NUMBER); 981 987 982 988 if (!percentage) 983 989 return nullptr; 984 return CSSCrossfadeValue::create(fromImageValue, toImageValue, percentage); 985 } 986 987 static CSSValue* consumePaint(CSSParserTokenRange& args, CSSParserContext context) 988 { 989 DCHECK(RuntimeEnabledFeatures::cssPaintAPIEnabled()); 990 991 CSSCustomIdentValue* name = consumeCustomIdent(args); 992 if (!name) 993 return nullptr; 994 995 return CSSPaintValue::create(name); 996 } 997 998 static CSSValue* consumeGeneratedImage(CSSParserTokenRange& range, CSSParserContext context) 990 return CSSCrossfadeValue::create(fromImageValue.releaseNonNull(), toImageValue.releaseNonNull(), percentage.releaseNonNull()); 991 } 992 993 static RefPtr<CSSValue> consumeGeneratedImage(CSSParserTokenRange& range, CSSParserContext context) 999 994 { 1000 995 CSSValueID id = range.peek().functionId(); 1001 996 CSSParserTokenRange rangeCopy = range; 1002 997 CSSParserTokenRange args = consumeFunction(rangeCopy); 1003 CSSValue* result = nullptr; 1004 if (id == CSSValueRadialGradient) { 1005 result = consumeRadialGradient(args, context.mode(), NonRepeating); 1006 } else if (id == CSSValueRepeatingRadialGradient) { 1007 result = consumeRadialGradient(args, context.mode(), Repeating); 1008 } else if (id == CSSValueWebkitLinearGradient) { 1009 // FIXME: This should send a deprecation message. 1010 if (context.useCounter()) 1011 context.useCounter()->count(UseCounter::DeprecatedWebKitLinearGradient); 1012 result = consumeLinearGradient(args, context.mode(), NonRepeating, CSSPrefixedLinearGradient); 1013 } else if (id == CSSValueWebkitRepeatingLinearGradient) { 1014 // FIXME: This should send a deprecation message. 1015 if (context.useCounter()) 1016 context.useCounter()->count(UseCounter::DeprecatedWebKitRepeatingLinearGradient); 1017 result = consumeLinearGradient(args, context.mode(), Repeating, CSSPrefixedLinearGradient); 1018 } else if (id == CSSValueRepeatingLinearGradient) { 1019 result = consumeLinearGradient(args, context.mode(), Repeating, CSSLinearGradient); 1020 } else if (id == CSSValueLinearGradient) { 1021 result = consumeLinearGradient(args, context.mode(), NonRepeating, CSSLinearGradient); 1022 } else if (id == CSSValueWebkitGradient) { 1023 // FIXME: This should send a deprecation message. 1024 if (context.useCounter()) 1025 context.useCounter()->count(UseCounter::DeprecatedWebKitGradient); 1026 result = consumeDeprecatedGradient(args, context.mode()); 1027 } else if (id == CSSValueWebkitRadialGradient) { 1028 // FIXME: This should send a deprecation message. 1029 if (context.useCounter()) 1030 context.useCounter()->count(UseCounter::DeprecatedWebKitRadialGradient); 1031 result = consumeDeprecatedRadialGradient(args, context.mode(), NonRepeating); 1032 } else if (id == CSSValueWebkitRepeatingRadialGradient) { 1033 if (context.useCounter()) 1034 context.useCounter()->count(UseCounter::DeprecatedWebKitRepeatingRadialGradient); 1035 result = consumeDeprecatedRadialGradient(args, context.mode(), Repeating); 1036 } else if (id == CSSValueWebkitCrossFade) { 998 RefPtr<CSSValue> result; 999 if (id == CSSValueRadialGradient) 1000 result = consumeRadialGradient(args, context.mode, NonRepeating); 1001 else if (id == CSSValueRepeatingRadialGradient) 1002 result = consumeRadialGradient(args, context.mode, Repeating); 1003 else if (id == CSSValueWebkitLinearGradient) 1004 result = consumeLinearGradient(args, context.mode, NonRepeating, CSSPrefixedLinearGradient); 1005 else if (id == CSSValueWebkitRepeatingLinearGradient) 1006 result = consumeLinearGradient(args, context.mode, Repeating, CSSPrefixedLinearGradient); 1007 else if (id == CSSValueRepeatingLinearGradient) 1008 result = consumeLinearGradient(args, context.mode, Repeating, CSSLinearGradient); 1009 else if (id == CSSValueLinearGradient) 1010 result = consumeLinearGradient(args, context.mode, NonRepeating, CSSLinearGradient); 1011 else if (id == CSSValueWebkitGradient) 1012 result = consumeDeprecatedGradient(args, context.mode); 1013 else if (id == CSSValueWebkitRadialGradient) 1014 result = consumeDeprecatedRadialGradient(args, context.mode, NonRepeating); 1015 else if (id == CSSValueWebkitRepeatingRadialGradient) 1016 result = consumeDeprecatedRadialGradient(args, context.mode, Repeating); 1017 else if (id == CSSValueWebkitCrossFade) 1037 1018 result = consumeCrossFade(args, context); 1038 } else if (id == CSSValuePaint) { 1039 result = RuntimeEnabledFeatures::cssPaintAPIEnabled() ? consumePaint(args, context) : nullptr; 1040 } 1019 1041 1020 if (!result || !args.atEnd()) 1042 1021 return nullptr; … … 1045 1024 } 1046 1025 1047 static CSSValue* createCSSImageValueWithReferrer(const AtomicString& rawValue, const CSSParserContext& context) 1048 { 1049 CSSValue* imageValue = CSSImageValue::create(rawValue, context.completeURL(rawValue)); 1050 toCSSImageValue(imageValue)->setReferrer(context.referrer()); 1051 return imageValue; 1052 } 1053 1054 static CSSValue* consumeImageSet(CSSParserTokenRange& range, const CSSParserContext& context) 1026 static RefPtr<CSSValue> consumeImageSet(CSSParserTokenRange& range, const CSSParserContext& context) 1055 1027 { 1056 1028 CSSParserTokenRange rangeCopy = range; 1057 1029 CSSParserTokenRange args = consumeFunction(rangeCopy); 1058 CSSImageSetValue*imageSet = CSSImageSetValue::create();1030 RefPtr<CSSImageSetValue> imageSet = CSSImageSetValue::create(); 1059 1031 do { 1060 1032 AtomicString urlValue = consumeUrlAsStringView(args).toAtomicString(); … … 1062 1034 return nullptr; 1063 1035 1064 CSSValue* image = createCSSImageValueWithReferrer(urlValue, context);1036 RefPtr<CSSValue> image = CSSImageValue::create(completeURL(context, urlValue)); 1065 1037 imageSet->append(*image); 1066 1038 … … 1070 1042 if (token.value() != "x") 1071 1043 return nullptr; 1072 DCHECK(token.unitType() == CSSPrimitiveValue::UnitType::Unknown);1044 ASSERT(token.unitType() == CSSPrimitiveValue::UnitTypes::CSS_UNKNOWN); 1073 1045 double imageScaleFactor = token.numericValue(); 1074 1046 if (imageScaleFactor <= 0) 1075 1047 return nullptr; 1076 imageSet->append( *CSSPrimitiveValue::create(imageScaleFactor, CSSPrimitiveValue::UnitType::Number));1048 imageSet->append(CSSPrimitiveValue::create(imageScaleFactor, CSSPrimitiveValue::UnitTypes::CSS_NUMBER)); 1077 1049 } while (consumeCommaIncludingWhitespace(args)); 1078 1050 if (!args.atEnd()) … … 1091 1063 } 1092 1064 1093 CSSValue*consumeImage(CSSParserTokenRange& range, CSSParserContext context, ConsumeGeneratedImage generatedImage)1065 RefPtr<CSSValue> consumeImage(CSSParserTokenRange& range, CSSParserContext context, ConsumeGeneratedImage generatedImage) 1094 1066 { 1095 1067 AtomicString uri = consumeUrlAsStringView(range).toAtomicString(); 1096 1068 if (!uri.isNull()) 1097 return createCSSImageValueWithReferrer(uri, context);1069 return CSSImageValue::create(completeURL(context, uri)); 1098 1070 if (range.peek().type() == FunctionToken) { 1099 1071 CSSValueID id = range.peek().functionId(); … … 1107 1079 1108 1080 } // namespace CSSPropertyParserHelpers 1109 */1110 1081 1111 1082 } // namespace WebCore -
trunk/Source/WebCore/css/parser/CSSPropertyParserHelpers.h
r205103 r206043 32 32 #define CSSPropertyParserHelpers_h 33 33 34 // FIXME-NEWPARSER#include "CSSCustomIdentValue.h"34 #include "CSSCustomIdentValue.h" 35 35 #include "CSSParserMode.h" 36 36 #include "CSSParserTokenRange.h" … … 39 39 40 40 namespace WebCore { 41 42 class CSSStringValue;43 class CSSURIValue;44 class CSSValuePair;45 41 46 42 // When these functions are successful, they will consume all the relevant … … 61 57 }; 62 58 63 CSSPrimitiveValue*consumeInteger(CSSParserTokenRange&, double minimumValue = -std::numeric_limits<double>::max());64 CSSPrimitiveValue*consumePositiveInteger(CSSParserTokenRange&);59 RefPtr<CSSPrimitiveValue> consumeInteger(CSSParserTokenRange&, double minimumValue = -std::numeric_limits<double>::max()); 60 RefPtr<CSSPrimitiveValue> consumePositiveInteger(CSSParserTokenRange&); 65 61 bool consumeNumberRaw(CSSParserTokenRange&, double& result); 66 CSSPrimitiveValue*consumeNumber(CSSParserTokenRange&, ValueRange);67 CSSPrimitiveValue*consumeLength(CSSParserTokenRange&, CSSParserMode, ValueRange, UnitlessQuirk = UnitlessQuirk::Forbid);68 CSSPrimitiveValue*consumePercent(CSSParserTokenRange&, ValueRange);69 CSSPrimitiveValue*consumeLengthOrPercent(CSSParserTokenRange&, CSSParserMode, ValueRange, UnitlessQuirk = UnitlessQuirk::Forbid);70 CSSPrimitiveValue* consumeAngle(CSSParserTokenRange&);71 CSSPrimitiveValue* consumeTime(CSSParserTokenRange&, ValueRange);62 RefPtr<CSSPrimitiveValue> consumeNumber(CSSParserTokenRange&, ValueRange); 63 RefPtr<CSSPrimitiveValue> consumeLength(CSSParserTokenRange&, CSSParserMode, ValueRange, UnitlessQuirk = UnitlessQuirk::Forbid); 64 RefPtr<CSSPrimitiveValue> consumePercent(CSSParserTokenRange&, ValueRange); 65 RefPtr<CSSPrimitiveValue> consumeLengthOrPercent(CSSParserTokenRange&, CSSParserMode, ValueRange, UnitlessQuirk = UnitlessQuirk::Forbid); 66 RefPtr<CSSPrimitiveValue> consumeAngle(CSSParserTokenRange&, CSSParserMode, UnitlessQuirk = UnitlessQuirk::Forbid); 67 RefPtr<CSSPrimitiveValue> consumeTime(CSSParserTokenRange&, CSSParserMode, ValueRange, UnitlessQuirk = UnitlessQuirk::Forbid); 72 68 73 CSSPrimitiveValue*consumeIdent(CSSParserTokenRange&);74 CSSPrimitiveValue*consumeIdentRange(CSSParserTokenRange&, CSSValueID lower, CSSValueID upper);69 RefPtr<CSSPrimitiveValue> consumeIdent(CSSParserTokenRange&); 70 RefPtr<CSSPrimitiveValue> consumeIdentRange(CSSParserTokenRange&, CSSValueID lower, CSSValueID upper); 75 71 template<CSSValueID, CSSValueID...> inline bool identMatches(CSSValueID id); 76 template<CSSValueID... allowedIdents> CSSPrimitiveValue*consumeIdent(CSSParserTokenRange&);72 template<CSSValueID... allowedIdents> RefPtr<CSSPrimitiveValue> consumeIdent(CSSParserTokenRange&); 77 73 78 // FIXME-NEWPARSER CSSCustomIdentValue*consumeCustomIdent(CSSParserTokenRange&);79 CSSStringValue*consumeString(CSSParserTokenRange&);74 RefPtr<CSSCustomIdentValue> consumeCustomIdent(CSSParserTokenRange&); 75 RefPtr<CSSPrimitiveValue> consumeString(CSSParserTokenRange&); 80 76 StringView consumeUrlAsStringView(CSSParserTokenRange&); 81 CSSURIValue*consumeUrl(CSSParserTokenRange&);77 RefPtr<CSSPrimitiveValue> consumeUrl(CSSParserTokenRange&); 82 78 83 CSSValue*consumeColor(CSSParserTokenRange&, CSSParserMode, bool acceptQuirkyColors = false);79 RefPtr<CSSPrimitiveValue> consumeColor(CSSParserTokenRange&, CSSParserMode, bool acceptQuirkyColors = false); 84 80 85 CSSValuePair*consumePosition(CSSParserTokenRange&, CSSParserMode, UnitlessQuirk);86 bool consumePosition(CSSParserTokenRange&, CSSParserMode, UnitlessQuirk, CSSValue*& resultX, CSSValue*& resultY);87 bool consumeOneOrTwoValuedPosition(CSSParserTokenRange&, CSSParserMode, UnitlessQuirk, CSSValue*& resultX, CSSValue*& resultY);81 RefPtr<CSSPrimitiveValue> consumePosition(CSSParserTokenRange&, CSSParserMode, UnitlessQuirk); 82 bool consumePosition(CSSParserTokenRange&, CSSParserMode, UnitlessQuirk, RefPtr<CSSPrimitiveValue>& resultX, RefPtr<CSSPrimitiveValue>& resultY); 83 bool consumeOneOrTwoValuedPosition(CSSParserTokenRange&, CSSParserMode, UnitlessQuirk, RefPtr<CSSPrimitiveValue>& resultX, RefPtr<CSSPrimitiveValue>& resultY); 88 84 89 85 enum class ConsumeGeneratedImage { … … 92 88 }; 93 89 94 CSSValue*consumeImage(CSSParserTokenRange&, CSSParserContext, ConsumeGeneratedImage = ConsumeGeneratedImage::Allow);95 CSSValue*consumeImageOrNone(CSSParserTokenRange&, CSSParserContext);90 RefPtr<CSSValue> consumeImage(CSSParserTokenRange&, CSSParserContext, ConsumeGeneratedImage = ConsumeGeneratedImage::Allow); 91 RefPtr<CSSValue> consumeImageOrNone(CSSParserTokenRange&, CSSParserContext); 96 92 97 93 // Template implementations are at the bottom of the file for readability. … … 113 109 static inline bool isCSSWideKeyword(const CSSValueID& id) 114 110 { 115 return id == CSSValueInitial || id == CSSValueInherit || id == CSSValueUnset || id == CSSValue Default;111 return id == CSSValueInitial || id == CSSValueInherit || id == CSSValueUnset || id == CSSValueRevert || id == CSSValueDefault; 116 112 } 117 113 -
trunk/Source/WebCore/platform/CalculationValue.cpp
r194496 r206043 37 37 namespace WebCore { 38 38 39 Ref<CalculationValue> CalculationValue::create(std::unique_ptr<CalcExpressionNode> value, CalculationPermittedValueRange range)39 Ref<CalculationValue> CalculationValue::create(std::unique_ptr<CalcExpressionNode> value, ValueRange range) 40 40 { 41 41 return adoptRef(*new CalculationValue(WTFMove(value), range)); -
trunk/Source/WebCore/platform/CalculationValue.h
r204466 r206043 47 47 }; 48 48 49 enum CalculationPermittedValueRange {50 CalculationRangeAll,51 CalculationRangeNonNegative52 };53 54 49 enum CalcExpressionNodeType { 55 50 CalcExpressionNodeUndefined, … … 137 132 class CalculationValue : public RefCounted<CalculationValue> { 138 133 public: 139 WEBCORE_EXPORT static Ref<CalculationValue> create(std::unique_ptr<CalcExpressionNode>, CalculationPermittedValueRange);134 WEBCORE_EXPORT static Ref<CalculationValue> create(std::unique_ptr<CalcExpressionNode>, ValueRange); 140 135 float evaluate(float maxValue) const; 141 136 … … 144 139 145 140 private: 146 CalculationValue(std::unique_ptr<CalcExpressionNode>, CalculationPermittedValueRange);141 CalculationValue(std::unique_ptr<CalcExpressionNode>, ValueRange); 147 142 148 143 std::unique_ptr<CalcExpressionNode> m_expression; … … 155 150 } 156 151 157 inline CalculationValue::CalculationValue(std::unique_ptr<CalcExpressionNode> expression, CalculationPermittedValueRange range)152 inline CalculationValue::CalculationValue(std::unique_ptr<CalcExpressionNode> expression, ValueRange range) 158 153 : m_expression(WTFMove(expression)) 159 , m_shouldClampToNonNegative(range == CalculationRangeNonNegative)154 , m_shouldClampToNonNegative(range == ValueRangeNonNegative) 160 155 { 161 156 } -
trunk/Source/WebCore/platform/Length.cpp
r205659 r206043 294 294 295 295 auto blend = std::make_unique<CalcExpressionBlendLength>(from, to, progress); 296 return Length(CalculationValue::create(WTFMove(blend), CalculationRangeAll));296 return Length(CalculationValue::create(WTFMove(blend), ValueRangeAll)); 297 297 } 298 298 -
trunk/Source/WebCore/platform/graphics/Color.cpp
r205841 r206043 205 205 } 206 206 207 bool Color::parseHexColor(const StringView& name, RGBA32& rgb) 208 { 209 unsigned length = name.length(); 210 if (!length) 211 return false; 212 if (name.is8Bit()) 213 return parseHexColor(name.characters8(), name.length(), rgb); 214 return parseHexColor(name.characters16(), name.length(), rgb); 215 } 216 207 217 int differenceSquared(const Color& c1, const Color& c2) 208 218 { … … 227 237 { 228 238 if (name[0] == '#') 229 m_valid = parseHexColor( &name[1], m_color);239 m_valid = parseHexColor((String)&name[1], m_color); 230 240 else { 231 241 const NamedColor* foundColor = findColor(name, strlen(name)); -
trunk/Source/WebCore/platform/graphics/Color.h
r205841 r206043 176 176 177 177 static bool parseHexColor(const String&, RGBA32&); 178 static bool parseHexColor(const StringView&, RGBA32&); 178 179 static bool parseHexColor(const LChar*, unsigned, RGBA32&); 179 180 static bool parseHexColor(const UChar*, unsigned, RGBA32&); -
trunk/Source/WebCore/rendering/style/BasicShapes.cpp
r200343 r206043 61 61 auto rhs = std::make_unique<CalcExpressionLength>(m_length); 62 62 auto op = std::make_unique<CalcExpressionBinaryOperation>(WTFMove(lhs), WTFMove(rhs), CalcSubtract); 63 m_computedLength = Length(CalculationValue::create(WTFMove(op), CalculationRangeAll));63 m_computedLength = Length(CalculationValue::create(WTFMove(op), ValueRangeAll)); 64 64 } 65 65 -
trunk/Tools/ChangeLog
r206042 r206043 1 2016-09-16 Dave Hyatt <hyatt@apple.com> 2 3 [CSS Parser] Get CSSPropertyParserHelpers.cpp compiling 4 https://bugs.webkit.org/show_bug.cgi?id=162078 5 6 Reviewed by Dean Jackson. 7 8 * TestWebKitAPI/Tests/WebCore/CalculationValue.cpp: 9 (TestWebKitAPI::createTestValue): 10 Convert to ValueRange. 11 1 12 2016-09-16 Alex Christensen <achristensen@webkit.org> 2 13 -
trunk/Tools/TestWebKitAPI/Tests/WebCore/CalculationValue.cpp
r197563 r206043 46 46 { 47 47 auto node = std::make_unique<CalculationDeletionTestNode>(); 48 return WebCore::CalculationValue::create(WTFMove(node), WebCore:: CalculationRangeAll);48 return WebCore::CalculationValue::create(WTFMove(node), WebCore::ValueRangeAll); 49 49 } 50 50
Note: See TracChangeset
for help on using the changeset viewer.