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