From: Nikolay Sivov <nsivov@codeweavers.com> Signed-off-by: Nikolay Sivov <nsivov@codeweavers.com> --- dlls/msxml3/node.c | 4 ++++ dlls/msxml3/tests/domdoc.c | 22 ++++++++++++++++++++-- 2 files changed, 24 insertions(+), 2 deletions(-) diff --git a/dlls/msxml3/node.c b/dlls/msxml3/node.c index af78ce9ba9d..91e58e6ae9e 100644 --- a/dlls/msxml3/node.c +++ b/dlls/msxml3/node.c @@ -3491,6 +3491,10 @@ HRESULT node_set_attribute_value(struct domnode *node, const WCHAR *name, const hr = node_put_data(attr, attr_value); VariantClear(&v); + /* Allow setting namespace definition node once. */ + if (attr && is_namespace_definition(attr)) + attr->flags |= DOMNODE_READONLY_VALUE; + return hr; } diff --git a/dlls/msxml3/tests/domdoc.c b/dlls/msxml3/tests/domdoc.c index d2c13badbef..d0cead99689 100644 --- a/dlls/msxml3/tests/domdoc.c +++ b/dlls/msxml3/tests/domdoc.c @@ -16928,6 +16928,7 @@ static void test_document_reload(void) static void test_setAttribute(void) { IXMLDOMElement *element; + IXMLDOMAttribute *attr; IXMLDOMDocument *doc; IXMLDOMNode *node; HRESULT hr; @@ -16959,15 +16960,32 @@ static void test_setAttribute(void) SysFreeString(str); hr = IXMLDOMElement_setAttribute(element, _bstr_("xmlns:prefix"), _variantbstr_("uri2")); - todo_wine ok(hr == E_FAIL, "Unexpected hr %#lx.\n", hr); hr = IXMLDOMElement_get_xml(element, &str); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - todo_wine ok(!wcscmp(str, L"<prefix:name xmlns:prefix=\"uri\"/>"), "Unexpected xml %s.\n", debugstr_w(str)); SysFreeString(str); + hr = IXMLDOMElement_getAttributeNode(element, _bstr_("xmlns:prefix"), &attr); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + hr = IXMLDOMAttribute_put_text(attr, _bstr_("uri3")); + ok(hr == E_FAIL, "Unexpected hr %#lx.\n", hr); + IXMLDOMAttribute_Release(attr); + + hr = IXMLDOMElement_setAttribute(element, _bstr_("attr1"), _variantbstr_("value")); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + hr = IXMLDOMElement_getAttributeNode(element, _bstr_("attr1"), &attr); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + hr = IXMLDOMAttribute_put_text(attr, _bstr_("value2")); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + IXMLDOMAttribute_Release(attr); + + hr = IXMLDOMElement_get_xml(element, &str); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(!wcscmp(str, L"<prefix:name xmlns:prefix=\"uri\" attr1=\"value2\"/>"), "Unexpected xml %s.\n", debugstr_w(str)); + SysFreeString(str); + IXMLDOMElement_Release(element); /* Same local name as existing namespace, different uri value */ -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/10688