mshtml: Use vtbl for node destructors.

This commit is contained in:
Jacek Caban 2007-10-04 02:09:48 +02:00 committed by Alexandre Julliard
parent e04cdbb82c
commit f9036c8926
8 changed files with 64 additions and 29 deletions

View File

@ -468,19 +468,23 @@ static const IHTMLAnchorElementVtbl HTMLAnchorElementVtbl = {
static void HTMLAnchorElement_destructor(HTMLDOMNode *iface)
{
HTMLAnchorElement *This = HTMLANCHOR_NODE_THIS(iface);
mshtml_free(This);
HTMLElement_destructor(&This->element.node);
}
#undef HTMLANCHOR_NODE_THIS
static const NodeImplVtbl HTMLAnchorElementImplVtbl = {
HTMLAnchorElement_destructor
};
HTMLElement *HTMLAnchorElement_Create(nsIDOMHTMLElement *nselem)
{
HTMLAnchorElement *ret = mshtml_alloc(sizeof(HTMLAnchorElement));
ret->lpHTMLAnchorElementVtbl = &HTMLAnchorElementVtbl;
ret->element.node.vtbl = &HTMLAnchorElementImplVtbl;
ret->element.impl = (IUnknown*)HTMLANCHOR(ret);
ret->element.destructor = HTMLAnchorElement_destructor;
return &ret->element;
}

View File

@ -481,11 +481,16 @@ static void HTMLBodyElement_destructor(HTMLDOMNode *iface)
ConnectionPointContainer_Destroy(&This->cp_container);
nsIDOMHTMLBodyElement_Release(This->nsbody);
mshtml_free(This);
HTMLElement_destructor(&This->textcont.element.node);
}
#undef HTMLBODY_NODE_THIS
static const NodeImplVtbl HTMLBodyElementImplVtbl = {
HTMLBodyElement_destructor
};
HTMLElement *HTMLBodyElement_Create(nsIDOMHTMLElement *nselem)
{
HTMLBodyElement *ret = mshtml_alloc(sizeof(HTMLBodyElement));
@ -494,6 +499,7 @@ HTMLElement *HTMLBodyElement_Create(nsIDOMHTMLElement *nselem)
TRACE("(%p)->(%p)\n", ret, nselem);
ret->lpHTMLBodyElementVtbl = &HTMLBodyElementVtbl;
ret->textcont.element.node.vtbl = &HTMLBodyElementImplVtbl;
HTMLTextContainer_Init(&ret->textcont);
@ -509,7 +515,6 @@ HTMLElement *HTMLBodyElement_Create(nsIDOMHTMLElement *nselem)
ERR("Could not get nsDOMHTMLBodyElement: %08x\n", nsres);
ret->textcont.element.impl = (IUnknown*)HTMLBODY(ret);
ret->textcont.element.destructor = HTMLBodyElement_destructor;
return &ret->textcont.element;
}

View File

@ -1265,19 +1265,20 @@ HRESULT HTMLElement_QI(HTMLElement *This, REFIID riid, void **ppv)
return HTMLDOMNode_QI(&This->node, riid, ppv);
}
static void HTMLElement_destructor(HTMLDOMNode *iface)
void HTMLElement_destructor(HTMLDOMNode *iface)
{
HTMLElement *This = HTMLELEM_NODE_THIS(iface);
if(This->destructor)
This->destructor(&This->node);
if(This->nselem)
nsIDOMHTMLElement_Release(This->nselem);
mshtml_free(This);
HTMLDOMNode_destructor(&This->node);
}
static const NodeImplVtbl HTMLElementImplVtbl = {
HTMLElement_destructor
};
HTMLElement *HTMLElement_Create(nsIDOMNode *nsnode)
{
nsIDOMHTMLElement *nselem;
@ -1314,9 +1315,9 @@ HTMLElement *HTMLElement_Create(nsIDOMNode *nsnode)
if(!ret) {
ret = mshtml_alloc(sizeof(HTMLElement));
ret->node.vtbl = &HTMLElementImplVtbl;
ret->impl = NULL;
ret->destructor = NULL;
}
nsAString_Finish(&class_name_str);
@ -1327,7 +1328,6 @@ HTMLElement *HTMLElement_Create(nsIDOMNode *nsnode)
HTMLElement2_Init(ret);
ret->node.impl.elem = HTMLELEM(ret);
ret->node.destructor = HTMLElement_destructor;
return ret;
}

View File

@ -733,17 +733,23 @@ static void HTMLInputElement_destructor(HTMLDOMNode *iface)
HTMLInputElement *This = HTMLINPUT_NODE_THIS(iface);
nsIDOMHTMLInputElement_Release(This->nsinput);
mshtml_free(This);
HTMLElement_destructor(&This->element.node);
}
#undef HTMLINPUT_NODE_THIS
static const NodeImplVtbl HTMLInputElementImplVtbl = {
HTMLInputElement_destructor
};
HTMLElement *HTMLInputElement_Create(nsIDOMHTMLElement *nselem)
{
HTMLInputElement *ret = mshtml_alloc(sizeof(HTMLInputElement));
nsresult nsres;
ret->lpHTMLInputElementVtbl = &HTMLInputElementVtbl;
ret->element.node.vtbl = &HTMLInputElementImplVtbl;
nsres = nsIDOMHTMLElement_QueryInterface(nselem, &IID_nsIDOMHTMLInputElement,
(void**)&ret->nsinput);
@ -751,7 +757,6 @@ HTMLElement *HTMLInputElement_Create(nsIDOMHTMLElement *nselem)
ERR("Could not get nsIDOMHTMLInputElement interface: %08x\n", nsres);
ret->element.impl = (IUnknown*)HTMLINPUT(ret);
ret->element.destructor = HTMLInputElement_destructor;
return &ret->element;
}

View File

@ -331,6 +331,16 @@ HRESULT HTMLDOMNode_QI(HTMLDOMNode *This, REFIID riid, void **ppv)
return E_NOINTERFACE;
}
void HTMLDOMNode_destructor(HTMLDOMNode *This)
{
if(This->nsnode)
nsIDOMNode_Release(This->nsnode);
}
static const NodeImplVtbl HTMLDOMNodeImplVtbl = {
HTMLDOMNode_destructor
};
static HTMLDOMNode *create_node(HTMLDocument *doc, nsIDOMNode *nsnode)
{
HTMLDOMNode *ret;
@ -344,8 +354,8 @@ static HTMLDOMNode *create_node(HTMLDocument *doc, nsIDOMNode *nsnode)
break;
default:
ret = mshtml_alloc(sizeof(HTMLDOMNode));
ret->vtbl = &HTMLDOMNodeImplVtbl;
ret->impl.unk = NULL;
ret->destructor = NULL;
}
ret->lpHTMLDOMNodeVtbl = &HTMLDOMNodeVtbl;
@ -393,10 +403,7 @@ void release_nodes(HTMLDocument *This)
for(iter = This->nodes; iter; iter = next) {
next = iter->next;
nsIDOMNode_Release(iter->nsnode);
if(iter->destructor)
iter->destructor(iter);
else
mshtml_free(iter);
iter->vtbl->destructor(iter);
mshtml_free(iter);
}
}

View File

@ -384,17 +384,23 @@ static void HTMLSelectElement_destructor(HTMLDOMNode *iface)
HTMLSelectElement *This = HTMLSELECT_NODE_THIS(iface);
nsIDOMHTMLSelectElement_Release(This->nsselect);
mshtml_free(This);
HTMLElement_destructor(&This->element.node);
}
#undef HTMLSELECT_NODE_THIS
static const NodeImplVtbl HTMLSelectElementImplVtbl = {
HTMLSelectElement_destructor
};
HTMLElement *HTMLSelectElement_Create(nsIDOMHTMLElement *nselem)
{
HTMLSelectElement *ret = mshtml_alloc(sizeof(HTMLSelectElement));
nsresult nsres;
ret->lpHTMLSelectElementVtbl = &HTMLSelectElementVtbl;
ret->element.node.vtbl = &HTMLSelectElementImplVtbl;
nsres = nsIDOMHTMLElement_QueryInterface(nselem, &IID_nsIDOMHTMLSelectElement,
(void**)&ret->nsselect);
@ -402,7 +408,6 @@ HTMLElement *HTMLSelectElement_Create(nsIDOMHTMLElement *nselem)
ERR("Could not get nsIDOMHTMLSelectElement interfce: %08x\n", nsres);
ret->element.impl = (IUnknown*)HTMLSELECT(ret);
ret->element.destructor = HTMLSelectElement_destructor;
return &ret->element;
}

View File

@ -391,17 +391,23 @@ static void HTMLTextAreaElement_destructor(HTMLDOMNode *iface)
HTMLTextAreaElement *This = HTMLTXTAREA_NODE_THIS(iface);
nsIDOMHTMLTextAreaElement_Release(This->nstextarea);
mshtml_free(This);
HTMLElement_destructor(&This->element.node);
}
#undef HTMLTXTAREA_NODE_THIS
static const NodeImplVtbl HTMLTextAreaElementImplVtbl = {
HTMLTextAreaElement_destructor
};
HTMLElement *HTMLTextAreaElement_Create(nsIDOMHTMLElement *nselem)
{
HTMLTextAreaElement *ret = mshtml_alloc(sizeof(HTMLTextAreaElement));
nsresult nsres;
ret->lpHTMLTextAreaElementVtbl = &HTMLTextAreaElementVtbl;
ret->element.node.vtbl = &HTMLTextAreaElementImplVtbl;
nsres = nsIDOMHTMLElement_QueryInterface(nselem, &IID_nsIDOMHTMLTextAreaElement,
(void**)&ret->nstextarea);
@ -409,7 +415,6 @@ HTMLElement *HTMLTextAreaElement_Create(nsIDOMHTMLElement *nselem)
ERR("Could not get nsDOMHTMLInputElement: %08x\n", nsres);
ret->element.impl = (IUnknown*)HTMLTXTAREA(ret);
ret->element.destructor = HTMLTextAreaElement_destructor;
return &ret->element;
}

View File

@ -250,10 +250,13 @@ struct BSCallback {
nsProtocolStream *nsstream;
};
typedef struct {
void (*destructor)(HTMLDOMNode*);
} NodeImplVtbl;
struct HTMLDOMNode {
const IHTMLDOMNodeVtbl *lpHTMLDOMNodeVtbl;
void (*destructor)(HTMLDOMNode*);
const NodeImplVtbl *vtbl;
union {
IUnknown *unk;
@ -269,10 +272,8 @@ struct HTMLDOMNode {
typedef struct {
HTMLDOMNode node;
const IHTMLElementVtbl *lpHTMLElementVtbl;
const IHTMLElement2Vtbl *lpHTMLElement2Vtbl;
void (*destructor)(HTMLDOMNode*);
const IHTMLElementVtbl *lpHTMLElementVtbl;
const IHTMLElement2Vtbl *lpHTMLElement2Vtbl;
nsIDOMHTMLElement *nselem;
@ -427,7 +428,10 @@ void HTMLElement2_Init(HTMLElement*);
void HTMLTextContainer_Init(HTMLTextContainer*);
HRESULT HTMLDOMNode_QI(HTMLDOMNode*,REFIID,void**);
void HTMLDOMNode_destructor(HTMLDOMNode*);
HRESULT HTMLElement_QI(HTMLElement*,REFIID,void**);
void HTMLElement_destructor(HTMLDOMNode*);
HTMLDOMNode *get_node(HTMLDocument*,nsIDOMNode*);
void release_nodes(HTMLDocument*);