mshtml: Store MSHTML node reference in Gecko node object and get rid of all node list in document object.

This commit is contained in:
Jacek Caban 2012-07-19 11:29:34 +02:00 committed by Alexandre Julliard
parent 94060b99c9
commit 12f1fbb7a4
3 changed files with 32 additions and 38 deletions

View File

@ -2080,7 +2080,6 @@ static void HTMLDocumentNode_destructor(HTMLDOMNode *iface)
detach_selection(This);
detach_ranges(This);
release_nodes(This);
while(!list_empty(&This->plugin_hosts))
detach_plugin_host(LIST_ENTRY(list_head(&This->plugin_hosts), PluginHost, entry));

View File

@ -17,6 +17,7 @@
*/
#include <stdarg.h>
#include <assert.h>
#define COBJMACROS
@ -1028,6 +1029,8 @@ void HTMLDOMNode_destructor(HTMLDOMNode *This)
{
if(This->nsnode)
nsIDOMNode_Release(This->nsnode);
if(This->doc && &This->doc->node != This)
htmldoc_release(&This->doc->basedoc);
if(This->event_target)
release_event_target(This->event_target);
}
@ -1045,17 +1048,23 @@ static const NodeImplVtbl HTMLDOMNodeImplVtbl = {
void HTMLDOMNode_Init(HTMLDocumentNode *doc, HTMLDOMNode *node, nsIDOMNode *nsnode)
{
nsresult nsres;
node->IHTMLDOMNode_iface.lpVtbl = &HTMLDOMNodeVtbl;
node->IHTMLDOMNode2_iface.lpVtbl = &HTMLDOMNode2Vtbl;
ccref_init(&node->ccref, &doc->node != node ? 2 : 1);
ccref_init(&node->ccref, 1);
if(&doc->node != node)
htmldoc_addref(&doc->basedoc);
node->doc = doc;
if(nsnode)
nsIDOMNode_AddRef(nsnode);
node->nsnode = nsnode;
node->next = doc->nodes;
doc->nodes = node;
nsres = nsIDOMNode_SetMshtmlNode(nsnode, (nsISupports*)&node->IHTMLDOMNode_iface);
assert(nsres == NS_OK);
}
static HRESULT create_node(HTMLDocumentNode *doc, nsIDOMNode *nsnode, HTMLDOMNode **ret)
@ -1123,6 +1132,8 @@ static nsresult NSAPI HTMLDOMNode_traverse(void *ccp, void *p, nsCycleCollection
if(This->nsnode)
note_cc_edge((nsISupports*)This->nsnode, "This->nsnode", cb);
if(This->doc && &This->doc->node != This)
note_cc_edge((nsISupports*)&This->doc->node.IHTMLDOMNode_iface, "This->doc", cb);
dispex_traverse(&This->dispex, cb);
if(This->vtbl->traverse)
@ -1148,6 +1159,14 @@ static nsresult NSAPI HTMLDOMNode_unlink(void *p)
nsIDOMNode_Release(nsnode);
}
if(This->doc && &This->doc->node != This) {
HTMLDocument *doc = &This->doc->basedoc;
This->doc = NULL;
htmldoc_release(doc);
}else {
This->doc = NULL;
}
return NS_OK;
}
@ -1162,43 +1181,23 @@ void init_node_cc(void)
ccp_init(&node_ccp, &node_ccp_callback);
}
/*
* FIXME
* List looks really ugly here. We should use a better data structure or
* (better) find a way to store HTMLDOMelement pointer in nsIDOMNode.
*/
HRESULT get_node(HTMLDocumentNode *This, nsIDOMNode *nsnode, BOOL create, HTMLDOMNode **ret)
{
HTMLDOMNode *iter = This->nodes;
nsISupports *unk = NULL;
nsresult nsres;
while(iter) {
if(iter->nsnode == nsnode)
break;
iter = iter->next;
nsres = nsIDOMNode_GetMshtmlNode(nsnode, &unk);
assert(nsres == NS_OK);
if(unk) {
*ret = get_node_obj(This, (IUnknown*)unk);
return NS_OK;
}
if(iter || !create) {
if(iter)
IHTMLDOMNode_AddRef(&iter->IHTMLDOMNode_iface);
*ret = iter;
if(!create) {
*ret = NULL;
return S_OK;
}
return create_node(This, nsnode, ret);
}
void release_nodes(HTMLDocumentNode *This)
{
HTMLDOMNode *iter, *next;
if(!This->nodes)
return;
for(iter = This->nodes; iter; iter = next) {
next = iter->next;
iter->doc = NULL;
if(&This->node != iter)
IHTMLDOMNode_Release(&iter->IHTMLDOMNode_iface);
}
}

View File

@ -603,8 +603,6 @@ struct HTMLDOMNode {
HTMLDocumentNode *doc;
event_target_t *event_target;
ConnectionPointContainer *cp_container;
HTMLDOMNode *next;
};
static inline void node_addref(HTMLDOMNode *node)
@ -673,7 +671,6 @@ struct HTMLDocumentNode {
LONG ref;
nsIDOMHTMLDocument *nsdoc;
HTMLDOMNode *nodes;
BOOL content_ready;
event_target_t *body_event_target;
@ -881,7 +878,6 @@ HRESULT HTMLFrameBase_QI(HTMLFrameBase*,REFIID,void**) DECLSPEC_HIDDEN;
void HTMLFrameBase_destructor(HTMLFrameBase*) DECLSPEC_HIDDEN;
HRESULT get_node(HTMLDocumentNode*,nsIDOMNode*,BOOL,HTMLDOMNode**) DECLSPEC_HIDDEN;
void release_nodes(HTMLDocumentNode*) DECLSPEC_HIDDEN;
HTMLElement *unsafe_impl_from_IHTMLElement(IHTMLElement*) DECLSPEC_HIDDEN;