[5/5] msxml3: Revert "Simplify IXMLDOMNode::removeChild" (with test) (try2)

Michael Karcher wine at mkarcher.dialup.fu-berlin.de
Tue Oct 7 04:56:06 CDT 2008


The simplification was bad, native msxml works if interface pointers
to the wrong interface are passed in. Tests included.

try 2: Removed trailing whitespace
---
 dlls/msxml3/node.c         |   11 ++++++++++-
 dlls/msxml3/tests/domdoc.c |    8 ++++++--
 2 files changed, 16 insertions(+), 3 deletions(-)

diff --git a/dlls/msxml3/node.c b/dlls/msxml3/node.c
index 9598e29..7056ca3 100644
--- a/dlls/msxml3/node.c
+++ b/dlls/msxml3/node.c
@@ -671,6 +671,8 @@ static HRESULT WINAPI xmlnode_removeChild(
 {
     xmlnode *This = impl_from_IXMLDOMNode( iface );
     xmlNode *child_node_ptr;
+    HRESULT hr;
+    IXMLDOMNode *child;
 
     TRACE("%p->(%p, %p)\n", This, childNode, oldChild);
 
@@ -679,15 +681,22 @@ static HRESULT WINAPI xmlnode_removeChild(
     if(oldChild)
         *oldChild = NULL;
 
-    child_node_ptr = impl_from_IXMLDOMNode(childNode)->node;
+    hr = IXMLDOMNode_QueryInterface(childNode, &IID_IXMLDOMNode, (LPVOID)&child);
+    if(FAILED(hr))
+        return hr;
+
+    child_node_ptr = impl_from_IXMLDOMNode(child)->node;
     if(child_node_ptr->parent != This->node)
     {
         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);
+
     if(oldChild)
     {
         IXMLDOMNode_AddRef(childNode);
diff --git a/dlls/msxml3/tests/domdoc.c b/dlls/msxml3/tests/domdoc.c
index 1645e2f..b98d0eb 100644
--- a/dlls/msxml3/tests/domdoc.c
+++ b/dlls/msxml3/tests/domdoc.c
@@ -1791,7 +1791,7 @@ static void test_removeChild(void)
     BSTR str;
     VARIANT_BOOL b;
     IXMLDOMDocument *doc;
-    IXMLDOMElement *element;
+    IXMLDOMElement *element, *lc_element;
     IXMLDOMNode *fo_node, *ba_node, *removed_node, *temp_node, *lc_node;
     IXMLDOMNodeList *root_list, *fo_list;
 
@@ -1855,7 +1855,11 @@ static void test_removeChild(void)
     r = IXMLDOMNodeList_get_item( root_list, 0, &lc_node );
     ok( r == S_OK, "ret %08x\n", r);
 
-    r = IXMLDOMElement_removeChild( element, lc_node, NULL );
+    r = IXMLDOMElement_QueryInterface( lc_node, &IID_IXMLDOMElement, (LPVOID*)&lc_element );
+    ok( r == S_OK, "ret %08x\n", r);
+
+    /* MS quirk: passing wrong interface pointer works, too */
+    r = IXMLDOMElement_removeChild( element, lc_element, NULL );
     ok( r == S_OK, "ret %08x\n", r);
 
     r = IXMLDOMNode_get_parentNode( lc_node, &temp_node );
-- 
1.5.6.5




More information about the wine-patches mailing list