Jacek Caban : mshtml: Better error handling in create_node calls.

Alexandre Julliard julliard at winehq.org
Thu Dec 2 12:23:56 CST 2010


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

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Wed Dec  1 22:42:03 2010 +0100

mshtml: Better error handling in create_node calls.

---

 dlls/mshtml/htmlcomment.c    |   11 ++++++--
 dlls/mshtml/htmldoc3.c       |    5 +++-
 dlls/mshtml/htmldoc5.c       |   11 ++++++---
 dlls/mshtml/htmlnode.c       |   49 ++++++++++++++++++++++++++++-------------
 dlls/mshtml/htmltextnode.c   |   25 +++++++++++++++------
 dlls/mshtml/mshtml_private.h |    4 +-
 6 files changed, 72 insertions(+), 33 deletions(-)

diff --git a/dlls/mshtml/htmlcomment.c b/dlls/mshtml/htmlcomment.c
index 077a746..49f116d 100644
--- a/dlls/mshtml/htmlcomment.c
+++ b/dlls/mshtml/htmlcomment.c
@@ -185,9 +185,13 @@ static dispex_static_data_t HTMLCommentElement_dispex = {
     HTMLCommentElement_iface_tids
 };
 
-HTMLElement *HTMLCommentElement_Create(HTMLDocumentNode *doc, nsIDOMNode *nsnode)
+HRESULT HTMLCommentElement_Create(HTMLDocumentNode *doc, nsIDOMNode *nsnode, HTMLElement **elem)
 {
-    HTMLCommentElement *ret = heap_alloc_zero(sizeof(*ret));
+    HTMLCommentElement *ret;
+
+    ret = heap_alloc_zero(sizeof(*ret));
+    if(!ret)
+        return E_OUTOFMEMORY;
 
     ret->element.node.vtbl = &HTMLCommentElementImplVtbl;
     ret->lpIHTMLCommentElementVtbl = &HTMLCommentElementVtbl;
@@ -197,5 +201,6 @@ HTMLElement *HTMLCommentElement_Create(HTMLDocumentNode *doc, nsIDOMNode *nsnode
     nsIDOMNode_AddRef(nsnode);
     ret->element.node.nsnode = nsnode;
 
-    return &ret->element;
+    *elem = &ret->element;
+    return S_OK;
 }
diff --git a/dlls/mshtml/htmldoc3.c b/dlls/mshtml/htmldoc3.c
index 9a04208..0cab185 100644
--- a/dlls/mshtml/htmldoc3.c
+++ b/dlls/mshtml/htmldoc3.c
@@ -108,6 +108,7 @@ static HRESULT WINAPI HTMLDocument3_createTextNode(IHTMLDocument3 *iface, BSTR t
     HTMLDOMNode *node;
     nsAString text_str;
     nsresult nsres;
+    HRESULT hres;
 
     TRACE("(%p)->(%s %p)\n", This, debugstr_w(text), newTextNode);
 
@@ -124,8 +125,10 @@ static HRESULT WINAPI HTMLDocument3_createTextNode(IHTMLDocument3 *iface, BSTR t
         return E_FAIL;
     }
 
-    node = HTMLDOMTextNode_Create(This->doc_node, (nsIDOMNode*)nstext);
+    hres = HTMLDOMTextNode_Create(This->doc_node, (nsIDOMNode*)nstext, &node);
     nsIDOMElement_Release(nstext);
+    if(FAILED(hres))
+        return hres;
 
     *newTextNode = HTMLDOMNODE(node);
     IHTMLDOMNode_AddRef(HTMLDOMNODE(node));
diff --git a/dlls/mshtml/htmldoc5.c b/dlls/mshtml/htmldoc5.c
index 12742f6..0f8cc7c 100644
--- a/dlls/mshtml/htmldoc5.c
+++ b/dlls/mshtml/htmldoc5.c
@@ -125,9 +125,10 @@ static HRESULT WINAPI HTMLDocument5_createComment(IHTMLDocument5 *iface, BSTR bs
 {
     HTMLDocument *This = HTMLDOC5_THIS(iface);
     nsIDOMComment *nscomment;
-    HTMLDOMNode *node;
+    HTMLElement *elem;
     nsAString str;
     nsresult nsres;
+    HRESULT hres;
 
     TRACE("(%p)->(%s %p)\n", This, debugstr_w(bstrdata), ppRetNode);
 
@@ -144,11 +145,13 @@ static HRESULT WINAPI HTMLDocument5_createComment(IHTMLDocument5 *iface, BSTR bs
         return E_FAIL;
     }
 
-    node = &HTMLCommentElement_Create(This->doc_node, (nsIDOMNode*)nscomment)->node;
+    hres = HTMLCommentElement_Create(This->doc_node, (nsIDOMNode*)nscomment, &elem);
     nsIDOMElement_Release(nscomment);
+    if(FAILED(hres))
+        return hres;
 
-    *ppRetNode = HTMLDOMNODE(node);
-    IHTMLDOMNode_AddRef(HTMLDOMNODE(node));
+    *ppRetNode = HTMLDOMNODE(&elem->node);
+    IHTMLDOMNode_AddRef(HTMLDOMNODE(&elem->node));
     return S_OK;
 }
 
diff --git a/dlls/mshtml/htmlnode.c b/dlls/mshtml/htmlnode.c
index 0131d5f..aa1f55d 100644
--- a/dlls/mshtml/htmlnode.c
+++ b/dlls/mshtml/htmlnode.c
@@ -33,7 +33,7 @@
 WINE_DEFAULT_DEBUG_CHANNEL(mshtml);
 
 static HTMLDOMNode *get_node_obj(HTMLDocumentNode*,IUnknown*);
-static HTMLDOMNode *create_node(HTMLDocumentNode*,nsIDOMNode*);
+static HRESULT create_node(HTMLDocumentNode*,nsIDOMNode*,HTMLDOMNode**);
 
 typedef struct {
     DispatchEx dispex;
@@ -962,7 +962,12 @@ void HTMLDOMNode_destructor(HTMLDOMNode *This)
 
 static HRESULT HTMLDOMNode_clone(HTMLDOMNode *This, nsIDOMNode *nsnode, HTMLDOMNode **ret)
 {
-    *ret = create_node(This->doc, nsnode);
+    HRESULT hres;
+
+    hres = create_node(This->doc, nsnode, ret);
+    if(FAILED(hres))
+        return hres;
+
     IHTMLDOMNode_AddRef(HTMLDOMNODE(*ret));
     return S_OK;
 }
@@ -988,32 +993,45 @@ void HTMLDOMNode_Init(HTMLDocumentNode *doc, HTMLDOMNode *node, nsIDOMNode *nsno
     doc->nodes = node;
 }
 
-static HTMLDOMNode *create_node(HTMLDocumentNode *doc, nsIDOMNode *nsnode)
+static HRESULT create_node(HTMLDocumentNode *doc, nsIDOMNode *nsnode, HTMLDOMNode **ret)
 {
-    HTMLDOMNode *ret;
     PRUint16 node_type;
+    HRESULT hres;
 
     nsIDOMNode_GetNodeType(nsnode, &node_type);
 
     switch(node_type) {
     case ELEMENT_NODE:
-        ret = &HTMLElement_Create(doc, nsnode, FALSE)->node;
+        *ret = &HTMLElement_Create(doc, nsnode, FALSE)->node;
         break;
     case TEXT_NODE:
-        ret = HTMLDOMTextNode_Create(doc, nsnode);
+        hres = HTMLDOMTextNode_Create(doc, nsnode, ret);
+        if(FAILED(hres))
+            return hres;
         break;
-    case COMMENT_NODE:
-        ret = &HTMLCommentElement_Create(doc, nsnode)->node;
+    case COMMENT_NODE: {
+        HTMLElement *comment;
+        hres = HTMLCommentElement_Create(doc, nsnode, &comment);
+        if(FAILED(hres))
+            return hres;
+        *ret = &comment->node;
         break;
-    default:
-        ret = heap_alloc_zero(sizeof(HTMLDOMNode));
-        ret->vtbl = &HTMLDOMNodeImplVtbl;
-        HTMLDOMNode_Init(doc, ret, nsnode);
     }
+    default: {
+        HTMLDOMNode *node;
 
-    TRACE("type %d ret %p\n", node_type, ret);
+        node = heap_alloc_zero(sizeof(HTMLDOMNode));
+        if(!node)
+            return E_OUTOFMEMORY;
 
-    return ret;
+        node->vtbl = &HTMLDOMNodeImplVtbl;
+        HTMLDOMNode_Init(doc, node, nsnode);
+        *ret = node;
+    }
+    }
+
+    TRACE("type %d ret %p\n", node_type, *ret);
+    return S_OK;
 }
 
 /*
@@ -1037,8 +1055,7 @@ HRESULT get_node(HTMLDocumentNode *This, nsIDOMNode *nsnode, BOOL create, HTMLDO
         return S_OK;
     }
 
-    *ret = create_node(This, nsnode);
-    return *ret ? S_OK : E_OUTOFMEMORY;
+    return create_node(This, nsnode, ret);
 }
 
 /*
diff --git a/dlls/mshtml/htmltextnode.c b/dlls/mshtml/htmltextnode.c
index 1bbca53..7cf7a11 100644
--- a/dlls/mshtml/htmltextnode.c
+++ b/dlls/mshtml/htmltextnode.c
@@ -190,8 +190,12 @@ static void HTMLDOMTextNode_destructor(HTMLDOMNode *iface)
 static HRESULT HTMLDOMTextNode_clone(HTMLDOMNode *iface, nsIDOMNode *nsnode, HTMLDOMNode **ret)
 {
     HTMLDOMTextNode *This = HTMLTEXT_NODE_THIS(iface);
+    HRESULT hres;
+
+    hres = HTMLDOMTextNode_Create(This->node.doc, nsnode, ret);
+    if(FAILED(hres))
+        return hres;
 
-    *ret = HTMLDOMTextNode_Create(This->node.doc, nsnode);
     IHTMLDOMNode_AddRef(HTMLDOMNODE(*ret));
     return S_OK;
 }
@@ -217,21 +221,28 @@ static dispex_static_data_t HTMLDOMTextNode_dispex = {
     HTMLDOMTextNode_iface_tids
 };
 
-HTMLDOMNode *HTMLDOMTextNode_Create(HTMLDocumentNode *doc, nsIDOMNode *nsnode)
+HRESULT HTMLDOMTextNode_Create(HTMLDocumentNode *doc, nsIDOMNode *nsnode, HTMLDOMNode **node)
 {
     HTMLDOMTextNode *ret;
     nsresult nsres;
 
     ret = heap_alloc_zero(sizeof(*ret));
+    if(!ret)
+        return E_OUTOFMEMORY;
+
     ret->node.vtbl = &HTMLDOMTextNodeImplVtbl;
     ret->lpIHTMLDOMTextNodeVtbl = &HTMLDOMTextNodeVtbl;
 
-    init_dispex(&ret->node.dispex, (IUnknown*)HTMLTEXT(ret), &HTMLDOMTextNode_dispex);
-    HTMLDOMNode_Init(doc, &ret->node, nsnode);
-
     nsres = nsIDOMNode_QueryInterface(nsnode, &IID_nsIDOMText, (void**)&ret->nstext);
-    if(NS_FAILED(nsres))
+    if(NS_FAILED(nsres)) {
         ERR("Could not get nsIDOMText iface: %08x\n", nsres);
+        heap_free(ret);
+        return E_FAIL;
+    }
 
-    return &ret->node;
+    init_dispex(&ret->node.dispex, (IUnknown*)HTMLTEXT(ret), &HTMLDOMTextNode_dispex);
+    HTMLDOMNode_Init(doc, &ret->node, nsnode);
+
+    *node = &ret->node;
+    return S_OK;
 }
diff --git a/dlls/mshtml/mshtml_private.h b/dlls/mshtml/mshtml_private.h
index 9d8113f..b8ffffe 100644
--- a/dlls/mshtml/mshtml_private.h
+++ b/dlls/mshtml/mshtml_private.h
@@ -818,10 +818,10 @@ HRESULT get_node_text(HTMLDOMNode*,BSTR*);
 
 HRESULT create_nselem(HTMLDocumentNode*,const WCHAR*,nsIDOMHTMLElement**);
 
-HTMLDOMNode *HTMLDOMTextNode_Create(HTMLDocumentNode*,nsIDOMNode*);
+HRESULT HTMLDOMTextNode_Create(HTMLDocumentNode*,nsIDOMNode*,HTMLDOMNode**);
 
 HTMLElement *HTMLElement_Create(HTMLDocumentNode*,nsIDOMNode*,BOOL);
-HTMLElement *HTMLCommentElement_Create(HTMLDocumentNode*,nsIDOMNode*);
+HRESULT HTMLCommentElement_Create(HTMLDocumentNode*,nsIDOMNode*,HTMLElement**);
 HTMLElement *HTMLAnchorElement_Create(HTMLDocumentNode*,nsIDOMHTMLElement*);
 HTMLElement *HTMLBodyElement_Create(HTMLDocumentNode*,nsIDOMHTMLElement*);
 HTMLElement *HTMLEmbedElement_Create(HTMLDocumentNode*,nsIDOMHTMLElement*);




More information about the wine-cvs mailing list