Module: wine Branch: refs/heads/master Commit: 187ab1c028bf02734f841e9404c4aefa91d889aa URL: http://source.winehq.org/git/?p=wine.git;a=commit;h=187ab1c028bf02734f841e94...
Author: Huw Davies huw@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(); }