Title: [101542] trunk
Revision
101542
Author
timothy_hor...@apple.com
Date
2011-11-30 11:53:28 -0800 (Wed, 30 Nov 2011)

Log Message

feImage referencing a primitive draws incorrectly
https://bugs.webkit.org/show_bug.cgi?id=71731
<rdar://problem/10408178>

Reviewed by Simon Fraser.

If the target of an <feImage> appears to be a local fragment identifier, but
it hasn't resolved yet, defer resolution instead of loading a bogus image.

Invalidate <feImage> if the xlink:href attribute changes.

Don't attempt to render an <feImage> if the referenced element is of size 0x0.

Tests: svg/filters/feImage-reference-invalidation.svg
       svg/filters/feImage-reference-svg-primitive.svg
       svg/filters/feImage-zero-size-crash.svg

* svg/SVGFEImageElement.cpp:
(WebCore::SVGFEImageElement::parseMappedAttribute):
(WebCore::SVGFEImageElement::build):

Add a test (feImage-reference-svg-primitive) that ensures that having
an <feImage> referencing an SVG primitive which is declared after it
successfully paints the referenced object.

Add a test (feImage-zero-size-crash) to see if we crash when <feImage>
references an object with 0x0 size.

Add a test (feImage-reference-invalidation) that ensures that changing the
xlink:href on an <feImage> correctly invalidates the image.

* svg/filters/feImage-reference-invalidation-expected.png: Added.
* svg/filters/feImage-reference-invalidation-expected.txt: Added.
* svg/filters/feImage-reference-svg-primitive-expected.png: Added.
* svg/filters/feImage-reference-svg-primitive-expected.txt: Added.
* svg/filters/feImage-reference-invalidation.svg: Added.
* svg/filters/feImage-reference-svg-primitive.svg: Added.
* svg/filters/feImage-zero-size-crash-expected.txt: Added.
* svg/filters/feImage-zero-size-crash.svg: Added.

Modified Paths

Added Paths

Diff

Modified: trunk/LayoutTests/ChangeLog (101541 => 101542)


--- trunk/LayoutTests/ChangeLog	2011-11-30 19:43:32 UTC (rev 101541)
+++ trunk/LayoutTests/ChangeLog	2011-11-30 19:53:28 UTC (rev 101542)
@@ -1,5 +1,32 @@
 2011-11-30  Tim Horton  <timothy_hor...@apple.com>
 
+        feImage referencing a primitive draws incorrectly
+        https://bugs.webkit.org/show_bug.cgi?id=71731
+        <rdar://problem/10408178>
+
+        Reviewed by Simon Fraser.
+
+        Add a test (feImage-reference-svg-primitive) that ensures that having
+        an <feImage> referencing an SVG primitive which is declared after it
+        successfully paints the referenced object.
+
+        Add a test (feImage-zero-size-crash) to see if we crash when <feImage>
+        references an object with 0x0 size.
+        
+        Add a test (feImage-reference-invalidation) that ensures that changing the
+        xlink:href on an <feImage> correctly invalidates the image.
+
+        * svg/filters/feImage-reference-invalidation-expected.png: Added.
+        * svg/filters/feImage-reference-invalidation-expected.txt: Added.
+        * svg/filters/feImage-reference-svg-primitive-expected.png: Added.
+        * svg/filters/feImage-reference-svg-primitive-expected.txt: Added.
+        * svg/filters/feImage-reference-invalidation.svg: Added.
+        * svg/filters/feImage-reference-svg-primitive.svg: Added.
+        * svg/filters/feImage-zero-size-crash-expected.txt: Added.
+        * svg/filters/feImage-zero-size-crash.svg: Added.
+
+2011-11-30  Tim Horton  <timothy_hor...@apple.com>
+
         dx causes non-BMP characters to fail to render
         https://bugs.webkit.org/show_bug.cgi?id=18039
         <rdar://problem/10422142>

Added: trunk/LayoutTests/svg/filters/feImage-reference-invalidation-expected.png


(Binary files differ)
Property changes on: trunk/LayoutTests/svg/filters/feImage-reference-invalidation-expected.png ___________________________________________________________________

Added: svn:mime-type

Added: trunk/LayoutTests/svg/filters/feImage-reference-invalidation-expected.txt (0 => 101542)


--- trunk/LayoutTests/svg/filters/feImage-reference-invalidation-expected.txt	                        (rev 0)
+++ trunk/LayoutTests/svg/filters/feImage-reference-invalidation-expected.txt	2011-11-30 19:53:28 UTC (rev 101542)
@@ -0,0 +1,11 @@
+layer at (0,0) size 800x600
+  RenderView at (0,0) size 800x600
+layer at (0,0) size 800x600
+  RenderSVGRoot {svg} at (0,0) size 111x111
+    RenderSVGHiddenContainer {defs} at (0,0) size 0x0
+      RenderSVGPath {rect} at (0,0) size 100x100 [fill={[type=SOLID] [color=#FF0000]}] [x=0.00] [y=0.00] [width=100.00] [height=100.00]
+      RenderSVGPath {rect} at (0,0) size 100x100 [fill={[type=SOLID] [color=#008000]}] [x=0.00] [y=0.00] [width=100.00] [height=100.00]
+      RenderSVGResourceFilter {filter} [id="image"] [filterUnits=objectBoundingBox] [primitiveUnits=userSpaceOnUse]
+        [feImage image-size="100x100"]
+    RenderSVGPath {rect} at (0,0) size 111x111 [fill={[type=SOLID] [color=#000000]}] [x=0.00] [y=0.00] [width=100.00] [height=100.00]
+      [filter="image"] RenderSVGResourceFilter {filter} at (-10,-10) size 120x120

Added: trunk/LayoutTests/svg/filters/feImage-reference-invalidation.svg (0 => 101542)


--- trunk/LayoutTests/svg/filters/feImage-reference-invalidation.svg	                        (rev 0)
+++ trunk/LayoutTests/svg/filters/feImage-reference-invalidation.svg	2011-11-30 19:53:28 UTC (rev 101542)
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+    <title>There should be a single green square.</title>
+    <defs>
+        <rect id="rect" width="100" height="100" fill="red" />
+        <rect id="rect2" width="100" height="100" fill="green" />
+        
+        <filter id="image">
+            <feImage id="feimage" xlink:href="" />
+        </filter>
+    </defs>
+    <rect x="0" y="0" width="100" height="100" filter="url(#image)" />
+    <script>
+    <![CDATA[
+        function runTest()
+        {
+            document.getElementById("feimage").setAttributeNS("http://www.w3.org/1999/xlink", "href", "#rect2");
+
+            if (window.layoutTestController)
+                layoutTestController.notifyDone();
+        }
+
+        if (window.layoutTestController) {
+            layoutTestController.waitUntilDone();
+        }
+
+        setTimeout(runTest, 0);
+    ]]>
+    </script>
+</svg>

Added: trunk/LayoutTests/svg/filters/feImage-reference-svg-primitive-expected.png


(Binary files differ)
Property changes on: trunk/LayoutTests/svg/filters/feImage-reference-svg-primitive-expected.png ___________________________________________________________________

Added: svn:mime-type

Added: trunk/LayoutTests/svg/filters/feImage-reference-svg-primitive-expected.txt (0 => 101542)


--- trunk/LayoutTests/svg/filters/feImage-reference-svg-primitive-expected.txt	                        (rev 0)
+++ trunk/LayoutTests/svg/filters/feImage-reference-svg-primitive-expected.txt	2011-11-30 19:53:28 UTC (rev 101542)
@@ -0,0 +1,14 @@
+layer at (0,0) size 800x600
+  RenderView at (0,0) size 800x600
+layer at (0,0) size 800x600
+  RenderSVGRoot {svg} at (85,0) size 330x315
+    RenderSVGHiddenContainer {defs} at (0,0) size 0x0
+      RenderSVGResourceFilter {filter} [id="image"] [filterUnits=objectBoundingBox] [primitiveUnits=userSpaceOnUse]
+        [feImage image-size="200x200"]
+      RenderSVGResourceFilter {filter} [id="flood"] [filterUnits=objectBoundingBox] [primitiveUnits=userSpaceOnUse]
+        [feFlood flood-color="#008000" flood-opacity="1.00"]
+      RenderSVGPath {circle} at (0,0) size 250x150 [fill={[type=SOLID] [color=#0000FF]}] [cx=0.00] [cy=0.00] [r=100.00]
+    RenderSVGPath {rect} at (85,0) size 180x166 [fill={[type=SOLID] [color=#000000]}] [x=0.00] [y=0.00] [width=100.00] [height=100.00]
+      [filter="image"] RenderSVGResourceFilter {filter} at (-10,-10) size 120x120
+    RenderSVGPath {rect} at (235,135) size 180x180 [fill={[type=SOLID] [color=#000000]}] [x=100.00] [y=100.00] [width=100.00] [height=100.00]
+      [filter="flood"] RenderSVGResourceFilter {filter} at (90,90) size 120x120

Added: trunk/LayoutTests/svg/filters/feImage-reference-svg-primitive.svg (0 => 101542)


--- trunk/LayoutTests/svg/filters/feImage-reference-svg-primitive.svg	                        (rev 0)
+++ trunk/LayoutTests/svg/filters/feImage-reference-svg-primitive.svg	2011-11-30 19:53:28 UTC (rev 101542)
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 400 400">
+    <title>There should be a single blue quarter-circle and a single green square.</title>
+    <defs>
+        <filter id="image">
+            <feImage xlink:href="" />
+        </filter>
+        <filter id="flood">
+            <feFlood flood-color="green" />
+        </filter>
+        <circle id="circle" r="100" fill="blue" />
+    </defs>
+    <rect x="0" y="0" width="100" height="100" filter="url(#image)" />
+    <rect x="100" y="100" width="100" height="100" filter="url(#flood)" />
+</svg>

Added: trunk/LayoutTests/svg/filters/feImage-zero-size-crash-expected.txt (0 => 101542)


--- trunk/LayoutTests/svg/filters/feImage-zero-size-crash-expected.txt	                        (rev 0)
+++ trunk/LayoutTests/svg/filters/feImage-zero-size-crash-expected.txt	2011-11-30 19:53:28 UTC (rev 101542)
@@ -0,0 +1,2 @@
+PASS
+

Added: trunk/LayoutTests/svg/filters/feImage-zero-size-crash.svg (0 => 101542)


--- trunk/LayoutTests/svg/filters/feImage-zero-size-crash.svg	                        (rev 0)
+++ trunk/LayoutTests/svg/filters/feImage-zero-size-crash.svg	2011-11-30 19:53:28 UTC (rev 101542)
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 400 400">
+    <title>This test passes if it doesn't crash.</title>
+    <text id="log" />
+    <defs>
+        <circle id="circle" r="0" fill="red" />
+        <filter id="image">
+            <feImage xlink:href="" />
+        </filter>
+    </defs>
+    <rect x="0" y="0" width="100" height="100" filter="url(#image)" />
+    <rect x="100" y="100" width="100" height="100" fill="green" />
+    <script>
+      <![CDATA[
+        if (window.layoutTestController)
+            layoutTestController.dumpAsText();
+
+        var log = document.getElementById("log");
+        log.appendChild(document.createTextNode("PASS"));
+    ]]>
+    </script>
+</svg>

Modified: trunk/Source/WebCore/ChangeLog (101541 => 101542)


--- trunk/Source/WebCore/ChangeLog	2011-11-30 19:43:32 UTC (rev 101541)
+++ trunk/Source/WebCore/ChangeLog	2011-11-30 19:53:28 UTC (rev 101542)
@@ -1,3 +1,26 @@
+2011-11-30  Tim Horton  <timothy_hor...@apple.com>
+
+        feImage referencing a primitive draws incorrectly
+        https://bugs.webkit.org/show_bug.cgi?id=71731
+        <rdar://problem/10408178>
+
+        Reviewed by Simon Fraser.
+
+        If the target of an <feImage> appears to be a local fragment identifier, but
+        it hasn't resolved yet, defer resolution instead of loading a bogus image.
+
+        Invalidate <feImage> if the xlink:href attribute changes.
+
+        Don't attempt to render an <feImage> if the referenced element is of size 0x0.
+
+        Tests: svg/filters/feImage-reference-invalidation.svg
+               svg/filters/feImage-reference-svg-primitive.svg
+               svg/filters/feImage-zero-size-crash.svg
+
+        * svg/SVGFEImageElement.cpp:
+        (WebCore::SVGFEImageElement::parseMappedAttribute):
+        (WebCore::SVGFEImageElement::build):
+
 2011-11-30  Robin Dunn  <ro...@alldunn.com>
 
         [wx] Ensure we always notify the popup client that the popup

Modified: trunk/Source/WebCore/svg/SVGFEImageElement.cpp (101541 => 101542)


--- trunk/Source/WebCore/svg/SVGFEImageElement.cpp	2011-11-30 19:43:32 UTC (rev 101541)
+++ trunk/Source/WebCore/svg/SVGFEImageElement.cpp	2011-11-30 19:53:28 UTC (rev 101542)
@@ -69,17 +69,30 @@
         m_cachedImage->removeClient(this);
 }
 
-void SVGFEImageElement::requestImageResource()
+void SVGFEImageElement::invalidateImageResource()
 {
     if (m_cachedImage) {
         m_cachedImage->removeClient(this);
         m_cachedImage = 0;
     }
 
-    Element* hrefElement = SVGURIReference::targetElementFromIRIString(href(), document());
+    m_targetImage.clear();
+}
+
+void SVGFEImageElement::requestImageResource()
+{
+    invalidateImageResource();
+
+    String fragmentIdentifier;
+    Element* hrefElement = SVGURIReference::targetElementFromIRIString(href(), document(), &fragmentIdentifier);
+
     if (hrefElement && hrefElement->isSVGElement() && hrefElement->renderer())
         return;
 
+    // We have what appears to be a local fragment identifier, but it didn't resolve yet.
+    if (!fragmentIdentifier.isEmpty())
+        return;
+
     ResourceRequest request(ownerDocument()->completeURL(href()));
     m_cachedImage = ownerDocument()->cachedResourceLoader()->requestImage(request);
 
@@ -139,10 +152,15 @@
         return;
     }
 
-    // FIXME: This can't be correct, I'm just preserving existing code. <feImage> + SVG DOM 'href' changes need testing.
-    if (SVGLangSpace::isKnownAttribute(attrName) || SVGExternalResourcesRequired::isKnownAttribute(attrName) || SVGURIReference::isKnownAttribute(attrName))
+    if (SVGURIReference::isKnownAttribute(attrName)) {
+        invalidateImageResource();
+        invalidate();
         return;
+    }
 
+    if (SVGLangSpace::isKnownAttribute(attrName) || SVGExternalResourcesRequired::isKnownAttribute(attrName))
+        return;
+
     ASSERT_NOT_REACHED();
 }
 
@@ -162,6 +180,9 @@
 
 PassRefPtr<FilterEffect> SVGFEImageElement::build(SVGFilterBuilder*, Filter* filter)
 {
+    if (!m_cachedImage && !m_targetImage)
+        requestImageResource();
+
     if (!m_cachedImage && !m_targetImage) {
         Element* hrefElement = SVGURIReference::targetElementFromIRIString(href(), document());
         if (!hrefElement || !hrefElement->isSVGElement())
@@ -172,6 +193,10 @@
             return 0;
 
         IntRect targetRect = enclosingIntRect(renderer->objectBoundingBox());
+
+        if (targetRect.isEmpty())
+            return 0;
+
         m_targetImage = ImageBuffer::create(targetRect.size(), ColorSpaceLinearRGB);
 
         AffineTransform contentTransformation;

Modified: trunk/Source/WebCore/svg/SVGFEImageElement.h (101541 => 101542)


--- trunk/Source/WebCore/svg/SVGFEImageElement.h	2011-11-30 19:43:32 UTC (rev 101541)
+++ trunk/Source/WebCore/svg/SVGFEImageElement.h	2011-11-30 19:53:28 UTC (rev 101542)
@@ -56,6 +56,7 @@
     virtual void addSubresourceAttributeURLs(ListHashSet<KURL>&) const;
     virtual PassRefPtr<FilterEffect> build(SVGFilterBuilder*, Filter*);
 
+    void invalidateImageResource();
     void requestImageResource();
 
     BEGIN_DECLARE_ANIMATED_PROPERTIES(SVGFEImageElement)
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
http://lists.webkit.org/mailman/listinfo.cgi/webkit-changes

Reply via email to