Michael Karcher : msxml3: replaceNode accepts IXMLDOMElement instead of IXMLDOMNode.

Alexandre Julliard julliard at winehq.org
Tue Oct 7 08:54:14 CDT 2008


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

Author: Michael Karcher <wine at mkarcher.dialup.fu-berlin.de>
Date:   Tue Oct  7 11:55:45 2008 +0200

msxml3: replaceNode accepts IXMLDOMElement instead of IXMLDOMNode.

---

 dlls/msxml3/node.c         |    9 ++++++++-
 dlls/msxml3/tests/domdoc.c |    9 ++++++++-
 2 files changed, 16 insertions(+), 2 deletions(-)

diff --git a/dlls/msxml3/node.c b/dlls/msxml3/node.c
index 27c8e53..9598e29 100644
--- a/dlls/msxml3/node.c
+++ b/dlls/msxml3/node.c
@@ -613,6 +613,8 @@ static HRESULT WINAPI xmlnode_replaceChild(
     xmlNode *old_child_ptr, *new_child_ptr;
     xmlDocPtr leaving_doc;
     xmlNode *my_ancestor;
+    IXMLDOMNode *realOldChild;
+    HRESULT hr;
 
     TRACE("%p->(%p,%p,%p)\n",This,newChild,oldChild,outOldChild);
 
@@ -624,7 +626,12 @@ static HRESULT WINAPI xmlnode_replaceChild(
     if(outOldChild)
         *outOldChild = NULL;
 
-    old_child_ptr = impl_from_IXMLDOMNode(oldChild)->node;
+    hr = IXMLDOMNode_QueryInterface(oldChild,&IID_IXMLDOMNode,(LPVOID*)&realOldChild);
+    if(FAILED(hr))
+        return hr;
+
+    old_child_ptr = impl_from_IXMLDOMNode(realOldChild)->node;
+    IXMLDOMNode_Release(realOldChild);
     if(old_child_ptr->parent != This->node)
     {
         WARN("childNode %p is not a child of %p\n", oldChild, iface);
diff --git a/dlls/msxml3/tests/domdoc.c b/dlls/msxml3/tests/domdoc.c
index 85c19cc..056c91b 100644
--- a/dlls/msxml3/tests/domdoc.c
+++ b/dlls/msxml3/tests/domdoc.c
@@ -1842,7 +1842,7 @@ static void test_replaceChild(void)
     BSTR str;
     VARIANT_BOOL b;
     IXMLDOMDocument *doc;
-    IXMLDOMElement *element;
+    IXMLDOMElement *element, *ba_element;
     IXMLDOMNode *fo_node, *ba_node, *lc_node, *removed_node, *temp_node;
     IXMLDOMNodeList *root_list, *fo_list;
     IUnknown * unk1, *unk2;
@@ -1925,6 +1925,13 @@ static void test_replaceChild(void)
     r = IXMLDOMNode_get_childNodes( fo_node, &fo_list );
     ok( r == S_OK, "ret %08x\n", r );
 
+    /* MS quirk: replaceChild also accepts elements instead of nodes */
+    r = IXMLDOMNode_QueryInterface( ba_node, &IID_IXMLDOMElement, (void**)&ba_element);
+    ok( r == S_OK, "ret %08x\n", r );
+
+    r = IXMLDOMElement_replaceChild( element, ba_node, (IXMLDOMNode*)ba_element, &removed_node );
+    ok( r == S_OK, "ret %08x\n", r );
+
     r = IXMLDOMNodeList_get_length( fo_list, &len);
     ok( r == S_OK, "ret %08x\n", r );
     ok( len == 0, "len %ld\n", len);




More information about the wine-cvs mailing list