[PATCH 0/6] MR10664: msxml3: Improvements to DTD node type.
Signed-off-by: Nikolay Sivov <nsivov@codeweavers.com> -- https://gitlab.winehq.org/wine/wine/-/merge_requests/10664
From: Nikolay Sivov <nsivov@codeweavers.com> Signed-off-by: Nikolay Sivov <nsivov@codeweavers.com> --- dlls/msxml3/msxml_private.h | 1 - dlls/msxml3/node.c | 1 - 2 files changed, 2 deletions(-) diff --git a/dlls/msxml3/msxml_private.h b/dlls/msxml3/msxml_private.h index 66d576c709d..34e04764068 100644 --- a/dlls/msxml3/msxml_private.h +++ b/dlls/msxml3/msxml_private.h @@ -181,7 +181,6 @@ struct domnode struct domnode *owner; struct list children; struct list attributes; - struct list namespaces; struct list owned; }; diff --git a/dlls/msxml3/node.c b/dlls/msxml3/node.c index 1f2c7a52daa..46ca8f04b47 100644 --- a/dlls/msxml3/node.c +++ b/dlls/msxml3/node.c @@ -1103,7 +1103,6 @@ HRESULT domnode_create(DOMNodeType type, const WCHAR *name, int name_len, const list_init(&object->owner_entry); list_init(&object->children); list_init(&object->attributes); - list_init(&object->namespaces); list_init(&object->owned); object->owner = owner; /* Document node does not have an owner */ -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/10664
From: Nikolay Sivov <nsivov@codeweavers.com> Signed-off-by: Nikolay Sivov <nsivov@codeweavers.com> --- dlls/msxml3/doctype.c | 6 ++++-- dlls/msxml3/tests/domdoc.c | 18 ++++++++++++++++++ 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/dlls/msxml3/doctype.c b/dlls/msxml3/doctype.c index 59a2f54c39a..631ef18171b 100644 --- a/dlls/msxml3/doctype.c +++ b/dlls/msxml3/doctype.c @@ -178,9 +178,11 @@ static HRESULT WINAPI domdoctype_get_nodeType(IXMLDOMDocumentType *iface, DOMNod static HRESULT WINAPI domdoctype_get_parentNode(IXMLDOMDocumentType *iface, IXMLDOMNode **parent) { - FIXME("%p, %p: stub\n", iface, parent); + domdoctype *doctype = impl_from_IXMLDOMDocumentType(iface); - return E_NOTIMPL; + TRACE("%p, %p.\n", iface, parent); + + return node_get_parent(doctype->node, parent); } static HRESULT WINAPI domdoctype_get_childNodes(IXMLDOMDocumentType *iface, IXMLDOMNodeList **list) diff --git a/dlls/msxml3/tests/domdoc.c b/dlls/msxml3/tests/domdoc.c index de969200eaf..665e0cfa954 100644 --- a/dlls/msxml3/tests/domdoc.c +++ b/dlls/msxml3/tests/domdoc.c @@ -14618,9 +14618,11 @@ static DWORD WINAPI new_thread(void *arg) static void test_get_parentNode(void) { + IXMLDOMDocumentType *doctype; IXMLDOMNode *node, *child; IXMLDOMAttribute *attr; IXMLDOMElement *e, *e2; + DOMNodeType node_type; IXMLDOMDocument *doc; VARIANT_BOOL b; HRESULT hr; @@ -14660,6 +14662,22 @@ static void test_get_parentNode(void) IXMLDOMElement_Release(e2); IXMLDOMElement_Release(e); + /* DTD parent */ + hr = IXMLDOMDocument_loadXML(doc, _bstr_(szEmailXML), NULL); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + + hr = IXMLDOMDocument_get_doctype(doc, &doctype); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + hr = IXMLDOMDocumentType_get_parentNode(doctype, NULL); + ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr); + hr = IXMLDOMDocumentType_get_parentNode(doctype, &node); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + hr = IXMLDOMNode_get_nodeType(node, &node_type); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(node_type == NODE_DOCUMENT, "Unexpected node type %d.\n", node_type); + IXMLDOMNode_Release(node); + IXMLDOMDocumentType_Release(doctype); + IXMLDOMDocument_Release(doc); } -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/10664
From: Nikolay Sivov <nsivov@codeweavers.com> Signed-off-by: Nikolay Sivov <nsivov@codeweavers.com> --- dlls/msxml3/doctype.c | 6 ++++-- dlls/msxml3/tests/domdoc.c | 20 ++++++++++++++++++-- 2 files changed, 22 insertions(+), 4 deletions(-) diff --git a/dlls/msxml3/doctype.c b/dlls/msxml3/doctype.c index 631ef18171b..a0c94339237 100644 --- a/dlls/msxml3/doctype.c +++ b/dlls/msxml3/doctype.c @@ -268,9 +268,11 @@ static HRESULT WINAPI domdoctype_hasChildNodes(IXMLDOMDocumentType *iface, VARIA static HRESULT WINAPI domdoctype_get_ownerDocument(IXMLDOMDocumentType *iface, IXMLDOMDocument **doc) { - FIXME("%p, %p: stub\n", iface, doc); + domdoctype *doctype = impl_from_IXMLDOMDocumentType(iface); - return E_NOTIMPL; + TRACE("%p, %p.\n", iface, doc); + + return node_get_owner_document(doctype->node, doc); } static HRESULT WINAPI domdoctype_cloneNode(IXMLDOMDocumentType *iface, VARIANT_BOOL deep, IXMLDOMNode **node) diff --git a/dlls/msxml3/tests/domdoc.c b/dlls/msxml3/tests/domdoc.c index 665e0cfa954..bf32c5c88ac 100644 --- a/dlls/msxml3/tests/domdoc.c +++ b/dlls/msxml3/tests/domdoc.c @@ -8045,6 +8045,7 @@ static void test_get_ownerDocument(void) IXMLDOMDocument2 *doc, *doc_owner; IXMLDOMNode *node; IXMLDOMSchemaCollection *cache; + IXMLDOMDocumentType *doctype; VARIANT_BOOL b; VARIANT var; IXMLDOMElement *element; @@ -8178,12 +8179,26 @@ static void test_get_ownerDocument(void) IXMLDOMAttribute_Release(attr); IXMLDOMNodeList_Release(node_list); - IXMLDOMSchemaCollection_Release(cache); - IXMLDOMDocument_Release(doc1); IXMLDOMDocument_Release(doc2); IXMLDOMDocument_Release(doc3); IXMLDOMDocument2_Release(doc); IXMLDOMDocument2_Release(doc_owner); + + /* DTD node */ + hr = IXMLDOMDocument_loadXML(doc1, _bstr_(szEmailXML), NULL); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + + hr = IXMLDOMDocument_get_doctype(doc1, &doctype); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + hr = IXMLDOMDocumentType_get_ownerDocument(doctype, NULL); + ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr); + hr = IXMLDOMDocumentType_get_ownerDocument(doctype, &doc2); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + IXMLDOMDocumentType_Release(doctype); + IXMLDOMDocument_Release(doc2); + + IXMLDOMSchemaCollection_Release(cache); + IXMLDOMDocument_Release(doc1); free_bstrs(); } @@ -14679,6 +14694,7 @@ static void test_get_parentNode(void) IXMLDOMDocumentType_Release(doctype); IXMLDOMDocument_Release(doc); + free_bstrs(); } static void test_removeAttributeNode(void) -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/10664
From: Nikolay Sivov <nsivov@codeweavers.com> Signed-off-by: Nikolay Sivov <nsivov@codeweavers.com> --- dlls/msxml3/doctype.c | 4 ++-- dlls/msxml3/tests/domdoc.c | 14 ++++++++++++++ 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/dlls/msxml3/doctype.c b/dlls/msxml3/doctype.c index a0c94339237..3b8cd805aef 100644 --- a/dlls/msxml3/doctype.c +++ b/dlls/msxml3/doctype.c @@ -284,9 +284,9 @@ static HRESULT WINAPI domdoctype_cloneNode(IXMLDOMDocumentType *iface, VARIANT_B static HRESULT WINAPI domdoctype_get_nodeTypeString(IXMLDOMDocumentType *iface, BSTR *p) { - FIXME("%p, %p: stub\n", iface, p); + TRACE("%p, %p.\n", iface, p); - return E_NOTIMPL; + return return_bstr(L"documenttype", p); } static HRESULT WINAPI domdoctype_get_text(IXMLDOMDocumentType *iface, BSTR *p) diff --git a/dlls/msxml3/tests/domdoc.c b/dlls/msxml3/tests/domdoc.c index bf32c5c88ac..4dc15f64674 100644 --- a/dlls/msxml3/tests/domdoc.c +++ b/dlls/msxml3/tests/domdoc.c @@ -10281,6 +10281,7 @@ static const get_node_typestring_t get_node_typestring[] = { static void test_get_nodeTypeString(void) { const get_node_typestring_t *entry = get_node_typestring; + IXMLDOMDocumentType *doctype; IXMLDOMDocument *doc; HRESULT hr; BSTR str; @@ -10315,6 +10316,19 @@ static void test_get_nodeTypeString(void) entry++; } + hr = IXMLDOMDocument_loadXML(doc, _bstr_(szEmailXML), NULL); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + + hr = IXMLDOMDocument_get_doctype(doc, &doctype); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + hr = IXMLDOMDocumentType_get_nodeTypeString(doctype, NULL); + ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr); + hr = IXMLDOMDocumentType_get_nodeTypeString(doctype, &str); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(!wcscmp(str, L"documenttype"), "Unexpected string %s.\n", debugstr_w(str)); + SysFreeString(str); + IXMLDOMDocumentType_Release(doctype); + IXMLDOMDocument_Release(doc); free_bstrs(); } -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/10664
From: Nikolay Sivov <nsivov@codeweavers.com> Signed-off-by: Nikolay Sivov <nsivov@codeweavers.com> --- dlls/msxml3/tests/domdoc.c | 68 +++++++++++++++++++++++++++ dlls/msxml4/tests/domdoc.c | 21 +++++++++ dlls/msxml6/tests/domdoc.c | 95 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 184 insertions(+) diff --git a/dlls/msxml3/tests/domdoc.c b/dlls/msxml3/tests/domdoc.c index 4dc15f64674..abf6b0f5570 100644 --- a/dlls/msxml3/tests/domdoc.c +++ b/dlls/msxml3/tests/domdoc.c @@ -16894,6 +16894,73 @@ static void test_default_namespace(void) free_bstrs(); } +static void test_prohibitdtd(void) +{ + IXMLDOMDocument2 *doc, *doc2; + IXMLDOMNode *node; + HRESULT hr; + VARIANT v; + + hr = CoCreateInstance(&CLSID_DOMDocument30, NULL, CLSCTX_INPROC_SERVER, &IID_IXMLDOMDocument2, (void **)&doc); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + + VariantInit(&v); + hr = IXMLDOMDocument2_getProperty(doc, _bstr_("ProhibitDTD"), &v); + todo_wine + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + todo_wine + ok(V_VT(&v) == VT_BOOL, "Unexpected type %d.\n", V_VT(&v)); + ok(!V_BOOL(&v), "Unexpected value %d.\n", V_BOOL(&v)); + + hr = IXMLDOMDocument2_loadXML(doc, _bstr_(szEmailXML), NULL); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + + V_VT(&v) = VT_I2; + V_I2(&v) = 123; + hr = IXMLDOMDocument2_setProperty(doc, _bstr_("ProhibitDTD"), v); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + + VariantInit(&v); + hr = IXMLDOMDocument2_getProperty(doc, _bstr_("ProhibitDTD"), &v); + todo_wine + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + todo_wine + ok(V_VT(&v) == VT_BOOL, "Unexpected type %d.\n", V_VT(&v)); + todo_wine + ok(V_BOOL(&v) == VARIANT_TRUE, "Unexpected value %d.\n", V_BOOL(&v)); + + V_VT(&v) = VT_BOOL; + V_BOOL(&v) = VARIANT_TRUE; + hr = IXMLDOMDocument2_setProperty(doc, _bstr_("ProhibitDTD"), v); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + + hr = IXMLDOMDocument2_loadXML(doc, _bstr_(szEmailXML), NULL); + todo_wine + ok(hr == S_FALSE, "Unexpected hr %#lx.\n", hr); + + hr = IXMLDOMDocument2_loadXML(doc, _bstr_("<a/>"), NULL); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + + hr = IXMLDOMDocument2_cloneNode(doc, VARIANT_FALSE, &node); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + + hr = IXMLDOMNode_QueryInterface(node, &IID_IXMLDOMDocument2, (void **)&doc2); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + IXMLDOMNode_Release(node); + + VariantInit(&v); + hr = IXMLDOMDocument2_getProperty(doc2, _bstr_("ProhibitDTD"), &v); + todo_wine + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + todo_wine + ok(V_VT(&v) == VT_BOOL, "Unexpected type %d.\n", V_VT(&v)); + todo_wine + ok(V_BOOL(&v) == VARIANT_TRUE, "Unexpected value %d.\n", V_BOOL(&v)); + IXMLDOMDocument2_Release(doc2); + + IXMLDOMDocument2_Release(doc); +} + START_TEST(domdoc) { HRESULT hr; @@ -16999,6 +17066,7 @@ START_TEST(domdoc) test_setAttribute(); test_createElement(); test_default_namespace(); + test_prohibitdtd(); if (is_clsid_supported(&CLSID_MXNamespaceManager40, &IID_IMXNamespaceManager)) { diff --git a/dlls/msxml4/tests/domdoc.c b/dlls/msxml4/tests/domdoc.c index edcb82fa313..bf9ef504796 100644 --- a/dlls/msxml4/tests/domdoc.c +++ b/dlls/msxml4/tests/domdoc.c @@ -375,6 +375,26 @@ static void test_get_parentNode(void) IXMLDOMDocument_Release(doc); } +static void test_prohibitdtd(void) +{ + IXMLDOMDocument2 *doc; + HRESULT hr; + VARIANT v; + + hr = CoCreateInstance(&CLSID_DOMDocument40, NULL, CLSCTX_INPROC_SERVER, &IID_IXMLDOMDocument2, (void **)&doc); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + + VariantInit(&v); + hr = IXMLDOMDocument2_getProperty(doc, _bstr_(L"ProhibitDTD"), &v); + todo_wine + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + todo_wine + ok(V_VT(&v) == VT_BOOL, "Unexpected type %d.\n", V_VT(&v)); + ok(!V_BOOL(&v), "Unexpected value %d.\n", V_BOOL(&v)); + + IXMLDOMDocument2_Release(doc); +} + START_TEST(domdoc) { HRESULT hr; @@ -395,6 +415,7 @@ START_TEST(domdoc) test_create_attribute(); test_get_ownerDocument(); test_get_parentNode(); + test_prohibitdtd(); CoUninitialize(); } diff --git a/dlls/msxml6/tests/domdoc.c b/dlls/msxml6/tests/domdoc.c index 26aea60c3d2..6e556e55bb5 100644 --- a/dlls/msxml6/tests/domdoc.c +++ b/dlls/msxml6/tests/domdoc.c @@ -36,6 +36,39 @@ #include "wine/test.h" +static const WCHAR email_xml[] = +L"<?xml version=\"1.0\"?>" +"<!DOCTYPE email ["\ +" <!ELEMENT email (recipients,from,reply-to?,subject,body,attachment*)>"\ +" <!ATTLIST email attachments IDREFS #REQUIRED>"\ +" <!ATTLIST email sent (yes|no) \"no\">"\ +" <!ELEMENT recipients (to+,cc*)>"\ +" <!ELEMENT to (#PCDATA)>"\ +" <!ATTLIST to name CDATA #IMPLIED>"\ +" <!ELEMENT cc (#PCDATA)>"\ +" <!ATTLIST cc name CDATA #IMPLIED>"\ +" <!ELEMENT from (#PCDATA)>"\ +" <!ATTLIST from name CDATA #IMPLIED>"\ +" <!ELEMENT reply-to (#PCDATA)>"\ +" <!ATTLIST reply-to name CDATA #IMPLIED>"\ +" <!ELEMENT subject ANY>"\ +" <!ELEMENT body ANY>"\ +" <!ATTLIST body enc CDATA #FIXED \"UTF-8\">"\ +" <!ELEMENT attachment (#PCDATA)>"\ +" <!ATTLIST attachment id ID #REQUIRED>"\ +"]>" +"<email attachments=\"patch1\">" +" <recipients>" +" <to>wine-patches@winehq.org</to>" +" </recipients>" +" <from name=\"Anonymous\">user@localhost</from>" +" <subject>msxml3/tests: DTD validation (try 87)</subject>" +" <body>" +" It no longer causes spontaneous combustion..." +" </body>" +" <attachment id=\"patch1\">0001-msxml3-tests-DTD-validation.patch</attachment>" +"</email>"; + static BSTR alloced_bstrs[256]; static int alloced_bstrs_count; @@ -512,6 +545,67 @@ todo_wine { free_bstrs(); } +static void test_prohibitdtd(void) +{ + IXMLDOMDocument2 *doc, *doc2; + IXMLDOMNode *node; + HRESULT hr; + VARIANT v; + + hr = CoCreateInstance(&CLSID_DOMDocument60, NULL, CLSCTX_INPROC_SERVER, &IID_IXMLDOMDocument2, (void **)&doc); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + + VariantInit(&v); + hr = IXMLDOMDocument2_getProperty(doc, _bstr_(L"ProhibitDTD"), &v); + todo_wine + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + todo_wine + ok(V_VT(&v) == VT_BOOL, "Unexpected type %d.\n", V_VT(&v)); + todo_wine + ok(V_BOOL(&v) == VARIANT_TRUE, "Unexpected value %d.\n", V_BOOL(&v)); + + hr = IXMLDOMDocument2_loadXML(doc, _bstr_(email_xml), NULL); + todo_wine + ok(hr == S_FALSE, "Unexpected hr %#lx.\n", hr); + + hr = IXMLDOMDocument2_loadXML(doc, _bstr_(L"<a/>"), NULL); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + + V_VT(&v) = VT_I2; + V_I2(&v) = 0; + hr = IXMLDOMDocument2_setProperty(doc, _bstr_(L"ProhibitDTD"), v); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + + VariantInit(&v); + hr = IXMLDOMDocument2_getProperty(doc, _bstr_(L"ProhibitDTD"), &v); + todo_wine + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + todo_wine + ok(V_VT(&v) == VT_BOOL, "Unexpected type %d.\n", V_VT(&v)); + ok(!V_BOOL(&v), "Unexpected value %d.\n", V_BOOL(&v)); + + hr = IXMLDOMDocument2_loadXML(doc, _bstr_(email_xml), NULL); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + + hr = IXMLDOMDocument2_cloneNode(doc, VARIANT_FALSE, &node); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + + hr = IXMLDOMNode_QueryInterface(node, &IID_IXMLDOMDocument2, (void **)&doc2); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + IXMLDOMNode_Release(node); + + VariantInit(&v); + hr = IXMLDOMDocument2_getProperty(doc2, _bstr_(L"ProhibitDTD"), &v); + todo_wine + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + todo_wine + ok(V_VT(&v) == VT_BOOL, "Unexpected type %d.\n", V_VT(&v)); + ok(!V_BOOL(&v), "Unexpected value %d.\n", V_BOOL(&v)); + IXMLDOMDocument2_Release(doc2); + + IXMLDOMDocument2_Release(doc); +} + START_TEST(domdoc) { HRESULT hr; @@ -534,6 +628,7 @@ START_TEST(domdoc) test_get_ownerDocument(); test_get_parentNode(); test_normalize_attribute_values(); + test_prohibitdtd(); CoUninitialize(); } -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/10664
From: Nikolay Sivov <nsivov@codeweavers.com> Signed-off-by: Nikolay Sivov <nsivov@codeweavers.com> --- dlls/msxml3/domdoc.c | 66 +++++++++++++++++++++++-------------- dlls/msxml3/msxml_private.h | 6 ++-- dlls/msxml3/node.c | 12 ++++--- dlls/msxml3/saxreader.c | 4 +-- dlls/msxml3/tests/domdoc.c | 9 ----- dlls/msxml4/tests/domdoc.c | 2 -- dlls/msxml6/tests/domdoc.c | 8 ----- 7 files changed, 56 insertions(+), 51 deletions(-) diff --git a/dlls/msxml3/domdoc.c b/dlls/msxml3/domdoc.c index b3a01f477ed..53d56a3866f 100644 --- a/dlls/msxml3/domdoc.c +++ b/dlls/msxml3/domdoc.c @@ -279,7 +279,7 @@ static HRESULT domdoc_load_from_stream(domdoc *doc, ISequentialStream *stream) } hr = IStream_Seek(hstream, zero, STREAM_SEEK_SET, NULL); - hr = parse_stream((ISequentialStream *)hstream, false, doc->node->properties->preserving, &node); + hr = parse_stream((ISequentialStream *)hstream, false, doc->node->properties, &node); IStream_Release(hstream); if (!node) @@ -1223,7 +1223,7 @@ static HRESULT domdoc_onDataAvailable(void *obj, char *ptr, DWORD len) HRESULT hr; stream_wrapper_create(ptr, len, &stream); - hr = parse_stream(stream, false, doc->node->properties->preserving, &node); + hr = parse_stream(stream, false, doc->node->properties, &node); ISequentialStream_Release(stream); if (hr == S_OK) @@ -1517,7 +1517,7 @@ static HRESULT WINAPI domdoc_loadXML(IXMLDOMDocument3 *iface, BSTR data, VARIANT if (SUCCEEDED(hr = stream_wrapper_create(ptr, lstrlenW(ptr) * sizeof(WCHAR), &stream))) { - hr = parse_stream(stream, true, doc->node->properties->preserving, &node); + hr = parse_stream(stream, true, doc->node->properties, &node); ISequentialStream_Release(stream); } @@ -1819,14 +1819,15 @@ static HRESULT WINAPI domdoc_validate(IXMLDOMDocument3 *iface, IXMLDOMParseError static HRESULT WINAPI domdoc_setProperty(IXMLDOMDocument3 *iface, BSTR p, VARIANT value) { domdoc *doc = impl_from_IXMLDOMDocument3(iface); - struct domnode *node = doc->node; + struct domdoc_properties *properties = doc->node->properties; + HRESULT hr; + VARIANT v; TRACE("%p, %s, %s.\n", iface, debugstr_w(p), debugstr_variant(&value)); if (wcsicmp(p, L"SelectionLanguage") == 0) { VARIANT varStr; - HRESULT hr; BSTR bstr; V_VT(&varStr) = VT_EMPTY; @@ -1841,9 +1842,9 @@ static HRESULT WINAPI domdoc_setProperty(IXMLDOMDocument3 *iface, BSTR p, VARIAN hr = S_OK; if (wcsicmp(bstr, L"XPath") == 0) - node->properties->XPath = TRUE; + properties->XPath = TRUE; else if (wcsicmp(bstr, L"XSLPattern") == 0) - node->properties->XPath = FALSE; + properties->XPath = FALSE; else hr = E_FAIL; @@ -1852,10 +1853,9 @@ static HRESULT WINAPI domdoc_setProperty(IXMLDOMDocument3 *iface, BSTR p, VARIAN } else if (!wcsicmp(p, L"SelectionNamespaces")) { - xmlChar *nsStr = (xmlChar *)node->properties->selectNsStr; + xmlChar *nsStr = (xmlChar *)properties->selectNsStr; struct list *pNsList; VARIANT varStr; - HRESULT hr; BSTR bstr; V_VT(&varStr) = VT_EMPTY; @@ -1870,15 +1870,15 @@ static HRESULT WINAPI domdoc_setProperty(IXMLDOMDocument3 *iface, BSTR p, VARIAN hr = S_OK; - pNsList = &node->properties->selectNsList; + pNsList = &properties->selectNsList; domdoc_properties_clear_selection_namespaces(pNsList); free(nsStr); nsStr = xmlchar_from_wchar(bstr); TRACE("property value: \"%s\"\n", debugstr_w(bstr)); - node->properties->selectNsStr = nsStr; - node->properties->selectNsStr_len = xmlStrlen(nsStr); + properties->selectNsStr = nsStr; + properties->selectNsStr_len = xmlStrlen(nsStr); if (bstr && *bstr) { xmlChar *pTokBegin, *pTokEnd, *pTokInner; @@ -1977,16 +1977,15 @@ static HRESULT WINAPI domdoc_setProperty(IXMLDOMDocument3 *iface, BSTR p, VARIAN } else if (wcsicmp(p, L"ValidateOnParse") == 0) { - if (node->properties->version < MSXML4) + if (properties->version < MSXML4) return E_FAIL; else { - node->properties->validating = V_BOOL(&value); + properties->validating = V_BOOL(&value); return S_OK; } } - else if (wcsicmp(p, L"ProhibitDTD") == 0 || - wcsicmp(p, L"NewParser") == 0 || + else if (wcsicmp(p, L"NewParser") == 0 || wcsicmp(p, L"ResolveExternals") == 0 || wcsicmp(p, L"AllowXsltScript") == 0 || wcsicmp(p, L"NormalizeAttributeValues") == 0 || @@ -1999,6 +1998,19 @@ static HRESULT WINAPI domdoc_setProperty(IXMLDOMDocument3 *iface, BSTR p, VARIAN return S_OK; } + if (!wcscmp(p, L"ProhibitDTD")) + { + V_VT(&v) = VT_EMPTY; + if (FAILED(hr = VariantChangeType(&v, &value, 0, VT_BOOL))) + { + WARN("Failed to convert to boolean.\n"); + return hr; + } + + properties->prohibit_dtd = V_BOOL(&v) == VARIANT_TRUE; + return S_OK; + } + FIXME("Unknown property %s\n", debugstr_w(p)); return E_FAIL; } @@ -2006,6 +2018,7 @@ static HRESULT WINAPI domdoc_setProperty(IXMLDOMDocument3 *iface, BSTR p, VARIAN static HRESULT WINAPI domdoc_getProperty(IXMLDOMDocument3 *iface, BSTR p, VARIANT *var) { domdoc *doc = impl_from_IXMLDOMDocument3(iface); + struct domdoc_properties *properties = doc->node->properties; TRACE("%p, %s, %p.\n", iface, debugstr_w(p), var); @@ -2015,9 +2028,7 @@ static HRESULT WINAPI domdoc_getProperty(IXMLDOMDocument3 *iface, BSTR p, VARIAN if (!wcsicmp(p, L"SelectionLanguage")) { V_VT(var) = VT_BSTR; - V_BSTR(var) = doc->node->properties->XPath ? - SysAllocString(L"XPath") : - SysAllocString(L"XSLPattern"); + V_BSTR(var) = SysAllocString(properties->XPath ? L"XPath" : L"XSLPattern"); return V_BSTR(var) ? S_OK : E_OUTOFMEMORY; } else if (!wcsicmp(p, L"SelectionNamespaces")) @@ -2029,9 +2040,9 @@ static HRESULT WINAPI domdoc_getProperty(IXMLDOMDocument3 *iface, BSTR p, VARIAN select_ns_entry* pNsEntry; V_VT(var) = VT_BSTR; - nsStr = doc->node->properties->selectNsStr; - pNsList = &doc->node->properties->selectNsList; - lenA = doc->node->properties->selectNsStr_len; + nsStr = properties->selectNsStr; + pNsList = &properties->selectNsList; + lenA = properties->selectNsStr_len; lenW = MultiByteToWideChar(CP_UTF8, 0, (LPCSTR)nsStr, lenA+1, NULL, 0); rebuiltStr = malloc(lenW * sizeof(WCHAR)); MultiByteToWideChar(CP_UTF8, 0, (LPCSTR)nsStr, lenA+1, rebuiltStr, lenW); @@ -2057,16 +2068,23 @@ static HRESULT WINAPI domdoc_getProperty(IXMLDOMDocument3 *iface, BSTR p, VARIAN } else if (!wcsicmp(p, L"ValidateOnParse")) { - if (doc->node->properties->version < MSXML4) + if (properties->version < MSXML4) return E_FAIL; else { V_VT(var) = VT_BOOL; - V_BOOL(var) = doc->node->properties->validating; + V_BOOL(var) = properties->validating; return S_OK; } } + if (!wcscmp(p, L"ProhibitDTD")) + { + V_VT(var) = VT_BOOL; + V_BOOL(var) = properties->prohibit_dtd ? VARIANT_TRUE : VARIANT_FALSE; + return S_OK; + } + FIXME("Unknown property %s\n", debugstr_w(p)); return E_FAIL; } diff --git a/dlls/msxml3/msxml_private.h b/dlls/msxml3/msxml_private.h index 34e04764068..b83b38f1af0 100644 --- a/dlls/msxml3/msxml_private.h +++ b/dlls/msxml3/msxml_private.h @@ -156,7 +156,8 @@ struct domdoc_properties struct list selectNsList; xmlChar const* selectNsStr; LONG selectNsStr_len; - BOOL XPath; + bool XPath; + bool prohibit_dtd; IUri *uri; }; @@ -199,7 +200,8 @@ extern struct domnode *domnode_get_first_child(struct domnode *node); extern struct domnode *domnode_get_next_sibling(struct domnode *node); extern HRESULT domnode_get_attribute(const struct domnode *node, const WCHAR *name, struct domnode **attr); extern HRESULT node_clone_domnode(struct domnode *, bool, struct domnode **); -extern HRESULT parse_stream(ISequentialStream *stream, bool utf16, VARIANT_BOOL preserve, struct domnode **tree); +extern HRESULT parse_stream(ISequentialStream *stream, bool utf16, const struct domdoc_properties *properties, + struct domnode **tree); extern void dump_doc_refcounts(struct domnode *node); struct parsed_name diff --git a/dlls/msxml3/node.c b/dlls/msxml3/node.c index 46ca8f04b47..31aa300a7eb 100644 --- a/dlls/msxml3/node.c +++ b/dlls/msxml3/node.c @@ -1269,6 +1269,7 @@ struct domdoc_properties *domdoc_create_properties(MSXML_VERSION version) /* properties that are dependent on object versions */ properties->version = version; properties->XPath = (version == MSXML4 || version == MSXML6); + properties->prohibit_dtd = version == MSXML6; /* document uri */ properties->uri = NULL; @@ -1300,6 +1301,7 @@ static struct domdoc_properties* domdoc_properties_clone(struct domdoc_propertie pcopy->version = properties->version; pcopy->preserving = properties->preserving; pcopy->validating = properties->validating; + pcopy->prohibit_dtd = properties->prohibit_dtd; pcopy->schemaCache = properties->schemaCache; if (pcopy->schemaCache) IXMLDOMSchemaCollection2_AddRef(pcopy->schemaCache); @@ -4015,7 +4017,7 @@ static const ISAXLexicalHandlerVtbl parse_lexical_handler_vtbl = struct domdoc_properties *domdoc_create_properties(MSXML_VERSION version); -static HRESULT parse_context_init(struct parse_context *c, VARIANT_BOOL preserving) +static HRESULT parse_context_init(struct parse_context *c, const struct domdoc_properties *properties) { IUnknown *unk; HRESULT hr; @@ -4044,9 +4046,11 @@ static HRESULT parse_context_init(struct parse_context *c, VARIANT_BOOL preservi V_UNKNOWN(&v) = (IUnknown *)&c->extension_handler; ISAXXMLReader_putProperty(c->reader, L"http://winehq.org/sax/properties/extension-handler", v); + ISAXXMLReader_putFeature(c->reader, L"prohibit-dtd", properties->prohibit_dtd ? VARIANT_TRUE : VARIANT_FALSE); + domnode_create(NODE_DOCUMENT, NULL, 0, NULL, 0, NULL, &c->root); c->root->properties = domdoc_create_properties(MSXML_DEFAULT); - c->root->properties->preserving = preserving; + c->root->properties->preserving = properties->preserving; c->node = c->root; return hr; @@ -4061,7 +4065,7 @@ static void parse_context_cleanup(struct parse_context *c) ISAXXMLReaderExtension_Release(c->reader_extension); } -HRESULT parse_stream(ISequentialStream *stream, bool utf16, VARIANT_BOOL preserve, struct domnode **tree) +HRESULT parse_stream(ISequentialStream *stream, bool utf16, const struct domdoc_properties *properties, struct domnode **tree) { struct parse_context context; HRESULT hr; @@ -4069,7 +4073,7 @@ HRESULT parse_stream(ISequentialStream *stream, bool utf16, VARIANT_BOOL preserv *tree = NULL; - if (FAILED(hr = parse_context_init(&context, preserve))) + if (FAILED(hr = parse_context_init(&context, properties))) return hr; if (utf16) diff --git a/dlls/msxml3/saxreader.c b/dlls/msxml3/saxreader.c index 3107d74cca8..4b0ec0085d7 100644 --- a/dlls/msxml3/saxreader.c +++ b/dlls/msxml3/saxreader.c @@ -6207,13 +6207,13 @@ static HRESULT WINAPI isaxxmlreader_putFeature(ISAXXMLReader *iface, const WCHAR (feature == SchemaValidation && value == VARIANT_FALSE) || feature == Namespaces || feature == NamespacePrefixes || - feature == NormalizeLineBreaks) + feature == NormalizeLineBreaks || + feature == ProhibitDTD) { return set_feature_value(reader, feature, value); } if (feature == LexicalHandlerParEntities || - feature == ProhibitDTD || feature == ExternalGeneralEntities || feature == ExternalParameterEntities) { diff --git a/dlls/msxml3/tests/domdoc.c b/dlls/msxml3/tests/domdoc.c index abf6b0f5570..bdd88779b88 100644 --- a/dlls/msxml3/tests/domdoc.c +++ b/dlls/msxml3/tests/domdoc.c @@ -16906,9 +16906,7 @@ static void test_prohibitdtd(void) VariantInit(&v); hr = IXMLDOMDocument2_getProperty(doc, _bstr_("ProhibitDTD"), &v); - todo_wine ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - todo_wine ok(V_VT(&v) == VT_BOOL, "Unexpected type %d.\n", V_VT(&v)); ok(!V_BOOL(&v), "Unexpected value %d.\n", V_BOOL(&v)); @@ -16922,11 +16920,8 @@ static void test_prohibitdtd(void) VariantInit(&v); hr = IXMLDOMDocument2_getProperty(doc, _bstr_("ProhibitDTD"), &v); - todo_wine ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - todo_wine ok(V_VT(&v) == VT_BOOL, "Unexpected type %d.\n", V_VT(&v)); - todo_wine ok(V_BOOL(&v) == VARIANT_TRUE, "Unexpected value %d.\n", V_BOOL(&v)); V_VT(&v) = VT_BOOL; @@ -16935,7 +16930,6 @@ static void test_prohibitdtd(void) ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); hr = IXMLDOMDocument2_loadXML(doc, _bstr_(szEmailXML), NULL); - todo_wine ok(hr == S_FALSE, "Unexpected hr %#lx.\n", hr); hr = IXMLDOMDocument2_loadXML(doc, _bstr_("<a/>"), NULL); @@ -16950,11 +16944,8 @@ static void test_prohibitdtd(void) VariantInit(&v); hr = IXMLDOMDocument2_getProperty(doc2, _bstr_("ProhibitDTD"), &v); - todo_wine ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - todo_wine ok(V_VT(&v) == VT_BOOL, "Unexpected type %d.\n", V_VT(&v)); - todo_wine ok(V_BOOL(&v) == VARIANT_TRUE, "Unexpected value %d.\n", V_BOOL(&v)); IXMLDOMDocument2_Release(doc2); diff --git a/dlls/msxml4/tests/domdoc.c b/dlls/msxml4/tests/domdoc.c index bf9ef504796..7e78e7b494d 100644 --- a/dlls/msxml4/tests/domdoc.c +++ b/dlls/msxml4/tests/domdoc.c @@ -386,9 +386,7 @@ static void test_prohibitdtd(void) VariantInit(&v); hr = IXMLDOMDocument2_getProperty(doc, _bstr_(L"ProhibitDTD"), &v); - todo_wine ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - todo_wine ok(V_VT(&v) == VT_BOOL, "Unexpected type %d.\n", V_VT(&v)); ok(!V_BOOL(&v), "Unexpected value %d.\n", V_BOOL(&v)); diff --git a/dlls/msxml6/tests/domdoc.c b/dlls/msxml6/tests/domdoc.c index 6e556e55bb5..8a10c7a29f8 100644 --- a/dlls/msxml6/tests/domdoc.c +++ b/dlls/msxml6/tests/domdoc.c @@ -557,15 +557,11 @@ static void test_prohibitdtd(void) VariantInit(&v); hr = IXMLDOMDocument2_getProperty(doc, _bstr_(L"ProhibitDTD"), &v); - todo_wine ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - todo_wine ok(V_VT(&v) == VT_BOOL, "Unexpected type %d.\n", V_VT(&v)); - todo_wine ok(V_BOOL(&v) == VARIANT_TRUE, "Unexpected value %d.\n", V_BOOL(&v)); hr = IXMLDOMDocument2_loadXML(doc, _bstr_(email_xml), NULL); - todo_wine ok(hr == S_FALSE, "Unexpected hr %#lx.\n", hr); hr = IXMLDOMDocument2_loadXML(doc, _bstr_(L"<a/>"), NULL); @@ -578,9 +574,7 @@ static void test_prohibitdtd(void) VariantInit(&v); hr = IXMLDOMDocument2_getProperty(doc, _bstr_(L"ProhibitDTD"), &v); - todo_wine ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - todo_wine ok(V_VT(&v) == VT_BOOL, "Unexpected type %d.\n", V_VT(&v)); ok(!V_BOOL(&v), "Unexpected value %d.\n", V_BOOL(&v)); @@ -596,9 +590,7 @@ static void test_prohibitdtd(void) VariantInit(&v); hr = IXMLDOMDocument2_getProperty(doc2, _bstr_(L"ProhibitDTD"), &v); - todo_wine ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - todo_wine ok(V_VT(&v) == VT_BOOL, "Unexpected type %d.\n", V_VT(&v)); ok(!V_BOOL(&v), "Unexpected value %d.\n", V_BOOL(&v)); IXMLDOMDocument2_Release(doc2); -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/10664
participants (2)
-
Nikolay Sivov -
Nikolay Sivov (@nsivov)