15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/*
25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) Research In Motion Limited 2010. All rights reserved.
35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * This library is free software; you can redistribute it and/or
55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * modify it under the terms of the GNU Library General Public
65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * License as published by the Free Software Foundation; either
75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * version 2 of the License, or (at your option) any later version.
85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * This library is distributed in the hope that it will be useful,
105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * but WITHOUT ANY WARRANTY; without even the implied warranty of
115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Library General Public License for more details.
135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * You should have received a copy of the GNU Library General Public License
155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * along with this library; see the file COPYING.LIB.  If not, write to
165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Boston, MA 02110-1301, USA.
185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */
195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "config.h"
2153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/rendering/svg/SVGResourcesCache.h"
225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
235d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)#include "core/HTMLNames.h"
2453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/rendering/svg/RenderSVGResourceContainer.h"
2553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/rendering/svg/SVGResources.h"
2653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/rendering/svg/SVGResourcesCycleSolver.h"
2753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/svg/SVGDocumentExtensions.h"
285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
29c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)namespace blink {
305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)SVGResourcesCache::SVGResourcesCache()
325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)SVGResourcesCache::~SVGResourcesCache()
365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void SVGResourcesCache::addResourcesFromRenderObject(RenderObject* object, const RenderStyle* style)
405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(object);
425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(style);
435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(!m_cache.contains(object));
445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
45197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    const SVGRenderStyle& svgStyle = style->svgStyle();
465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Build a list of all resources associated with the passed RenderObject
48a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    OwnPtr<SVGResources> newResources = SVGResources::buildResources(object, svgStyle);
49a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    if (!newResources)
505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Put object in cache.
5309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    SVGResources* resources = m_cache.set(object, newResources.release()).storedValue->value.get();
545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Run cycle-detection _afterwards_, so self-references can be caught as well.
565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    SVGResourcesCycleSolver solver(object, resources);
575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    solver.resolveCycles();
585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Walk resources and register the render object at each resources.
605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    HashSet<RenderSVGResourceContainer*> resourceSet;
615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    resources->buildSetOfResources(resourceSet);
625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    HashSet<RenderSVGResourceContainer*>::iterator end = resourceSet.end();
645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    for (HashSet<RenderSVGResourceContainer*>::iterator it = resourceSet.begin(); it != end; ++it)
655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        (*it)->addClient(object);
665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void SVGResourcesCache::removeResourcesFromRenderObject(RenderObject* object)
695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
7081a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)    OwnPtr<SVGResources> resources = m_cache.take(object);
711e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    if (!resources)
721e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)        return;
735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Walk resources and register the render object at each resources.
755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    HashSet<RenderSVGResourceContainer*> resourceSet;
765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    resources->buildSetOfResources(resourceSet);
775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    HashSet<RenderSVGResourceContainer*>::iterator end = resourceSet.end();
795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    for (HashSet<RenderSVGResourceContainer*>::iterator it = resourceSet.begin(); it != end; ++it)
805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        (*it)->removeClient(object);
815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static inline SVGResourcesCache* resourcesCacheFromRenderObject(const RenderObject* renderer)
845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
858abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    Document& document = renderer->document();
865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
87d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    SVGDocumentExtensions& extensions = document.accessSVGExtensions();
88d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    SVGResourcesCache* cache = extensions.resourcesCache();
895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(cache);
905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return cache;
925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)SVGResources* SVGResourcesCache::cachedResourcesForRenderObject(const RenderObject* renderer)
955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(renderer);
9781a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)    return resourcesCacheFromRenderObject(renderer)->m_cache.get(renderer);
985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void SVGResourcesCache::clientLayoutChanged(RenderObject* object)
1015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    SVGResources* resources = SVGResourcesCache::cachedResourcesForRenderObject(object);
1035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!resources)
1045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
1055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Invalidate the resources if either the RenderObject itself changed,
1075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // or we have filter resources, which could depend on the layout of children.
10893ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    if (object->selfNeedsLayout() || resources->filter())
1095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        resources->removeClientFromCache(object);
1105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
112926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)static inline bool rendererCanHaveResources(RenderObject* renderer)
113926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
114926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    ASSERT(renderer);
115926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    return renderer->node() && renderer->node()->isSVGElement() && !renderer->isSVGInlineText();
116926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
117926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
1185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void SVGResourcesCache::clientStyleChanged(RenderObject* renderer, StyleDifference diff, const RenderStyle* newStyle)
1195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(renderer);
1211e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    ASSERT(renderer->node());
1221e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    ASSERT(renderer->node()->isSVGElement());
1231e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)
124197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    if (!diff.hasDifference() || !renderer->parent())
1255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
1265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
127e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    // In this case the proper SVGFE*Element will decide whether the modified CSS properties require a relayout or paintInvalidation.
128f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    if (renderer->isSVGResourceFilterPrimitive() && !diff.needsLayout())
1295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
1305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Dynamic changes of CSS properties like 'clip-path' may require us to recompute the associated resources for a renderer.
1325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // FIXME: Avoid passing in a useless StyleDifference, but instead compare oldStyle/newStyle to see which resources changed
1335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // to be able to selectively rebuild individual resources, instead of all of them.
134926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (rendererCanHaveResources(renderer)) {
135926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        SVGResourcesCache* cache = resourcesCacheFromRenderObject(renderer);
136926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        cache->removeResourcesFromRenderObject(renderer);
137926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        cache->addResourcesFromRenderObject(renderer, newStyle);
138926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    }
1395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    RenderSVGResource::markForLayoutAndParentResourceInvalidation(renderer, false);
1415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void SVGResourcesCache::clientWasAddedToTree(RenderObject* renderer, const RenderStyle* newStyle)
1445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!renderer->node())
1465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
1475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    RenderSVGResource::markForLayoutAndParentResourceInvalidation(renderer, false);
1485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!rendererCanHaveResources(renderer))
1505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
1515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    SVGResourcesCache* cache = resourcesCacheFromRenderObject(renderer);
1525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    cache->addResourcesFromRenderObject(renderer, newStyle);
1535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void SVGResourcesCache::clientWillBeRemovedFromTree(RenderObject* renderer)
1565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!renderer->node())
1585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
1595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    RenderSVGResource::markForLayoutAndParentResourceInvalidation(renderer, false);
1605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!rendererCanHaveResources(renderer))
1625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
1635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    SVGResourcesCache* cache = resourcesCacheFromRenderObject(renderer);
1645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    cache->removeResourcesFromRenderObject(renderer);
1655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void SVGResourcesCache::clientDestroyed(RenderObject* renderer)
1685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(renderer);
1705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    SVGResources* resources = SVGResourcesCache::cachedResourcesForRenderObject(renderer);
1725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (resources)
1735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        resources->removeClientFromCache(renderer);
1745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    SVGResourcesCache* cache = resourcesCacheFromRenderObject(renderer);
1765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    cache->removeResourcesFromRenderObject(renderer);
1775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void SVGResourcesCache::resourceDestroyed(RenderSVGResourceContainer* resource)
1805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(resource);
1825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    SVGResourcesCache* cache = resourcesCacheFromRenderObject(resource);
1835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // The resource itself may have clients, that need to be notified.
1855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    cache->removeResourcesFromRenderObject(resource);
1865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
18781a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)        CacheMap::iterator end = cache->m_cache.end();
18881a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)        for (CacheMap::iterator it = cache->m_cache.begin(); it != end; ++it) {
1895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        it->value->resourceDestroyed(resource);
1905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // Mark users of destroyed resources as pending resolution based on the id of the old resource.
1928abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)        Element* resourceElement = resource->element();
193926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        Element* clientElement = toElement(it->key->node());
194d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        SVGDocumentExtensions& extensions = clientElement->document().accessSVGExtensions();
1955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
196d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        extensions.addPendingResource(resourceElement->fastGetAttribute(HTMLNames::idAttr), clientElement);
1975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
201