Fix lifetime handling of SVGPropertyTearOffs
[WebKit-https.git] / Source / WebCore / svg / properties / SVGPropertyTearOff.h
index 13c0fa54970ddebadc16e6be078a1b1789121ce2..dafb2d6bef7f9c1ac004a3fec865fa2a6deaf8a3 100644 (file)
 #include "SVGAnimatedProperty.h"
 #include "SVGElement.h"
 #include "SVGProperty.h"
+#include <wtf/WeakPtr.h>
 
 namespace WebCore {
 
+class SVGPropertyTearOffBase : public SVGProperty {
+public:
+    virtual void detachWrapper() = 0;
+};
+
 template<typename PropertyType>
-class SVGPropertyTearOff : public SVGProperty {
+class SVGPropertyTearOff : public SVGPropertyTearOffBase {
 public:
     typedef SVGPropertyTearOff<PropertyType> Self;
 
@@ -71,11 +77,18 @@ public:
         return m_contextElement.get();
     }
 
-    void detachWrapper()
+    void addChild(WeakPtr<SVGPropertyTearOffBase> child)
+    {
+        m_childTearOffs.append(child);
+    }
+
+    virtual void detachWrapper() override
     {
         if (m_valueIsCopy)
             return;
 
+        detachChildren();
+
         // Switch from a live value, to a non-live value.
         // For example: <text x="50"/>
         // var item = text.x.baseVal.getItem(0);
@@ -132,10 +145,20 @@ protected:
             delete m_value;
     }
 
+    void detachChildren()
+    {
+        for (const auto& childTearOff : m_childTearOffs) {
+            if (childTearOff.get())
+                childTearOff.get()->detachWrapper();
+        }
+        m_childTearOffs.clear();
+    }
+
     RefPtr<SVGElement> m_contextElement;
     SVGAnimatedProperty* m_animatedProperty;
     SVGPropertyRole m_role;
     PropertyType* m_value;
+    Vector<WeakPtr<SVGPropertyTearOffBase>> m_childTearOffs;
     bool m_valueIsCopy : 1;
 };