Nikolay Sivov : msxml3: Implement IXMLElement::removeChild() with some tests.

Alexandre Julliard julliard at winehq.org
Mon Jan 18 10:58:51 CST 2010


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

Author: Nikolay Sivov <bunglehead at gmail.com>
Date:   Fri Jan 15 00:13:50 2010 +0300

msxml3: Implement IXMLElement::removeChild() with some tests.

---

 dlls/msxml3/tests/xmlelem.c |   26 +++++++++++++++++++++++---
 dlls/msxml3/xmlelem.c       |   17 +++++++++++++++--
 2 files changed, 38 insertions(+), 5 deletions(-)

diff --git a/dlls/msxml3/tests/xmlelem.c b/dlls/msxml3/tests/xmlelem.c
index 38b621f..dec1464 100644
--- a/dlls/msxml3/tests/xmlelem.c
+++ b/dlls/msxml3/tests/xmlelem.c
@@ -478,7 +478,7 @@ static void test_xmlelem_children(void)
 
     /* remove/add child and check what happens with collection */
     hr = IXMLElement_removeChild(element, child);
-    todo_wine ok(hr == S_OK, "Expected S_OK, got %08x\n", hr);
+    ok(hr == S_OK, "Expected S_OK, got %08x\n", hr);
 
     length = -1;
     hr = IXMLElementCollection_get_length(collection, &length);
@@ -522,14 +522,34 @@ static void test_xmlelem_children(void)
     hr = IXMLElementCollection_item(collection, vIndex, vName, (IDispatch **)&child2);
     ok(hr == S_OK, "Expected S_OK, got %08x\n", hr);
     ok(child2 != NULL, "Expected not NULL child\n");
+    IXMLElementCollection_Release(collection);
+
+    /* add element->child->child2 structure, then remove child2 from node */
+    V_VT(&vType) = VT_I4;
+    V_I4(&vType) = XMLELEMTYPE_TEXT;
+    V_VT(&vName) = VT_NULL;
+    hr = IXMLDocument_createElement(doc, vType, vName, &child2);
+    ok(hr == S_OK, "Expected S_OK, got %08x\n", hr);
+    ok(child2 != NULL, "Expected non-NULL child\n");
+
+    hr = IXMLElement_addChild(child, child2, 0, -1);
+    ok(hr == S_OK, "Expected S_OK, got %08x\n", hr);
+
+    hr = IXMLElement_removeChild(element, child2);
+    ok(hr == E_INVALIDARG, "Expected E_INVALIDARG, got %08x\n", hr);
+
+    hr = IXMLElement_removeChild(child, child2);
+    ok(hr == S_OK, "Expected S_OK, got %08x\n", hr);
+
+    hr = IXMLElement_removeChild(child, NULL);
+    ok(hr == E_INVALIDARG, "Expected E_INVALIDARG, got %08x\n", hr);
 
     IXMLElement_Release(element);
     IXMLElement_Release(child);
-    IXMLElementCollection_Release(collection);
+    IXMLElement_Release(child2);
     IXMLDocument_Release(doc);
 }
 
-
 static BOOL test_try_xmldoc(void)
 {
     IXMLDocument *doc = NULL;
diff --git a/dlls/msxml3/xmlelem.c b/dlls/msxml3/xmlelem.c
index b91722c..8fe24eb 100644
--- a/dlls/msxml3/xmlelem.c
+++ b/dlls/msxml3/xmlelem.c
@@ -412,8 +412,21 @@ static HRESULT WINAPI xmlelem_addChild(IXMLElement *iface, IXMLElement *pChildEl
 
 static HRESULT WINAPI xmlelem_removeChild(IXMLElement *iface, IXMLElement *pChildElem)
 {
-    FIXME("(%p, %p): stub\n", iface, pChildElem);
-    return E_NOTIMPL;
+    xmlelem *This = impl_from_IXMLElement(iface);
+    xmlelem *childElem = impl_from_IXMLElement(pChildElem);
+
+    TRACE("(%p, %p)\n", This, childElem);
+
+    if (!pChildElem)
+        return E_INVALIDARG;
+
+    /* only supported for This is childElem parent case */
+    if (This->node != childElem->node->parent)
+        return E_INVALIDARG;
+
+    xmlUnlinkNode(childElem->node);
+
+    return S_OK;
 }
 
 static const struct IXMLElementVtbl xmlelem_vtbl =




More information about the wine-cvs mailing list