Module: wine Branch: master Commit: 38844dc31e6afb7c6a3e824979b2bc1a403d104b URL: https://source.winehq.org/git/wine.git/?a=commit;h=38844dc31e6afb7c6a3e82497...
Author: Daniel Lehman dlehman25@gmail.com Date: Tue Sep 22 16:35:38 2020 -0700
msxml3: Handle namespaces in removeNamedItem.
Signed-off-by: Daniel Lehman dlehman25@gmail.com Signed-off-by: Nikolay Sivov nsivov@codeweavers.com Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/msxml3/element.c | 37 ++++++++++++++++++++++++++++++++++++- dlls/msxml3/tests/domdoc.c | 10 +++++----- 2 files changed, 41 insertions(+), 6 deletions(-)
diff --git a/dlls/msxml3/element.c b/dlls/msxml3/element.c index ecebd39fea..a352621bfb 100644 --- a/dlls/msxml3/element.c +++ b/dlls/msxml3/element.c @@ -1749,8 +1749,43 @@ static HRESULT domelem_remove_qualified_item(xmlNodePtr node, BSTR name, BSTR ur
static HRESULT domelem_remove_named_item(xmlNodePtr node, BSTR name, IXMLDOMNode **item) { + xmlChar *nameA, *local, *prefix; + BSTR uriW, localW; + xmlNsPtr ns; + HRESULT hr; + TRACE("(%p)->(%s %p)\n", node, debugstr_w(name), item); - return domelem_remove_qualified_item(node, name, NULL, item); + + nameA = xmlchar_from_wchar(name); + local = xmlSplitQName2(nameA, &prefix); + heap_free(nameA); + + if (!local) + return domelem_remove_qualified_item(node, name, NULL, item); + + ns = xmlSearchNs(node->doc, node, prefix); + + xmlFree(prefix); + + if (!ns) + { + xmlFree(local); + if (item) *item = NULL; + return item ? S_FALSE : E_INVALIDARG; + } + + uriW = bstr_from_xmlChar(ns->href); + localW = bstr_from_xmlChar(local); + xmlFree(local); + + TRACE("removing qualified node %s, uri=%s\n", debugstr_w(localW), debugstr_w(uriW)); + + hr = domelem_remove_qualified_item(node, localW, uriW, item); + + SysFreeString(localW); + SysFreeString(uriW); + + return hr; }
static HRESULT domelem_get_item(const xmlNodePtr node, LONG index, IXMLDOMNode **item) diff --git a/dlls/msxml3/tests/domdoc.c b/dlls/msxml3/tests/domdoc.c index 76e42d5029..304c08acf6 100644 --- a/dlls/msxml3/tests/domdoc.c +++ b/dlls/msxml3/tests/domdoc.c @@ -4164,18 +4164,18 @@ static void test_removeNamedItem(void)
removed_node = NULL; r = IXMLDOMNamedNodeMap_removeNamedItem( map, _bstr_("ns:b"), &removed_node ); - todo_wine EXPECT_HR(r, S_OK); - if (removed_node) IXMLDOMNode_Release( removed_node ); + EXPECT_HR(r, S_OK); + IXMLDOMNode_Release( removed_node );
removed_node = NULL; r = IXMLDOMNamedNodeMap_removeNamedItem( map, _bstr_("xml:lang"), &removed_node ); - todo_wine EXPECT_HR(r, S_OK); - if (removed_node) IXMLDOMNode_Release( removed_node ); + EXPECT_HR(r, S_OK); + IXMLDOMNode_Release( removed_node );
len = -1; r = IXMLDOMNamedNodeMap_get_length( map, &len ); EXPECT_HR(r, S_OK); - todo_wine ok( len == 2, "length %d\n", len ); + ok( len == 2, "length %d\n", len );
IXMLDOMNamedNodeMap_Release( map ); IXMLDOMElement_Release( element );