[PATCH v2 0/2] MR10027: msxml3: Skip writing xml declaration if it already exists.
https://testbot.winehq.org/JobDetails.pl?Key=161651 -- v2: msxml3: Remove existing xml declaration to avoid duplicates. msxml3/tests: Add some transformNodeToObjects tests. https://gitlab.winehq.org/wine/wine/-/merge_requests/10027
From: Daniel Lehman <dlehman25@gmail.com> --- dlls/msxml3/tests/domdoc.c | 134 +++++++++++++++++++++++++++++++++++++ 1 file changed, 134 insertions(+) diff --git a/dlls/msxml3/tests/domdoc.c b/dlls/msxml3/tests/domdoc.c index 0ff88b04cc4..0acde3f6a13 100644 --- a/dlls/msxml3/tests/domdoc.c +++ b/dlls/msxml3/tests/domdoc.c @@ -13753,6 +13753,58 @@ static void test_merging_text(void) free_bstrs(); } +static const WCHAR transform_xsldecl_copy_utf16_xsl[] = +L"<?xml version=\"1.0\" encoding=\"utf-16\"?>\n" +"<xsl:stylesheet xmlns:xsl=\"http://www.w3.org/1999/XSL/Transform\" version=\"1.0\">\n" +"<xsl:output method=\"xml\" version=\"1.0\" encoding=\"utf-16\"/>" +"<xsl:template match=\"@* | node()\" >" +" <xsl:copy>" +" <xsl:apply-templates select=\"@* | node()\" />" +" </xsl:copy>" +"</xsl:template>" +"</xsl:stylesheet>"; + +static const char transform_xsldecl_copy_utf8_xsl[] = +"<?xml version=\"1.0\"?>\n" +"<xsl:stylesheet xmlns:xsl=\"http://www.w3.org/1999/XSL/Transform\" version=\"1.0\">\n" +"<xsl:output method=\"xml\" version=\"1.0\" encoding=\"utf-8\"/>" +"<xsl:template match=\"@* | node()\" >" +" <xsl:copy>" +" <xsl:apply-templates select=\"@* | node()\" />" +" </xsl:copy>" +"</xsl:template>" +"</xsl:stylesheet>"; + +static const char transform_xsldecl_and_omit_xsl[] = +"<?xml version=\"1.0\"?>\n" +"<xsl:stylesheet xmlns:xsl=\"http://www.w3.org/1999/XSL/Transform\" version=\"1.0\">\n" +"<xsl:output method=\"xml\" version=\"1.0\" encoding=\"utf-8\" omit-xml-declaration=\"yes\"/>" +"<xsl:template match=\"@* | node()\" >" +" <xsl:copy>" +" <xsl:apply-templates select=\"@* | node()\" />" +" </xsl:copy>" +"</xsl:template>" +"</xsl:stylesheet>"; + +static const char transform_xmldecl_utf8_doc[] = +"<?xml version=\"1.0\" encoding=\"utf-8\"?>" +"<a>" +" <item>item1</item>" +" <item>item2</item>" +"</a>"; + +static const char transform_utf8_omit_ret[] = +"<a><item>item1</item><item>item2</item></a>"; + +static const char transform_utf8_ret[] = +"<?xml version=\"1.0\" encoding=\"utf-8\"?>" +"<a><item>item1</item><item>item2</item></a>"; + +static const WCHAR transform_utf16_ret[] = +L"<?xml version=\"1.0\" encoding=\"utf-16\"?>" +"<a><item>item1</item><item>item2</item></a>"; + + static HRESULT WINAPI transformdest_QueryInterface(IUnknown *iface, REFIID riid, void **obj) { BOOL known_iid = IsEqualIID(riid, &IID_IHTMLObjectElement) || @@ -13792,11 +13844,13 @@ static void test_transformNodeToObject(void) ISequentialStream *sstream; LARGE_INTEGER off; WCHAR buffer[256]; + char bufferA[256]; IStream *istream; VARIANT_BOOL b; ULONG nread; HRESULT hr; VARIANT v; + BSTR bstr; doc = create_document(&IID_IXMLDOMDocument); doc2 = create_document(&IID_IXMLDOMDocument); @@ -13872,6 +13926,86 @@ static void test_transformNodeToObject(void) ISequentialStream_Release(sstream); IStream_Release(istream); + /* omitting declaration overrides specifying xml declaration */ + hr = IXMLDOMDocument_loadXML(doc, _bstr_(transform_xmldecl_utf8_doc), &b); + ok(hr == S_OK, "Failed to load document, hr %#lx.\n", hr); + hr = IXMLDOMDocument_loadXML(doc2, _bstr_(transform_xsldecl_and_omit_xsl), &b); + ok(hr == S_OK, "Failed to load document, hr %#lx.\n", hr); + + istream = SHCreateMemStream(NULL, 0); + V_VT(&v) = VT_UNKNOWN; + V_UNKNOWN(&v) = (IUnknown*)istream; + hr = IXMLDOMDocument_transformNodeToObject(doc, (IXMLDOMNode*)doc2, v); + ok(hr == S_OK, "Failed to transform node, hr %#lx.\n", hr); + + off.QuadPart = 0; + hr = IStream_Seek(istream, off, STREAM_SEEK_SET, NULL); + ok(hr == S_OK, "Failed to seek, hr %#lx.\n", hr); + + nread = 0; + memset(bufferA, 0xcc, sizeof(bufferA)); + hr = IStream_Read(istream, bufferA, sizeof(bufferA), &nread); + ok(hr == S_OK, "Failed to read, hr %#lx.\n", hr); + bufferA[nread] = 0; + todo_wine + ok(!strcmp(bufferA, transform_utf8_omit_ret), "got output %s\n", wine_dbgstr_a(bufferA)); + IStream_Release(istream); + + /* duplicate xml declarations are removed */ + hr = IXMLDOMDocument_loadXML(doc, _bstr_(transform_xmldecl_utf8_doc), &b); + ok(hr == S_OK, "Failed to load document, hr %#lx.\n", hr); + hr = IXMLDOMDocument_loadXML(doc2, _bstr_(transform_xsldecl_copy_utf8_xsl), &b); + ok(hr == S_OK, "Failed to load document, hr %#lx.\n", hr); + + istream = SHCreateMemStream(NULL, 0); + V_VT(&v) = VT_UNKNOWN; + V_UNKNOWN(&v) = (IUnknown*)istream; + hr = IXMLDOMDocument_transformNodeToObject(doc, (IXMLDOMNode*)doc2, v); + ok(hr == S_OK, "Failed to transform node, hr %#lx.\n", hr); + + off.QuadPart = 0; + hr = IStream_Seek(istream, off, STREAM_SEEK_SET, NULL); + ok(hr == S_OK, "Failed to seek, hr %#lx.\n", hr); + + nread = 0; + memset(bufferA, 0xcc, sizeof(bufferA)); + hr = IStream_Read(istream, bufferA, sizeof(bufferA), &nread); + ok(hr == S_OK, "Failed to read, hr %#lx.\n", hr); + bufferA[nread] = 0; + todo_wine + ok(!strcmp(bufferA, transform_utf8_ret), "got output %s\n", wine_dbgstr_a(bufferA)); + IStream_Release(istream); + + /* encoding in xsl overrides encoding from xml */ + hr = IXMLDOMDocument_loadXML(doc, _bstr_(transform_xmldecl_utf8_doc), &b); + ok(hr == S_OK, "Failed to load document, hr %#lx.\n", hr); + bstr = SysAllocString(transform_xsldecl_copy_utf16_xsl); + hr = IXMLDOMDocument_loadXML(doc2, bstr, &b); + ok(hr == S_OK, "Failed to load document, hr %#lx.\n", hr); + SysFreeString(bstr); + + istream = SHCreateMemStream(NULL, 0); + V_VT(&v) = VT_UNKNOWN; + V_UNKNOWN(&v) = (IUnknown*)istream; + hr = IXMLDOMDocument_transformNodeToObject(doc, (IXMLDOMNode*)doc2, v); + ok(hr == S_OK, "Failed to transform node, hr %#lx.\n", hr); + + off.QuadPart = 0; + hr = IStream_Seek(istream, off, STREAM_SEEK_SET, NULL); + ok(hr == S_OK, "Failed to seek, hr %#lx.\n", hr); + + nread = 0; + memset(buffer, 0xcc, sizeof(buffer)); + hr = IStream_Read(istream, buffer, sizeof(buffer), &nread); + ok(hr == S_OK, "Failed to read, hr %#lx.\n", hr); + buffer[nread / 2] = 0; + ok(buffer[0] == 0xfeff, "got %x\n", buffer[0]); + bstr = SysAllocString(transform_utf16_ret); + todo_wine + ok(compareIgnoreReturns(&buffer[1], bstr), "got output %s\n", wine_dbgstr_w(buffer)); + SysFreeString(bstr); + IStream_Release(istream); + IXMLDOMDocument_Release(doc3); IXMLDOMDocument_Release(doc2); IXMLDOMDocument_Release(doc); -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/10027
From: Daniel Lehman <dlehman25@gmail.com> --- dlls/msxml3/node.c | 4 ++++ dlls/msxml3/tests/domdoc.c | 3 --- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/dlls/msxml3/node.c b/dlls/msxml3/node.c index 3e389144cd4..37e25c4a9d0 100644 --- a/dlls/msxml3/node.c +++ b/dlls/msxml3/node.c @@ -1091,6 +1091,10 @@ static void transform_write_text(xmlDocPtr result, xsltStylesheetPtr style, xmlO static void transform_write_xmldecl(xmlDocPtr result, xsltStylesheetPtr style, BOOL omit_encoding, xmlOutputBufferPtr output) { int omit_xmldecl, standalone; + xmlNodePtr decl; + + if ((decl = xmldoc_unlink_xmldecl(result))) + xmlFreeNode(decl); XSLT_GET_IMPORT_INT(omit_xmldecl, style, omitXmlDeclaration); if (omit_xmldecl == 1) return; diff --git a/dlls/msxml3/tests/domdoc.c b/dlls/msxml3/tests/domdoc.c index 0acde3f6a13..2c5b1d0721f 100644 --- a/dlls/msxml3/tests/domdoc.c +++ b/dlls/msxml3/tests/domdoc.c @@ -13947,7 +13947,6 @@ static void test_transformNodeToObject(void) hr = IStream_Read(istream, bufferA, sizeof(bufferA), &nread); ok(hr == S_OK, "Failed to read, hr %#lx.\n", hr); bufferA[nread] = 0; - todo_wine ok(!strcmp(bufferA, transform_utf8_omit_ret), "got output %s\n", wine_dbgstr_a(bufferA)); IStream_Release(istream); @@ -13972,7 +13971,6 @@ static void test_transformNodeToObject(void) hr = IStream_Read(istream, bufferA, sizeof(bufferA), &nread); ok(hr == S_OK, "Failed to read, hr %#lx.\n", hr); bufferA[nread] = 0; - todo_wine ok(!strcmp(bufferA, transform_utf8_ret), "got output %s\n", wine_dbgstr_a(bufferA)); IStream_Release(istream); @@ -14001,7 +13999,6 @@ static void test_transformNodeToObject(void) buffer[nread / 2] = 0; ok(buffer[0] == 0xfeff, "got %x\n", buffer[0]); bstr = SysAllocString(transform_utf16_ret); - todo_wine ok(compareIgnoreReturns(&buffer[1], bstr), "got output %s\n", wine_dbgstr_w(buffer)); SysFreeString(bstr); IStream_Release(istream); -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/10027
participants (2)
-
Daniel Lehman -
Daniel Lehman (@dlehman25)