Commit 94060b99 authored by Jacek Caban's avatar Jacek Caban Committed by Alexandre Julliard

mshtml: Make nsIDOMHTMLDocument reference cycle collectable.

parent e9cc7676
......@@ -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);
......
......@@ -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) {
......
......@@ -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 {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment