From: Daniel Lehman <dlehman25@gmail.com> --- dlls/msxml3/domdoc.c | 22 +++++++++++++--------- dlls/msxml3/msxml_private.h | 1 + dlls/msxml3/node.c | 3 ++- dlls/msxml3/tests/domdoc.c | 1 - 4 files changed, 16 insertions(+), 11 deletions(-) diff --git a/dlls/msxml3/domdoc.c b/dlls/msxml3/domdoc.c index f35daff5f6d..bc27c85247c 100644 --- a/dlls/msxml3/domdoc.c +++ b/dlls/msxml3/domdoc.c @@ -376,24 +376,28 @@ void xmldoc_link_xmldecl(xmlDocPtr doc, xmlNodePtr node) if (doc->standalone != -1) xmlAddPrevSibling( doc->children, node ); } +xmlNodePtr xmldoc_get_xmldecl( xmlDocPtr doc ) +{ + static const xmlChar xmlA[] = "xml"; + xmlNodePtr first_child; + + first_child = doc->children; + if (first_child && first_child->type == XML_PI_NODE && xmlStrEqual(first_child->name, xmlA)) + return first_child; + return NULL; +} + /* unlinks a first "<?xml" child if it was created */ xmlNodePtr xmldoc_unlink_xmldecl(xmlDocPtr doc) { - static const xmlChar xmlA[] = "xml"; - xmlNodePtr node, first_child; + xmlNodePtr node; assert(doc != NULL); /* xml declaration node could be created automatically after parsing or added to a tree later */ - first_child = doc->children; - if (first_child && first_child->type == XML_PI_NODE && xmlStrEqual(first_child->name, xmlA)) - { - node = first_child; + if ((node = xmldoc_get_xmldecl(doc))) xmlUnlinkNode( node ); - } - else - node = NULL; return node; } diff --git a/dlls/msxml3/msxml_private.h b/dlls/msxml3/msxml_private.h index 9709f8247ab..02fe5991e59 100644 --- a/dlls/msxml3/msxml_private.h +++ b/dlls/msxml3/msxml_private.h @@ -190,6 +190,7 @@ extern HRESULT xmldoc_add_orphan( xmlDocPtr doc, xmlNodePtr node ); extern HRESULT xmldoc_remove_orphan( xmlDocPtr doc, xmlNodePtr node ); extern void xmldoc_link_xmldecl(xmlDocPtr doc, xmlNodePtr node); extern xmlNodePtr xmldoc_unlink_xmldecl(xmlDocPtr doc); +extern xmlNodePtr xmldoc_get_xmldecl( xmlDocPtr doc ); extern MSXML_VERSION xmldoc_version( xmlDocPtr doc ); extern void wineXmlCallbackLog(char const* caller, xmlErrorLevel lvl, char const* msg, va_list ap); diff --git a/dlls/msxml3/node.c b/dlls/msxml3/node.c index 3e389144cd4..5864de96c80 100644 --- a/dlls/msxml3/node.c +++ b/dlls/msxml3/node.c @@ -1214,7 +1214,8 @@ static HRESULT node_transform_write(xsltStylesheetPtr style, xmlDocPtr result, B transform_write_text(result, style, output); else { - transform_write_xmldecl(result, style, omit_encoding, output); + if (!xmldoc_get_xmldecl(result)) + transform_write_xmldecl(result, style, omit_encoding, output); if (result->children) { diff --git a/dlls/msxml3/tests/domdoc.c b/dlls/msxml3/tests/domdoc.c index 6aaa9a4f086..d95d3df9dbf 100644 --- a/dlls/msxml3/tests/domdoc.c +++ b/dlls/msxml3/tests/domdoc.c @@ -13840,7 +13840,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) || !strcmp(bufferA, transform_utf8_ret_alt), "got output %s\n", wine_dbgstr_a(bufferA)); -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/10027