Jacek Caban : mshtml: Make nsIDOMHTMLDocument reference cycle collectable.

Alexandre Julliard julliard at winehq.org
Thu Jul 19 13:23:44 CDT 2012


Module: wine
Branch: master
Commit: 94060b99c939413d9425f4c196e36066644421b4
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=94060b99c939413d9425f4c196e36066644421b4

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Thu Jul 19 11:29:13 2012 +0200

mshtml: Make nsIDOMHTMLDocument reference cycle collectable.

---

 dlls/mshtml/htmldoc.c        |   43 ++++++++++++++++++++++++++++++++++++++---
 dlls/mshtml/htmlnode.c       |    6 +++++
 dlls/mshtml/mshtml_private.h |    2 +
 3 files changed, 47 insertions(+), 4 deletions(-)

diff --git a/dlls/mshtml/htmldoc.c b/dlls/mshtml/htmldoc.c
index 8d5330e..d78767c 100644
--- a/dlls/mshtml/htmldoc.c
+++ b/dlls/mshtml/htmldoc.c
@@ -2085,8 +2085,10 @@ static void HTMLDocumentNode_destructor(HTMLDOMNode *iface)
     while(!list_empty(&This->plugin_hosts))
         detach_plugin_host(LIST_ENTRY(list_head(&This->plugin_hosts), PluginHost, entry));
 
-    if(This->nsdoc)
+    if(This->nsdoc) {
         release_document_mutation(This);
+        nsIDOMHTMLDocument_Release(This->nsdoc);
+    }
 
     heap_free(This->event_vector);
     destroy_htmldoc(&This->basedoc);
@@ -2099,10 +2101,44 @@ static HRESULT HTMLDocumentNode_clone(HTMLDOMNode *iface, nsIDOMNode *nsnode, HT
     return E_NOTIMPL;
 }
 
+static void HTMLDocumentNode_traverse(HTMLDOMNode *iface, nsCycleCollectionTraversalCallback *cb)
+{
+    HTMLDocumentNode *This = impl_from_HTMLDOMNode(iface);
+
+    if(This->nsdoc)
+        note_cc_edge((nsISupports*)This->nsdoc, "This->nsdoc", cb);
+}
+
+static void HTMLDocumentNode_unlink(HTMLDOMNode *iface)
+{
+    HTMLDocumentNode *This = impl_from_HTMLDOMNode(iface);
+
+    if(This->nsdoc) {
+        nsIDOMHTMLDocument *nsdoc = This->nsdoc;
+
+        release_document_mutation(This);
+        This->nsdoc = NULL;
+        nsIDOMHTMLDocument_Release(nsdoc);
+    }
+}
+
 static const NodeImplVtbl HTMLDocumentNodeImplVtbl = {
     HTMLDocumentNode_QI,
     HTMLDocumentNode_destructor,
-    HTMLDocumentNode_clone
+    HTMLDocumentNode_clone,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    HTMLDocumentNode_traverse,
+    HTMLDocumentNode_unlink
 };
 
 static HRESULT HTMLDocumentFragment_clone(HTMLDOMNode *iface, nsIDOMNode *nsnode, HTMLDOMNode **ret)
@@ -2236,8 +2272,7 @@ HRESULT create_doc_from_nsdoc(nsIDOMHTMLDocument *nsdoc, HTMLDocumentObj *doc_ob
 
     HTMLDOMNode_Init(doc, &doc->node, (nsIDOMNode*)nsdoc);
 
-    /* No AddRef, share the reference with nsnode */
-    assert((nsIDOMNode*)nsdoc == doc->node.nsnode);
+    nsIDOMHTMLDocument_AddRef(nsdoc);
     doc->nsdoc = nsdoc;
 
     init_document_mutation(doc);
diff --git a/dlls/mshtml/htmlnode.c b/dlls/mshtml/htmlnode.c
index 2afcb23..a9e5d3f 100644
--- a/dlls/mshtml/htmlnode.c
+++ b/dlls/mshtml/htmlnode.c
@@ -1125,6 +1125,9 @@ static nsresult NSAPI HTMLDOMNode_traverse(void *ccp, void *p, nsCycleCollection
         note_cc_edge((nsISupports*)This->nsnode, "This->nsnode", cb);
     dispex_traverse(&This->dispex, cb);
 
+    if(This->vtbl->traverse)
+        This->vtbl->traverse(This, cb);
+
     return NS_OK;
 }
 
@@ -1134,6 +1137,9 @@ static nsresult NSAPI HTMLDOMNode_unlink(void *p)
 
     TRACE("%p\n", This);
 
+    if(This->vtbl->unlink)
+        This->vtbl->unlink(This);
+
     dispex_unlink(&This->dispex);
 
     if(This->nsnode) {
diff --git a/dlls/mshtml/mshtml_private.h b/dlls/mshtml/mshtml_private.h
index 803d214..af165bf 100644
--- a/dlls/mshtml/mshtml_private.h
+++ b/dlls/mshtml/mshtml_private.h
@@ -587,6 +587,8 @@ typedef struct {
     HRESULT (*get_dispid)(HTMLDOMNode*,BSTR,DWORD,DISPID*);
     HRESULT (*invoke)(HTMLDOMNode*,DISPID,LCID,WORD,DISPPARAMS*,VARIANT*,EXCEPINFO*,IServiceProvider*);
     HRESULT (*bind_to_tree)(HTMLDOMNode*);
+    void (*traverse)(HTMLDOMNode*,nsCycleCollectionTraversalCallback*);
+    void (*unlink)(HTMLDOMNode*);
 } NodeImplVtbl;
 
 struct HTMLDOMNode {




More information about the wine-cvs mailing list