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