Jacek Caban : mshtml: Return referenced instances from node constructors.
Alexandre Julliard
julliard at winehq.org
Tue Jun 26 13:34:14 CDT 2012
Module: wine
Branch: master
Commit: a8d0efc7d6ff001b671e379c6c312257261a4b0f
URL: http://source.winehq.org/git/wine.git/?a=commit;h=a8d0efc7d6ff001b671e379c6c312257261a4b0f
Author: Jacek Caban <jacek at codeweavers.com>
Date: Tue Jun 26 12:33:35 2012 +0200
mshtml: Return referenced instances from node constructors.
---
dlls/mshtml/htmldoc.c | 2 --
dlls/mshtml/htmldoc3.c | 1 -
dlls/mshtml/htmldoc5.c | 1 -
dlls/mshtml/htmlelem.c | 1 -
dlls/mshtml/htmlimg.c | 1 +
dlls/mshtml/htmlnode.c | 20 ++++++--------------
dlls/mshtml/htmltextnode.c | 8 +-------
7 files changed, 8 insertions(+), 26 deletions(-)
diff --git a/dlls/mshtml/htmldoc.c b/dlls/mshtml/htmldoc.c
index ede856b..19b73e5 100644
--- a/dlls/mshtml/htmldoc.c
+++ b/dlls/mshtml/htmldoc.c
@@ -1037,7 +1037,6 @@ static HRESULT WINAPI HTMLDocument_createElement(IHTMLDocument2 *iface, BSTR eTa
return hres;
*newElem = &elem->IHTMLElement_iface;
- IHTMLElement_AddRef(&elem->IHTMLElement_iface);
return S_OK;
}
@@ -2262,7 +2261,6 @@ HRESULT create_document_fragment(nsIDOMNode *nsnode, HTMLDocumentNode *doc_node,
doc_frag->node.vtbl = &HTMLDocumentFragmentImplVtbl;
doc_frag->node.cp_container = &doc_frag->basedoc.cp_container;
- htmldoc_addref(&doc_frag->basedoc);
*ret = doc_frag;
return S_OK;
}
diff --git a/dlls/mshtml/htmldoc3.c b/dlls/mshtml/htmldoc3.c
index 3e7c7b7..eb19f8c 100644
--- a/dlls/mshtml/htmldoc3.c
+++ b/dlls/mshtml/htmldoc3.c
@@ -135,7 +135,6 @@ static HRESULT WINAPI HTMLDocument3_createTextNode(IHTMLDocument3 *iface, BSTR t
return hres;
*newTextNode = &node->IHTMLDOMNode_iface;
- IHTMLDOMNode_AddRef(&node->IHTMLDOMNode_iface);
return S_OK;
}
diff --git a/dlls/mshtml/htmldoc5.c b/dlls/mshtml/htmldoc5.c
index 587d75b..2377b7a 100644
--- a/dlls/mshtml/htmldoc5.c
+++ b/dlls/mshtml/htmldoc5.c
@@ -155,7 +155,6 @@ static HRESULT WINAPI HTMLDocument5_createComment(IHTMLDocument5 *iface, BSTR bs
return hres;
*ppRetNode = &elem->node.IHTMLDOMNode_iface;
- IHTMLDOMNode_AddRef(&elem->node.IHTMLDOMNode_iface);
return S_OK;
}
diff --git a/dlls/mshtml/htmlelem.c b/dlls/mshtml/htmlelem.c
index b0e589e..10d5108 100644
--- a/dlls/mshtml/htmlelem.c
+++ b/dlls/mshtml/htmlelem.c
@@ -1618,7 +1618,6 @@ HRESULT HTMLElement_clone(HTMLDOMNode *iface, nsIDOMNode *nsnode, HTMLDOMNode **
}
}
- IHTMLElement_AddRef(&new_elem->IHTMLElement_iface);
*ret = &new_elem->node;
return S_OK;
}
diff --git a/dlls/mshtml/htmlimg.c b/dlls/mshtml/htmlimg.c
index adb40d5..5d1c665 100644
--- a/dlls/mshtml/htmlimg.c
+++ b/dlls/mshtml/htmlimg.c
@@ -841,6 +841,7 @@ static HRESULT WINAPI HTMLImageElementFactory_create(IHTMLImageElementFactory *i
hres = IHTMLElement_QueryInterface(&elem->IHTMLElement_iface, &IID_IHTMLImgElement,
(void**)&img);
+ IHTMLElement_Release(&elem->IHTMLElement_iface);
if(FAILED(hres)) {
ERR("IHTMLElement_QueryInterface failed: 0x%08x\n", hres);
return hres;
diff --git a/dlls/mshtml/htmlnode.c b/dlls/mshtml/htmlnode.c
index 9574fcb..5124c1c 100644
--- a/dlls/mshtml/htmlnode.c
+++ b/dlls/mshtml/htmlnode.c
@@ -1007,14 +1007,7 @@ void HTMLDOMNode_destructor(HTMLDOMNode *This)
static HRESULT HTMLDOMNode_clone(HTMLDOMNode *This, nsIDOMNode *nsnode, HTMLDOMNode **ret)
{
- HRESULT hres;
-
- hres = create_node(This->doc, nsnode, ret);
- if(FAILED(hres))
- return hres;
-
- IHTMLDOMNode_AddRef(&(*ret)->IHTMLDOMNode_iface);
- return S_OK;
+ return create_node(This->doc, nsnode, ret);
}
static const NodeImplVtbl HTMLDOMNodeImplVtbl = {
@@ -1027,9 +1020,12 @@ void HTMLDOMNode_Init(HTMLDocumentNode *doc, HTMLDOMNode *node, nsIDOMNode *nsno
{
node->IHTMLDOMNode_iface.lpVtbl = &HTMLDOMNodeVtbl;
node->IHTMLDOMNode2_iface.lpVtbl = &HTMLDOMNode2Vtbl;
- node->ref = 1;
+ node->ref = 2;
node->doc = doc;
+ if(&doc->node != node)
+ node->ref++; /* one extra for list entry reference */
+
if(nsnode)
nsIDOMNode_AddRef(nsnode);
node->nsnode = nsnode;
@@ -1096,7 +1092,6 @@ static HRESULT create_node(HTMLDocumentNode *doc, nsIDOMNode *nsnode, HTMLDOMNod
HRESULT get_node(HTMLDocumentNode *This, nsIDOMNode *nsnode, BOOL create, HTMLDOMNode **ret)
{
HTMLDOMNode *iter = This->nodes;
- HRESULT hres;
while(iter) {
if(iter->nsnode == nsnode)
@@ -1111,10 +1106,7 @@ HRESULT get_node(HTMLDocumentNode *This, nsIDOMNode *nsnode, BOOL create, HTMLDO
return S_OK;
}
- hres = create_node(This, nsnode, ret);
- if(SUCCEEDED(hres))
- IHTMLDOMNode_AddRef(&(*ret)->IHTMLDOMNode_iface);
- return hres;
+ return create_node(This, nsnode, ret);
}
/*
diff --git a/dlls/mshtml/htmltextnode.c b/dlls/mshtml/htmltextnode.c
index 58422de..7663810 100644
--- a/dlls/mshtml/htmltextnode.c
+++ b/dlls/mshtml/htmltextnode.c
@@ -191,14 +191,8 @@ static void HTMLDOMTextNode_destructor(HTMLDOMNode *iface)
static HRESULT HTMLDOMTextNode_clone(HTMLDOMNode *iface, nsIDOMNode *nsnode, HTMLDOMNode **ret)
{
HTMLDOMTextNode *This = impl_from_HTMLDOMNode(iface);
- HRESULT hres;
- hres = HTMLDOMTextNode_Create(This->node.doc, nsnode, ret);
- if(FAILED(hres))
- return hres;
-
- IHTMLDOMNode_AddRef(&(*ret)->IHTMLDOMNode_iface);
- return S_OK;
+ return HTMLDOMTextNode_Create(This->node.doc, nsnode, ret);
}
static const NodeImplVtbl HTMLDOMTextNodeImplVtbl = {
More information about the wine-cvs
mailing list