| Index: third_party/WebKit/Source/core/css/CSSGradientValue.cpp | 
| diff --git a/third_party/WebKit/Source/core/css/CSSGradientValue.cpp b/third_party/WebKit/Source/core/css/CSSGradientValue.cpp | 
| index 32f7a3546eb6ebf8412f6d717dd472c7fe6b8e2c..1b0e22dae9e3c47a657e04097b91d5c75dfbc28a 100644 | 
| --- a/third_party/WebKit/Source/core/css/CSSGradientValue.cpp | 
| +++ b/third_party/WebKit/Source/core/css/CSSGradientValue.cpp | 
| @@ -72,10 +72,20 @@ PassRefPtr<Image> CSSGradientValue::image(const LayoutObject& layoutObject, cons | 
|  | 
| const ComputedStyle* rootStyle = layoutObject.document().documentElement()->computedStyle(); | 
| CSSToLengthConversionData conversionData(layoutObject.style(), rootStyle, layoutObject.view(), layoutObject.style()->effectiveZoom()); | 
| -    if (isLinearGradientValue()) | 
| + | 
| +    switch (getClassType()) { | 
| +    case LinearGradientClass: | 
| gradient = toCSSLinearGradientValue(this)->createGradient(conversionData, size, layoutObject); | 
| -    else | 
| +        break; | 
| +    case RadialGradientClass: | 
| gradient = toCSSRadialGradientValue(this)->createGradient(conversionData, size, layoutObject); | 
| +        break; | 
| +    case ConicGradientClass: | 
| +        gradient = toCSSConicGradientValue(this)->createGradient(conversionData, size, layoutObject); | 
| +        break; | 
| +    default: | 
| +        ASSERT_NOT_REACHED(); | 
| +    } | 
|  | 
| RefPtr<Image> newImage = GradientGeneratedImage::create(gradient, size); | 
| if (cacheable) | 
| @@ -461,7 +471,7 @@ void CSSGradientValue::addStops(Gradient* gradient, const CSSToLengthConversionD | 
| // Negative offsets are only an issue for non-repeating radial gradients: linear gradient | 
| // points can be repositioned arbitrarily, and for repeating radial gradients we shift | 
| // the radii into equivalent positive values. | 
| -        if (isRadialGradientValue() && !m_repeating) | 
| +        if ((isRadialGradientValue() && !m_repeating) || isConicGradientValue()) | 
| clampNegativeOffsets(stops); | 
|  | 
| if (normalizeAndAddStops(stops, gradient)) { | 
| @@ -1222,4 +1232,43 @@ DEFINE_TRACE_AFTER_DISPATCH(CSSRadialGradientValue) | 
| CSSGradientValue::traceAfterDispatch(visitor); | 
| } | 
|  | 
| +String CSSConicGradientValue::customCSSText() const | 
| +{ | 
| +    StringBuilder result; | 
| + | 
| +    return result.toString(); | 
| +} | 
| + | 
| +PassRefPtr<Gradient> CSSConicGradientValue::createGradient(const CSSToLengthConversionData& conversionData, const IntSize& size, const LayoutObject& object) | 
| +{ | 
| +    ASSERT(!size.isEmpty()); | 
| + | 
| +    FloatPoint point = computeEndPoint(m_firstX.get(), m_firstY.get(), conversionData, size); | 
| +    if (!m_firstX) | 
| +        point.setX(size.width() / 2); | 
| +    if (!m_firstY) | 
| +        point.setY(size.height() / 2); | 
| + | 
| +    RefPtr<Gradient> gradient = Gradient::create(point, 0); // TODO: angle | 
| +    gradient->setSpreadMethod(m_repeating ? SpreadMethodRepeat : SpreadMethodPad); | 
| +    gradient->setDrawsInPMColorSpace(true); | 
| + | 
| +    addStops(gradient.get(), conversionData, object); | 
| + | 
| +    return gradient.release(); | 
| +} | 
| + | 
| +bool CSSConicGradientValue::equals(const CSSConicGradientValue& other) const | 
| +{ | 
| + | 
| +    return compareCSSValuePtr(m_firstX, other.m_firstX) | 
| +        && compareCSSValuePtr(m_firstY, other.m_firstY) | 
| +        && m_stops == other.m_stops; | 
| +} | 
| + | 
| +DEFINE_TRACE_AFTER_DISPATCH(CSSConicGradientValue) | 
| +{ | 
| +    CSSGradientValue::traceAfterDispatch(visitor); | 
| +} | 
| + | 
| } // namespace blink | 
|  |