Module: wine Branch: master Commit: 2d5c9f4f462f50cd82536dee3c5c9e7dfd6ad336 URL: http://source.winehq.org/git/wine.git/?a=commit;h=2d5c9f4f462f50cd82536dee3c...
Author: Nikolay Sivov nsivov@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;