void SVGResourcesCache::clientStyleChanged(RenderObject* renderer, StyleDifference diff, const RenderStyle* newStyle) { ASSERT(renderer); if (diff == StyleDifferenceEqual || !renderer->parent()) return; // In this case the proper SVGFE*Element will decide whether the modified CSS properties require a relayout or repaint. if (renderer->isSVGResourceFilterPrimitive() && (diff == StyleDifferenceRepaint || diff == StyleDifferenceRepaintIfText)) return; // Dynamic changes of CSS properties like 'clip-path' may require us to recompute the associated resources for a renderer. // 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->removeResourcesFromRenderObject(renderer); cache->addResourcesFromRenderObject(renderer, newStyle); } RenderSVGResource::markForLayoutAndParentResourceInvalidation(renderer, false); // FIXME: This doesn't look right, we often go through here in styleDidChange which means // we're changing the needsStyleRecalc bits in the middle of recalcStyle on ourself which // makes no sense. It's also not clear why we'd go through here for non-SVG elements. if (renderer->node() && !renderer->node()->isSVGElement()) renderer->node()->setNeedsStyleRecalc(LocalStyleChange, StyleChangeFromRenderer); }
void SVGResourcesCache::clientDestroyed(RenderElement& renderer) { SVGResources* resources = SVGResourcesCache::cachedResourcesForRenderObject(renderer); if (resources) resources->removeClientFromCache(renderer); SVGResourcesCache* cache = resourcesCacheFromRenderObject(renderer); cache->removeResourcesFromRenderer(renderer); }
void SVGResourcesCache::clientUpdatedFromElement(RenderObject* renderer, const RenderStyle* newStyle) { ASSERT(renderer); ASSERT(renderer->parent()); SVGResourcesCache* cache = resourcesCacheFromRenderObject(renderer); cache->removeResourcesFromRenderObject(renderer); cache->addResourcesFromRenderObject(renderer, newStyle); }
void SVGResourcesCache::clientWasAddedToTree(RenderObject* renderer, const RenderStyle* newStyle) { if (!renderer->node()) return; RenderSVGResource::markForLayoutAndParentResourceInvalidation(renderer, false); if (!rendererCanHaveResources(renderer)) return; SVGResourcesCache* cache = resourcesCacheFromRenderObject(renderer); cache->addResourcesFromRenderObject(renderer, newStyle); }
void SVGResourcesCache::clientDestroyed(LayoutObject* layoutObject) { ASSERT(layoutObject); SVGResources* resources = SVGResourcesCache::cachedResourcesForLayoutObject(layoutObject); if (resources) resources->removeClientFromCache(layoutObject); SVGResourcesCache* cache = resourcesCacheFromLayoutObject(layoutObject); cache->removeResourcesFromLayoutObject(layoutObject); }
void SVGResourcesCache::clientWillBeRemovedFromTree(LayoutObject* layoutObject) { if (!layoutObject->node()) return; LayoutSVGResourceContainer::markForLayoutAndParentResourceInvalidation(layoutObject, false); if (!layoutObjectCanHaveResources(layoutObject)) return; SVGResourcesCache* cache = resourcesCacheFromLayoutObject(layoutObject); cache->removeResourcesFromLayoutObject(layoutObject); }
void SVGResourcesCache::clientWasAddedToTree(LayoutObject* layoutObject, const ComputedStyle& newStyle) { if (!layoutObject->node()) return; LayoutSVGResourceContainer::markForLayoutAndParentResourceInvalidation(layoutObject, false); if (!layoutObjectCanHaveResources(layoutObject)) return; SVGResourcesCache* cache = resourcesCacheFromLayoutObject(layoutObject); cache->addResourcesFromLayoutObject(layoutObject, newStyle); }
void SVGResourcesCache::clientWillBeRemovedFromTree(RenderObject* renderer) { if (!renderer->node()) return; RenderSVGResource::markForLayoutAndParentResourceInvalidation(renderer, false); if (!rendererCanHaveResources(renderer)) return; SVGResourcesCache* cache = resourcesCacheFromRenderObject(renderer); cache->removeResourcesFromRenderObject(renderer); }
void SVGResourcesCache::resourceDestroyed(RenderSVGResourceContainer* resource) { ASSERT(resource); SVGResourcesCache* cache = resourcesCacheFromRenderObject(resource); // The resource itself may have clients, that need to be notified. cache->removeResourcesFromRenderObject(resource); HashMap<RenderObject*, SVGResources*>::iterator end = cache->m_cache.end(); for (HashMap<RenderObject*, SVGResources*>::iterator it = cache->m_cache.begin(); it != end; ++it) it->second->resourceDestroyed(resource); }
void SVGResourcesCache::clientWillBeRemovedFromTree(RenderObject& renderer) { if (renderer.isAnonymous()) return; RenderSVGResource::markForLayoutAndParentResourceInvalidation(renderer, false); if (!rendererCanHaveResources(renderer)) return; RenderElement& elementRenderer = toRenderElement(renderer); SVGResourcesCache* cache = resourcesCacheFromRenderObject(elementRenderer); cache->removeResourcesFromRenderer(elementRenderer); }
void SVGResourcesCache::clientUpdatedFromElement(RenderObject* renderer, const RenderStyle* newStyle) { ASSERT(renderer); ASSERT(renderer->parent()); SVGResourcesCache* cache = resourcesCacheFromRenderObject(renderer); cache->removeResourcesFromRenderObject(renderer); cache->addResourcesFromRenderObject(renderer, newStyle); #if ENABLE(FILTERS) SVGResources* resources = SVGResourcesCache::cachedResourcesForRenderObject(renderer); if (resources && resources->filter()) resources->removeClientFromCache(renderer); #endif }
void SVGResourcesCache::resourceDestroyed(RenderSVGResourceContainer& resource) { SVGResourcesCache* cache = resourcesCacheFromRenderObject(resource); // The resource itself may have clients, that need to be notified. cache->removeResourcesFromRenderer(resource); for (auto it = cache->m_cache.begin(), end = cache->m_cache.end(); it != end; ++it) { 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); } }
void SVGResourcesCache::resourceDestroyed(LayoutSVGResourceContainer* resource) { ASSERT(resource); SVGResourcesCache* cache = resourcesCacheFromLayoutObject(resource); // The resource itself may have clients, that need to be notified. cache->removeResourcesFromLayoutObject(resource); for (auto& objectResources : cache->m_cache) { objectResources.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(objectResources.key->node()); SVGDocumentExtensions& extensions = clientElement->document().accessSVGExtensions(); extensions.addPendingResource(resourceElement->fastGetAttribute(HTMLNames::idAttr), clientElement); } }
void SVGResourcesCache::resourceDestroyed(RenderSVGResourceContainer* resource) { ASSERT(resource); SVGResourcesCache* cache = resourcesCacheFromRenderObject(resource); // The resource itself may have clients, that need to be notified. cache->removeResourcesFromRenderObject(resource); HashMap<RenderObject*, SVGResources*>::iterator end = cache->m_cache.end(); for (HashMap<RenderObject*, SVGResources*>::iterator it = cache->m_cache.begin(); it != end; ++it) { it->second->resourceDestroyed(resource); // Mark users of destroyed resources as pending resolution based on the id of the old resource. Element* resourceElement = toElement(resource->node()); SVGStyledElement* clientElement = toSVGStyledElement(it->first->node()); SVGDocumentExtensions* extensions = clientElement->document()->accessSVGExtensions(); extensions->addPendingResource(resourceElement->fastGetAttribute(HTMLNames::idAttr), clientElement); } }
void SVGResourcesCache::clientStyleChanged(RenderElement& renderer, StyleDifference diff, const RenderStyle& newStyle) { if (diff == StyleDifferenceEqual || !renderer.parent()) return; // In this case the proper SVGFE*Element will decide whether the modified CSS properties require a relayout or repaint. if (renderer.isSVGResourceFilterPrimitive() && (diff == StyleDifferenceRepaint || diff == StyleDifferenceRepaintIfTextOrBorderOrOutline)) return; // Dynamic changes of CSS properties like 'clip-path' may require us to recompute the associated resources for a renderer. // 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); } RenderSVGResource::markForLayoutAndParentResourceInvalidation(renderer, false); if (renderer.element() && !renderer.element()->isSVGElement()) renderer.element()->setNeedsStyleRecalc(SyntheticStyleChange); }
void SVGResourcesCache::clientStyleChanged(LayoutObject* layoutObject, StyleDifference diff, const ComputedStyle& newStyle) { ASSERT(layoutObject); ASSERT(layoutObject->node()); ASSERT(layoutObject->node()->isSVGElement()); if (!diff.hasDifference() || !layoutObject->parent()) return; // In this case the proper SVGFE*Element will decide whether the modified CSS properties require a relayout or paintInvalidation. if (layoutObject->isSVGResourceFilterPrimitive() && !diff.needsLayout()) return; // Dynamic changes of CSS properties like 'clip-path' may require us to recompute the associated resources for a layoutObject. // 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 (layoutObjectCanHaveResources(layoutObject)) { SVGResourcesCache* cache = resourcesCacheFromLayoutObject(layoutObject); cache->removeResourcesFromLayoutObject(layoutObject); cache->addResourcesFromLayoutObject(layoutObject, newStyle); } LayoutSVGResourceContainer::markForLayoutAndParentResourceInvalidation(layoutObject, false); }
void SVGResourcesCache::clientDestroyed(RenderObject* renderer) { ASSERT(renderer); SVGResourcesCache* cache = resourcesCacheFromRenderObject(renderer); cache->removeResourcesFromRenderObject(renderer); }