Changeset 107067 in webkit


Ignore:
Timestamp:
Feb 8, 2012 4:12:31 AM (12 years ago)
Author:
Nikolas Zimmermann
Message:

feImage doesn't invalidate when its target SVG element is animated
https://bugs.webkit.org/show_bug.cgi?id=73860

Reviewed by Dirk Schulze.

Source/WebCore:

Consider following testcase:
<defs>

<rect id="rect" fill="red" width="50" height="50"/>
<filter id="filter">

<feImage xlink:href="#rect"/>

</filter>

</defs>
<rect width="50" height="50" filter="url(#filter)"/>

If the <rect id="rect"> gets changed dynamically (attribute/property/style change) the <feImage>
doesn't notice this, as there's no link between the <rect> and the <feImage>, as the <rect> is not
a child of the <feImage/>. To get invalidations working for these situations, we have to track
the referencingElement & referencedElement in SVGDocumentExtensions.

Fixes parts the SVG-Wow twirl testcase and David Daileys SVG waves example.

Tests: svg/filters/feImage-animated-transform-on-target-rect.svg

svg/filters/feImage-late-indirect-update.svg
svg/filters/feImage-mutliple-targets-id-change.svg
svg/filters/feImage-target-attribute-change-with-use-indirection-2.svg
svg/filters/feImage-target-attribute-change-with-use-indirection.svg
svg/filters/feImage-target-attribute-change.svg
svg/filters/feImage-target-inline-style-change.svg
svg/filters/feImage-target-property-change.svg
svg/filters/feImage-target-style-change.svg

  • rendering/svg/RenderSVGResource.cpp:

(WebCore::removeFromFilterCacheAndInvalidateDependencies): Renamed from removeFromFilterCache, as it has another purpose now.
(WebCore::RenderSVGResource::markForLayoutAndParentResourceInvalidation): s/removeFromFilterCache/removeFromFilterCacheAndInvalidateDependencies/.

  • rendering/svg/RenderSVGResource.h: Removed removeFromFilterCache, it got inlined.
  • svg/SVGDocumentExtensions.cpp: Add a new HashMap<SVGElement*, OwnPtr<HashSet<SVGElement*> > > used for dependency tracking.

(WebCore::SVGDocumentExtensions::setOfElementsReferencingTarget): Returns all elements the passed in element depends on.
(WebCore::SVGDocumentExtensions::addElementReferencingTarget): Register element 'a' referencing target 'b'.
(WebCore::SVGDocumentExtensions::removeAllTargetReferencesForElement): Called by element 'a' on destruction or any target change.
(WebCore::SVGDocumentExtensions::removeAllElementReferencesForTarget): Called by element 'b' on destruction.

  • svg/SVGDocumentExtensions.h: Expose new methods.
  • svg/SVGElement.cpp:

(WebCore::SVGElement::~SVGElement): Call remove removeAllElementReferencesForTarget on destruction.

  • svg/SVGFEImageElement.cpp:

(WebCore::SVGFEImageElement::clearResourceReferences):
(WebCore::SVGFEImageElement::buildPendingResource):

LayoutTests:

Add lots of new testcases covering <feImage> invalidation, when the referenced target changes.
Thanks to the repaint harness, it uncovered a bug with feImage-late-indirect-update.svg - there no gray
overlay rects are visible, as the whole screen gets repainted, which is a bug!

  • platform/mac/svg/filters/feImage-animated-transform-on-target-rect-expected.png: Added.
  • platform/mac/svg/filters/feImage-change-target-id-expected.png: Added.
  • platform/mac/svg/filters/feImage-change-target-id-expected.txt: Added.
  • platform/mac/svg/filters/feImage-late-indirect-update-expected.png: Added.
  • platform/mac/svg/filters/feImage-late-indirect-update-expected.txt: Added.
  • platform/mac/svg/filters/feImage-multiple-targets-id-change-expected.png: Added.
  • platform/mac/svg/filters/feImage-multiple-targets-id-change-expected.txt: Added.
  • platform/mac/svg/filters/feImage-remove-target-expected.png: Added.
  • platform/mac/svg/filters/feImage-remove-target-expected.txt: Added.
  • platform/mac/svg/filters/feImage-target-add-to-document-expected.png: Renamed from LayoutTests/svg/filters/feImage-target-add-to-document-expected.png.
  • platform/mac/svg/filters/feImage-target-add-to-document-expected.txt: Copied from LayoutTests/svg/filters/feImage-target-add-to-document-expected.txt.
  • platform/mac/svg/filters/feImage-target-attribute-change-expected.png: Added.
  • platform/mac/svg/filters/feImage-target-attribute-change-expected.txt: Copied from LayoutTests/svg/filters/feImage-target-changes-id-expected.txt.
  • platform/mac/svg/filters/feImage-target-attribute-change-with-use-indirection-2-expected.png: Added.
  • platform/mac/svg/filters/feImage-target-attribute-change-with-use-indirection-2-expected.txt: Added.
  • platform/mac/svg/filters/feImage-target-attribute-change-with-use-indirection-expected.png: Added.
  • platform/mac/svg/filters/feImage-target-attribute-change-with-use-indirection-expected.txt: Added.
  • platform/mac/svg/filters/feImage-target-changes-id-expected.png: Renamed from LayoutTests/svg/filters/feImage-target-changes-id-expected.png.
  • platform/mac/svg/filters/feImage-target-changes-id-expected.txt: Copied from LayoutTests/svg/filters/feImage-target-changes-id-expected.txt.
  • platform/mac/svg/filters/feImage-target-id-change-expected.png: Renamed from LayoutTests/svg/filters/feImage-target-id-change-expected.png.
  • platform/mac/svg/filters/feImage-target-id-change-expected.txt: Renamed from LayoutTests/svg/filters/feImage-target-id-change-expected.txt.
  • platform/mac/svg/filters/feImage-target-inline-style-change-expected.png: Added.
  • platform/mac/svg/filters/feImage-target-inline-style-change-expected.txt: Copied from LayoutTests/svg/filters/feImage-target-changes-id-expected.txt.
  • platform/mac/svg/filters/feImage-target-property-change-expected.png: Added.
  • platform/mac/svg/filters/feImage-target-property-change-expected.txt: Copied from LayoutTests/svg/filters/feImage-target-changes-id-expected.txt.
  • platform/mac/svg/filters/feImage-target-reappend-to-document-expected.png: Renamed from LayoutTests/svg/filters/feImage-target-reappend-to-document-expected.png.
  • platform/mac/svg/filters/feImage-target-reappend-to-document-expected.txt: Renamed from LayoutTests/svg/filters/feImage-target-reappend-to-document-expected.txt.
  • platform/mac/svg/filters/feImage-target-remove-from-document-expected.png: Renamed from LayoutTests/svg/filters/feImage-target-remove-from-document-expected.png.
  • platform/mac/svg/filters/feImage-target-remove-from-document-expected.txt: Renamed from LayoutTests/svg/filters/feImage-target-remove-from-document-expected.txt.
  • platform/mac/svg/filters/feImage-target-style-change-expected.png: Added.
  • platform/mac/svg/filters/feImage-target-style-change-expected.txt: Renamed from LayoutTests/svg/filters/feImage-target-changes-id-expected.txt.
  • svg/filters/feImage-animated-transform-on-target-rect-expected.txt: Added.
  • svg/filters/feImage-animated-transform-on-target-rect.svg: Added.
  • svg/filters/feImage-change-target-id.svg: Added.
  • svg/filters/feImage-late-indirect-update.svg: Added.
  • svg/filters/feImage-multiple-targets-id-change.svg: Added.
  • svg/filters/feImage-remove-target.svg: Added.
  • svg/filters/feImage-target-attribute-change-with-use-indirection-2.svg: Added.
  • svg/filters/feImage-target-attribute-change-with-use-indirection.svg: Added.
  • svg/filters/feImage-target-attribute-change.svg: Added.
  • svg/filters/feImage-target-inline-style-change.svg: Added.
  • svg/filters/feImage-target-property-change.svg: Added.
  • svg/filters/feImage-target-style-change.svg: Added.
Location:
trunk
Files:
19 added
9 edited
14 copied
10 moved

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r107066 r107067  
     12012-02-08  Nikolas Zimmermann  <nzimmermann@rim.com>
     2
     3        feImage doesn't invalidate when its target SVG element is animated
     4        https://bugs.webkit.org/show_bug.cgi?id=73860
     5
     6        Reviewed by Dirk Schulze.
     7
     8        Add lots of new testcases covering <feImage> invalidation, when the referenced target changes.
     9        Thanks to the repaint harness, it uncovered a bug with feImage-late-indirect-update.svg - there no gray
     10        overlay rects are visible, as the whole screen gets repainted, which is a bug!
     11
     12        * platform/mac/svg/filters/feImage-animated-transform-on-target-rect-expected.png: Added.
     13        * platform/mac/svg/filters/feImage-change-target-id-expected.png: Added.
     14        * platform/mac/svg/filters/feImage-change-target-id-expected.txt: Added.
     15        * platform/mac/svg/filters/feImage-late-indirect-update-expected.png: Added.
     16        * platform/mac/svg/filters/feImage-late-indirect-update-expected.txt: Added.
     17        * platform/mac/svg/filters/feImage-multiple-targets-id-change-expected.png: Added.
     18        * platform/mac/svg/filters/feImage-multiple-targets-id-change-expected.txt: Added.
     19        * platform/mac/svg/filters/feImage-remove-target-expected.png: Added.
     20        * platform/mac/svg/filters/feImage-remove-target-expected.txt: Added.
     21        * platform/mac/svg/filters/feImage-target-add-to-document-expected.png: Renamed from LayoutTests/svg/filters/feImage-target-add-to-document-expected.png.
     22        * platform/mac/svg/filters/feImage-target-add-to-document-expected.txt: Copied from LayoutTests/svg/filters/feImage-target-add-to-document-expected.txt.
     23        * platform/mac/svg/filters/feImage-target-attribute-change-expected.png: Added.
     24        * platform/mac/svg/filters/feImage-target-attribute-change-expected.txt: Copied from LayoutTests/svg/filters/feImage-target-changes-id-expected.txt.
     25        * platform/mac/svg/filters/feImage-target-attribute-change-with-use-indirection-2-expected.png: Added.
     26        * platform/mac/svg/filters/feImage-target-attribute-change-with-use-indirection-2-expected.txt: Added.
     27        * platform/mac/svg/filters/feImage-target-attribute-change-with-use-indirection-expected.png: Added.
     28        * platform/mac/svg/filters/feImage-target-attribute-change-with-use-indirection-expected.txt: Added.
     29        * platform/mac/svg/filters/feImage-target-changes-id-expected.png: Renamed from LayoutTests/svg/filters/feImage-target-changes-id-expected.png.
     30        * platform/mac/svg/filters/feImage-target-changes-id-expected.txt: Copied from LayoutTests/svg/filters/feImage-target-changes-id-expected.txt.
     31        * platform/mac/svg/filters/feImage-target-id-change-expected.png: Renamed from LayoutTests/svg/filters/feImage-target-id-change-expected.png.
     32        * platform/mac/svg/filters/feImage-target-id-change-expected.txt: Renamed from LayoutTests/svg/filters/feImage-target-id-change-expected.txt.
     33        * platform/mac/svg/filters/feImage-target-inline-style-change-expected.png: Added.
     34        * platform/mac/svg/filters/feImage-target-inline-style-change-expected.txt: Copied from LayoutTests/svg/filters/feImage-target-changes-id-expected.txt.
     35        * platform/mac/svg/filters/feImage-target-property-change-expected.png: Added.
     36        * platform/mac/svg/filters/feImage-target-property-change-expected.txt: Copied from LayoutTests/svg/filters/feImage-target-changes-id-expected.txt.
     37        * platform/mac/svg/filters/feImage-target-reappend-to-document-expected.png: Renamed from LayoutTests/svg/filters/feImage-target-reappend-to-document-expected.png.
     38        * platform/mac/svg/filters/feImage-target-reappend-to-document-expected.txt: Renamed from LayoutTests/svg/filters/feImage-target-reappend-to-document-expected.txt.
     39        * platform/mac/svg/filters/feImage-target-remove-from-document-expected.png: Renamed from LayoutTests/svg/filters/feImage-target-remove-from-document-expected.png.
     40        * platform/mac/svg/filters/feImage-target-remove-from-document-expected.txt: Renamed from LayoutTests/svg/filters/feImage-target-remove-from-document-expected.txt.
     41        * platform/mac/svg/filters/feImage-target-style-change-expected.png: Added.
     42        * platform/mac/svg/filters/feImage-target-style-change-expected.txt: Renamed from LayoutTests/svg/filters/feImage-target-changes-id-expected.txt.
     43        * svg/filters/feImage-animated-transform-on-target-rect-expected.txt: Added.
     44        * svg/filters/feImage-animated-transform-on-target-rect.svg: Added.
     45        * svg/filters/feImage-change-target-id.svg: Added.
     46        * svg/filters/feImage-late-indirect-update.svg: Added.
     47        * svg/filters/feImage-multiple-targets-id-change.svg: Added.
     48        * svg/filters/feImage-remove-target.svg: Added.
     49        * svg/filters/feImage-target-attribute-change-with-use-indirection-2.svg: Added.
     50        * svg/filters/feImage-target-attribute-change-with-use-indirection.svg: Added.
     51        * svg/filters/feImage-target-attribute-change.svg: Added.
     52        * svg/filters/feImage-target-inline-style-change.svg: Added.
     53        * svg/filters/feImage-target-property-change.svg: Added.
     54        * svg/filters/feImage-target-style-change.svg: Added.
     55
    1562012-02-08  Csaba Osztrogonác  <ossy@webkit.org>
    257
  • trunk/LayoutTests/platform/chromium/test_expectations.txt

    r107057 r107067  
    40514051BUGWK78084 : svg/custom/text-hit-test.svg = IMAGE+TEXT
    40524052
     4053// feImage now supports dynamic invalidations if the target changes.
     4054BUGWK73860 : svg/filters/feImage-animated-transform-on-target-rect.svg = IMAGE+TEXT
     4055BUGWK73860 : svg/filters/feImage-change-target-id.svg = IMAGE+TEXT
     4056BUGWK73860 : svg/filters/feImage-late-indirect-update.svg = IMAGE+TEXT
     4057BUGWK73860 : svg/filters/feImage-multiple-targets-id-change.svg = IMAGE+TEXT
     4058BUGWK73860 : svg/filters/feImage-remove-target.svg = IMAGE+TEXT
     4059BUGWK73860 : svg/filters/feImage-target-attribute-change-with-use-indirection-2.svg = IMAGE+TEXT
     4060BUGWK73860 : svg/filters/feImage-target-attribute-change-with-use-indirection.svg = IMAGE+TEXT
     4061BUGWK73860 : svg/filters/feImage-target-attribute-change.svg = IMAGE+TEXT
     4062BUGWK73860 : svg/filters/feImage-target-inline-style-change.svg = IMAGE+TEXT
     4063BUGWK73860 : svg/filters/feImage-target-property-change.svg = IMAGE+TEXT
     4064BUGWK73860 : svg/filters/feImage-target-style-change.svg = IMAGE+TEXT
     4065
    40534066BUGWK78038 DEBUG : compositing/iframes/invisible-nested-iframe-show.html = PASS CRASH
    40544067BUGWK78038 DEBUG : compositing/iframes/layout-on-compositing-change.html = PASS CRASH
  • trunk/LayoutTests/platform/mac/svg/filters/feImage-change-target-id-expected.txt

    r107066 r107067  
    66      RenderSVGRect {rect} at (0,0) size 100x100 [fill={[type=SOLID] [color=#008000]}] [x=0.00] [y=0.00] [width=100.00] [height=100.00]
    77      RenderSVGResourceFilter {filter} [id="filter"] [filterUnits=objectBoundingBox] [primitiveUnits=userSpaceOnUse]
    8         [feImage image-size="100x100"]
     8        [feImage image-size="0x0"]
    99    RenderSVGRect {rect} at (0,0) size 111x111 [fill={[type=SOLID] [color=#000000]}] [x=0.00] [y=0.00] [width=100.00] [height=100.00]
    1010      [filter="filter"] RenderSVGResourceFilter {filter} at (-10,-10) size 120x120
  • trunk/LayoutTests/platform/mac/svg/filters/feImage-remove-target-expected.txt

    r107066 r107067  
    44  RenderSVGRoot {svg} at (0,0) size 111x111
    55    RenderSVGHiddenContainer {defs} at (0,0) size 0x0
    6       RenderSVGRect {rect} at (0,0) size 100x100 [fill={[type=SOLID] [color=#008000]}] [x=0.00] [y=0.00] [width=100.00] [height=100.00]
    76      RenderSVGResourceFilter {filter} [id="filter"] [filterUnits=objectBoundingBox] [primitiveUnits=userSpaceOnUse]
    8         [feImage image-size="100x100"]
     7        [feImage image-size="0x0"]
    98    RenderSVGRect {rect} at (0,0) size 111x111 [fill={[type=SOLID] [color=#000000]}] [x=0.00] [y=0.00] [width=100.00] [height=100.00]
    109      [filter="filter"] RenderSVGResourceFilter {filter} at (-10,-10) size 120x120
  • trunk/LayoutTests/platform/mac/svg/filters/feImage-target-attribute-change-with-use-indirection-2-expected.txt

    r107066 r107067  
    44  RenderSVGRoot {svg} at (0,0) size 111x111
    55    RenderSVGHiddenContainer {defs} at (0,0) size 0x0
    6       RenderSVGRect {rect} at (0,0) size 100x100 [fill={[type=SOLID] [color=#FF0000]}] [x=0.00] [y=0.00] [width=100.00] [height=100.00]
    7       RenderSVGRect {rect} at (0,0) size 100x100 [fill={[type=SOLID] [color=#008000]}] [x=0.00] [y=0.00] [width=100.00] [height=100.00]
     6      RenderSVGRect {rect} at (0,0) size 50x100 [fill={[type=SOLID] [color=#008000]}] [x=-50.00] [y=0.00] [width=100.00] [height=100.00]
     7      RenderSVGContainer {use} at (0,0) size 100x100
     8        RenderSVGContainer {g} at (0,0) size 100x100 [transform={m=((1.00,0.00)(0.00,1.00)) t=(50.00,0.00)}]
     9          RenderSVGRect {rect} at (0,0) size 100x100 [fill={[type=SOLID] [color=#008000]}] [x=-50.00] [y=0.00] [width=100.00] [height=100.00]
    810      RenderSVGResourceFilter {filter} [id="filter"] [filterUnits=objectBoundingBox] [primitiveUnits=userSpaceOnUse]
    911        [feImage image-size="100x100"]
  • trunk/LayoutTests/platform/mac/svg/filters/feImage-target-attribute-change-with-use-indirection-expected.txt

    r107066 r107067  
    44  RenderSVGRoot {svg} at (0,0) size 111x111
    55    RenderSVGHiddenContainer {defs} at (0,0) size 0x0
    6       RenderSVGRect {rect} at (0,0) size 100x100 [fill={[type=SOLID] [color=#FF0000]}] [x=0.00] [y=0.00] [width=100.00] [height=100.00]
    76      RenderSVGRect {rect} at (0,0) size 100x100 [fill={[type=SOLID] [color=#008000]}] [x=0.00] [y=0.00] [width=100.00] [height=100.00]
     7      RenderSVGContainer {use} at (0,0) size 100x100
     8        RenderSVGContainer {g} at (0,0) size 100x100
     9          RenderSVGRect {rect} at (0,0) size 100x100 [fill={[type=SOLID] [color=#008000]}] [x=0.00] [y=0.00] [width=100.00] [height=100.00]
    810      RenderSVGResourceFilter {filter} [id="filter"] [filterUnits=objectBoundingBox] [primitiveUnits=userSpaceOnUse]
    911        [feImage image-size="100x100"]
  • trunk/Source/WebCore/ChangeLog

    r107065 r107067  
     12012-02-08  Nikolas Zimmermann  <nzimmermann@rim.com>
     2
     3        feImage doesn't invalidate when its target SVG element is animated
     4        https://bugs.webkit.org/show_bug.cgi?id=73860
     5
     6        Reviewed by Dirk Schulze.
     7
     8        Consider following testcase:
     9        <defs>
     10            <rect id="rect" fill="red" width="50" height="50"/>
     11            <filter id="filter">
     12                <feImage xlink:href="#rect"/>
     13            </filter>
     14        </defs>
     15        <rect width="50" height="50" filter="url(#filter)"/>
     16
     17        If the <rect id="rect"> gets changed dynamically (attribute/property/style change) the <feImage>
     18        doesn't notice this, as there's no link between the <rect> and the <feImage>, as the <rect> is not
     19        a child of the <feImage/>. To get invalidations working for these situations, we have to track
     20        the referencingElement & referencedElement in SVGDocumentExtensions.
     21
     22        Fixes parts the SVG-Wow twirl testcase and David Daileys SVG waves example.
     23
     24        Tests: svg/filters/feImage-animated-transform-on-target-rect.svg
     25               svg/filters/feImage-late-indirect-update.svg
     26               svg/filters/feImage-mutliple-targets-id-change.svg
     27               svg/filters/feImage-target-attribute-change-with-use-indirection-2.svg
     28               svg/filters/feImage-target-attribute-change-with-use-indirection.svg
     29               svg/filters/feImage-target-attribute-change.svg
     30               svg/filters/feImage-target-inline-style-change.svg
     31               svg/filters/feImage-target-property-change.svg
     32               svg/filters/feImage-target-style-change.svg
     33
     34        * rendering/svg/RenderSVGResource.cpp:
     35        (WebCore::removeFromFilterCacheAndInvalidateDependencies): Renamed from removeFromFilterCache, as it has another purpose now.
     36        (WebCore::RenderSVGResource::markForLayoutAndParentResourceInvalidation): s/removeFromFilterCache/removeFromFilterCacheAndInvalidateDependencies/.
     37        * rendering/svg/RenderSVGResource.h: Removed removeFromFilterCache, it got inlined.
     38        * svg/SVGDocumentExtensions.cpp: Add a new HashMap<SVGElement*, OwnPtr<HashSet<SVGElement*> > > used for dependency tracking.
     39        (WebCore::SVGDocumentExtensions::setOfElementsReferencingTarget): Returns all elements the passed in element depends on.
     40        (WebCore::SVGDocumentExtensions::addElementReferencingTarget): Register element 'a' referencing target 'b'.
     41        (WebCore::SVGDocumentExtensions::removeAllTargetReferencesForElement): Called by element 'a' on destruction or any target change.
     42        (WebCore::SVGDocumentExtensions::removeAllElementReferencesForTarget): Called by element 'b' on destruction.
     43        * svg/SVGDocumentExtensions.h: Expose new methods.
     44        * svg/SVGElement.cpp:
     45        (WebCore::SVGElement::~SVGElement): Call remove removeAllElementReferencesForTarget on destruction.
     46        * svg/SVGFEImageElement.cpp:
     47        (WebCore::SVGFEImageElement::clearResourceReferences):
     48        (WebCore::SVGFEImageElement::buildPendingResource):
     49
    1502012-02-08  Kihong Kwon  <kihong.kwon@samsung.com>
    251
  • trunk/Source/WebCore/rendering/svg/RenderSVGResource.cpp

    r105985 r107067  
    162162}
    163163
    164 void RenderSVGResource::removeFromFilterCache(RenderObject* object)
    165 {
     164static inline void removeFromFilterCacheAndInvalidateDependencies(RenderObject* object, bool needsLayout)
     165{
     166    ASSERT(object);
    166167#if ENABLE(FILTERS)
     168    if (SVGResources* resources = SVGResourcesCache::cachedResourcesForRenderObject(object)) {
     169        if (RenderSVGResourceFilter* filter = resources->filter())
     170            filter->removeClientFromCache(object);
     171    }
     172#endif
     173    if (!object->node() || !object->node()->isSVGElement())
     174        return;
     175    HashSet<SVGElement*>* dependencies = object->document()->accessSVGExtensions()->setOfElementsReferencingTarget(static_cast<SVGElement*>(object->node()));
     176    if (!dependencies)
     177        return;
     178    HashSet<SVGElement*>::iterator end = dependencies->end();
     179    for (HashSet<SVGElement*>::iterator it = dependencies->begin(); it != end; ++it) {
     180        if (RenderObject* renderer = (*it)->renderer())
     181            RenderSVGResource::markForLayoutAndParentResourceInvalidation(renderer, needsLayout);
     182    }
     183}
     184
     185void RenderSVGResource::markForLayoutAndParentResourceInvalidation(RenderObject* object, bool needsLayout)
     186{
    167187    ASSERT(object);
    168 
    169     SVGResources* resources = SVGResourcesCache::cachedResourcesForRenderObject(object);
    170     if (!resources)
    171         return;
    172 
    173     RenderSVGResourceFilter* filter = resources->filter();
    174     if (!filter)
    175         return;
    176 
    177     filter->removeClientFromCache(object);
    178 #else
    179     UNUSED_PARAM(object);
    180 #endif
    181 }
    182 
    183 void RenderSVGResource::markForLayoutAndParentResourceInvalidation(RenderObject* object, bool needsLayout)
    184 {
    185     ASSERT(object);
     188    ASSERT(object->document());
     189    ASSERT(object->node());
     190
    186191    if (needsLayout)
    187192        object->setNeedsLayout(true);
    188193
    189     removeFromFilterCache(object);
     194    removeFromFilterCacheAndInvalidateDependencies(object, needsLayout);
    190195
    191196    // Invalidate resources in ancestor chain, if needed.
    192197    RenderObject* current = object->parent();
    193198    while (current) {
    194         removeFromFilterCache(current);
     199        removeFromFilterCacheAndInvalidateDependencies(current, needsLayout);
    195200
    196201        if (current->isSVGResourceContainer()) {
  • trunk/Source/WebCore/rendering/svg/RenderSVGResource.h

    r103539 r107067  
    8383
    8484    static void markForLayoutAndParentResourceInvalidation(RenderObject*, bool needsLayout = true);
    85 
    86 private:
    87     static void removeFromFilterCache(RenderObject*);
    8885};
    8986
  • trunk/Source/WebCore/svg/SVGDocumentExtensions.cpp

    r107057 r107067  
    3838#include "SVGSVGElement.h"
    3939#include "ScriptableDocumentParser.h"
     40#include "XLinkNames.h"
    4041#include <wtf/text/AtomicString.h>
    4142
     
    291292
    292293    // We use the removePendingResource function here because it deals with set lifetime correctly.
    293     Vector<AtomicString>::iterator endVector = toBeRemoved.end();
    294     for (Vector<AtomicString>::iterator it = toBeRemoved.begin(); it != endVector; ++it)
     294    Vector<AtomicString>::iterator vectorEnd = toBeRemoved.end();
     295    for (Vector<AtomicString>::iterator it = toBeRemoved.begin(); it != vectorEnd; ++it)
    295296        removePendingResource(*it);
    296297}
     
    315316}
    316317
     318HashSet<SVGElement*>* SVGDocumentExtensions::setOfElementsReferencingTarget(SVGElement* referencedElement) const
     319{
     320    ASSERT(referencedElement);
     321    const HashMap<SVGElement*, OwnPtr<HashSet<SVGElement*> > >::const_iterator it = m_elementDependencies.find(referencedElement);
     322    if (it == m_elementDependencies.end())
     323        return 0;
     324    return it->second.get();
     325}
     326
     327void SVGDocumentExtensions::addElementReferencingTarget(SVGElement* referencingElement, SVGElement* referencedElement)
     328{
     329    ASSERT(referencingElement);
     330    ASSERT(referencedElement);
     331
     332    if (HashSet<SVGElement*>* elements = m_elementDependencies.get(referencedElement)) {
     333        elements->add(referencingElement);
     334        return;
     335    }
     336
     337    OwnPtr<HashSet<SVGElement*> > elements = adoptPtr(new HashSet<SVGElement*>);
     338    elements->add(referencingElement);
     339    m_elementDependencies.set(referencedElement, elements.release());
     340}
     341
     342void SVGDocumentExtensions::removeAllTargetReferencesForElement(SVGElement* referencingElement)
     343{
     344    Vector<SVGElement*> toBeRemoved;
     345
     346    HashMap<SVGElement*, OwnPtr<HashSet<SVGElement*> > >::iterator end = m_elementDependencies.end();
     347    for (HashMap<SVGElement*, OwnPtr<HashSet<SVGElement*> > >::iterator it = m_elementDependencies.begin(); it != end; ++it) {
     348        SVGElement* referencedElement = it->first;
     349        HashSet<SVGElement*>* referencingElements = it->second.get();
     350        HashSet<SVGElement*>::iterator setIt = referencingElements->find(referencingElement);
     351        if (setIt == referencingElements->end())
     352            continue;
     353
     354        referencingElements->remove(setIt);
     355        if (referencingElements->isEmpty())
     356            toBeRemoved.append(referencedElement);
     357    }
     358
     359    Vector<SVGElement*>::iterator vectorEnd = toBeRemoved.end();
     360    for (Vector<SVGElement*>::iterator it = toBeRemoved.begin(); it != vectorEnd; ++it)
     361        m_elementDependencies.remove(*it);
     362}
     363
     364void SVGDocumentExtensions::removeAllElementReferencesForTarget(SVGElement* referencedElement)
     365{
     366    ASSERT(referencedElement);
     367    HashMap<SVGElement*, OwnPtr<HashSet<SVGElement*> > >::iterator it = m_elementDependencies.find(referencedElement);
     368    if (it == m_elementDependencies.end())
     369        return;
     370    ASSERT(it->first == referencedElement);
     371    Vector<SVGElement*> toBeNotified;
     372
     373    HashSet<SVGElement*>* referencingElements = it->second.get();
     374    HashSet<SVGElement*>::iterator setEnd = referencingElements->end();
     375    for (HashSet<SVGElement*>::iterator setIt = referencingElements->begin(); setIt != setEnd; ++setIt)
     376        toBeNotified.append(*setIt);
     377
     378    m_elementDependencies.remove(it);
     379
     380    // Force rebuilding the referencingElement so it knows about this change.
     381    Vector<SVGElement*>::iterator vectorEnd = toBeNotified.end();
     382    for (Vector<SVGElement*>::iterator vectorIt = toBeNotified.begin(); vectorIt != vectorEnd; ++vectorIt)
     383        (*vectorIt)->svgAttributeChanged(XLinkNames::hrefAttr);
     384}
     385
    317386}
    318387
  • trunk/Source/WebCore/svg/SVGDocumentExtensions.h

    r107057 r107067  
    6969    SVGResourcesCache* resourcesCache() const { return m_resourcesCache.get(); }
    7070
     71    HashSet<SVGElement*>* setOfElementsReferencingTarget(SVGElement* referencedElement) const;
     72    void addElementReferencingTarget(SVGElement* referencingElement, SVGElement* referencedElement);
     73    void removeAllTargetReferencesForElement(SVGElement* referencingElement);
     74    void removeAllElementReferencesForTarget(SVGElement* referencedElement);
     75
    7176private:
    7277    Document* m_document; // weak reference
     
    7580    HashMap<AtomicString, RenderSVGResourceContainer*> m_resources;
    7681    HashMap<AtomicString, SVGPendingElements*> m_pendingResources;
     82    HashMap<SVGElement*, OwnPtr<HashSet<SVGElement*> > > m_elementDependencies;
    7783    OwnPtr<SVGResourcesCache> m_resourcesCache;
    7884
  • trunk/Source/WebCore/svg/SVGElement.cpp

    r107057 r107067  
    8686    }
    8787    document()->accessSVGExtensions()->removeAllAnimationElementsFromTarget(this);
     88    document()->accessSVGExtensions()->removeAllElementReferencesForTarget(this);
    8889}
    8990
     
    160161{
    161162    document()->accessSVGExtensions()->removeAllAnimationElementsFromTarget(this);
     163    document()->accessSVGExtensions()->removeAllElementReferencesForTarget(this);
    162164    StyledElement::removedFromDocument();
    163165}
     
    408410        return;
    409411
    410     if (isIdAttributeName(attr->name()))
     412    if (isIdAttributeName(attr->name())) {
    411413        document()->accessSVGExtensions()->removeAllAnimationElementsFromTarget(this);
     414        document()->accessSVGExtensions()->removeAllElementReferencesForTarget(this);
     415    }
    412416
    413417    // Changes to the style attribute are processed lazily (see Element::getAttribute() and related methods),
  • trunk/Source/WebCore/svg/SVGFEImageElement.cpp

    r106769 r107067  
    7474        m_cachedImage = 0;
    7575    }
     76
     77    ASSERT(document());
     78    document()->accessSVGExtensions()->removeAllTargetReferencesForElement(this);
    7679}
    7780
     
    103106            ASSERT(hasPendingResources());
    104107        }
     108    } else if (target->isSVGElement()) {
     109        // Register us with the target in the dependencies map. Any change of hrefElement
     110        // that leads to relayout/repainting now informs us, so we can react to it.
     111        document()->accessSVGExtensions()->addElementReferencingTarget(this, static_cast<SVGElement*>(target));
    105112    }
    106113
Note: See TracChangeset for help on using the changeset viewer.