From: Jacob Czekalla <jczekalla@codeweavers.com> IXMLDOMNamedNodeMap::setNamedItem() should return the supplied node. Currently, it returns the result of IXMLDOMElement::setAttributeNode() which returns the replaced attribute or NULL. Fix this by returning the supplied node instead. --- dlls/msxml3/nodemap.c | 13 ++++++++++++- dlls/msxml3/tests/domdoc.c | 4 ++-- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/dlls/msxml3/nodemap.c b/dlls/msxml3/nodemap.c index 419dfa6305d..cb5036ed27d 100644 --- a/dlls/msxml3/nodemap.c +++ b/dlls/msxml3/nodemap.c @@ -179,10 +179,21 @@ static HRESULT WINAPI xmlnodemap_getNamedItem(IXMLDOMNamedNodeMap *iface, BSTR n static HRESULT WINAPI xmlnodemap_setNamedItem(IXMLDOMNamedNodeMap *iface, IXMLDOMNode *newItem, IXMLDOMNode **namedItem) { xmlnodemap *map = impl_from_IXMLDOMNamedNodeMap(iface); + HRESULT hr; TRACE("%p, %p, %p.\n", iface, newItem, namedItem ); - return map->funcs->set_named_item(map->node, newItem, namedItem); + hr = map->funcs->set_named_item(map->node, newItem, NULL); + if (FAILED(hr)) + return hr; + + if (namedItem) + { + *namedItem = newItem; + IXMLDOMNode_AddRef(*namedItem); + } + + return S_OK; } static HRESULT WINAPI xmlnodemap_removeNamedItem(IXMLDOMNamedNodeMap *iface, BSTR name, IXMLDOMNode **namedItem) diff --git a/dlls/msxml3/tests/domdoc.c b/dlls/msxml3/tests/domdoc.c index 03500b58234..980d73d6e9c 100644 --- a/dlls/msxml3/tests/domdoc.c +++ b/dlls/msxml3/tests/domdoc.c @@ -8434,7 +8434,7 @@ static void test_setNamedItem_map(IXMLDOMDocument *doc, IXMLDOMNamedNodeMap *map IXMLDOMAttribute_put_nodeValue(attr, _variantbstr_("first")); hr = IXMLDOMNamedNodeMap_setNamedItem(map, (IXMLDOMNode *)attr, &ret_node); ok(hr == expected_hr, "Unexpected hr %#lx.\n", hr); - todo_wine ok(FAILED(hr) ? !ret_node : !!ret_node, "Unexpected returned node %p.\n", ret_node); + ok(FAILED(hr) ? !ret_node : !!ret_node, "Unexpected returned node %p.\n", ret_node); IXMLDOMAttribute_Release(attr); if (ret_node) { @@ -8460,7 +8460,7 @@ static void test_setNamedItem_map(IXMLDOMDocument *doc, IXMLDOMNamedNodeMap *map hr = IXMLDOMNode_get_nodeValue(ret_node, &value); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); ok(V_VT(&value) == VT_BSTR, "Unexpected type %d.\n", V_VT(&value)); - todo_wine ok(V_VT(&value) == VT_BSTR && !wcscmp(V_BSTR(&value), L"second"), "Unexpected value %s.\n", debugstr_variant(&value)); + ok(V_VT(&value) == VT_BSTR && !wcscmp(V_BSTR(&value), L"second"), "Unexpected value %s.\n", debugstr_variant(&value)); VariantClear(&value); IXMLDOMNode_Release(ret_node); } -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/11363