Michael Karcher : msxml3: Implementation of IXMLDOMNamedNodeMap:: removeNamedItem.

Alexandre Julliard julliard at winehq.org
Mon Oct 13 06:38:56 CDT 2008


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

Author: Michael Karcher <wine at mkarcher.dialup.fu-berlin.de>
Date:   Sat Oct 11 23:57:48 2008 +0200

msxml3: Implementation of IXMLDOMNamedNodeMap::removeNamedItem.

---

 dlls/msxml3/nodemap.c      |   36 +++++++++++++++++-
 dlls/msxml3/tests/domdoc.c |   86 ++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 120 insertions(+), 2 deletions(-)

diff --git a/dlls/msxml3/nodemap.c b/dlls/msxml3/nodemap.c
index f41df2f..ae52a4d 100644
--- a/dlls/msxml3/nodemap.c
+++ b/dlls/msxml3/nodemap.c
@@ -283,8 +283,40 @@ static HRESULT WINAPI xmlnodemap_removeNamedItem(
     BSTR name,
     IXMLDOMNode** namedItem)
 {
-    FIXME("\n");
-    return E_NOTIMPL;
+    xmlnodemap *This = impl_from_IXMLDOMNamedNodeMap( iface );
+    xmlChar *element_name;
+    xmlAttrPtr attr, attr_copy;
+    xmlNodePtr node;
+
+    TRACE("%p %s %p\n", This, debugstr_w(name), namedItem );
+
+    if ( !name)
+        return E_INVALIDARG;
+
+    node = xmlNodePtr_from_domnode( This->node, 0 );
+    if ( !node )
+        return E_FAIL;
+
+    element_name = xmlChar_from_wchar( name );
+    attr = xmlHasNsProp( node, element_name, NULL );
+    HeapFree( GetProcessHeap(), 0, element_name );
+
+    if ( !attr )
+    {
+        if( namedItem )
+            *namedItem = NULL;
+        return S_FALSE;
+    }
+
+    if ( namedItem )
+    {
+        attr_copy = xmlCopyProp( NULL, attr );
+        attr_copy->doc = node->doc;
+        *namedItem = create_node( (xmlNodePtr) attr_copy );
+    }
+    xmlRemoveProp( attr );
+
+    return S_OK;
 }
 
 static HRESULT WINAPI xmlnodemap_get_item(
diff --git a/dlls/msxml3/tests/domdoc.c b/dlls/msxml3/tests/domdoc.c
index 15a60e5..653475e 100644
--- a/dlls/msxml3/tests/domdoc.c
+++ b/dlls/msxml3/tests/domdoc.c
@@ -1985,6 +1985,91 @@ static void test_replaceChild(void)
     IXMLDOMDocument_Release( doc );
 }
 
+static void test_removeNamedItem(void)
+{
+    IXMLDOMDocument *doc;
+    IXMLDOMElement *element;
+    IXMLDOMNode *pr_node, *removed_node, *removed_node2;
+    IXMLDOMNodeList *root_list;
+    IXMLDOMNamedNodeMap * pr_attrs;
+    VARIANT_BOOL b;
+    BSTR str;
+    long len;
+    HRESULT r;
+
+    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 %08x\n", r);
+
+    r = IXMLDOMElement_get_childNodes( element, &root_list );
+    ok( r == S_OK, "ret %08x\n", r);
+
+    r = IXMLDOMNodeList_get_item( root_list, 1, &pr_node );
+    ok( r == S_OK, "ret %08x\n", r);
+
+    r = IXMLDOMNode_get_attributes( pr_node, &pr_attrs );
+    ok( r == S_OK, "ret %08x\n", r);
+
+    r = IXMLDOMNamedNodeMap_get_length( pr_attrs, &len );
+    ok( r == S_OK, "ret %08x\n", r);
+    ok( len == 3, "length %ld\n", len);
+
+    removed_node = (void*)0xdeadbeef;
+    r = IXMLDOMNamedNodeMap_removeNamedItem( pr_attrs, NULL, &removed_node);
+    ok ( r == E_INVALIDARG, "ret %08x\n", r);
+    ok ( removed_node == (void*)0xdeadbeef, "removed_node == %p\n", removed_node);
+
+    removed_node = (void*)0xdeadbeef;
+    str = SysAllocString(szvr);
+    r = IXMLDOMNamedNodeMap_removeNamedItem( pr_attrs, str, &removed_node);
+    ok ( r == S_OK, "ret %08x\n", r);
+
+    removed_node2 = (void*)0xdeadbeef;
+    r = IXMLDOMNamedNodeMap_removeNamedItem( pr_attrs, str, &removed_node2);
+    ok ( r == S_FALSE, "ret %08x\n", r);
+    ok ( removed_node2 == NULL, "removed_node == %p\n", removed_node2 );
+
+    r = IXMLDOMNamedNodeMap_get_length( pr_attrs, &len );
+    ok( r == S_OK, "ret %08x\n", r);
+    ok( len == 2, "length %ld\n", len);
+
+    r = IXMLDOMNamedNodeMap_setNamedItem( pr_attrs, removed_node, NULL);
+    ok ( r == S_OK, "ret %08x\n", r);
+    IXMLDOMNode_Release(removed_node);
+
+    r = IXMLDOMNamedNodeMap_get_length( pr_attrs, &len );
+    ok( r == S_OK, "ret %08x\n", r);
+    ok( len == 3, "length %ld\n", len);
+
+    r = IXMLDOMNamedNodeMap_removeNamedItem( pr_attrs, str, NULL);
+    ok ( r == S_OK, "ret %08x\n", r);
+
+    r = IXMLDOMNamedNodeMap_get_length( pr_attrs, &len );
+    ok( r == S_OK, "ret %08x\n", r);
+    ok( len == 2, "length %ld\n", len);
+
+    r = IXMLDOMNamedNodeMap_removeNamedItem( pr_attrs, str, NULL);
+    ok ( r == S_FALSE, "ret %08x\n", r);
+
+    SysFreeString(str);
+
+    IXMLDOMNamedNodeMap_Release( pr_attrs );
+    IXMLDOMNode_Release( pr_node );
+    IXMLDOMNodeList_Release( root_list );
+    IXMLDOMElement_Release( element );
+    IXMLDOMDocument_Release( doc );
+}
+
 static void test_XMLHTTP(void)
 {
     static const WCHAR wszBody[] = {'m','o','d','e','=','T','e','s','t',0};
@@ -3686,6 +3771,7 @@ START_TEST(domdoc)
     test_get_childNodes();
     test_removeChild();
     test_replaceChild();
+    test_removeNamedItem();
     test_XMLHTTP();
     test_IXMLDOMDocument2();
     test_XPath();




More information about the wine-cvs mailing list