[PATCH 2/5] msxml3: Parse XML declaration when creating processing instruction.
Daniel Lehman
dlehman25 at gmail.com
Wed Sep 29 00:16:46 CDT 2021
Signed-off-by: Daniel Lehman <dlehman25 at gmail.com>
---
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 e8b5445df19..566bfa06798 100644
--- a/dlls/msxml3/domdoc.c
+++ b/dlls/msxml3/domdoc.c
@@ -1890,13 +1890,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 f16040f3542..3d3cdc60f33 100644
--- a/dlls/msxml3/msxml_private.h
+++ b/dlls/msxml3/msxml_private.h
@@ -281,6 +281,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;
+
#ifdef SONAME_LIBXSLT
# include <libxslt/documents.h>
extern xmlDocPtr xslt_doc_default_loader(const xmlChar *uri, xmlDictPtr dict, int options,
diff --git a/dlls/msxml3/pi.c b/dlls/msxml3/pi.c
index 606d8dc3571..d0626c7b0dd 100644
--- a/dlls/msxml3/pi.c
+++ b/dlls/msxml3/pi.c
@@ -439,25 +439,11 @@ static HRESULT WINAPI dom_pi_get_attributes(
if (hr != S_OK) return hr;
if (!strcmpW(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(
@@ -766,6 +752,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 (!strcmpW(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));
--
2.25.1
More information about the wine-devel
mailing list