Huw Davies : msxml3: Implement removeChild.

Alexandre Julliard julliard at wine.codeweavers.com
Tue Jul 11 06:10:28 CDT 2006


Module: wine
Branch: refs/heads/master
Commit: 187ab1c028bf02734f841e9404c4aefa91d889aa
URL:    http://source.winehq.org/git/?p=wine.git;a=commit;h=187ab1c028bf02734f841e9404c4aefa91d889aa

Author: Huw Davies <huw at codeweavers.com>
Date:   Mon Jul 10 14:48:45 2006 +0100

msxml3: Implement removeChild.

---

 dlls/msxml3/node.c         |   34 +++++++++++++++++++++-
 dlls/msxml3/tests/domdoc.c |   67 +++++++++++++++++++++++++++++++++++++++++---
 2 files changed, 95 insertions(+), 6 deletions(-)

diff --git a/dlls/msxml3/node.c b/dlls/msxml3/node.c
index 312edae..d7af878 100644
--- a/dlls/msxml3/node.c
+++ b/dlls/msxml3/node.c
@@ -444,8 +444,38 @@ static HRESULT WINAPI xmlnode_removeChil
     IXMLDOMNode* childNode,
     IXMLDOMNode** oldChild)
 {
-    FIXME("\n");
-    return E_NOTIMPL;
+    xmlnode *This = impl_from_IXMLDOMNode( iface );
+    xmlNode *ancestor, *child_node_ptr;
+    HRESULT hr;
+    IXMLDOMNode *child;
+
+    TRACE("%p->(%p, %p)\n", This, childNode, oldChild);
+
+    *oldChild = NULL;
+    hr = IXMLDOMNode_QueryInterface(childNode, &IID_IXMLDOMNode, (LPVOID)&child);
+    if(FAILED(hr))
+        return hr;
+
+    child_node_ptr = ancestor = impl_from_IXMLDOMNode(child)->node;
+    while(ancestor->parent)
+    {
+        if(ancestor->parent == This->node)
+            break;
+        ancestor = ancestor->parent;
+    }
+    if(!ancestor->parent)
+    {
+        WARN("childNode %p is not a child of %p\n", childNode, iface);
+        IXMLDOMNode_Release(child);
+        return E_INVALIDARG;
+    }
+
+    xmlUnlinkNode(child_node_ptr);
+
+    IXMLDOMNode_Release(child);
+    IXMLDOMNode_AddRef(childNode);
+    *oldChild = childNode;
+    return S_OK;
 }
 
 static HRESULT WINAPI xmlnode_appendChild(
diff --git a/dlls/msxml3/tests/domdoc.c b/dlls/msxml3/tests/domdoc.c
index 808ad93..7cd0822 100644
--- a/dlls/msxml3/tests/domdoc.c
+++ b/dlls/msxml3/tests/domdoc.c
@@ -59,6 +59,11 @@ static const WCHAR szComplete4[] = {
             'f','n','2','.','t','x','t','\n',
         '<','/','p','r','>','\n',
         '<','e','m','p','t','y','>','<','/','e','m','p','t','y','>','\n',
+        '<','f','o','>','\n',
+            '<','b','a','>','\n',
+                'f','1','\n',
+            '<','/','b','a','>','\n',
+        '<','/','f','o','>','\n',
     '<','/','l','c','>','\n',0
 };
 static const WCHAR szComplete5[] = {
@@ -517,7 +522,7 @@ todo_wine
     {
         r = IXMLDOMNodeList_get_length( list, &count );
         ok( r == S_OK, "get_length returns %08lx\n", r );
-        ok( count == 3, "get_length got %ld\n", count );
+        ok( count == 4, "get_length got %ld\n", count );
 
         r = IXMLDOMNodeList_nextNode( list, &node );
         ok( r == S_OK, "nextNode returned wrong code\n");
@@ -858,7 +863,7 @@ static void test_getElementsByTagName(vo
     ok( r == S_OK, "ret %08lx\n", r );
     r = IXMLDOMNodeList_get_length( node_list, &len );
     ok( r == S_OK, "ret %08lx\n", r );
-    ok( len == 4, "len %ld\n", len );
+    ok( len == 6, "len %ld\n", len );
     IXMLDOMNodeList_Release( node_list );
     SysFreeString( str );
 
@@ -989,7 +994,7 @@ static void test_get_childNodes(void)
 
     r = IXMLDOMNodeList_get_length( node_list, &len );
     ok( r == S_OK, "ret %08lx\n", r);
-    ok( len == 3, "len %ld\n", len);
+    ok( len == 4, "len %ld\n", len);
 
     r = IXMLDOMNodeList_get_item( node_list, 2, &node );
     ok( r == S_OK, "ret %08lx\n", r);
@@ -1010,7 +1015,60 @@ static void test_get_childNodes(void)
     IXMLDOMElement_Release( element );
     IXMLDOMDocument_Release( doc );
 }
-    
+
+static void test_removeChild(void)
+{
+    HRESULT r;
+    BSTR str;
+    VARIANT_BOOL b;
+    IXMLDOMDocument *doc;
+    IXMLDOMElement *element;
+    IXMLDOMNode *node, *node2, *node3, *node4;
+    IXMLDOMNodeList *node_list, *node_list2;
+
+    r = CoCreateInstance( &CLSID_DOMDocument, NULL, 
+        CLSCTX_INPROC_SERVER, &IID_IXMLDOMDocument, (LPVOID*)&doc );
+    if( r != S_OK )
+        return;
+
+    str = SysAllocString( szComplete4 );
+    r = IXMLDOMDocument_loadXML( doc, str, &b );
+    ok( r == S_OK, "loadXML failed\n");
+    ok( b == VARIANT_TRUE, "failed to load XML string\n");
+    SysFreeString( str );
+
+    r = IXMLDOMDocument_get_documentElement( doc, &element );
+    ok( r == S_OK, "ret %08lx\n", r);
+
+    r = IXMLDOMElement_get_childNodes( element, &node_list );
+    ok( r == S_OK, "ret %08lx\n", r);
+
+    r = IXMLDOMNodeList_get_item( node_list, 3, &node );
+    ok( r == S_OK, "ret %08lx\n", r);
+ 
+    r = IXMLDOMNode_get_childNodes( node, &node_list2 );
+    ok( r == S_OK, "ret %08lx\n", r);
+ 
+    r = IXMLDOMNodeList_get_item( node_list, 0, &node4 );
+    ok( r == S_OK, "ret %08lx\n", r);
+
+    r = IXMLDOMElement_removeChild( element, node4, &node2 );
+    ok( r == S_OK, "ret %08lx\n", r);
+    ok( node4 == node2, "node %p node2 %p\n", node4, node2 );
+
+    r = IXMLDOMNode_get_parentNode( node4, &node3 );
+    ok( r == S_FALSE, "ret %08lx\n", r);
+    ok( node3 == NULL, "%p\n", node3 );
+
+    IXMLDOMNode_Release( node2 );
+    IXMLDOMNode_Release( node4 );
+    IXMLDOMNodeList_Release( node_list2 );
+    IXMLDOMNode_Release( node );
+    IXMLDOMNodeList_Release( node_list );
+    IXMLDOMElement_Release( element );
+    IXMLDOMDocument_Release( doc );
+}
+
 START_TEST(domdoc)
 {
     HRESULT r;
@@ -1025,6 +1083,7 @@ START_TEST(domdoc)
     test_getElementsByTagName();
     test_get_text();
     test_get_childNodes();
+    test_removeChild();
 
     CoUninitialize();
 }




More information about the wine-cvs mailing list