mirror of
https://github.com/reactos/wine.git
synced 2025-02-03 10:43:30 +00:00
mshtml: Use vtbl for node destructors.
This commit is contained in:
parent
e04cdbb82c
commit
f9036c8926
@ -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;
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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*);
|
||||
|
Loading…
x
Reference in New Issue
Block a user