Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(198)

Unified Diff: third_party/WebKit/Source/core/css/parser/CSSPropertyParser.cpp

Issue 1915763002: CSS conic gradient (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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)
« no previous file with comments | « third_party/WebKit/Source/core/css/CSSValueKeywords.in ('k') | third_party/WebKit/Source/platform/graphics/Gradient.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698