Reviewed by Dave Harrison.
authortomernic <tomernic@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 25 Jan 2006 22:05:33 +0000 (22:05 +0000)
committertomernic <tomernic@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 25 Jan 2006 22:05:33 +0000 (22:05 +0000)
        <rdar://problem/4339024>
        <http://bugzilla.opendarwin.org/show_bug.cgi?id=6785> "Fix for possible leak of applet, object, or embed
        (and plugin view)"

        * khtml/html/html_objectimpl.cpp:
        (WebCore::HTMLAppletElementImpl::~HTMLAppletElementImpl):
        Assert that appletInstance has been deleted by detach().
        (WebCore::HTMLAppletElementImpl::detach):
        Delete appletInstance, because it references the widget owned by the renderer we're about to destroy.
        It is assumed elsewhere (getRuntimeObject(), kjs_dom.cpp) that the instance is owned by the applet
        element.  Therefore, it is required that the element destroy the instance in its tear-down phase.
        (WebCore::HTMLEmbedElementImpl::~HTMLEmbedElementImpl):
        Assert that embedInstance has been deleted by detach().
        (WebCore::HTMLEmbedElementImpl::detach):
        Delete embedInstance, same reason.  This is the one that fixes <rdar://problem/4339024>.
        (WebCore::HTMLObjectElementImpl::~HTMLObjectElementImpl):
        Assert that objectInstance has been deleted by detach().
        (WebCore::HTMLObjectElementImpl::detach):
        Delete embedInstance, same reason.
        * khtml/html/html_objectimpl.h:
        Declared HTMLAppletElementImpl::detach() and HTMLEmbedElementImpl::detach().

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@12362 268f45cc-cd09-0410-ab3c-d52691b4dbfc

WebCore/ChangeLog
WebCore/khtml/html/html_objectimpl.cpp
WebCore/khtml/html/html_objectimpl.h

index 4e585c0..20e6e90 100644 (file)
@@ -1,3 +1,29 @@
+2006-01-24  Tim Omernick  <timo@apple.com>
+
+        Reviewed by Dave Harrison.
+
+        <rdar://problem/4339024>
+        <http://bugzilla.opendarwin.org/show_bug.cgi?id=6785> "Fix for possible leak of applet, object, or embed
+        (and plugin view)"
+        
+        * khtml/html/html_objectimpl.cpp:
+        (WebCore::HTMLAppletElementImpl::~HTMLAppletElementImpl):
+        Assert that appletInstance has been deleted by detach().
+        (WebCore::HTMLAppletElementImpl::detach):
+        Delete appletInstance, because it references the widget owned by the renderer we're about to destroy.
+        It is assumed elsewhere (getRuntimeObject(), kjs_dom.cpp) that the instance is owned by the applet
+        element.  Therefore, it is required that the element destroy the instance in its tear-down phase.
+        (WebCore::HTMLEmbedElementImpl::~HTMLEmbedElementImpl):
+        Assert that embedInstance has been deleted by detach().
+        (WebCore::HTMLEmbedElementImpl::detach):
+        Delete embedInstance, same reason.  This is the one that fixes <rdar://problem/4339024>.
+        (WebCore::HTMLObjectElementImpl::~HTMLObjectElementImpl):
+        Assert that objectInstance has been deleted by detach().
+        (WebCore::HTMLObjectElementImpl::detach):
+        Delete embedInstance, same reason.
+        * khtml/html/html_objectimpl.h:
+        Declared HTMLAppletElementImpl::detach() and HTMLEmbedElementImpl::detach().
+
 2006-01-24  Anders Carlsson  <andersca@mac.com>
 
         Reviewed by Darin.
index 49eccce..72b7ad9 100644 (file)
@@ -59,7 +59,8 @@ HTMLAppletElementImpl::HTMLAppletElementImpl(DocumentImpl *doc)
 
 HTMLAppletElementImpl::~HTMLAppletElementImpl()
 {
-    delete appletInstance;
+    // appletInstance should have been cleaned up in detach().
+    assert(!appletInstance);
 }
 
 bool HTMLAppletElementImpl::checkDTD(const NodeImpl* newChild)
@@ -223,6 +224,17 @@ void HTMLAppletElementImpl::closeRenderer()
     HTMLElementImpl::closeRenderer();
 }
 
+void HTMLAppletElementImpl::detach()
+{
+    // Delete appletInstance, because it references the widget owned by the renderer we're about to destroy.
+    if (appletInstance) {
+        delete appletInstance;
+        appletInstance = 0;
+    }
+
+    HTMLElementImpl::detach();
+}
+
 bool HTMLAppletElementImpl::allParamsAvailable()
 {
     return m_allParamsAvailable;
@@ -346,6 +358,8 @@ HTMLEmbedElementImpl::HTMLEmbedElementImpl(DocumentImpl *doc)
 
 HTMLEmbedElementImpl::~HTMLEmbedElementImpl()
 {
+    // embedInstance should have been cleaned up in detach().
+    assert(!embedInstance);
 }
 
 bool HTMLEmbedElementImpl::checkDTD(const NodeImpl* newChild)
@@ -486,6 +500,17 @@ void HTMLEmbedElementImpl::attach()
         static_cast<RenderPartObject*>(renderer())->updateWidget();
 }
 
+void HTMLEmbedElementImpl::detach()
+{
+    // Delete embedInstance, because it references the widget owned by the renderer we're about to destroy.
+    if (embedInstance) {
+        delete embedInstance;
+        embedInstance = 0;
+    }
+
+    HTMLElementImpl::detach();
+}
+
 void HTMLEmbedElementImpl::insertedIntoDocument()
 {
     if (getDocument()->isHTMLDocument()) {
@@ -524,6 +549,9 @@ HTMLObjectElementImpl::HTMLObjectElementImpl(DocumentImpl *doc)
 
 HTMLObjectElementImpl::~HTMLObjectElementImpl()
 {
+    // objectInstance should have been cleaned up in detach().
+    assert(!objectInstance);
+    
     delete m_imageLoader;
 }
 
@@ -731,6 +759,12 @@ void HTMLObjectElementImpl::detach()
         needWidgetUpdate = true;
     }
 
+    // Delete objectInstance, because it references the widget owned by the renderer we're about to destroy.
+    if (objectInstance) {
+        delete objectInstance;
+        objectInstance = 0;
+    }
+    
     HTMLElementImpl::detach();
 }
 
index f147837..8ae0a9b 100644 (file)
@@ -55,6 +55,7 @@ public:
     virtual bool rendererIsNeeded(khtml::RenderStyle *);
     virtual khtml::RenderObject *createRenderer(RenderArena *, khtml::RenderStyle *);
     virtual void closeRenderer();
+    virtual void detach();
     
     DOMString align() const;
     void setAlign(const DOMString &);
@@ -125,6 +126,7 @@ public:
     virtual void parseMappedAttribute(MappedAttributeImpl *attr);
 
     virtual void attach();
+    virtual void detach();
     virtual bool rendererIsNeeded(khtml::RenderStyle *);
     virtual khtml::RenderObject *createRenderer(RenderArena *, khtml::RenderStyle *);
     virtual void insertedIntoDocument();