Jacek Caban : mshtml: Return referenced object in get_node_obj.

Alexandre Julliard julliard at winehq.org
Thu Jun 28 13:55:18 CDT 2012


Module: wine
Branch: master
Commit: 4e10fcc953c6866a9a88ecde065fb70c6497147d
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=4e10fcc953c6866a9a88ecde065fb70c6497147d

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Thu Jun 28 11:21:10 2012 +0200

mshtml: Return referenced object in get_node_obj.

---

 dlls/mshtml/htmlnode.c |   57 ++++++++++++++++++++++++++---------------------
 1 files changed, 31 insertions(+), 26 deletions(-)

diff --git a/dlls/mshtml/htmlnode.c b/dlls/mshtml/htmlnode.c
index 5e1b8b3..46061a6 100644
--- a/dlls/mshtml/htmlnode.c
+++ b/dlls/mshtml/htmlnode.c
@@ -495,11 +495,10 @@ static HRESULT WINAPI HTMLDOMNode_insertBefore(IHTMLDOMNode *iface, IHTMLDOMNode
                                                VARIANT refChild, IHTMLDOMNode **node)
 {
     HTMLDOMNode *This = impl_from_IHTMLDOMNode(iface);
-    nsIDOMNode *nsnode, *nsref = NULL;
-    HTMLDOMNode *new_child;
-    HTMLDOMNode *node_obj;
+    HTMLDOMNode *new_child, *node_obj, *ref_node = NULL;
+    nsIDOMNode *nsnode;
     nsresult nsres;
-    HRESULT hres;
+    HRESULT hres = S_OK;
 
     TRACE("(%p)->(%p %s %p)\n", This, newChild, debugstr_variant(&refChild), node);
 
@@ -513,27 +512,31 @@ static HRESULT WINAPI HTMLDOMNode_insertBefore(IHTMLDOMNode *iface, IHTMLDOMNode
     case VT_NULL:
         break;
     case VT_DISPATCH: {
-        HTMLDOMNode *ref_node;
-
         ref_node = get_node_obj(This->doc, (IUnknown*)V_DISPATCH(&refChild));
         if(!ref_node) {
             ERR("unvalid node\n");
-            return E_FAIL;
+            hres = E_FAIL;
+            break;
         }
-
-        nsref = ref_node->nsnode;
         break;
     }
     default:
         FIXME("unimplemented refChild %s\n", debugstr_variant(&refChild));
-        return E_NOTIMPL;
+        hres = E_NOTIMPL;
     }
 
-    nsres = nsIDOMNode_InsertBefore(This->nsnode, new_child->nsnode, nsref, &nsnode);
-    if(NS_FAILED(nsres)) {
-        ERR("InsertBefore failed: %08x\n", nsres);
-        return E_FAIL;
+    if(SUCCEEDED(hres)) {
+        nsres = nsIDOMNode_InsertBefore(This->nsnode, new_child->nsnode, ref_node ? ref_node->nsnode : NULL, &nsnode);
+        if(NS_FAILED(nsres)) {
+            ERR("InsertBefore failed: %08x\n", nsres);
+            hres = E_FAIL;
+        }
     }
+    node_release(new_child);
+    if(ref_node)
+        node_release(ref_node);
+    if(FAILED(hres))
+        return hres;
 
     hres = get_node(This->doc, nsnode, TRUE, &node_obj);
     nsIDOMNode_Release(nsnode);
@@ -560,6 +563,7 @@ static HRESULT WINAPI HTMLDOMNode_removeChild(IHTMLDOMNode *iface, IHTMLDOMNode
         return E_FAIL;
 
     nsres = nsIDOMNode_RemoveChild(This->nsnode, node_obj->nsnode, &nsnode);
+    node_release(node_obj);
     if(NS_FAILED(nsres)) {
         ERR("RemoveChild failed: %08x\n", nsres);
         return E_FAIL;
@@ -579,8 +583,7 @@ static HRESULT WINAPI HTMLDOMNode_replaceChild(IHTMLDOMNode *iface, IHTMLDOMNode
                                                IHTMLDOMNode *oldChild, IHTMLDOMNode **node)
 {
     HTMLDOMNode *This = impl_from_IHTMLDOMNode(iface);
-    HTMLDOMNode *node_new;
-    HTMLDOMNode *node_old;
+    HTMLDOMNode *node_new, *node_old, *ret_node;
     nsIDOMNode *nsnode;
     nsresult nsres;
     HRESULT hres;
@@ -592,22 +595,23 @@ static HRESULT WINAPI HTMLDOMNode_replaceChild(IHTMLDOMNode *iface, IHTMLDOMNode
         return E_FAIL;
 
     node_old = get_node_obj(This->doc, (IUnknown*)oldChild);
-    if(!node_old)
+    if(!node_old) {
+        node_release(node_new);
         return E_FAIL;
+    }
 
     nsres = nsIDOMNode_ReplaceChild(This->nsnode, node_new->nsnode, node_old->nsnode, &nsnode);
-    if(NS_FAILED(nsres)) {
+    node_release(node_new);
+    node_release(node_old);
+    if(NS_FAILED(nsres))
         return E_FAIL;
-    }
-
-    nsnode = node_new->nsnode;
 
-    hres = get_node(This->doc, nsnode, TRUE, &node_new);
+    hres = get_node(This->doc, nsnode, TRUE, &ret_node);
     nsIDOMNode_Release(nsnode);
     if(FAILED(hres))
         return hres;
 
-    *node = &node_new->IHTMLDOMNode_iface;
+    *node = &ret_node->IHTMLDOMNode_iface;
     return S_OK;
 }
 
@@ -676,9 +680,10 @@ static HRESULT WINAPI HTMLDOMNode_appendChild(IHTMLDOMNode *iface, IHTMLDOMNode
         return E_FAIL;
 
     nsres = nsIDOMNode_AppendChild(This->nsnode, node_obj->nsnode, &nsnode);
+    node_release(node_obj);
     if(NS_FAILED(nsres)) {
-        WARN("AppendChild failed: %08x\n", nsres);
-        nsnode = node_obj->nsnode;
+        ERR("AppendChild failed: %08x\n", nsres);
+        return E_FAIL;
     }
 
     hres = get_node(This->doc, nsnode, TRUE, &node_obj);
@@ -1123,7 +1128,6 @@ static HTMLDOMNode *get_node_obj(HTMLDocumentNode *This, IUnknown *iface)
     IHTMLDOMNode *node;
 
     IUnknown_QueryInterface(iface, &IID_IHTMLDOMNode, (void**)&node);
-    IHTMLDOMNode_Release(node);
 
     while(iter) {
         if(&iter->IHTMLDOMNode_iface == node)
@@ -1132,6 +1136,7 @@ static HTMLDOMNode *get_node_obj(HTMLDocumentNode *This, IUnknown *iface)
     }
 
     FIXME("Not found %p\n", iface);
+    IHTMLDOMNode_Release(node);
     return NULL;
 }
 




More information about the wine-cvs mailing list