mshtml: Use vtbl for node destructors.
diff --git a/dlls/mshtml/htmlanchor.c b/dlls/mshtml/htmlanchor.c
index 1494efb..72cd106 100644
--- a/dlls/mshtml/htmlanchor.c
+++ b/dlls/mshtml/htmlanchor.c
@@ -468,19 +468,23 @@
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;
}
diff --git a/dlls/mshtml/htmlbody.c b/dlls/mshtml/htmlbody.c
index 8742032..b3712b7 100644
--- a/dlls/mshtml/htmlbody.c
+++ b/dlls/mshtml/htmlbody.c
@@ -481,11 +481,16 @@
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 @@
TRACE("(%p)->(%p)\n", ret, nselem);
ret->lpHTMLBodyElementVtbl = &HTMLBodyElementVtbl;
+ ret->textcont.element.node.vtbl = &HTMLBodyElementImplVtbl;
HTMLTextContainer_Init(&ret->textcont);
@@ -509,7 +515,6 @@
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;
}
diff --git a/dlls/mshtml/htmlelem.c b/dlls/mshtml/htmlelem.c
index 76098ce..8bf2e54 100644
--- a/dlls/mshtml/htmlelem.c
+++ b/dlls/mshtml/htmlelem.c
@@ -1265,19 +1265,20 @@
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 @@
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 @@
HTMLElement2_Init(ret);
ret->node.impl.elem = HTMLELEM(ret);
- ret->node.destructor = HTMLElement_destructor;
return ret;
}
diff --git a/dlls/mshtml/htmlinput.c b/dlls/mshtml/htmlinput.c
index 4b60e21..0991fd8 100644
--- a/dlls/mshtml/htmlinput.c
+++ b/dlls/mshtml/htmlinput.c
@@ -733,17 +733,23 @@
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 @@
ERR("Could not get nsIDOMHTMLInputElement interface: %08x\n", nsres);
ret->element.impl = (IUnknown*)HTMLINPUT(ret);
- ret->element.destructor = HTMLInputElement_destructor;
return &ret->element;
}
diff --git a/dlls/mshtml/htmlnode.c b/dlls/mshtml/htmlnode.c
index 0e2c127..d93d0ac 100644
--- a/dlls/mshtml/htmlnode.c
+++ b/dlls/mshtml/htmlnode.c
@@ -331,6 +331,16 @@
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 @@
break;
default:
ret = mshtml_alloc(sizeof(HTMLDOMNode));
+ ret->vtbl = &HTMLDOMNodeImplVtbl;
ret->impl.unk = NULL;
- ret->destructor = NULL;
}
ret->lpHTMLDOMNodeVtbl = &HTMLDOMNodeVtbl;
@@ -393,10 +403,7 @@
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);
}
}
diff --git a/dlls/mshtml/htmlselect.c b/dlls/mshtml/htmlselect.c
index 65175f9..4fc6d57 100644
--- a/dlls/mshtml/htmlselect.c
+++ b/dlls/mshtml/htmlselect.c
@@ -384,17 +384,23 @@
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 @@
ERR("Could not get nsIDOMHTMLSelectElement interfce: %08x\n", nsres);
ret->element.impl = (IUnknown*)HTMLSELECT(ret);
- ret->element.destructor = HTMLSelectElement_destructor;
return &ret->element;
}
diff --git a/dlls/mshtml/htmltextarea.c b/dlls/mshtml/htmltextarea.c
index 6994d97..38206c2 100644
--- a/dlls/mshtml/htmltextarea.c
+++ b/dlls/mshtml/htmltextarea.c
@@ -391,17 +391,23 @@
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 @@
ERR("Could not get nsDOMHTMLInputElement: %08x\n", nsres);
ret->element.impl = (IUnknown*)HTMLTXTAREA(ret);
- ret->element.destructor = HTMLTextAreaElement_destructor;
return &ret->element;
}
diff --git a/dlls/mshtml/mshtml_private.h b/dlls/mshtml/mshtml_private.h
index 4e49923..8cb11e7 100644
--- a/dlls/mshtml/mshtml_private.h
+++ b/dlls/mshtml/mshtml_private.h
@@ -250,10 +250,13 @@
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 @@
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 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*);