Update handling of negative radius for feMorphology

Spec[1] states:

 "A negative or zero value disables the effect of the given filter
  primitive (i.e., the result is the filter input image)."

So change FEMorphology to clamp radii to non-negative and stop treating
as an error in SVGFEMorphologyElement::build.

[1] https://drafts.fxtf.org/filters/#element-attrdef-femorphology-radius

BUG=533457

Review URL: https://codereview.chromium.org/1344283004

git-svn-id: svn://svn.chromium.org/blink/trunk@202644 bbb929c8-8fbe-4397-9dbb-9b2b20218538
diff --git a/third_party/WebKit/LayoutTests/svg/filters/feMorphology-negative-radius-expected.html b/third_party/WebKit/LayoutTests/svg/filters/feMorphology-negative-radius-expected.html
new file mode 100644
index 0000000..6122c34
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/svg/filters/feMorphology-negative-radius-expected.html
@@ -0,0 +1,12 @@
+<!DOCTYPE html>
+<svg>
+    <filter id="dilate">
+        <feMorphology operator="dilate" radius="0"/>
+    </filter>
+    <rect width="100" height="100" fill="green" filter="url(#dilate)"/>
+
+    <filter id="erode">
+        <feMorphology operator="erode" radius="0"/>
+    </filter>
+    <rect width="100" height="100" fill="green" filter="url(#erode)" x="100"/>
+</svg>
diff --git a/third_party/WebKit/LayoutTests/svg/filters/feMorphology-negative-radius.html b/third_party/WebKit/LayoutTests/svg/filters/feMorphology-negative-radius.html
new file mode 100644
index 0000000..299342c
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/svg/filters/feMorphology-negative-radius.html
@@ -0,0 +1,12 @@
+<!DOCTYPE html>
+<svg>
+    <filter id="dilate">
+        <feMorphology operator="dilate" radius="-1"/>
+    </filter>
+    <rect width="100" height="100" fill="green" filter="url(#dilate)"/>
+
+    <filter id="erode">
+        <feMorphology operator="erode" radius="-1"/>
+    </filter>
+    <rect width="100" height="100" fill="green" filter="url(#erode)" x="100"/>
+</svg>
diff --git a/third_party/WebKit/Source/core/svg/SVGFEMorphologyElement.cpp b/third_party/WebKit/Source/core/svg/SVGFEMorphologyElement.cpp
index b39fcee..9c36d646 100644
--- a/third_party/WebKit/Source/core/svg/SVGFEMorphologyElement.cpp
+++ b/third_party/WebKit/Source/core/svg/SVGFEMorphologyElement.cpp
@@ -95,15 +95,17 @@
 PassRefPtrWillBeRawPtr<FilterEffect> SVGFEMorphologyElement::build(SVGFilterBuilder* filterBuilder, Filter* filter)
 {
     FilterEffect* input1 = filterBuilder->getEffectById(AtomicString(m_in1->currentValue()->value()));
-    float xRadius = radiusX()->currentValue()->value();
-    float yRadius = radiusY()->currentValue()->value();
 
     if (!input1)
         return nullptr;
 
-    if (xRadius < 0 || yRadius < 0)
-        return nullptr;
-
+    // "A negative or zero value disables the effect of the given filter
+    // primitive (i.e., the result is the filter input image)."
+    // https://drafts.fxtf.org/filters/#element-attrdef-femorphology-radius
+    //
+    // (This is handled by FEMorphology)
+    float xRadius = radiusX()->currentValue()->value();
+    float yRadius = radiusY()->currentValue()->value();
     RefPtrWillBeRawPtr<FilterEffect> effect = FEMorphology::create(filter, m_svgOperator->currentValue()->enumValue(), xRadius, yRadius);
     effect->inputEffects().append(input1);
     return effect.release();
diff --git a/third_party/WebKit/Source/platform/graphics/filters/FEMorphology.cpp b/third_party/WebKit/Source/platform/graphics/filters/FEMorphology.cpp
index f5d7796..bfd2ebcb 100644
--- a/third_party/WebKit/Source/platform/graphics/filters/FEMorphology.cpp
+++ b/third_party/WebKit/Source/platform/graphics/filters/FEMorphology.cpp
@@ -35,8 +35,8 @@
 FEMorphology::FEMorphology(Filter* filter, MorphologyOperatorType type, float radiusX, float radiusY)
     : FilterEffect(filter)
     , m_type(type)
-    , m_radiusX(radiusX)
-    , m_radiusY(radiusY)
+    , m_radiusX(std::max(0.0f, radiusX))
+    , m_radiusY(std::max(0.0f, radiusY))
 {
 }
 
@@ -65,6 +65,7 @@
 
 bool FEMorphology::setRadiusX(float radiusX)
 {
+    radiusX = std::max(0.0f, radiusX);
     if (m_radiusX == radiusX)
         return false;
     m_radiusX = radiusX;
@@ -76,6 +77,15 @@
     return m_radiusY;
 }
 
+bool FEMorphology::setRadiusY(float radiusY)
+{
+    radiusY = std::max(0.0f, radiusY);
+    if (m_radiusY == radiusY)
+        return false;
+    m_radiusY = radiusY;
+    return true;
+}
+
 FloatRect FEMorphology::mapRect(const FloatRect& rect, bool)
 {
     FloatRect result = rect;
@@ -84,14 +94,6 @@
     return result;
 }
 
-bool FEMorphology::setRadiusY(float radiusY)
-{
-    if (m_radiusY == radiusY)
-        return false;
-    m_radiusY = radiusY;
-    return true;
-}
-
 PassRefPtr<SkImageFilter> FEMorphology::createImageFilter(SkiaImageFilterBuilder* builder)
 {
     RefPtr<SkImageFilter> input(builder->build(inputEffect(0), operatingColorSpace()));