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) |