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