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

Alexandre Julliard julliard at winehq.org
Tue Oct 14 08:29:34 CDT 2008


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

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Mon Oct 13 14:50:52 2008 -0500

mshtml: Added IHTMLDOMNode::insertBefore implementation.

---

 dlls/mshtml/htmlnode.c  |   44 ++++++++++++++++++++++++++++++++++++++++++--
 dlls/mshtml/tests/dom.c |   39 ++++++++++++++++++++++++++++++++++++---
 2 files changed, 78 insertions(+), 5 deletions(-)

diff --git a/dlls/mshtml/htmlnode.c b/dlls/mshtml/htmlnode.c
index a3eaaaf..e102951 100644
--- a/dlls/mshtml/htmlnode.c
+++ b/dlls/mshtml/htmlnode.c
@@ -446,8 +446,48 @@ static HRESULT WINAPI HTMLDOMNode_insertBefore(IHTMLDOMNode *iface, IHTMLDOMNode
                                                VARIANT refChild, IHTMLDOMNode **node)
 {
     HTMLDOMNode *This = HTMLDOMNODE_THIS(iface);
-    FIXME("(%p)->(%p v %p)\n", This, newChild, node);
-    return E_NOTIMPL;
+    nsIDOMNode *nsnode, *nsref = NULL;
+    HTMLDOMNode *new_child;
+    nsresult nsres;
+
+    TRACE("(%p)->(%p %s %p)\n", This, newChild, debugstr_variant(&refChild), node);
+
+    new_child = get_node_obj(This->doc, (IUnknown*)newChild);
+    if(!new_child) {
+        ERR("invalid newChild\n");
+        return E_INVALIDARG;
+    }
+
+    switch(V_VT(&refChild)) {
+    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;
+        }
+
+        nsref = ref_node->nsnode;
+        break;
+    }
+    default:
+        FIXME("unimplemented vt %d\n", V_VT(&refChild));
+        return 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;
+    }
+
+    *node = HTMLDOMNODE(get_node(This->doc, nsnode, TRUE));
+    nsIDOMNode_Release(nsnode);
+    IHTMLDOMNode_AddRef(*node);
+    return S_OK;
 }
 
 static HRESULT WINAPI HTMLDOMNode_removeChild(IHTMLDOMNode *iface, IHTMLDOMNode *oldChild,
diff --git a/dlls/mshtml/tests/dom.c b/dlls/mshtml/tests/dom.c
index 350eb24..58b9594 100644
--- a/dlls/mshtml/tests/dom.c
+++ b/dlls/mshtml/tests/dom.c
@@ -1674,6 +1674,23 @@ static IHTMLDOMNode *_test_node_append_child(unsigned line, IUnknown *node_unk,
     return new_child;
 }
 
+#define test_node_insertbefore(n,c,v) _test_node_insertbefore(__LINE__,n,c,v)
+static IHTMLDOMNode *_test_node_insertbefore(unsigned line, IUnknown *node_unk, IHTMLDOMNode *child, VARIANT *var)
+{
+    IHTMLDOMNode *node = _get_node_iface(line, node_unk);
+    IHTMLDOMNode *new_child = NULL;
+    HRESULT hres;
+
+    hres = IHTMLDOMNode_insertBefore(node, child, *var, &new_child);
+    ok_(__FILE__,line) (hres == S_OK, "insertBefore 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);
+
+    return new_child;
+}
+
 #define test_node_remove_child(n,c) _test_node_remove_child(__LINE__,n,c)
 static void _test_node_remove_child(unsigned line, IUnknown *unk, IHTMLDOMNode *child)
 {
@@ -1682,7 +1699,7 @@ static void _test_node_remove_child(unsigned line, IUnknown *unk, IHTMLDOMNode *
     HRESULT hres;
 
     hres = IHTMLDOMNode_removeChild(node, child, &new_node);
-    ok_(__FILE__,line) (hres == S_OK, "appendChild failed: %08x\n", hres);
+    ok_(__FILE__,line) (hres == S_OK, "removeChild failed: %08x\n", hres);
     ok_(__FILE__,line) (new_node != NULL, "new_node == NULL\n");
     /* TODO ok_(__FILE__,line) (new_node != child, "new_node == child\n"); */
 
@@ -3209,8 +3226,9 @@ static void test_elems(IHTMLDocument2 *doc)
 static void test_create_elems(IHTMLDocument2 *doc)
 {
     IHTMLElement *elem, *body, *elem2;
-    IHTMLDOMNode *node;
+    IHTMLDOMNode *node, *node2, *node3;
     IDispatch *disp;
+    VARIANT var;
     long type;
     HRESULT hres;
 
@@ -3245,14 +3263,29 @@ static void test_create_elems(IHTMLDocument2 *doc)
     IDispatch_Release(disp);
     test_node_has_child((IUnknown*)body, VARIANT_FALSE);
 
-    IHTMLElement_Release(body);
     IHTMLElement_Release(elem);
     IHTMLDOMNode_Release(node);
 
     node = test_create_text(doc, "test");
     test_ifaces((IUnknown*)node, text_iids);
     test_disp((IUnknown*)node, &DIID_DispHTMLDOMTextNode);
+
+    V_VT(&var) = VT_NULL;
+    node2 = test_node_insertbefore((IUnknown*)body, node, &var);
     IHTMLDOMNode_Release(node);
+
+    node = test_create_text(doc, "insert ");
+
+    V_VT(&var) = VT_DISPATCH;
+    V_DISPATCH(&var) = (IDispatch*)node2;
+    node3 = test_node_insertbefore((IUnknown*)body, node, &var);
+    IHTMLDOMNode_Release(node);
+    IHTMLDOMNode_Release(node2);
+    IHTMLDOMNode_Release(node3);
+
+    test_elem_innertext(body, "insert test");
+
+    IHTMLElement_Release(body);
 }
 
 static void test_exec(IUnknown *unk, const GUID *grpid, DWORD cmdid, VARIANT *in, VARIANT *out)




More information about the wine-cvs mailing list