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