Index: third_party/WebKit/Source/core/svg/SVGFEImageElement.cpp |
diff --git a/third_party/WebKit/Source/core/svg/SVGFEImageElement.cpp b/third_party/WebKit/Source/core/svg/SVGFEImageElement.cpp |
index c0127df275ccb55ab8d235c98a0d2c24d7b5138b..c3393388176c0889b1f93ade1c1e5f8bb2437fba 100644 |
--- a/third_party/WebKit/Source/core/svg/SVGFEImageElement.cpp |
+++ b/third_party/WebKit/Source/core/svg/SVGFEImageElement.cpp |
@@ -21,9 +21,11 @@ |
#include "core/svg/SVGFEImageElement.h" |
+#include "core/SVGNames.h" |
#include "core/dom/Document.h" |
+#include "core/dom/IdTargetObserver.h" |
+#include "core/loader/resource/ImageResourceContent.h" |
#include "core/svg/SVGPreserveAspectRatio.h" |
-#include "core/svg/SVGTreeScopeResources.h" |
#include "core/svg/graphics/filters/SVGFEImage.h" |
#include "platform/graphics/Image.h" |
#include "platform/loader/fetch/FetchRequest.h" |
@@ -43,15 +45,13 @@ inline SVGFEImageElement::SVGFEImageElement(Document& document) |
DEFINE_NODE_FACTORY(SVGFEImageElement) |
SVGFEImageElement::~SVGFEImageElement() { |
- if (m_cachedImage) { |
- m_cachedImage->removeObserver(this); |
- m_cachedImage = nullptr; |
- } |
+ clearImageResource(); |
} |
DEFINE_TRACE(SVGFEImageElement) { |
visitor->trace(m_preserveAspectRatio); |
visitor->trace(m_cachedImage); |
+ visitor->trace(m_targetIdObserver); |
SVGFilterPrimitiveStandardAttributes::trace(visitor); |
SVGURIReference::trace(visitor); |
} |
@@ -64,38 +64,36 @@ bool SVGFEImageElement::currentFrameHasSingleSecurityOrigin() const { |
} |
void SVGFEImageElement::clearResourceReferences() { |
- if (m_cachedImage) { |
- m_cachedImage->removeObserver(this); |
- m_cachedImage = nullptr; |
- } |
- |
+ clearImageResource(); |
+ unobserveTarget(m_targetIdObserver); |
removeAllOutgoingReferences(); |
} |
void SVGFEImageElement::fetchImageResource() { |
- FetchRequest request( |
- ResourceRequest(ownerDocument()->completeURL(hrefString())), localName()); |
+ FetchRequest request(ResourceRequest(document().completeURL(hrefString())), |
+ localName()); |
m_cachedImage = ImageResourceContent::fetch(request, document().fetcher()); |
if (m_cachedImage) |
m_cachedImage->addObserver(this); |
} |
+void SVGFEImageElement::clearImageResource() { |
+ if (!m_cachedImage) |
+ return; |
+ m_cachedImage->removeObserver(this); |
+ m_cachedImage = nullptr; |
+} |
+ |
void SVGFEImageElement::buildPendingResource() { |
clearResourceReferences(); |
if (!isConnected()) |
return; |
- AtomicString id; |
- Element* target = SVGURIReference::targetElementFromIRIString( |
- hrefString(), treeScope(), &id); |
+ Element* target = observeTarget(m_targetIdObserver, *this); |
if (!target) { |
- if (id.isEmpty()) { |
+ if (!SVGURLReferenceResolver(hrefString(), document()).isLocal()) |
fetchImageResource(); |
- } else { |
- treeScope().ensureSVGTreeScopedResources().addPendingResource(id, *this); |
- DCHECK(hasPendingResources()); |
- } |
} else if (target->isSVGElement()) { |
// Register us with the target in the dependencies map. Any change of |
// hrefElement that leads to relayout/repainting now informs us, so we can |