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 " 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));