Daniel Lehman : msxml3: Parse XML declaration when creating processing instruction.

Alexandre Julliard julliard at winehq.org
Fri Oct 22 14:46:12 CDT 2021


Module: wine
Branch: master
Commit: 12d2417e4fe2067e20960bdd852de70b92429dcc
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=12d2417e4fe2067e20960bdd852de70b92429dcc

Author: Daniel Lehman <dlehman25 at gmail.com>
Date:   Fri Oct 22 16:41:26 2021 +0300

msxml3: Parse XML declaration when creating processing instruction.

Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/msxml3/domdoc.c        |  9 +++------
 dlls/msxml3/msxml_private.h |  2 ++
 dlls/msxml3/pi.c            | 41 ++++++++++++++++++++++++++---------------
 dlls/msxml3/tests/domdoc.c  |  8 +++++---
 4 files changed, 36 insertions(+), 24 deletions(-)

diff --git a/dlls/msxml3/domdoc.c b/dlls/msxml3/domdoc.c
index cbf16bcb1d4..4013f106cc6 100644
--- a/dlls/msxml3/domdoc.c
+++ b/dlls/msxml3/domdoc.c
@@ -1884,13 +1884,10 @@ static HRESULT WINAPI domdoc_createProcessingInstruction(
     hr = IXMLDOMDocument3_createNode(iface, type, target, NULL, &node);
     if (hr == S_OK)
     {
-        xmlnode *node_obj;
-
         /* this is to bypass check in ::put_data() that blocks "<?xml" PIs */
-        node_obj = get_node_obj(node);
-        hr = node_set_content(node_obj, data);
-
-        IXMLDOMNode_QueryInterface(node, &IID_IXMLDOMProcessingInstruction, (void**)pi);
+        hr = dom_pi_put_xml_decl(node, data);
+        if (SUCCEEDED(hr))
+            hr = IXMLDOMNode_QueryInterface(node, &IID_IXMLDOMProcessingInstruction, (void**)pi);
         IXMLDOMNode_Release(node);
     }
 
diff --git a/dlls/msxml3/msxml_private.h b/dlls/msxml3/msxml_private.h
index 07ed09fb480..8003c1a9650 100644
--- a/dlls/msxml3/msxml_private.h
+++ b/dlls/msxml3/msxml_private.h
@@ -261,6 +261,8 @@ extern BSTR EnsureCorrectEOL(BSTR) DECLSPEC_HIDDEN;
 
 extern xmlChar* tagName_to_XPath(const BSTR tagName) DECLSPEC_HIDDEN;
 
+extern HRESULT dom_pi_put_xml_decl(IXMLDOMNode *node, BSTR data) DECLSPEC_HIDDEN;
+
 #include <libxslt/documents.h>
 extern xmlDocPtr xslt_doc_default_loader(const xmlChar *uri, xmlDictPtr dict, int options,
     void *_ctxt, xsltLoadType type) DECLSPEC_HIDDEN;
diff --git a/dlls/msxml3/pi.c b/dlls/msxml3/pi.c
index f4da13e91ac..fb4ca798c68 100644
--- a/dlls/msxml3/pi.c
+++ b/dlls/msxml3/pi.c
@@ -433,25 +433,11 @@ static HRESULT WINAPI dom_pi_get_attributes(
     if (hr != S_OK) return hr;
 
     if (!wcscmp(name, xmlW))
-    {
-        if (!This->node.node->properties)
-        {
-            hr = parse_xml_decl(This->node.node);
-            if (hr != S_OK)
-            {
-                SysFreeString(name);
-                return S_FALSE;
-            }
-        }
-
         *map = create_nodemap(This->node.node, &dom_pi_attr_map);
-        SysFreeString(name);
-        return S_OK;
-    }
 
     SysFreeString(name);
 
-    return S_FALSE;
+    return *map ? S_OK : S_FALSE;
 }
 
 static HRESULT WINAPI dom_pi_insertBefore(
@@ -760,6 +746,31 @@ static HRESULT WINAPI dom_pi_put_data(
     return node_set_content(&This->node, data);
 }
 
+HRESULT dom_pi_put_xml_decl(IXMLDOMNode *node, BSTR data)
+{
+    static const WCHAR xmlW[] = {'x','m','l',0};
+    xmlnode *node_obj;
+    HRESULT hr;
+    BSTR name;
+
+    node_obj = get_node_obj(node);
+    hr = node_set_content(node_obj, data);
+    if (FAILED(hr))
+        return hr;
+
+    hr = node_get_nodeName(node_obj, &name);
+    if (FAILED(hr))
+        return hr;
+
+    if (!lstrcmpW(name, xmlW) && !node_obj->node->properties)
+        hr = parse_xml_decl(node_obj->node);
+    else
+        hr = S_OK;
+
+    SysFreeString(name);
+    return hr;
+}
+
 static const struct IXMLDOMProcessingInstructionVtbl dom_pi_vtbl =
 {
     dom_pi_QueryInterface,
diff --git a/dlls/msxml3/tests/domdoc.c b/dlls/msxml3/tests/domdoc.c
index d98a87f6d9c..81ee8dcb52d 100644
--- a/dlls/msxml3/tests/domdoc.c
+++ b/dlls/msxml3/tests/domdoc.c
@@ -8592,7 +8592,6 @@ static void test_createProcessingInstruction(void)
     doc = create_document(&IID_IXMLDOMDocument);
 
     hr = IXMLDOMDocument_createProcessingInstruction(doc, _bstr_("xml"), _bstr_("version=\"1.0\" encoding=\"windows-1252\" dummy=\"value\""), &pi);
-todo_wine
     ok(hr == XML_E_UNEXPECTED_ATTRIBUTE, "got 0x%08x\n", hr);
     hr = IXMLDOMDocument_createProcessingInstruction(doc, NULL, _bstr_("version=\"1.0\" encoding=\"UTF-8\""), &pi);
     ok(hr == E_FAIL, "got 0x%08x\n", hr);
@@ -8600,7 +8599,6 @@ todo_wine
 todo_wine
     ok(hr == XML_E_XMLDECLSYNTAX, "got 0x%08x\n", hr);
     hr = IXMLDOMDocument_createProcessingInstruction(doc, _bstr_("xml"), _bstr_("version=\"1.0\" encoding=UTF-8"), &pi);
-todo_wine
     ok(hr == XML_E_MISSINGQUOTE, "got 0x%08x\n", hr);
     hr = IXMLDOMDocument_createProcessingInstruction(doc, _bstr_("xml"), _bstr_("version=\"1.0\" encoding='UTF-8\""), &pi);
 todo_wine
@@ -8608,17 +8606,21 @@ todo_wine
     hr = IXMLDOMDocument_createProcessingInstruction(doc, _bstr_("xml"), _bstr_("version=\"1.0\" encoding=\"UTF-8"), &pi);
 todo_wine
     ok(hr == XML_E_BADCHARINSTRING, "got 0x%08x\n", hr);
+    pi = NULL;
     hr = IXMLDOMDocument_createProcessingInstruction(doc, _bstr_("xml"), _bstr_("version=\"1.0\" encoding='UTF-8'"), &pi);
+todo_wine
     ok(hr == S_OK, "got 0x%08x\n", hr);
+if (pi)
+{
     hr = IXMLDOMProcessingInstruction_QueryInterface(pi, &IID_IXMLDOMNode, (void **)&node);
     node_map = NULL;
     ok(hr == S_OK, "got 0x%08x\n", hr);
     hr = IXMLDOMNode_get_attributes(node, &node_map);
-todo_wine
     ok(hr == S_OK, "got 0x%08x\n", hr);
     if (node_map) IXMLDOMNamedNodeMap_Release(node_map);
     IXMLDOMNode_Release(node);
     IXMLDOMProcessingInstruction_Release(pi);
+}
 
     /* test for BSTR handling, pass broken BSTR */
     memcpy(&buff[2], L"test", 5 * sizeof(WCHAR));




More information about the wine-cvs mailing list