| Index: third_party/WebKit/Source/core/css/parser/CSSPropertyParser.cpp
|
| diff --git a/third_party/WebKit/Source/core/css/parser/CSSPropertyParser.cpp b/third_party/WebKit/Source/core/css/parser/CSSPropertyParser.cpp
|
| index 89280601a7f886f0df8dfda3bea8991a0863d05b..385e72f064c4692ece8a3a1375e157ec8606ad9d 100644
|
| --- a/third_party/WebKit/Source/core/css/parser/CSSPropertyParser.cpp
|
| +++ b/third_party/WebKit/Source/core/css/parser/CSSPropertyParser.cpp
|
| @@ -2024,7 +2024,8 @@ static CSSValue* consumeDeprecatedGradient(CSSParserTokenRange& args, CSSParserM
|
| return result;
|
| }
|
|
|
| -static bool consumeGradientColorStops(CSSParserTokenRange& range, CSSParserMode cssParserMode, CSSGradientValue* gradient)
|
| +static bool consumeGradientColorStops(CSSParserTokenRange& range, CSSParserMode cssParserMode, CSSGradientValue* gradient,
|
| + CSSPrimitiveValue* (*consumePositionFunc)(CSSParserTokenRange&, CSSParserMode, ValueRange, UnitlessQuirk))
|
| {
|
| bool supportsColorHints = gradient->gradientType() == CSSLinearGradient || gradient->gradientType() == CSSRadialGradient;
|
|
|
| @@ -2037,7 +2038,8 @@ static bool consumeGradientColorStops(CSSParserTokenRange& range, CSSParserMode
|
| if (!stop.m_color && (!supportsColorHints || previousStopWasColorHint))
|
| return false;
|
| previousStopWasColorHint = !stop.m_color;
|
| - stop.m_position = consumeLengthOrPercent(range, cssParserMode, ValueRangeAll);
|
| +// stop.m_position = consumeLengthOrPercent(range, cssParserMode, ValueRangeAll);
|
| + stop.m_position = consumePositionFunc(range, cssParserMode, ValueRangeAll, UnitlessQuirk::Forbid);
|
| if (!stop.m_color && !stop.m_position)
|
| return false;
|
| gradient->addStop(stop);
|
| @@ -2087,7 +2089,7 @@ static CSSValue* consumeDeprecatedRadialGradient(CSSParserTokenRange& args, CSSP
|
| } else {
|
| consumeCommaIncludingWhitespace(args);
|
| }
|
| - if (!consumeGradientColorStops(args, cssParserMode, result))
|
| + if (!consumeGradientColorStops(args, cssParserMode, result, consumeLengthOrPercent))
|
| return nullptr;
|
|
|
| return result;
|
| @@ -2170,7 +2172,7 @@ static CSSValue* consumeRadialGradient(CSSParserTokenRange& args, CSSParserMode
|
|
|
| if ((shape || sizeKeyword || horizontalSize || centerX || centerY) && !consumeCommaIncludingWhitespace(args))
|
| return nullptr;
|
| - if (!consumeGradientColorStops(args, cssParserMode, result))
|
| + if (!consumeGradientColorStops(args, cssParserMode, result, consumeLengthOrPercent))
|
| return nullptr;
|
| return result;
|
| }
|
| @@ -2203,11 +2205,36 @@ static CSSValue* consumeLinearGradient(CSSParserTokenRange& args, CSSParserMode
|
|
|
| if (expectComma && !consumeCommaIncludingWhitespace(args))
|
| return nullptr;
|
| - if (!consumeGradientColorStops(args, cssParserMode, result))
|
| + if (!consumeGradientColorStops(args, cssParserMode, result, consumeLengthOrPercent))
|
| return nullptr;
|
| return result;
|
| }
|
|
|
| +static CSSValue* consumeConicGradient(CSSParserTokenRange& args, CSSParserMode cssParserMode, CSSGradientRepeat repeating)
|
| +{
|
| + CSSConicGradientValue* result = CSSConicGradientValue::create(repeating);
|
| +
|
| + CSSValue* centerX = nullptr;
|
| + CSSValue* centerY = nullptr;
|
| +
|
| + if (args.peek().id() == CSSValueAt) {
|
| + args.consumeIncludingWhitespace();
|
| + consumePosition(args, cssParserMode, UnitlessQuirk::Forbid, centerX, centerY);
|
| + if (!(centerX && centerY))
|
| + return nullptr;
|
| + result->setFirstX(centerX);
|
| + result->setFirstY(centerY);
|
| + }
|
| +
|
| + if ((centerX || centerY) && !consumeCommaIncludingWhitespace(args))
|
| + return nullptr;
|
| +
|
| + if (!consumeGradientColorStops(args, cssParserMode, result, consumeLengthOrPercent))
|
| + return nullptr;
|
| +
|
| + return result;
|
| +}
|
| +
|
| static CSSValue* consumeImageOrNone(CSSParserTokenRange&, CSSParserContext);
|
|
|
| static CSSValue* consumeCrossFade(CSSParserTokenRange& args, CSSParserContext context)
|
| @@ -2284,6 +2311,10 @@ static CSSValue* consumeGeneratedImage(CSSParserTokenRange& range, CSSParserCont
|
| result = consumeCrossFade(args, context);
|
| } else if (id == CSSValuePaint) {
|
| result = RuntimeEnabledFeatures::cssPaintAPIEnabled() ? consumePaint(args, context) : nullptr;
|
| + } else if (id == CSSValueConicGradient) {
|
| + result = consumeConicGradient(args, context.mode(), NonRepeating);
|
| + } else if (id == CSSValueRepeatingConicGradient) {
|
| + result = consumeConicGradient(args, context.mode(), Repeating);
|
| }
|
| if (!result || !args.atEnd())
|
| return nullptr;
|
| @@ -2297,7 +2328,8 @@ static bool isGeneratedImage(CSSValueID id)
|
| || id == CSSValueRepeatingLinearGradient || id == CSSValueRepeatingRadialGradient
|
| || id == CSSValueWebkitLinearGradient || id == CSSValueWebkitRadialGradient
|
| || id == CSSValueWebkitRepeatingLinearGradient || id == CSSValueWebkitRepeatingRadialGradient
|
| - || id == CSSValueWebkitGradient || id == CSSValueWebkitCrossFade || id == CSSValuePaint;
|
| + || id == CSSValueWebkitGradient || id == CSSValueWebkitCrossFade || id == CSSValuePaint
|
| + || id == CSSValueConicGradient || id == CSSValueRepeatingConicGradient;
|
| }
|
|
|
| static CSSValue* consumeImage(CSSParserTokenRange& range, CSSParserContext context)
|
|
|