Title: [271785] trunk
Revision
271785
Author
[email protected]
Date
2021-01-24 16:28:45 -0800 (Sun, 24 Jan 2021)

Log Message

SVG reference filter chain with errors applies only some of the filters, producing incorrect output
https://bugs.webkit.org/show_bug.cgi?id=220893

Reviewed by Sam Weinig.

Source/WebCore:

If the CSS filter property refers to an invalid reference filter, ensure that
the entire reference filter is skipped. Previously, we'd add elements of the reference
filter up to the invalid one.

This behavior matches Gecko and Blink.

Tests: css3/filters/invalid-reference-filter-in-chain.html
       css3/filters/invalid-reference-filter.html

* rendering/CSSFilter.cpp:
(WebCore::CSSFilter::buildReferenceFilter):

LayoutTests:

* css3/filters/invalid-reference-filter-expected.html: Added.
* css3/filters/invalid-reference-filter-in-chain-expected.html: Added.
* css3/filters/invalid-reference-filter-in-chain.html: Added.
* css3/filters/invalid-reference-filter.html: Added.

Modified Paths

Added Paths

Diff

Modified: trunk/LayoutTests/ChangeLog (271784 => 271785)


--- trunk/LayoutTests/ChangeLog	2021-01-24 21:58:52 UTC (rev 271784)
+++ trunk/LayoutTests/ChangeLog	2021-01-25 00:28:45 UTC (rev 271785)
@@ -1,3 +1,15 @@
+2021-01-24  Simon Fraser  <[email protected]>
+
+        SVG reference filter chain with errors applies only some of the filters, producing incorrect output
+        https://bugs.webkit.org/show_bug.cgi?id=220893
+
+        Reviewed by Sam Weinig.
+
+        * css3/filters/invalid-reference-filter-expected.html: Added.
+        * css3/filters/invalid-reference-filter-in-chain-expected.html: Added.
+        * css3/filters/invalid-reference-filter-in-chain.html: Added.
+        * css3/filters/invalid-reference-filter.html: Added.
+
 2021-01-23  Per Arne Vollan  <[email protected]>
 
         [macOS] Deny mach lookup access to "com.apple.iconservices" in the WebContent process

Added: trunk/LayoutTests/css3/filters/invalid-reference-filter-expected.html (0 => 271785)


--- trunk/LayoutTests/css3/filters/invalid-reference-filter-expected.html	                        (rev 0)
+++ trunk/LayoutTests/css3/filters/invalid-reference-filter-expected.html	2021-01-25 00:28:45 UTC (rev 271785)
@@ -0,0 +1,17 @@
+<!DOCTYPE html>
+<html>
+<head>
+<style>
+    .box {
+        height: 200px;
+        width: 200px;
+        background-color: green;
+    }
+</style>
+</head>
+<body>
+    <div class='box'></div>
+</body>
+</html>
+ 
+

Added: trunk/LayoutTests/css3/filters/invalid-reference-filter-in-chain-expected.html (0 => 271785)


--- trunk/LayoutTests/css3/filters/invalid-reference-filter-in-chain-expected.html	                        (rev 0)
+++ trunk/LayoutTests/css3/filters/invalid-reference-filter-in-chain-expected.html	2021-01-25 00:28:45 UTC (rev 271785)
@@ -0,0 +1,28 @@
+<!DOCTYPE html>
+<html>
+<head>
+<style>
+    body svg {
+        position: absolute;
+        width: 0;
+        height: 0;
+    }
+
+    .box {
+        margin: 10px;
+        height: 200px;
+        width: 200px;
+        border: 20px solid blue;
+        background-color: green;
+        box-sizing: border-box;
+    }
+</style>
+</head>
+<body>
+    <div class='box' style="filter: saturate(0);"></div>
+    <div class='box' style="filter: invert() saturate(0);"></div>
+    <div class='box' style="filter: invert()"></div>
+</body>
+</html>
+ 
+

Added: trunk/LayoutTests/css3/filters/invalid-reference-filter-in-chain.html (0 => 271785)


--- trunk/LayoutTests/css3/filters/invalid-reference-filter-in-chain.html	                        (rev 0)
+++ trunk/LayoutTests/css3/filters/invalid-reference-filter-in-chain.html	2021-01-25 00:28:45 UTC (rev 271785)
@@ -0,0 +1,36 @@
+<!DOCTYPE html>
+<html>
+<head>
+<style>
+    body svg {
+        position: absolute;
+        width: 0;
+        height: 0;
+    }
+
+    .box {
+        margin: 10px;
+        height: 200px;
+        width: 200px;
+        border: 20px solid blue;
+        background-color: green;
+        box-sizing: border-box;
+    }
+</style>
+</head>
+<body>
+    <svg version='1.1' xmlns='http://www.w3.org/2000/svg'>
+      <defs>
+        <filter id='filter1'>
+          <feturbulence basefrequency='0.005 0.005' id='frequency1' numoctaves='1' result='noise' seed='1' type='fractalNoise'></feturbulence>
+          <fedisplacementmap id='displacement1' in2='fractalNoise' in='SourceGraphic' scale='0'></fedisplacementmap> <!-- in2 is invalid -->
+        </filter>
+      </defs>
+    </svg>
+    <div class='box' style="filter: url(#filter1) saturate(0);"></div>
+    <div class='box' style="filter: invert() url(#filter1) saturate(0);"></div>
+    <div class='box' style="filter: invert() url(#filter1)"></div>
+</body>
+</html>
+ 
+

Added: trunk/LayoutTests/css3/filters/invalid-reference-filter.html (0 => 271785)


--- trunk/LayoutTests/css3/filters/invalid-reference-filter.html	                        (rev 0)
+++ trunk/LayoutTests/css3/filters/invalid-reference-filter.html	2021-01-25 00:28:45 UTC (rev 271785)
@@ -0,0 +1,32 @@
+<!DOCTYPE html>
+<html>
+<head>
+<style>
+    body svg {
+        position: absolute;
+        width: 0;
+        height: 0;
+    }
+
+    .box {
+        height: 200px;
+        width: 200px;
+        background-color: green;
+        filter: url(#filter1);
+    }
+</style>
+</head>
+<body>
+    <svg version='1.1' xmlns='http://www.w3.org/2000/svg'>
+      <defs>
+        <filter id='filter1'>
+          <feturbulence basefrequency='0.005 0.005' id='frequency1' numoctaves='1' result='noise' seed='1' type='fractalNoise'></feturbulence>
+          <fedisplacementmap id='displacement1' in2='fractalNoise' in='SourceGraphic' scale='0'></fedisplacementmap> <!-- in2 is invalid -->
+        </filter>
+      </defs>
+    </svg>
+    <div class='box'></div>
+</body>
+</html>
+ 
+

Modified: trunk/Source/WebCore/ChangeLog (271784 => 271785)


--- trunk/Source/WebCore/ChangeLog	2021-01-24 21:58:52 UTC (rev 271784)
+++ trunk/Source/WebCore/ChangeLog	2021-01-25 00:28:45 UTC (rev 271785)
@@ -1,3 +1,22 @@
+2021-01-24  Simon Fraser  <[email protected]>
+
+        SVG reference filter chain with errors applies only some of the filters, producing incorrect output
+        https://bugs.webkit.org/show_bug.cgi?id=220893
+
+        Reviewed by Sam Weinig.
+
+        If the CSS filter property refers to an invalid reference filter, ensure that
+        the entire reference filter is skipped. Previously, we'd add elements of the reference
+        filter up to the invalid one.
+
+        This behavior matches Gecko and Blink.
+
+        Tests: css3/filters/invalid-reference-filter-in-chain.html
+               css3/filters/invalid-reference-filter.html
+
+        * rendering/CSSFilter.cpp:
+        (WebCore::CSSFilter::buildReferenceFilter):
+
 2021-01-24  Rob Buis  <[email protected]>
 
         Make FontCascade::CodePath an enum class

Modified: trunk/Source/WebCore/rendering/CSSFilter.cpp (271784 => 271785)


--- trunk/Source/WebCore/rendering/CSSFilter.cpp	2021-01-24 21:58:52 UTC (rev 271784)
+++ trunk/Source/WebCore/rendering/CSSFilter.cpp	2021-01-25 00:28:45 UTC (rev 271785)
@@ -110,15 +110,18 @@
         return nullptr;
     }
 
-    RefPtr<FilterEffect> effect;
-
     auto builder = makeUnique<SVGFilterBuilder>(&previousEffect);
     m_sourceAlpha = builder->getEffectById(SourceAlpha::effectName());
 
+    RefPtr<FilterEffect> effect;
+    Vector<Ref<FilterEffect>> referenceEffects;
+
     for (auto& effectElement : childrenOfType<SVGFilterPrimitiveStandardAttributes>(*filter)) {
         effect = effectElement.build(builder.get(), *this);
-        if (!effect)
-            continue;
+        if (!effect) {
+            LOG_WITH_STREAM(Filters, stream << "CSSFilter " << this << " buildReferenceFilter: failed to build effect from " << effectElement);
+            return nullptr;
+        }
 
         effectElement.setStandardAttributes(effect.get());
         if (effectElement.renderer())
@@ -125,8 +128,10 @@
             effect->setOperatingColorSpace(effectElement.renderer()->style().svgStyle().colorInterpolationFilters() == ColorInterpolation::LinearRGB ? ColorSpace::LinearRGB : ColorSpace::SRGB);
 
         builder->add(effectElement.result(), effect);
-        m_effects.append(*effect);
+        referenceEffects.append(*effect);
     }
+    
+    m_effects.appendVector(WTFMove(referenceEffects));
     return effect;
 }
 
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to