Nikolay Sivov : msxml3: Filter unsupported child nodes in insertBefore() for elements.

Alexandre Julliard julliard at winehq.org
Mon Mar 4 13:23:38 CST 2013


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

Author: Nikolay Sivov <nsivov at codeweavers.com>
Date:   Sun Mar  3 21:20:13 2013 +0400

msxml3: Filter unsupported child nodes in insertBefore() for elements.

---

 dlls/msxml3/element.c      |   22 +++++++++++++++++++---
 dlls/msxml3/tests/domdoc.c |    8 +++++++-
 2 files changed, 26 insertions(+), 4 deletions(-)

diff --git a/dlls/msxml3/element.c b/dlls/msxml3/element.c
index 929830b..70360e5 100644
--- a/dlls/msxml3/element.c
+++ b/dlls/msxml3/element.c
@@ -301,13 +301,29 @@ static HRESULT WINAPI domelem_get_attributes(
 static HRESULT WINAPI domelem_insertBefore(
     IXMLDOMElement *iface,
     IXMLDOMNode* newNode, VARIANT refChild,
-    IXMLDOMNode** outOldNode)
+    IXMLDOMNode** old_node)
 {
     domelem *This = impl_from_IXMLDOMElement( iface );
+    DOMNodeType type;
+    HRESULT hr;
 
-    TRACE("(%p)->(%p %s %p)\n", This, newNode, debugstr_variant(&refChild), outOldNode);
+    TRACE("(%p)->(%p %s %p)\n", This, newNode, debugstr_variant(&refChild), old_node);
+
+    hr = IXMLDOMNode_get_nodeType(newNode, &type);
+    if (hr != S_OK) return hr;
 
-    return node_insert_before(&This->node, newNode, &refChild, outOldNode);
+    TRACE("new node type %d\n", type);
+    switch (type)
+    {
+        case NODE_DOCUMENT:
+        case NODE_DOCUMENT_TYPE:
+        case NODE_ENTITY:
+        case NODE_NOTATION:
+            if (old_node) *old_node = NULL;
+            return E_FAIL;
+        default:
+            return node_insert_before(&This->node, newNode, &refChild, old_node);
+    }
 }
 
 static HRESULT WINAPI domelem_replaceChild(
diff --git a/dlls/msxml3/tests/domdoc.c b/dlls/msxml3/tests/domdoc.c
index c1bfc1a..794df03 100644
--- a/dlls/msxml3/tests/domdoc.c
+++ b/dlls/msxml3/tests/domdoc.c
@@ -4,7 +4,7 @@
  * Copyright 2005 Mike McCormack for CodeWeavers
  * Copyright 2007-2008 Alistair Leslie-Hughes
  * Copyright 2010-2011 Adam Martinson for CodeWeavers
- * Copyright 2010-2012 Nikolay Sivov for CodeWeavers
+ * Copyright 2010-2013 Nikolay Sivov for CodeWeavers
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
@@ -8484,6 +8484,12 @@ static void test_insertBefore(void)
 
     todo_wine EXPECT_REF(elem2, 2);
 
+    /* document to element */
+    V_VT(&v) = VT_DISPATCH;
+    V_DISPATCH(&v) = NULL;
+    hr = IXMLDOMElement_insertBefore(elem1, (IXMLDOMNode*)doc, v, NULL);
+    ok(hr == E_FAIL, "got 0x%08x\n", hr);
+
     V_VT(&v) = VT_DISPATCH;
     V_DISPATCH(&v) = NULL;
     node = NULL;




More information about the wine-cvs mailing list