[PATCH 0/2] MR10826: msxml3: Node cloning fixes.
Signed-off-by: Nikolay Sivov <nsivov@codeweavers.com> -- https://gitlab.winehq.org/wine/wine/-/merge_requests/10826
From: Nikolay Sivov <nsivov@codeweavers.com> Signed-off-by: Nikolay Sivov <nsivov@codeweavers.com> --- dlls/msxml3/tests/domdoc.c | 90 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 90 insertions(+) diff --git a/dlls/msxml3/tests/domdoc.c b/dlls/msxml3/tests/domdoc.c index 7c8e28b56ae..5618dd9b42c 100644 --- a/dlls/msxml3/tests/domdoc.c +++ b/dlls/msxml3/tests/domdoc.c @@ -5684,6 +5684,9 @@ static void test_cloneNode(void ) { IXMLDOMDocumentType *doctype, *doctype2; IXMLDOMDocument2 *doc, *doc_clone; + IXMLDOMProcessingInstruction *pi; + IXMLDOMCDATASection *cdata; + IXMLDOMComment *comment; IXMLDOMElement *element; IXMLDOMDocument *doc2; VARIANT_BOOL b; @@ -5694,8 +5697,10 @@ static void test_cloneNode(void ) IXMLDOMNode *node, *attr; IXMLDOMNode *node_clone; IXMLDOMNode *node_first; + IXMLDOMText *textnode; VARIANT v; HRESULT hr; + BSTR str; doc = create_document(&IID_IXMLDOMDocument2); @@ -5866,6 +5871,91 @@ static void test_cloneNode(void ) IXMLDOMNode_Release(node_clone); IXMLDOMNode_Release(node); + + /* Text */ + hr = IXMLDOMDocument2_createTextNode(doc, _bstr_("Text"), &textnode); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + hr = IXMLDOMText_cloneNode(textnode, VARIANT_FALSE, &node); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + hr = IXMLDOMNode_get_xml(node, &str); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + todo_wine + ok(!wcscmp(str, L"Text"), "Unexpected str %s.\n", debugstr_w(str)); + SysFreeString(str); + IXMLDOMNode_Release(node); + hr = IXMLDOMText_cloneNode(textnode, VARIANT_TRUE, &node); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + hr = IXMLDOMNode_get_xml(node, &str); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + todo_wine + ok(!wcscmp(str, L"Text"), "Unexpected str %s.\n", debugstr_w(str)); + SysFreeString(str); + IXMLDOMNode_Release(node); + IXMLDOMText_Release(textnode); + + /* CDATA */ + hr = IXMLDOMDocument2_createCDATASection(doc, _bstr_("CData"), &cdata); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + hr = IXMLDOMCDATASection_cloneNode(cdata, VARIANT_FALSE, &node); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + hr = IXMLDOMNode_get_xml(node, &str); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + todo_wine + ok(!wcscmp(str, L"<![CDATA[CData]]>"), "Unexpected str %s.\n", debugstr_w(str)); + SysFreeString(str); + IXMLDOMNode_Release(node); + hr = IXMLDOMCDATASection_cloneNode(cdata, VARIANT_TRUE, &node); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + hr = IXMLDOMNode_get_xml(node, &str); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + todo_wine + ok(!wcscmp(str, L"<![CDATA[CData]]>"), "Unexpected str %s.\n", debugstr_w(str)); + SysFreeString(str); + IXMLDOMNode_Release(node); + IXMLDOMCDATASection_Release(cdata); + + /* PI */ + hr = IXMLDOMDocument2_createProcessingInstruction(doc, _bstr_("target"), _bstr_("data"), &pi); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + hr = IXMLDOMProcessingInstruction_cloneNode(pi, VARIANT_FALSE, &node); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + hr = IXMLDOMNode_get_xml(node, &str); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + todo_wine + ok(!wcscmp(str, L"<?target data?>"), "Unexpected str %s.\n", debugstr_w(str)); + SysFreeString(str); + IXMLDOMNode_Release(node); + hr = IXMLDOMProcessingInstruction_cloneNode(pi, VARIANT_TRUE, &node); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + hr = IXMLDOMNode_get_xml(node, &str); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + todo_wine + ok(!wcscmp(str, L"<?target data?>"), "Unexpected str %s.\n", debugstr_w(str)); + SysFreeString(str); + IXMLDOMNode_Release(node); + IXMLDOMProcessingInstruction_Release(pi); + + /* Comment */ + hr = IXMLDOMDocument2_createComment(doc, _bstr_("comment"), &comment); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + hr = IXMLDOMComment_cloneNode(comment, VARIANT_FALSE, &node); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + hr = IXMLDOMNode_get_xml(node, &str); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + todo_wine + ok(!wcscmp(str, L"<!--comment-->"), "Unexpected str %s.\n", debugstr_w(str)); + SysFreeString(str); + IXMLDOMNode_Release(node); + hr = IXMLDOMComment_cloneNode(comment, VARIANT_TRUE, &node); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + hr = IXMLDOMNode_get_xml(node, &str); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + todo_wine + ok(!wcscmp(str, L"<!--comment-->"), "Unexpected str %s.\n", debugstr_w(str)); + SysFreeString(str); + IXMLDOMNode_Release(node); + IXMLDOMComment_Release(comment); + IXMLDOMDocument2_Release(doc); free_bstrs(); } -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/10826
From: Nikolay Sivov <nsivov@codeweavers.com> Signed-off-by: Nikolay Sivov <nsivov@codeweavers.com> --- dlls/msxml3/node.c | 4 ++++ dlls/msxml3/tests/domdoc.c | 8 -------- 2 files changed, 4 insertions(+), 8 deletions(-) diff --git a/dlls/msxml3/node.c b/dlls/msxml3/node.c index 7493ab49eb3..8d1c8418ca6 100644 --- a/dlls/msxml3/node.c +++ b/dlls/msxml3/node.c @@ -1392,6 +1392,7 @@ void domnode_release(struct domnode *node) domnode_destroy_tree(top); } +/* TODO: needs to handle allocation failures */ HRESULT node_clone_domnode(struct domnode *node, bool deep, struct domnode **cloned) { struct domnode *object, *n, *child; @@ -1425,6 +1426,9 @@ HRESULT node_clone_domnode(struct domnode *node, bool deep, struct domnode **clo domnode_insert_attribute(object, child, NULL); } + if (node->data) + object->data = SysAllocStringLen(node->data, SysStringLen(node->data)); + *cloned = object; return hr; diff --git a/dlls/msxml3/tests/domdoc.c b/dlls/msxml3/tests/domdoc.c index 5618dd9b42c..bb0742af215 100644 --- a/dlls/msxml3/tests/domdoc.c +++ b/dlls/msxml3/tests/domdoc.c @@ -5879,7 +5879,6 @@ static void test_cloneNode(void ) ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); hr = IXMLDOMNode_get_xml(node, &str); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - todo_wine ok(!wcscmp(str, L"Text"), "Unexpected str %s.\n", debugstr_w(str)); SysFreeString(str); IXMLDOMNode_Release(node); @@ -5887,7 +5886,6 @@ static void test_cloneNode(void ) ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); hr = IXMLDOMNode_get_xml(node, &str); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - todo_wine ok(!wcscmp(str, L"Text"), "Unexpected str %s.\n", debugstr_w(str)); SysFreeString(str); IXMLDOMNode_Release(node); @@ -5900,7 +5898,6 @@ static void test_cloneNode(void ) ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); hr = IXMLDOMNode_get_xml(node, &str); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - todo_wine ok(!wcscmp(str, L"<![CDATA[CData]]>"), "Unexpected str %s.\n", debugstr_w(str)); SysFreeString(str); IXMLDOMNode_Release(node); @@ -5908,7 +5905,6 @@ static void test_cloneNode(void ) ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); hr = IXMLDOMNode_get_xml(node, &str); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - todo_wine ok(!wcscmp(str, L"<![CDATA[CData]]>"), "Unexpected str %s.\n", debugstr_w(str)); SysFreeString(str); IXMLDOMNode_Release(node); @@ -5921,7 +5917,6 @@ static void test_cloneNode(void ) ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); hr = IXMLDOMNode_get_xml(node, &str); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - todo_wine ok(!wcscmp(str, L"<?target data?>"), "Unexpected str %s.\n", debugstr_w(str)); SysFreeString(str); IXMLDOMNode_Release(node); @@ -5929,7 +5924,6 @@ static void test_cloneNode(void ) ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); hr = IXMLDOMNode_get_xml(node, &str); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - todo_wine ok(!wcscmp(str, L"<?target data?>"), "Unexpected str %s.\n", debugstr_w(str)); SysFreeString(str); IXMLDOMNode_Release(node); @@ -5942,7 +5936,6 @@ static void test_cloneNode(void ) ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); hr = IXMLDOMNode_get_xml(node, &str); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - todo_wine ok(!wcscmp(str, L"<!--comment-->"), "Unexpected str %s.\n", debugstr_w(str)); SysFreeString(str); IXMLDOMNode_Release(node); @@ -5950,7 +5943,6 @@ static void test_cloneNode(void ) ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); hr = IXMLDOMNode_get_xml(node, &str); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - todo_wine ok(!wcscmp(str, L"<!--comment-->"), "Unexpected str %s.\n", debugstr_w(str)); SysFreeString(str); IXMLDOMNode_Release(node); -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/10826
participants (2)
-
Nikolay Sivov -
Nikolay Sivov (@nsivov)