SVG: "filter" race condition may prevent SVG elements from being re-drawn
authorcommit-queue@webkit.org <commit-queue@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 22 Dec 2011 14:45:03 +0000 (14:45 +0000)
committercommit-queue@webkit.org <commit-queue@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 22 Dec 2011 14:45:03 +0000 (14:45 +0000)
https://bugs.webkit.org/show_bug.cgi?id=53088

Patch by Branimir Lambov <blambov@google.com> on 2011-12-22
Reviewed by Nikolas Zimmermann.

Source/WebCore:

Added code to explicitly invalidate data cached by filters applied to
an invalidated object or one of its parents.

Test: svg/filters/filter-refresh.svg

* rendering/svg/RenderSVGResource.cpp:
(WebCore::RenderSVGResource::removeFromFilterCache):
(WebCore::RenderSVGResource::markForLayoutAndParentResourceInvalidation):
Added code to invalidate any filters applied to any of the parents.
* rendering/svg/RenderSVGResource.h:
* rendering/svg/RenderSVGResourceContainer.cpp:
(WebCore::RenderSVGResourceContainer::markAllClientsForInvalidation):
Replaced a duplicate of RenderSVGResource::
markForLayoutAndParentResourceInvalidation with a call to the method.
* rendering/svg/SVGResourcesCache.cpp:
(WebCore::SVGResourcesCache::clientLayoutChanged):
Removed filter invalidation code as this function would not be called if
the filter isn't already invalidated.
(WebCore::SVGResourcesCache::clientStyleChanged):
(WebCore::SVGResourcesCache::clientUpdatedFromElement):
Replaced filter invalidation with a markForLayoutAndParentResourceInvalidation
call as all filters in the ancestor chain need to be invalidated.

LayoutTests:

Added code to explicitly invalidate data cached by filters applied to
an invalidated object or one of its parents.

* platform/mac/svg/filters/filter-refresh-expected.png: Added.
* platform/mac/svg/filters/filter-refresh-expected.txt: Added.
* svg/filters/filter-refresh.svg: Added.

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@103539 268f45cc-cd09-0410-ab3c-d52691b4dbfc

LayoutTests/ChangeLog
LayoutTests/platform/mac/svg/filters/filter-refresh-expected.png [new file with mode: 0644]
LayoutTests/platform/mac/svg/filters/filter-refresh-expected.txt [new file with mode: 0644]
LayoutTests/svg/filters/filter-refresh.svg [new file with mode: 0644]
Source/WebCore/ChangeLog
Source/WebCore/rendering/svg/RenderSVGResource.cpp
Source/WebCore/rendering/svg/RenderSVGResource.h
Source/WebCore/rendering/svg/RenderSVGResourceContainer.cpp
Source/WebCore/rendering/svg/SVGResourcesCache.cpp

index 0baf7b4..07193b7 100644 (file)
@@ -1,3 +1,17 @@
+2011-12-22  Branimir Lambov  <blambov@google.com>
+
+        SVG: "filter" race condition may prevent SVG elements from being re-drawn
+        https://bugs.webkit.org/show_bug.cgi?id=53088
+
+        Reviewed by Nikolas Zimmermann.
+
+        Added code to explicitly invalidate data cached by filters applied to
+        an invalidated object or one of its parents. 
+
+        * platform/mac/svg/filters/filter-refresh-expected.png: Added.
+        * platform/mac/svg/filters/filter-refresh-expected.txt: Added.
+        * svg/filters/filter-refresh.svg: Added.
+
 2011-12-22  Nikolas Zimmermann  <nzimmermann@rim.com>
 
         Not reviewed. Add final set of SVG pixel test results for Snow Leopard. Now both Lion & SL pass most tests with --tolerance 0 in svg/.
diff --git a/LayoutTests/platform/mac/svg/filters/filter-refresh-expected.png b/LayoutTests/platform/mac/svg/filters/filter-refresh-expected.png
new file mode 100644 (file)
index 0000000..f0e9784
Binary files /dev/null and b/LayoutTests/platform/mac/svg/filters/filter-refresh-expected.png differ
diff --git a/LayoutTests/platform/mac/svg/filters/filter-refresh-expected.txt b/LayoutTests/platform/mac/svg/filters/filter-refresh-expected.txt
new file mode 100644 (file)
index 0000000..71e141d
--- /dev/null
@@ -0,0 +1,95 @@
+layer at (0,0) size 800x600
+  RenderView at (0,0) size 800x600
+layer at (0,0) size 300x400
+  RenderSVGRoot {svg} at (10,50) size 166x156
+    RenderSVGHiddenContainer {defs} at (0,0) size 0x0
+      RenderSVGResourceFilter {filter} [id="simple"] [filterUnits=objectBoundingBox] [primitiveUnits=userSpaceOnUse]
+        [feOffset dx="0.00" dy="0.00"]
+          [SourceGraphic]
+      RenderSVGResourceFilter {filter} [id="animated"] [filterUnits=objectBoundingBox] [primitiveUnits=userSpaceOnUse]
+        [feOffset dx="0.00" dy="0.00"]
+          [SourceGraphic]
+      RenderSVGResourceFilter {filter} [id="toGreen"] [filterUnits=objectBoundingBox] [primitiveUnits=userSpaceOnUse]
+        [feComponentTransfer 
+            {red: type="LINEAR" slope="0.00" intercept="0.00" amplitude="1.00" exponent="1.00" offset="0.00"}
+            {green: type="LINEAR" slope="0.00" intercept="0.25" amplitude="1.00" exponent="1.00" offset="0.00"}
+            {blue: type="LINEAR" slope="0.00" intercept="0.00" amplitude="1.00" exponent="1.00" offset="0.00"}
+            {alpha: type="UNKNOWN" slope="0.00" intercept="0.00" amplitude="0.00" exponent="0.00" offset="0.00"}]
+          [SourceGraphic]
+      RenderSVGRect {rect} at (0,10) size 30x30 [fill={[type=SOLID] [color=#008000]}] [x=0.00] [y=10.00] [width=30.00] [height=30.00]
+    RenderSVGContainer {g} at (10,50) size 166x156
+      RenderSVGContainer {g} at (10,50) size 36x36
+        [filter="simple"] RenderSVGResourceFilter {filter} at (10,50) size 36x36
+        RenderSVGContainer {use} at (10,50) size 30x30
+          RenderSVGContainer {g} at (10,50) size 30x30 [transform={m=((1.00,0.00)(0.00,1.00)) t=(10.00,40.00)}]
+            RenderSVGRect {rect} at (10,50) size 30x30 [fill={[type=SOLID] [color=#008000]}] [x=0.00] [y=10.00] [width=30.00] [height=30.00]
+      RenderSVGContainer {g} at (50,50) size 36x36
+        [filter="simple"] RenderSVGResourceFilter {filter} at (50,50) size 36x36
+        RenderSVGContainer {g} at (50,50) size 36x36
+          [filter="simple"] RenderSVGResourceFilter {filter} at (50,50) size 36x36
+          RenderSVGContainer {use} at (50,50) size 30x30
+            RenderSVGContainer {g} at (50,50) size 30x30 [transform={m=((1.00,0.00)(0.00,1.00)) t=(50.00,40.00)}]
+              RenderSVGRect {rect} at (50,50) size 30x30 [fill={[type=SOLID] [color=#008000]}] [x=0.00] [y=10.00] [width=30.00] [height=30.00]
+      RenderSVGContainer {g} at (90,50) size 36x36
+        [filter="simple"] RenderSVGResourceFilter {filter} at (90,50) size 36x36
+        RenderSVGContainer {g} at (90,50) size 36x36
+          [filter="animated"] RenderSVGResourceFilter {filter} at (90,50) size 36x36
+          RenderSVGContainer {use} at (90,50) size 30x30
+            RenderSVGContainer {g} at (90,50) size 30x30 [transform={m=((1.00,0.00)(0.00,1.00)) t=(90.00,40.00)}]
+              RenderSVGRect {rect} at (90,50) size 30x30 [fill={[type=SOLID] [color=#008000]}] [x=0.00] [y=10.00] [width=30.00] [height=30.00]
+      RenderSVGContainer {g} at (10,90) size 36x36
+        [filter="animated"] RenderSVGResourceFilter {filter} at (10,90) size 36x36
+        RenderSVGContainer {use} at (10,90) size 30x30
+          RenderSVGContainer {g} at (10,90) size 30x30 [transform={m=((1.00,0.00)(0.00,1.00)) t=(10.00,80.00)}]
+            RenderSVGRect {rect} at (10,90) size 30x30 [fill={[type=SOLID] [color=#008000]}] [x=0.00] [y=10.00] [width=30.00] [height=30.00]
+      RenderSVGContainer {g} at (50,90) size 36x36
+        [filter="animated"] RenderSVGResourceFilter {filter} at (50,90) size 36x36
+        RenderSVGContainer {g} at (50,90) size 36x36
+          [filter="simple"] RenderSVGResourceFilter {filter} at (50,90) size 36x36
+          RenderSVGContainer {use} at (50,90) size 30x30
+            RenderSVGContainer {g} at (50,90) size 30x30 [transform={m=((1.00,0.00)(0.00,1.00)) t=(50.00,80.00)}]
+              RenderSVGRect {rect} at (50,90) size 30x30 [fill={[type=SOLID] [color=#008000]}] [x=0.00] [y=10.00] [width=30.00] [height=30.00]
+      RenderSVGContainer {g} at (90,90) size 36x36
+        [filter="animated"] RenderSVGResourceFilter {filter} at (90,90) size 36x36
+        RenderSVGContainer {g} at (90,90) size 36x36
+          [filter="animated"] RenderSVGResourceFilter {filter} at (90,90) size 36x36
+          RenderSVGContainer {use} at (90,90) size 30x30
+            RenderSVGContainer {g} at (90,90) size 30x30 [transform={m=((1.00,0.00)(0.00,1.00)) t=(90.00,80.00)}]
+              RenderSVGRect {rect} at (90,90) size 30x30 [fill={[type=SOLID] [color=#008000]}] [x=0.00] [y=10.00] [width=30.00] [height=30.00]
+      RenderSVGContainer {g} at (10,130) size 132x36 [transform={m=((1.00,0.00)(0.00,1.00)) t=(0.00,120.00)}]
+        [filter="simple"] RenderSVGResourceFilter {filter} at (10,10) size 132x36
+        RenderSVGContainer {use} at (10,130) size 30x30
+          RenderSVGContainer {g} at (10,130) size 30x30 [transform={m=((1.00,0.00)(0.00,1.00)) t=(10.00,0.00)}]
+            RenderSVGRect {rect} at (10,130) size 30x30 [fill={[type=SOLID] [color=#008000]}] [x=0.00] [y=10.00] [width=30.00] [height=30.00]
+        RenderSVGContainer {g} at (50,130) size 36x36
+          [filter="simple"] RenderSVGResourceFilter {filter} at (50,10) size 36x36
+          RenderSVGContainer {use} at (50,130) size 30x30
+            RenderSVGContainer {g} at (50,130) size 30x30 [transform={m=((1.00,0.00)(0.00,1.00)) t=(50.00,0.00)}]
+              RenderSVGRect {rect} at (50,130) size 30x30 [fill={[type=SOLID] [color=#008000]}] [x=0.00] [y=10.00] [width=30.00] [height=30.00]
+        RenderSVGContainer {g} at (90,130) size 36x36
+          [filter="animated"] RenderSVGResourceFilter {filter} at (90,10) size 36x36
+          RenderSVGContainer {use} at (90,130) size 30x30
+            RenderSVGContainer {g} at (90,130) size 30x30 [transform={m=((1.00,0.00)(0.00,1.00)) t=(90.00,0.00)}]
+              RenderSVGRect {rect} at (90,130) size 30x30 [fill={[type=SOLID] [color=#008000]}] [x=0.00] [y=10.00] [width=30.00] [height=30.00]
+      RenderSVGContainer {g} at (10,170) size 132x36 [transform={m=((1.00,0.00)(0.00,1.00)) t=(0.00,160.00)}]
+        [filter="animated"] RenderSVGResourceFilter {filter} at (10,10) size 132x36
+        RenderSVGContainer {use} at (10,170) size 30x30
+          RenderSVGContainer {g} at (10,170) size 30x30 [transform={m=((1.00,0.00)(0.00,1.00)) t=(10.00,0.00)}]
+            RenderSVGRect {rect} at (10,170) size 30x30 [fill={[type=SOLID] [color=#008000]}] [x=0.00] [y=10.00] [width=30.00] [height=30.00]
+        RenderSVGContainer {g} at (50,170) size 36x36
+          [filter="simple"] RenderSVGResourceFilter {filter} at (50,10) size 36x36
+          RenderSVGContainer {use} at (50,170) size 30x30
+            RenderSVGContainer {g} at (50,170) size 30x30 [transform={m=((1.00,0.00)(0.00,1.00)) t=(50.00,0.00)}]
+              RenderSVGRect {rect} at (50,170) size 30x30 [fill={[type=SOLID] [color=#008000]}] [x=0.00] [y=10.00] [width=30.00] [height=30.00]
+        RenderSVGContainer {g} at (90,170) size 36x36
+          [filter="animated"] RenderSVGResourceFilter {filter} at (90,10) size 36x36
+          RenderSVGContainer {use} at (90,170) size 30x30
+            RenderSVGContainer {g} at (90,170) size 30x30 [transform={m=((1.00,0.00)(0.00,1.00)) t=(90.00,0.00)}]
+              RenderSVGRect {rect} at (90,170) size 30x30 [fill={[type=SOLID] [color=#008000]}] [x=0.00] [y=10.00] [width=30.00] [height=30.00]
+      RenderSVGContainer {g} at (140,60) size 36x36
+        [filter="simple"] RenderSVGResourceFilter {filter} at (140,60) size 36x36
+        RenderSVGRect {rect} at (140,60) size 30x30 [fill={[type=SOLID] [color=#008000]}] [x=140.00] [y=60.00] [width=30.00] [height=30.00]
+      RenderSVGRect {rect} at (140,100) size 36x36 [fill={[type=SOLID] [color=#FF0000]}] [x=140.00] [y=100.00] [width=30.00] [height=30.00]
+        [filter="toGreen"] RenderSVGResourceFilter {filter} at (140,100) size 36x36
+      RenderSVGRect {rect} at (140,140) size 36x36 [fill={[type=SOLID] [color=#008000]}] [x=140.00] [y=140.00] [width=30.00] [height=30.00]
+        [filter="simple"] RenderSVGResourceFilter {filter} at (140,140) size 36x36
diff --git a/LayoutTests/svg/filters/filter-refresh.svg b/LayoutTests/svg/filters/filter-refresh.svg
new file mode 100644 (file)
index 0000000..32e0d9c
--- /dev/null
@@ -0,0 +1,129 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"
+  style="width:300px;height:400px">
+
+<!-- This tests filters failing to refresh after the initial rendering
+(https://bugs.webkit.org/show_bug.cgi?id=53088).
+There should be no red squares in the output. -->
+
+<defs>
+<filter id="simple" x="0" y="0">
+  <feOffset in="SourceGraphic" dx="0" dy="0" />
+</filter>
+
+<filter id="animated" x="0" y="0">
+  <animate attributeName="x" from="0" to="0" dur="0.05s"/>
+  <feOffset in="SourceGraphic" dx="0" dy="0" />
+</filter>
+
+<filter id="toGreen" x="0" y="0">
+  <feComponentTransfer>
+    <feFuncG type="linear" intercept="0.25" slope="0"/>
+    <feFuncR type="linear" intercept="0" slope="0"/>
+    <feFuncB type="linear" intercept="0" slope="0"/>
+  </feComponentTransfer>
+</filter>
+
+<rect id="rect" width="30" y="10" height="30" fill="red" />
+
+</defs>
+
+<g>
+
+<g filter="url(#simple)">
+  <use xlink:href="#rect" x="10" y="40" />
+</g>
+
+<g filter="url(#simple)">
+  <g filter="url(#simple)">
+    <use xlink:href="#rect" x="50" y="40" />
+  </g>
+</g>
+
+<g filter="url(#simple)">
+  <g filter="url(#animated)">
+    <use xlink:href="#rect" x="90" y="40" />
+  </g>
+</g>
+
+<g filter="url(#animated)">
+  <use xlink:href="#rect" x="10" y="80" />
+</g>
+
+<g filter="url(#animated)">
+  <g filter="url(#simple)">
+    <use xlink:href="#rect" x="50" y="80" />
+  </g>
+</g>
+
+<g filter="url(#animated)">
+  <g filter="url(#animated)">
+    <use xlink:href="#rect" x="90" y="80" />
+  </g>
+</g>
+
+<g filter="url(#simple)" transform="translate(0 120)">
+  <use xlink:href="#rect" x="10" />
+
+  <g filter="url(#simple)" >
+    <use xlink:href="#rect" x="50" />
+  </g>
+
+  <g filter="url(#animated)" >
+    <use xlink:href="#rect" x="90" />
+  </g>
+</g>
+
+<g filter="url(#animated)" transform="translate(0 160)">
+  <use xlink:href="#rect" x="10" />
+
+  <g filter="url(#simple)" >
+    <use xlink:href="#rect" x="50" />
+  </g>
+
+  <g filter="url(#animated)" >
+    <use xlink:href="#rect" x="90" />
+  </g>
+</g>
+
+<!-- Trying without use tags now. -->
+
+<g filter="url(#simple)">
+  <rect id="separate1" x="140" y="60" width="30" height="30" fill="red"/>
+</g>
+
+<rect id="filtered" x="140" y="100" filter="none" width="30" height="30" fill="red"/>
+
+<rect filter="url(#simple)" id="separate2" x="140" y="140" width="30" height="30" fill="red" />
+
+</g>
+
+<script><![CDATA[
+    var elements = ['rect', 'separate1', 'separate2'];
+    for (var i=0; i<elements.length; ++i) {
+      elements[i] = document.getElementById(elements[i]);
+    }
+    window.onload = wait;
+    
+    function wait() {
+      // OnLoad doesn't seem to wait for the initial painting, wait again.
+      setTimeout(change, 0);
+    }
+
+    function change() {
+      for (var i=0; i<elements.length; ++i) {
+        elements[i].setAttribute('fill', 'green');
+      }
+      document.getElementById('filtered').setAttribute('filter', 'url(#toGreen)');
+
+      if (window.layoutTestController) {
+          // Let it repaint and get screenshot.
+          setTimeout(function() { layoutTestController.notifyDone(); }, 0);
+      }
+    }
+
+    if (window.layoutTestController) {
+        layoutTestController.waitUntilDone();
+    }
+]]></script>
+
+</svg>
index 2c2640b..fd72dc2 100644 (file)
@@ -1,3 +1,33 @@
+2011-12-22  Branimir Lambov  <blambov@google.com>
+
+        SVG: "filter" race condition may prevent SVG elements from being re-drawn
+        https://bugs.webkit.org/show_bug.cgi?id=53088
+
+        Reviewed by Nikolas Zimmermann.
+
+        Added code to explicitly invalidate data cached by filters applied to
+        an invalidated object or one of its parents.
+
+        Test: svg/filters/filter-refresh.svg
+
+        * rendering/svg/RenderSVGResource.cpp:
+        (WebCore::RenderSVGResource::removeFromFilterCache):
+        (WebCore::RenderSVGResource::markForLayoutAndParentResourceInvalidation):
+        Added code to invalidate any filters applied to any of the parents.
+        * rendering/svg/RenderSVGResource.h:
+        * rendering/svg/RenderSVGResourceContainer.cpp:
+        (WebCore::RenderSVGResourceContainer::markAllClientsForInvalidation):
+        Replaced a duplicate of RenderSVGResource::
+        markForLayoutAndParentResourceInvalidation with a call to the method.
+        * rendering/svg/SVGResourcesCache.cpp:
+        (WebCore::SVGResourcesCache::clientLayoutChanged):
+        Removed filter invalidation code as this function would not be called if
+        the filter isn't already invalidated.
+        (WebCore::SVGResourcesCache::clientStyleChanged):
+        (WebCore::SVGResourcesCache::clientUpdatedFromElement):
+        Replaced filter invalidation with a markForLayoutAndParentResourceInvalidation
+        call as all filters in the ancestor chain need to be invalidated.
+
 2011-12-22  Leo Yang  <leo.yang@torchmobile.com.cn>
 
         [BlackBerry] Upstream the BlackBerry change to ResourceHandle.h
index 683f0a2..76de2a8 100644 (file)
@@ -26,6 +26,7 @@
 #include "RenderSVGResource.h"
 
 #include "RenderSVGResourceContainer.h"
+#include "RenderSVGResourceFilter.h"
 #include "RenderSVGResourceSolidColor.h"
 #include "SVGResources.h"
 #include "SVGResourcesCache.h"
@@ -147,16 +148,40 @@ RenderSVGResourceSolidColor* RenderSVGResource::sharedSolidPaintingResource()
     return s_sharedSolidPaintingResource;
 }
 
+void RenderSVGResource::removeFromFilterCache(RenderObject* object)
+{
+#if ENABLE(FILTERS)
+    ASSERT(object);
+
+    SVGResources* resources = SVGResourcesCache::cachedResourcesForRenderObject(object);
+    if (!resources)
+        return;
+
+    RenderSVGResourceFilter* filter = resources->filter();
+    if (!filter)
+        return;
+
+    filter->removeClientFromCache(object);
+#else
+    UNUSED_PARAM(object)
+#endif
+}
+
 void RenderSVGResource::markForLayoutAndParentResourceInvalidation(RenderObject* object, bool needsLayout)
 {
     ASSERT(object);
     if (needsLayout)
         object->setNeedsLayout(true);
 
+    removeFromFilterCache(object);
+
     // Invalidate resources in ancestor chain, if needed.
     RenderObject* current = object->parent();
     while (current) {
+        removeFromFilterCache(current);
+
         if (current->isSVGResourceContainer()) {
+            // This will process the rest of the ancestors.
             current->toRenderSVGResourceContainer()->removeAllClientsFromCache();
             break;
         }
index e020154..8ff552b 100644 (file)
@@ -82,6 +82,9 @@ public:
     static RenderSVGResourceSolidColor* sharedSolidPaintingResource();
 
     static void markForLayoutAndParentResourceInvalidation(RenderObject*, bool needsLayout = true);
+
+private:
+    static void removeFromFilterCache(RenderObject*);
 };
 
 }
index 85fcfaf..68e60ea 100644 (file)
@@ -108,19 +108,7 @@ void RenderSVGResourceContainer::markAllClientsForInvalidation(InvalidationMode
         if (markForInvalidation)
             markClientForInvalidation(client, mode);
 
-        if (needsLayout)
-            client->setNeedsLayout(true);
-
-        // Invalidate resources in ancestor chain, if needed.
-        RenderObject* current = client->parent();
-        while (current) {
-            if (current->isSVGResourceContainer()) {
-                current->toRenderSVGResourceContainer()->removeAllClientsFromCache(markForInvalidation);
-                break;
-            }
-
-            current = current->parent();
-        }
+        RenderSVGResource::markForLayoutAndParentResourceInvalidation(client, needsLayout);
     }
     m_isInvalidating = false;
 }
index 1d65231..03e6c7b 100644 (file)
@@ -123,8 +123,6 @@ void SVGResourcesCache::clientLayoutChanged(RenderObject* object)
     // or we have filter resources, which could depend on the layout of children.
     if (object->selfNeedsLayout())
         resources->removeClientFromCache(object);
-    else if (resources->filter())
-        resources->removeClientFromCache(object);
 }
 
 void SVGResourcesCache::clientStyleChanged(RenderObject* renderer, StyleDifference diff, const RenderStyle* newStyle)
@@ -138,7 +136,6 @@ void SVGResourcesCache::clientStyleChanged(RenderObject* renderer, StyleDifferen
         return;
 
     clientUpdatedFromElement(renderer, newStyle);
-    RenderSVGResource::markForLayoutAndParentResourceInvalidation(renderer, false);
 }
 
 void SVGResourcesCache::clientUpdatedFromElement(RenderObject* renderer, const RenderStyle* newStyle)
@@ -150,9 +147,7 @@ void SVGResourcesCache::clientUpdatedFromElement(RenderObject* renderer, const R
     cache->removeResourcesFromRenderObject(renderer);
     cache->addResourcesFromRenderObject(renderer, newStyle);
 
-    SVGResources* resources = SVGResourcesCache::cachedResourcesForRenderObject(renderer);
-    if (resources && resources->filter())
-        resources->removeClientFromCache(renderer);
+    RenderSVGResource::markForLayoutAndParentResourceInvalidation(renderer, false);
 }
 
 void SVGResourcesCache::clientDestroyed(RenderObject* renderer)