[PATCH 0/4] MR10608: msxml3/tests: Add some more appendChild() tests with fragments.
Signed-off-by: Nikolay Sivov <nsivov@codeweavers.com> -- https://gitlab.winehq.org/wine/wine/-/merge_requests/10608
From: Nikolay Sivov <nsivov@codeweavers.com> Signed-off-by: Nikolay Sivov <nsivov@codeweavers.com> --- dlls/msxml3/tests/domdoc.c | 103 ++++++++++++++++++++++++++++++++++++- 1 file changed, 101 insertions(+), 2 deletions(-) diff --git a/dlls/msxml3/tests/domdoc.c b/dlls/msxml3/tests/domdoc.c index 6ced8db12fa..3744d7bd92b 100644 --- a/dlls/msxml3/tests/domdoc.c +++ b/dlls/msxml3/tests/domdoc.c @@ -9839,11 +9839,11 @@ static void test_insertBefore(void) static void test_appendChild(void) { + IXMLDOMDocumentFragment *fragment, *fragment2; + IXMLDOMElement *elem, *elem2, *elem3; IXMLDOMComment *comment1, *comment2; - IXMLDOMDocumentFragment *fragment; IXMLDOMProcessingInstruction *pi; IXMLDOMDocument *doc, *doc2; - IXMLDOMElement *elem, *elem2; IXMLDOMText *text1, *text2; IXMLDOMNodeList *list; DOMNodeType node_type; @@ -9851,6 +9851,7 @@ static void test_appendChild(void) LONG length; VARIANT var; HRESULT hr; + BSTR xml; doc = create_document(&IID_IXMLDOMDocument); doc2 = create_document(&IID_IXMLDOMDocument); @@ -9978,7 +9979,105 @@ static void test_appendChild(void) IXMLDOMText_Release(text2); IXMLDOMDocumentFragment_Release(fragment); + /* Nested fragments */ + hr = IXMLDOMDocument_createDocumentFragment(doc, &fragment); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + hr = IXMLDOMDocument_createDocumentFragment(doc, &fragment2); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + + hr = IXMLDOMDocument_createElement(doc, _bstr_("elem"), &elem); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + hr = IXMLDOMDocumentFragment_appendChild(fragment, (IXMLDOMNode *)elem, NULL); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + hr = IXMLDOMDocumentFragment_get_xml(fragment, &xml); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(!wcscmp(xml, L"<elem/>"), "Unexpected xml %s.\n", debugstr_w(xml)); + SysFreeString(xml); + + hr = IXMLDOMDocument_createElement(doc, _bstr_("elem2"), &elem2); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + hr = IXMLDOMDocumentFragment_appendChild(fragment2, (IXMLDOMNode *)elem2, NULL); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + hr = IXMLDOMDocumentFragment_get_xml(fragment2, &xml); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(!wcscmp(xml, L"<elem2/>"), "Unexpected xml %s.\n", debugstr_w(xml)); + SysFreeString(xml); + + EXPECT_CHILDREN(fragment2); + hr = IXMLDOMDocumentFragment_appendChild(fragment, (IXMLDOMNode *)fragment2, NULL); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + EXPECT_NO_CHILDREN(fragment2); + + hr = IXMLDOMDocumentFragment_get_xml(fragment, &xml); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(!wcscmp(xml, L"<elem/><elem2/>"), "Unexpected xml %s.\n", debugstr_w(xml)); + SysFreeString(xml); + + hr = IXMLDOMDocument_createElement(doc, _bstr_("elem3"), &elem3); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + + EXPECT_CHILDREN(fragment); + hr = IXMLDOMElement_appendChild(elem3, (IXMLDOMNode *)fragment, NULL); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + EXPECT_NO_CHILDREN(fragment); + + hr = IXMLDOMElement_get_xml(elem3, &xml); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(!wcscmp(xml, L"<elem3><elem/><elem2/></elem3>"), "Unexpected xml %s.\n", debugstr_w(xml)); + SysFreeString(xml); + + IXMLDOMElement_Release(elem); + IXMLDOMElement_Release(elem2); + IXMLDOMElement_Release(elem3); + IXMLDOMDocumentFragment_Release(fragment2); + IXMLDOMDocumentFragment_Release(fragment); + + /* Append a child to empty linked fragment */ + hr = IXMLDOMDocument_createDocumentFragment(doc, &fragment); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + hr = IXMLDOMDocument_createDocumentFragment(doc, &fragment2); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + hr = IXMLDOMDocument_createElement(doc, _bstr_("elem"), &elem); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + hr = IXMLDOMDocument_createElement(doc, _bstr_("elem2"), &elem2); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + hr = IXMLDOMDocument_createElement(doc, _bstr_("elem3"), &elem3); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + hr = IXMLDOMDocumentFragment_appendChild(fragment, (IXMLDOMNode *)elem, NULL); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + hr = IXMLDOMDocumentFragment_appendChild(fragment, (IXMLDOMNode *)fragment2, NULL); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + hr = IXMLDOMDocumentFragment_appendChild(fragment2, (IXMLDOMNode *)elem2, NULL); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + + EXPECT_CHILDREN(fragment); + EXPECT_CHILDREN(fragment2); + hr = IXMLDOMElement_appendChild(elem3, (IXMLDOMNode *)fragment, NULL); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + EXPECT_NO_CHILDREN(fragment); + EXPECT_CHILDREN(fragment2); + hr = IXMLDOMDocumentFragment_get_parentNode(fragment2, &node); + ok(hr == S_FALSE, "Unexpected hr %#lx.\n", hr); + ok(!node, "Unexpected node %p.\n", node); + + hr = IXMLDOMElement_get_xml(elem3, &xml); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(!wcscmp(xml, L"<elem3><elem/></elem3>"), "Unexpected xml %s.\n", debugstr_w(xml)); + SysFreeString(xml); + + hr = IXMLDOMDocumentFragment_get_xml(fragment2, &xml); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(!wcscmp(xml, L"<elem2/>"), "Unexpected xml %s.\n", debugstr_w(xml)); + SysFreeString(xml); + + IXMLDOMElement_Release(elem); + IXMLDOMElement_Release(elem2); + IXMLDOMElement_Release(elem3); + IXMLDOMDocumentFragment_Release(fragment); + IXMLDOMDocumentFragment_Release(fragment2); + IXMLDOMDocument_Release(doc); + free_bstrs(); } static void test_get_doctype(void) -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/10608
From: Nikolay Sivov <nsivov@codeweavers.com> Signed-off-by: Nikolay Sivov <nsivov@codeweavers.com> --- dlls/msxml3/tests/domdoc.c | 58 ++++++++++++------------------------ dlls/msxml6/tests/domdoc.c | 60 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 79 insertions(+), 39 deletions(-) diff --git a/dlls/msxml3/tests/domdoc.c b/dlls/msxml3/tests/domdoc.c index 3744d7bd92b..149be7fa1bc 100644 --- a/dlls/msxml3/tests/domdoc.c +++ b/dlls/msxml3/tests/domdoc.c @@ -13879,44 +13879,6 @@ static void test_transformNodeToObject(void) free_bstrs(); } -static void test_normalize_attribute_values(void) -{ - IXMLDOMDocument2 *doc; - VARIANT var; - HRESULT hr; - - if (!is_clsid_supported(&CLSID_DOMDocument60, &IID_IXMLDOMDocument2)) - { - win_skip("NormalizeAttributeValues is not supported.\n"); - return; - } - - doc = create_document_version(60, &IID_IXMLDOMDocument2); - - V_VT(&var) = VT_I2; - V_I2(&var) = 10; - hr = IXMLDOMDocument2_getProperty(doc, _bstr_("NormalizeAttributeValues"), &var); -todo_wine { - ok(hr == S_OK, "Failed to get property value, hr %#lx.\n", hr); - ok(V_VT(&var) == VT_BOOL, "Unexpected property value type, vt %d.\n", V_VT(&var)); - ok(V_BOOL(&var) == VARIANT_FALSE, "Unexpected property value.\n"); -} - V_VT(&var) = VT_BOOL; - V_BOOL(&var) = VARIANT_TRUE; - hr = IXMLDOMDocument2_setProperty(doc, _bstr_("NormalizeAttributeValues"), var); - ok(hr == S_OK, "Failed to set property, hr %#lx.\n", hr); - - V_VT(&var) = VT_I2; - V_I2(&var) = 10; - hr = IXMLDOMDocument2_getProperty(doc, _bstr_("NormalizeAttributeValues"), &var); -todo_wine { - ok(hr == S_OK, "Failed to get property value, hr %#lx.\n", hr); - ok(V_VT(&var) == VT_BOOL, "Unexpected property value type, vt %d.\n", V_VT(&var)); - ok(V_BOOL(&var) == VARIANT_TRUE, "Unexpected property value.\n"); -} - IXMLDOMDocument2_Release(doc); -} - static void test_max_element_depth_values(void) { IXMLDOMDocument2 *doc; @@ -15958,6 +15920,7 @@ static void test_text(void) static void test_attribute_value(void) { + IXMLDOMElement *element; IXMLDOMAttribute *attr; IXMLDOMDocument *doc; IXMLDOMNode *child; @@ -16079,6 +16042,24 @@ static void test_attribute_value(void) IXMLDOMAttribute_Release(attr); + /* Newlines in attribute value */ + hr = IXMLDOMDocument_put_preserveWhiteSpace(doc, VARIANT_TRUE); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + + hr = IXMLDOMDocument_loadXML(doc, _bstr_("<a attr=\"v\r\na\rl\nu\te\" />"), NULL); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + + hr = IXMLDOMDocument_get_documentElement(doc, &element); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + + hr = IXMLDOMElement_getAttribute(element, _bstr_("attr"), &value); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + todo_wine + ok(!wcscmp(V_BSTR(&value), L"v\na\nl\nu\te"), "Unexpected value %s.\n", debugstr_w(V_BSTR(&value))); + VariantClear(&value); + + IXMLDOMElement_Release(element); + IXMLDOMDocument_Release(doc); free_bstrs(); } @@ -16802,7 +16783,6 @@ START_TEST(domdoc) test_url(); test_merging_text(); test_transformNodeToObject(); - test_normalize_attribute_values(); test_namespaces_as_attributes(); test_validate_on_parse_values(); test_xsltemplate(); diff --git a/dlls/msxml6/tests/domdoc.c b/dlls/msxml6/tests/domdoc.c index 2bf7acb276d..26aea60c3d2 100644 --- a/dlls/msxml6/tests/domdoc.c +++ b/dlls/msxml6/tests/domdoc.c @@ -453,6 +453,65 @@ static void test_get_parentNode(void) IXMLDOMDocument_Release(doc); } +static void test_normalize_attribute_values(void) +{ + IXMLDOMElement *element; + IXMLDOMDocument2 *doc; + VARIANT var; + HRESULT hr; + + hr = CoCreateInstance(&CLSID_DOMDocument60, NULL, CLSCTX_INPROC_SERVER, &IID_IXMLDOMDocument2, (void **)&doc); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + + hr = IXMLDOMDocument2_loadXML(doc, _bstr_(L"<a attr=\"v\r\na\tl\r\" />"), NULL); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + + hr = IXMLDOMDocument2_get_documentElement(doc, &element); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + + hr = IXMLDOMElement_getAttribute(element, _bstr_(L"attr"), &var); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + todo_wine + ok(!wcscmp(V_BSTR(&var), L"v\na\tl\n"), "Unexpected value %s.\n", debugstr_w(V_BSTR(&var))); + VariantClear(&var); + + V_VT(&var) = VT_I2; + V_I2(&var) = 10; + hr = IXMLDOMDocument2_getProperty(doc, _bstr_(L"NormalizeAttributeValues"), &var); +todo_wine { + ok(hr == S_OK, "Failed to get property value, hr %#lx.\n", hr); + ok(V_VT(&var) == VT_BOOL, "Unexpected property value type, vt %d.\n", V_VT(&var)); + ok(V_BOOL(&var) == VARIANT_FALSE, "Unexpected property value.\n"); +} + hr = IXMLDOMElement_getAttribute(element, _bstr_(L"attr"), &var); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + todo_wine + ok(!wcscmp(V_BSTR(&var), L"v\na\tl\n"), "Unexpected value %s.\n", debugstr_w(V_BSTR(&var))); + VariantClear(&var); + + V_VT(&var) = VT_BOOL; + V_BOOL(&var) = VARIANT_TRUE; + hr = IXMLDOMDocument2_setProperty(doc, _bstr_(L"NormalizeAttributeValues"), var); + ok(hr == S_OK, "Failed to set property, hr %#lx.\n", hr); + + V_VT(&var) = VT_I2; + V_I2(&var) = 10; + hr = IXMLDOMDocument2_getProperty(doc, _bstr_(L"NormalizeAttributeValues"), &var); +todo_wine { + ok(hr == S_OK, "Failed to get property value, hr %#lx.\n", hr); + ok(V_VT(&var) == VT_BOOL, "Unexpected property value type, vt %d.\n", V_VT(&var)); + ok(V_BOOL(&var) == VARIANT_TRUE, "Unexpected property value.\n"); +} + hr = IXMLDOMElement_getAttribute(element, _bstr_(L"attr"), &var); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(!wcscmp(V_BSTR(&var), L"v a l "), "Unexpected value %s.\n", debugstr_w(V_BSTR(&var))); + VariantClear(&var); + + IXMLDOMElement_Release(element); + IXMLDOMDocument2_Release(doc); + free_bstrs(); +} + START_TEST(domdoc) { HRESULT hr; @@ -474,6 +533,7 @@ START_TEST(domdoc) test_leading_spaces(); test_get_ownerDocument(); test_get_parentNode(); + test_normalize_attribute_values(); CoUninitialize(); } -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/10608
From: Nikolay Sivov <nsivov@codeweavers.com> Signed-off-by: Nikolay Sivov <nsivov@codeweavers.com> --- dlls/msxml3/tests/domdoc.c | 75 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 75 insertions(+) diff --git a/dlls/msxml3/tests/domdoc.c b/dlls/msxml3/tests/domdoc.c index 149be7fa1bc..5737e20b5a0 100644 --- a/dlls/msxml3/tests/domdoc.c +++ b/dlls/msxml3/tests/domdoc.c @@ -16699,6 +16699,79 @@ static void test_document_reload(void) free_bstrs(); } +static void test_setAttribute(void) +{ + IXMLDOMElement *element; + IXMLDOMDocument *doc; + HRESULT hr; + BSTR str; + + doc = create_document(&IID_IXMLDOMDocument); + + hr = IXMLDOMDocument_createElement(doc, _bstr_("prefix:name"), &element); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + + hr = IXMLDOMElement_get_namespaceURI(element, &str); + ok(hr == S_FALSE, "Unexpected hr %#lx.\n", hr); + + hr = IXMLDOMElement_get_xml(element, &str); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(!wcscmp(str, L"<prefix:name/>"), "Unexpected xml %s.\n", debugstr_w(str)); + SysFreeString(str); + + hr = IXMLDOMElement_setAttribute(element, _bstr_("xmlns:prefix"), _variantbstr_("uri")); + todo_wine + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + + hr = IXMLDOMElement_get_namespaceURI(element, &str); + ok(hr == S_FALSE, "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_setAttribute(element, _bstr_("xmlns:prefix"), _variantbstr_("uri2")); + todo_wine + ok(hr == E_FAIL, "Unexpected hr %#lx.\n", hr); + + IXMLDOMElement_Release(element); + IXMLDOMDocument_Release(doc); + free_bstrs(); +} + +static void test_createElement(void) +{ + IXMLDOMElement *element; + IXMLDOMDocument *doc; + HRESULT hr; + BSTR str; + + doc = create_document(&IID_IXMLDOMDocument); + + /* URI is not specified, and is not required */ + hr = IXMLDOMDocument_createElement(doc, _bstr_("prefix:name"), &element); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + + hr = IXMLDOMElement_get_xml(element, &str); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(!wcscmp(str, L"<prefix:name/>"), "Unexpected xml %s.\n", debugstr_w(str)); + SysFreeString(str); + + hr = IXMLDOMDocument_appendChild(doc, (IXMLDOMNode *)element, NULL); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + + hr = IXMLDOMDocument_get_xml(doc, &str); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(!wcscmp(str, L"<prefix:name/>\r\n"), "Unexpected xml %s.\n", debugstr_w(str)); + SysFreeString(str); + + IXMLDOMElement_Release(element); + IXMLDOMDocument_Release(doc); + free_bstrs(); +} + START_TEST(domdoc) { HRESULT hr; @@ -16801,6 +16874,8 @@ START_TEST(domdoc) test_loadXML(); test_cdata(); test_document_reload(); + test_setAttribute(); + test_createElement(); if (is_clsid_supported(&CLSID_MXNamespaceManager40, &IID_IMXNamespaceManager)) { -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/10608
From: Nikolay Sivov <nsivov@codeweavers.com> Signed-off-by: Nikolay Sivov <nsivov@codeweavers.com> --- dlls/msxml3/node.c | 5 +++-- dlls/msxml3/tests/domdoc.c | 2 -- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/dlls/msxml3/node.c b/dlls/msxml3/node.c index 03dc4a21614..d75590a31bc 100644 --- a/dlls/msxml3/node.c +++ b/dlls/msxml3/node.c @@ -3459,8 +3459,9 @@ HRESULT node_set_attribute_value(struct domnode *node, const WCHAR *name, const return hr; } - /* Check for conflict with element namespace */ - match = is_same_namespace_prefix(node, attr_name.local) && !is_same_uri(node, attr_value); + /* Check for conflict with element namespace. It's possible to have no uri set on element, + while still having qualified name. */ + match = node->uri && is_same_namespace_prefix(node, attr_name.local) && !is_same_uri(node, attr_value); parsed_name_cleanup(&attr_name); if (match) diff --git a/dlls/msxml3/tests/domdoc.c b/dlls/msxml3/tests/domdoc.c index 5737e20b5a0..f9dfef94b81 100644 --- a/dlls/msxml3/tests/domdoc.c +++ b/dlls/msxml3/tests/domdoc.c @@ -16720,7 +16720,6 @@ static void test_setAttribute(void) SysFreeString(str); hr = IXMLDOMElement_setAttribute(element, _bstr_("xmlns:prefix"), _variantbstr_("uri")); - todo_wine ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); hr = IXMLDOMElement_get_namespaceURI(element, &str); @@ -16728,7 +16727,6 @@ static void test_setAttribute(void) 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); -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/10608
participants (2)
-
Nikolay Sivov -
Nikolay Sivov (@nsivov)