[PATCH v2 0/2] MR11363: msxml3/element: Return the inserted node from IXMLDOMNamedNodeMap::setNamedItem().
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. Textpad 8 will not close if the x button is pressed. This patch fixes that. -- v2: msxml3/element: Return the inserted node from IXMLDOMNamedNodeMap::setNamedItem(). msxml3/tests: Add tests for IXMLDOMNamedNodeMap::setNamedItem(). https://gitlab.winehq.org/wine/wine/-/merge_requests/11363
From: Jacob Czekalla <jczekalla@codeweavers.com> Test that setNamedItem() returns the inserted node for both a new attribute and a replaced attribute with the same name. --- dlls/msxml3/tests/domdoc.c | 82 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 82 insertions(+) diff --git a/dlls/msxml3/tests/domdoc.c b/dlls/msxml3/tests/domdoc.c index 9254914ca07..03500b58234 100644 --- a/dlls/msxml3/tests/domdoc.c +++ b/dlls/msxml3/tests/domdoc.c @@ -8423,6 +8423,87 @@ static void test_get_ownerDocument(void) free_bstrs(); } +static void test_setNamedItem_map(IXMLDOMDocument *doc, IXMLDOMNamedNodeMap *map, const char *name, HRESULT expected_hr) +{ + IXMLDOMNode *ret_node = NULL; + IXMLDOMAttribute *attr; + VARIANT value; + HRESULT hr; + + IXMLDOMDocument_createAttribute(doc, _bstr_(name), &attr); + 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); + IXMLDOMAttribute_Release(attr); + if (ret_node) + { + VariantInit(&value); + 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)); + ok(V_VT(&value) == VT_BSTR && !wcscmp(V_BSTR(&value), L"first"), "Unexpected value %s.\n", debugstr_variant(&value)); + VariantClear(&value); + IXMLDOMNode_Release(ret_node); + } + + ret_node = NULL; + IXMLDOMDocument_createAttribute(doc, _bstr_(name), &attr); + IXMLDOMAttribute_put_nodeValue(attr, _variantbstr_("second")); + hr = IXMLDOMNamedNodeMap_setNamedItem(map, (IXMLDOMNode *)attr, &ret_node); + ok(hr == expected_hr, "Unexpected hr %#lx.\n", hr); + ok(FAILED(hr) ? !ret_node : !!ret_node, "Unexpected returned node %p.\n", ret_node); + IXMLDOMAttribute_Release(attr); + if (ret_node) + { + VariantInit(&value); + 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)); + VariantClear(&value); + IXMLDOMNode_Release(ret_node); + } +} + +static void test_setNamedItem(void) +{ + IXMLDOMProcessingInstruction *pi; + IXMLDOMDocumentType *doctype; + IXMLDOMNamedNodeMap *map; + IXMLDOMDocument *doc; + IXMLDOMElement *elem; + HRESULT hr; + + doc = create_document(&IID_IXMLDOMDocument); + + IXMLDOMDocument_createElement(doc, _bstr_("test"), &elem); + IXMLDOMElement_get_attributes(elem, &map); + test_setNamedItem_map(doc, map, "attr", S_OK); + IXMLDOMNamedNodeMap_Release(map); + IXMLDOMElement_Release(elem); + + IXMLDOMDocument_createProcessingInstruction(doc, _bstr_("xml"), _bstr_("version=\"1.0\""), &pi); + IXMLDOMProcessingInstruction_get_attributes(pi, &map); + test_setNamedItem_map(doc, map, "standalone", S_OK); + IXMLDOMNamedNodeMap_Release(map); + IXMLDOMProcessingInstruction_Release(pi); + + IXMLDOMDocument_loadXML(doc, _bstr_(szEmailXML), NULL); + IXMLDOMDocument_get_doctype(doc, &doctype); + hr = IXMLDOMDocumentType_get_attributes(doctype, &map); + todo_wine ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + if (hr == S_OK) + { + test_setNamedItem_map(doc, map, "attr", E_FAIL); + IXMLDOMNamedNodeMap_Release(map); + } + IXMLDOMDocumentType_Release(doctype); + + IXMLDOMDocument_Release(doc); + free_bstrs(); +} + static void test_setAttributeNode(void) { IXMLDOMDocument *doc, *doc2; @@ -17850,6 +17931,7 @@ START_TEST(domdoc) test_getQualifiedItem(); test_removeQualifiedItem(); test_get_ownerDocument(); + test_setNamedItem(); test_setAttributeNode(); test_put_dataType(); test_createNode(); -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/11363
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
participants (2)
-
Jacob Czekalla -
Jacob Czekalla (@JacobCzekalla)