Index: third_party/WebKit/Source/core/layout/svg/SVGResources.cpp |
diff --git a/third_party/WebKit/Source/core/layout/svg/SVGResources.cpp b/third_party/WebKit/Source/core/layout/svg/SVGResources.cpp |
index d2f4c08b6d4cd55a8fceab49ccad638cc11cc759..7c08f2fbde7816aeca1ca89bb80ecf377eca5f45 100644 |
--- a/third_party/WebKit/Source/core/layout/svg/SVGResources.cpp |
+++ b/third_party/WebKit/Source/core/layout/svg/SVGResources.cpp |
@@ -157,12 +157,15 @@ template <typename ContainerType> |
ContainerType* AttachToResource(SVGTreeScopeResources& tree_scope_resources, |
const AtomicString& id, |
SVGElement& element) { |
- if (LayoutSVGResourceContainer* container = |
- tree_scope_resources.ResourceById(id)) { |
+ SVGTreeScopeResources::Resource* resource = |
+ tree_scope_resources.ResourceForId(id); |
+ if (!resource) |
+ return nullptr; |
+ if (LayoutSVGResourceContainer* container = resource->ResourceContainer()) { |
if (IsResourceOfType<ContainerType>(container)) |
return static_cast<ContainerType*>(container); |
} |
- tree_scope_resources.AddPendingResource(id, element); |
+ resource->AddWatch(element); |
return nullptr; |
} |
} |
@@ -279,6 +282,22 @@ std::unique_ptr<SVGResources> SVGResources::BuildResources( |
: std::move(resources); |
} |
+void SVGResources::RemoveUnreferencedResources(const LayoutObject& object) { |
+ SVGTreeScopeResources& tree_scope_resources = |
+ ToSVGElement(*object.GetNode()) |
+ .TreeScopeForIdResolution() |
+ .EnsureSVGTreeScopedResources(); |
+ tree_scope_resources.RemoveUnreferencedResources(); |
+} |
+ |
+void SVGResources::RemoveWatchesForElement(Element& element) { |
+ SECURITY_DCHECK(element.IsSVGElement()); |
+ SVGElement& svg_element = ToSVGElement(element); |
+ SVGTreeScopeResources& tree_scope_resources = |
+ svg_element.TreeScopeForIdResolution().EnsureSVGTreeScopedResources(); |
+ tree_scope_resources.RemoveWatchesForElement(svg_element); |
+} |
+ |
void SVGResources::LayoutIfNeeded() { |
if (clipper_filter_masker_data_) { |
if (LayoutSVGResourceClipper* clipper = |