Jacek Caban : mshtml: Added IHTMLDOMNode::appendChild implementation.

Alexandre Julliard julliard at winehq.org
Mon Jun 23 16:03:56 CDT 2008


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

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Mon Jun 23 09:49:26 2008 -0500

mshtml: Added IHTMLDOMNode::appendChild implementation.

---

 dlls/mshtml/htmlnode.c  |   47 +++++++++++++++++++++++++++++++++++++++++++++--
 dlls/mshtml/tests/dom.c |   44 +++++++++++++++++++++++++++++++++++++++++++-
 2 files changed, 88 insertions(+), 3 deletions(-)

diff --git a/dlls/mshtml/htmlnode.c b/dlls/mshtml/htmlnode.c
index afcf363..6886508 100644
--- a/dlls/mshtml/htmlnode.c
+++ b/dlls/mshtml/htmlnode.c
@@ -31,6 +31,8 @@
 
 WINE_DEFAULT_DEBUG_CHANNEL(mshtml);
 
+static HTMLDOMNode *get_node_obj(HTMLDocument*,IUnknown*);
+
 typedef struct {
     DispatchEx dispex;
     const IHTMLDOMChildrenCollectionVtbl  *lpIHTMLDOMChildrenCollectionVtbl;
@@ -424,8 +426,26 @@ static HRESULT WINAPI HTMLDOMNode_appendChild(IHTMLDOMNode *iface, IHTMLDOMNode
                                               IHTMLDOMNode **node)
 {
     HTMLDOMNode *This = HTMLDOMNODE_THIS(iface);
-    FIXME("(%p)->(%p %p)\n", This, newChild, node);
-    return E_NOTIMPL;
+    HTMLDOMNode *node_obj;
+    nsIDOMNode *nsnode;
+    nsresult nsres;
+
+    TRACE("(%p)->(%p %p)\n", This, newChild, node);
+
+    node_obj = get_node_obj(This->doc, (IUnknown*)newChild);
+    if(!node_obj)
+        return E_FAIL;
+
+    nsres = nsIDOMNode_AppendChild(This->nsnode, node_obj->nsnode, &nsnode);
+    if(NS_FAILED(nsres)) {
+        ERR("AppendChild failed: %08x\n", nsres);
+        return E_FAIL;
+    }
+
+    /* FIXME: Make sure that node != newChild */
+    *node = HTMLDOMNODE(get_node(This->doc, nsnode, TRUE));
+    IHTMLDOMNode_AddRef(*node);
+    return S_OK;
 }
 
 static HRESULT WINAPI HTMLDOMNode_get_nodeName(IHTMLDOMNode *iface, BSTR *p)
@@ -769,6 +789,29 @@ HTMLDOMNode *get_node(HTMLDocument *This, nsIDOMNode *nsnode, BOOL create)
     return create_node(This, nsnode);
 }
 
+/*
+ * FIXME
+ * We should use better way for getting node object (like private interface)
+ * or avoid it at all.
+ */
+static HTMLDOMNode *get_node_obj(HTMLDocument *This, IUnknown *iface)
+{
+    HTMLDOMNode *iter = This->nodes;
+    IHTMLDOMNode *node;
+
+    IUnknown_QueryInterface(iface, &IID_IHTMLDOMNode, (void**)&node);
+    IHTMLDOMNode_Release(node);
+
+    while(iter) {
+        if(HTMLDOMNODE(iter) == node)
+            return iter;
+        iter = iter->next;
+    }
+
+    FIXME("Not found %p\n", iface);
+    return NULL;
+}
+
 void release_nodes(HTMLDocument *This)
 {
     HTMLDOMNode *iter, *next;
diff --git a/dlls/mshtml/tests/dom.c b/dlls/mshtml/tests/dom.c
index 8611a41..b64555d 100644
--- a/dlls/mshtml/tests/dom.c
+++ b/dlls/mshtml/tests/dom.c
@@ -1035,6 +1035,25 @@ static IHTMLElement *_test_create_elem(unsigned line, IHTMLDocument2 *doc, const
     return elem;
 }
 
+#define test_node_append_child(n,c) _test_node_append_child(__LINE__,n,c)
+static IHTMLDOMNode *_test_node_append_child(unsigned line, IUnknown *node_unk, IUnknown *child_unk)
+{
+    IHTMLDOMNode *node = _get_node_iface(line, node_unk);
+    IHTMLDOMNode *child = _get_node_iface(line, child_unk);
+    IHTMLDOMNode *new_child = NULL;
+    HRESULT hres;
+
+    hres = IHTMLDOMNode_appendChild(node, child, &new_child);
+    ok_(__FILE__,line) (hres == S_OK, "appendChild failed: %08x\n", hres);
+    ok_(__FILE__,line) (new_child != NULL, "new_child == NULL\n");
+    /* TODO  ok_(__FILE__,line) (new_child != child, "new_child == child\n"); */
+
+    IHTMLDOMNode_Release(node);
+    IHTMLDOMNode_Release(child);
+
+    return new_child;
+}
+
 static void test_elem_col_item(IHTMLElementCollection *col, LPCWSTR n,
         const elem_type_t *elem_types, long len)
 {
@@ -1879,8 +1898,14 @@ static void test_elems(IHTMLDocument2 *doc)
 
 static void test_create_elems(IHTMLDocument2 *doc)
 {
-    IHTMLElement *elem;
+    IHTMLElementCollection *col;
+    IHTMLElement *elem, *body, *elem2;
+    IHTMLDOMNode *node;
+    IDispatch *disp;
     long type;
+    HRESULT hres;
+
+    static const elem_type_t types1[] = { ET_TESTG };
 
     elem = test_create_elem(doc, "TEST");
     test_elem_tag((IUnknown*)elem, "TEST");
@@ -1889,6 +1914,23 @@ static void test_create_elems(IHTMLDocument2 *doc)
     test_ifaces((IUnknown*)elem, elem_iids);
     test_disp((IUnknown*)elem, &DIID_DispHTMLGenericElement);
 
+    hres = IHTMLDocument2_get_body(doc, &body);
+    ok(hres == S_OK, "get_body failed: %08x\n", hres);
+
+    node = test_node_append_child((IUnknown*)body, (IUnknown*)elem);
+    elem2 = get_elem_iface((IUnknown*)node);
+    IHTMLDOMNode_Release(node);
+
+    hres = IHTMLElement_get_all(body, &disp);
+    ok(hres == S_OK, "get_all failed: %08x\n", hres);
+    hres = IDispatch_QueryInterface(disp, &IID_IHTMLElementCollection, (void**)&col);
+    ok(hres == S_OK, "Could not get IHTMLElementCollection: %08x\n", hres);
+    IDispatch_Release(disp);
+
+    test_elem_collection(col, types1, sizeof(types1)/sizeof(types1[0]));
+
+    IHTMLElement_Release(elem2);
+    IHTMLElement_Release(body);
     IHTMLElement_Release(elem);
 }
 




More information about the wine-cvs mailing list