void RenderSVGResourceContainer::registerResource() { SVGDocumentExtensions* extensions = svgExtensionsFromNode(node()); if (!extensions->hasPendingResource(m_id)) { extensions->addResource(m_id, this); return; } OwnPtr<SVGDocumentExtensions::SVGPendingElements> clients(extensions->removePendingResource(m_id)); // Cache us with the new id. extensions->addResource(m_id, this); // Update cached resources of pending clients. const SVGDocumentExtensions::SVGPendingElements::const_iterator end = clients->end(); for (SVGDocumentExtensions::SVGPendingElements::const_iterator it = clients->begin(); it != end; ++it) { ASSERT((*it)->hasPendingResources()); extensions->clearHasPendingResourcesIfPossible(*it); RenderObject* renderer = (*it)->renderer(); if (!renderer) continue; SVGResourcesCache::clientStyleChanged(renderer, StyleDifferenceLayout, renderer->style()); renderer->setNeedsLayout(true); } }
void SVGElement::buildPendingResourcesIfNeeded() { Document& document = this->document(); if (!needsPendingResourceHandling() || !inDocument() || isInShadowTree()) return; SVGDocumentExtensions* extensions = document.accessSVGExtensions(); AtomicString resourceId = getIdAttribute(); if (!extensions->hasPendingResource(resourceId)) return; // Mark pending resources as pending for removal. extensions->markPendingResourcesForRemoval(resourceId); // Rebuild pending resources for each client of a pending resource that is being removed. while (Element* clientElement = extensions->removeElementFromPendingResourcesForRemoval(resourceId)) { ASSERT(clientElement->hasPendingResources()); if (clientElement->hasPendingResources()) { clientElement->buildPendingResource(); extensions->clearHasPendingResourcesIfPossible(clientElement); } } }