void SVGElement::buildPendingResourcesIfNeeded() { Document& document = this->document(); if (!needsPendingResourceHandling() || !inDocument() || inUseShadowTree()) 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()) { // FIXME: Ideally we'd always resolve pending resources async instead of inside // insertedInto and svgAttributeChanged. For now we only do it for <use> since // that would stamp out DOM. if (isSVGUseElement(clientElement)) toSVGUseElement(clientElement)->invalidateShadowTree(); else clientElement->buildPendingResource(); extensions.clearHasPendingResourcesIfPossible(clientElement); } } }
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); } } }