diff options
Diffstat (limited to 'Source/WebCore/rendering/svg/SVGResourcesCache.cpp')
-rw-r--r-- | Source/WebCore/rendering/svg/SVGResourcesCache.cpp | 76 |
1 files changed, 29 insertions, 47 deletions
diff --git a/Source/WebCore/rendering/svg/SVGResourcesCache.cpp b/Source/WebCore/rendering/svg/SVGResourcesCache.cpp index fad518a32..83d912eeb 100644 --- a/Source/WebCore/rendering/svg/SVGResourcesCache.cpp +++ b/Source/WebCore/rendering/svg/SVGResourcesCache.cpp @@ -20,8 +20,6 @@ #include "config.h" #include "SVGResourcesCache.h" -#if ENABLE(SVG) -#include "HTMLNames.h" #include "RenderSVGResourceContainer.h" #include "SVGResources.h" #include "SVGResourcesCycleSolver.h" @@ -40,15 +38,13 @@ void SVGResourcesCache::addResourcesFromRenderer(RenderElement& renderer, const { ASSERT(!m_cache.contains(&renderer)); - const SVGRenderStyle& svgStyle = style.svgStyle(); - // Build a list of all resources associated with the passed RenderObject - OwnPtr<SVGResources> newResources = adoptPtr(new SVGResources); - if (!newResources->buildCachedResources(renderer, svgStyle)) + auto newResources = std::make_unique<SVGResources>(); + if (!newResources->buildCachedResources(renderer, style)) return; // Put object in cache. - SVGResources& resources = *m_cache.add(&renderer, newResources.release()).iterator->value; + SVGResources& resources = *m_cache.add(&renderer, WTFMove(newResources)).iterator->value; // Run cycle-detection _afterwards_, so self-references can be caught as well. SVGResourcesCycleSolver solver(renderer, resources); @@ -58,13 +54,13 @@ void SVGResourcesCache::addResourcesFromRenderer(RenderElement& renderer, const HashSet<RenderSVGResourceContainer*> resourceSet; resources.buildSetOfResources(resourceSet); - for (auto it = resourceSet.begin(), end = resourceSet.end(); it != end; ++it) - (*it)->addClient(&renderer); + for (auto* resourceContainer : resourceSet) + resourceContainer->addClient(renderer); } void SVGResourcesCache::removeResourcesFromRenderer(RenderElement& renderer) { - OwnPtr<SVGResources> resources = m_cache.take(&renderer); + std::unique_ptr<SVGResources> resources = m_cache.take(&renderer); if (!resources) return; @@ -72,29 +68,23 @@ void SVGResourcesCache::removeResourcesFromRenderer(RenderElement& renderer) HashSet<RenderSVGResourceContainer*> resourceSet; resources->buildSetOfResources(resourceSet); - for (auto it = resourceSet.begin(), end = resourceSet.end(); it != end; ++it) - (*it)->removeClient(&renderer); + for (auto* resourceContainer : resourceSet) + resourceContainer->removeClient(renderer); } -static inline SVGResourcesCache* resourcesCacheFromRenderObject(const RenderObject& renderer) +static inline SVGResourcesCache& resourcesCacheFromRenderer(const RenderElement& renderer) { - SVGDocumentExtensions* extensions = renderer.document().accessSVGExtensions(); - ASSERT(extensions); - - SVGResourcesCache* cache = extensions->resourcesCache(); - ASSERT(cache); - - return cache; + return renderer.document().accessSVGExtensions().resourcesCache(); } -SVGResources* SVGResourcesCache::cachedResourcesForRenderObject(const RenderObject& renderer) +SVGResources* SVGResourcesCache::cachedResourcesForRenderer(const RenderElement& renderer) { - return resourcesCacheFromRenderObject(renderer)->m_cache.get(&renderer); + return resourcesCacheFromRenderer(renderer).m_cache.get(&renderer); } void SVGResourcesCache::clientLayoutChanged(RenderElement& renderer) { - SVGResources* resources = SVGResourcesCache::cachedResourcesForRenderObject(renderer); + auto* resources = SVGResourcesCache::cachedResourcesForRenderer(renderer); if (!resources) return; @@ -122,15 +112,15 @@ void SVGResourcesCache::clientStyleChanged(RenderElement& renderer, StyleDiffere // FIXME: Avoid passing in a useless StyleDifference, but instead compare oldStyle/newStyle to see which resources changed // to be able to selectively rebuild individual resources, instead of all of them. if (rendererCanHaveResources(renderer)) { - SVGResourcesCache* cache = resourcesCacheFromRenderObject(renderer); - cache->removeResourcesFromRenderer(renderer); - cache->addResourcesFromRenderer(renderer, newStyle); + auto& cache = resourcesCacheFromRenderer(renderer); + cache.removeResourcesFromRenderer(renderer); + cache.addResourcesFromRenderer(renderer, newStyle); } RenderSVGResource::markForLayoutAndParentResourceInvalidation(renderer, false); if (renderer.element() && !renderer.element()->isSVGElement()) - renderer.element()->setNeedsStyleRecalc(SyntheticStyleChange); + renderer.element()->invalidateStyleAndLayerComposition(); } void SVGResourcesCache::clientWasAddedToTree(RenderObject& renderer) @@ -142,9 +132,8 @@ void SVGResourcesCache::clientWasAddedToTree(RenderObject& renderer) if (!rendererCanHaveResources(renderer)) return; - RenderElement& elementRenderer = toRenderElement(renderer); - SVGResourcesCache* cache = resourcesCacheFromRenderObject(elementRenderer); - cache->addResourcesFromRenderer(elementRenderer, elementRenderer.style()); + RenderElement& elementRenderer = downcast<RenderElement>(renderer); + resourcesCacheFromRenderer(elementRenderer).addResourcesFromRenderer(elementRenderer, elementRenderer.style()); } void SVGResourcesCache::clientWillBeRemovedFromTree(RenderObject& renderer) @@ -156,40 +145,33 @@ void SVGResourcesCache::clientWillBeRemovedFromTree(RenderObject& renderer) if (!rendererCanHaveResources(renderer)) return; - RenderElement& elementRenderer = toRenderElement(renderer); - SVGResourcesCache* cache = resourcesCacheFromRenderObject(elementRenderer); - cache->removeResourcesFromRenderer(elementRenderer); + RenderElement& elementRenderer = downcast<RenderElement>(renderer); + resourcesCacheFromRenderer(elementRenderer).removeResourcesFromRenderer(elementRenderer); } void SVGResourcesCache::clientDestroyed(RenderElement& renderer) { - SVGResources* resources = SVGResourcesCache::cachedResourcesForRenderObject(renderer); - if (resources) + if (auto* resources = SVGResourcesCache::cachedResourcesForRenderer(renderer)) resources->removeClientFromCache(renderer); - SVGResourcesCache* cache = resourcesCacheFromRenderObject(renderer); - cache->removeResourcesFromRenderer(renderer); + resourcesCacheFromRenderer(renderer).removeResourcesFromRenderer(renderer); } void SVGResourcesCache::resourceDestroyed(RenderSVGResourceContainer& resource) { - SVGResourcesCache* cache = resourcesCacheFromRenderObject(resource); + auto& cache = resourcesCacheFromRenderer(resource); // The resource itself may have clients, that need to be notified. - cache->removeResourcesFromRenderer(resource); + cache.removeResourcesFromRenderer(resource); - for (auto it = cache->m_cache.begin(), end = cache->m_cache.end(); it != end; ++it) { - it->value->resourceDestroyed(resource); + for (auto& it : cache.m_cache) { + it.value->resourceDestroyed(resource); // Mark users of destroyed resources as pending resolution based on the id of the old resource. Element& resourceElement = resource.element(); - Element* clientElement = toElement(it->key->node()); - SVGDocumentExtensions* extensions = clientElement->document().accessSVGExtensions(); - - extensions->addPendingResource(resourceElement.getIdAttribute(), clientElement); + Element* clientElement = it.key->element(); + clientElement->document().accessSVGExtensions().addPendingResource(resourceElement.getIdAttribute(), clientElement); } } } - -#endif |