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