Index: third_party/WebKit/Source/core/svg/SVGURIReference.cpp |
diff --git a/third_party/WebKit/Source/core/svg/SVGURIReference.cpp b/third_party/WebKit/Source/core/svg/SVGURIReference.cpp |
index 1b64614fdfd42dfe5c7936857ad187ecd3afba03..86b61bdf9a6a228bff4d6ac487db5bd735e923f5 100644 |
--- a/third_party/WebKit/Source/core/svg/SVGURIReference.cpp |
+++ b/third_party/WebKit/Source/core/svg/SVGURIReference.cpp |
@@ -21,12 +21,29 @@ |
#include "core/svg/SVGURIReference.h" |
#include "core/XLinkNames.h" |
+#include "core/dom/IdTargetObserver.h" |
#include "core/html/parser/HTMLParserIdioms.h" |
#include "core/svg/SVGElement.h" |
#include "platform/weborigin/KURL.h" |
namespace blink { |
+namespace { |
+ |
+class SVGElementReferenceObserver : public IdTargetObserver { |
+ public: |
+ SVGElementReferenceObserver(TreeScope& treeScope, |
+ const AtomicString& id, |
+ std::unique_ptr<WTF::Closure> closure) |
+ : IdTargetObserver(treeScope.idTargetObserverRegistry(), id), |
+ m_closure(std::move(closure)) {} |
+ |
+ private: |
+ void idTargetChanged() override { (*m_closure)(); } |
+ std::unique_ptr<WTF::Closure> m_closure; |
+}; |
+} |
+ |
SVGURIReference::SVGURIReference(SVGElement* element) |
: m_href(SVGAnimatedHref::create(element)) { |
ASSERT(element); |
@@ -98,4 +115,25 @@ Element* SVGURIReference::targetElementFromIRIString( |
return treeScope.getElementById(id); |
} |
+Element* SVGURIReference::observeTarget(Member<IdTargetObserver>& observer, |
+ SVGElement& contextElement) { |
+ DCHECK(!observer); |
+ TreeScope& treeScope = contextElement.treeScope(); |
+ AtomicString id = fragmentIdentifierFromIRIString(hrefString(), treeScope); |
+ if (id.isEmpty()) |
+ return nullptr; |
+ observer = new SVGElementReferenceObserver( |
+ treeScope, id, |
+ WTF::bind(&SVGElement::buildPendingResource, |
+ wrapWeakPersistent(&contextElement))); |
+ return treeScope.getElementById(id); |
+} |
+ |
+void SVGURIReference::unobserveTarget(Member<IdTargetObserver>& observer) { |
+ if (!observer) |
+ return; |
+ observer->unregister(); |
+ observer = nullptr; |
+} |
+ |
} // namespace blink |