[PATCH 0/5] MR10706: msxml3: Respect document encoding in Save().
Signed-off-by: Nikolay Sivov <nsivov@codeweavers.com> -- https://gitlab.winehq.org/wine/wine/-/merge_requests/10706
From: Nikolay Sivov <nsivov@codeweavers.com> Signed-off-by: Nikolay Sivov <nsivov@codeweavers.com> --- dlls/msxml3/domdoc.c | 22 ++++------------------ dlls/msxml3/tests/domdoc.c | 18 +++++++++++++++++- 2 files changed, 21 insertions(+), 19 deletions(-) diff --git a/dlls/msxml3/domdoc.c b/dlls/msxml3/domdoc.c index 0011e6d1f79..c36c43256c0 100644 --- a/dlls/msxml3/domdoc.c +++ b/dlls/msxml3/domdoc.c @@ -304,27 +304,13 @@ static HRESULT WINAPI PersistStreamInit_Load(IPersistStreamInit *iface, IStream return doc->error = domdoc_load_from_stream(doc, (ISequentialStream *)stream); } -static HRESULT WINAPI PersistStreamInit_Save( - IPersistStreamInit *iface, IStream *stream, BOOL clr_dirty) +static HRESULT WINAPI PersistStreamInit_Save(IPersistStreamInit *iface, IStream *stream, BOOL clr_dirty) { - domdoc *This = impl_from_IPersistStreamInit(iface); - BSTR xmlString; - HRESULT hr; - - TRACE("(%p)->(%p %d)\n", This, stream, clr_dirty); - - hr = IXMLDOMDocument3_get_xml(&This->IXMLDOMDocument3_iface, &xmlString); - if(hr == S_OK) - { - DWORD len = SysStringLen(xmlString) * sizeof(WCHAR); - - hr = IStream_Write( stream, xmlString, len, NULL ); - SysFreeString(xmlString); - } + domdoc *doc = impl_from_IPersistStreamInit(iface); - TRACE("hr %#lx.\n", hr); + TRACE("%p, %p, %d.\n", iface, stream, clr_dirty); - return hr; + return node_save(doc->node, stream); } static HRESULT WINAPI PersistStreamInit_GetSizeMax(IPersistStreamInit *iface, ULARGE_INTEGER *size) diff --git a/dlls/msxml3/tests/domdoc.c b/dlls/msxml3/tests/domdoc.c index eb6e25210c8..3f825ba83eb 100644 --- a/dlls/msxml3/tests/domdoc.c +++ b/dlls/msxml3/tests/domdoc.c @@ -2138,12 +2138,14 @@ if (0) static void test_persiststream(void) { IPersistStreamInit *streaminit; + IStream *istream, *stream2; IPersistStream *stream; IXMLDOMDocument *doc; ULARGE_INTEGER size; - IStream *istream; + HGLOBAL global; HRESULT hr; CLSID clsid; + void *ptr; doc = create_document(&IID_IXMLDOMDocument); @@ -2180,6 +2182,20 @@ static void test_persiststream(void) IStream_Release(istream); EXPECT_PARSE_ERROR(doc, S_OK, FALSE); + /* Save */ + hr = CreateStreamOnHGlobal(NULL, TRUE, &stream2); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + hr = IPersistStreamInit_Save(streaminit, stream2, FALSE); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + + hr = GetHGlobalFromStream(stream2, &global); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ptr = GlobalLock(global); + ok(!memcmp(ptr, "<?xml", 5), "Unexpected output.\n"); + GlobalUnlock(global); + + IStream_Release(stream2); + istream = SHCreateMemStream((const BYTE*)"", 0); hr = IPersistStreamInit_Load(streaminit, istream); todo_wine ok(hr == XML_E_MISSINGROOT, "Unexpected hr %#lx.\n", hr); -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/10706
From: Nikolay Sivov <nsivov@codeweavers.com> Signed-off-by: Nikolay Sivov <nsivov@codeweavers.com> --- dlls/msxml3/tests/saxreader.c | 76 +++++++++++++++++++++++++++++++++++ dlls/msxml6/tests/saxreader.c | 76 +++++++++++++++++++++++++++++++++++ 2 files changed, 152 insertions(+) diff --git a/dlls/msxml3/tests/saxreader.c b/dlls/msxml3/tests/saxreader.c index b7a79bb8faa..67cbe9c53ff 100644 --- a/dlls/msxml3/tests/saxreader.c +++ b/dlls/msxml3/tests/saxreader.c @@ -6456,6 +6456,81 @@ static void test_saxreader_parse_input(void) ISAXXMLReader_Release(reader); } +static void test_saxreader_max_element_depth(void) +{ + ISAXXMLReader *reader; + HRESULT hr; + VARIANT v; + + hr = CoCreateInstance(&CLSID_SAXXMLReader30, NULL, CLSCTX_INPROC_SERVER, &IID_ISAXXMLReader, (void **)&reader); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + + hr = ISAXXMLReader_putErrorHandler(reader, &errorHandler); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + + memset(&v, 0, sizeof(v)); + hr = ISAXXMLReader_getProperty(reader, _bstr_("max-element-depth"), &v); + todo_wine + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + todo_wine + ok(V_VT(&v) == VT_I4, "Unexpected type %d.\n", V_VT(&v)); + todo_wine + ok(V_I4(&v) == 5000, "Unexpected value %ld.\n", V_I4(&v)); + + V_UI4(&v) = 2147483648; + hr = ISAXXMLReader_putProperty(reader, _bstr_("max-element-depth"), v); + todo_wine + ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr); + + V_I4(&v) = 2147483647; + hr = ISAXXMLReader_putProperty(reader, _bstr_("max-element-depth"), v); + todo_wine + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + + hr = ISAXXMLReader_getProperty(reader, _bstr_("max-element-depth"), &v); + todo_wine + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + todo_wine + ok(V_VT(&v) == VT_I4, "Unexpected type %d.\n", V_VT(&v)); + ok(V_I4(&v) == 2147483647, "Unexpected value %ld.\n", V_I4(&v)); + + V_I4(&v) = 0; + hr = ISAXXMLReader_putProperty(reader, _bstr_("max-element-depth"), v); + todo_wine + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + + hr = ISAXXMLReader_getProperty(reader, _bstr_("max-element-depth"), &v); + todo_wine + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(V_I4(&v) == 0, "Unexpected value %ld.\n", V_I4(&v)); + + V_I4(&v) = 1; + hr = ISAXXMLReader_putProperty(reader, _bstr_("max-element-depth"), v); + todo_wine + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + + V_VT(&v) = VT_BSTR; + V_BSTR(&v) = SysAllocString(L"<a>text</a>"); + hr = ISAXXMLReader_parse(reader, v); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + VariantClear(&v); + + V_VT(&v) = VT_BSTR; + V_BSTR(&v) = SysAllocString(L"<a>text<!-- comment --></a>"); + hr = ISAXXMLReader_parse(reader, v); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + VariantClear(&v); + + V_VT(&v) = VT_BSTR; + V_BSTR(&v) = SysAllocString(L"<a>text<!-- comment --><b/></a>"); + hr = ISAXXMLReader_parse(reader, v); + todo_wine + ok(hr == E_ABORT, "Unexpected hr %#lx.\n", hr); + VariantClear(&v); + + ISAXXMLReader_Release(reader); +} + START_TEST(saxreader) { ISAXXMLReader *reader; @@ -6493,6 +6568,7 @@ START_TEST(saxreader) test_saxreader_characters(); test_saxreader_dtd(); test_saxreader_parse_input(); + test_saxreader_max_element_depth(); /* MXXMLWriter tests */ get_class_support_data(mxwriter_support_data, &IID_IMXWriter); diff --git a/dlls/msxml6/tests/saxreader.c b/dlls/msxml6/tests/saxreader.c index 3b850d775ce..0868344a34b 100644 --- a/dlls/msxml6/tests/saxreader.c +++ b/dlls/msxml6/tests/saxreader.c @@ -5312,6 +5312,81 @@ static void test_saxreader_max_xml_size(void) IStream_Release(stream); } +static void test_saxreader_max_element_depth(void) +{ + ISAXXMLReader *reader; + HRESULT hr; + VARIANT v; + + hr = CoCreateInstance(&CLSID_SAXXMLReader60, NULL, CLSCTX_INPROC_SERVER, &IID_ISAXXMLReader, (void **)&reader); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + + hr = ISAXXMLReader_putErrorHandler(reader, &errorHandler); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + + memset(&v, 0, sizeof(v)); + hr = ISAXXMLReader_getProperty(reader, _bstr_("max-element-depth"), &v); + todo_wine + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + todo_wine + ok(V_VT(&v) == VT_I4, "Unexpected type %d.\n", V_VT(&v)); + todo_wine + ok(V_I4(&v) == 256, "Unexpected value %ld.\n", V_I4(&v)); + + V_UI4(&v) = 2147483648; + hr = ISAXXMLReader_putProperty(reader, _bstr_("max-element-depth"), v); + todo_wine + ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr); + + V_I4(&v) = 2147483647; + hr = ISAXXMLReader_putProperty(reader, _bstr_("max-element-depth"), v); + todo_wine + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + + hr = ISAXXMLReader_getProperty(reader, _bstr_("max-element-depth"), &v); + todo_wine + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + todo_wine + ok(V_VT(&v) == VT_I4, "Unexpected type %d.\n", V_VT(&v)); + ok(V_I4(&v) == 2147483647, "Unexpected value %ld.\n", V_I4(&v)); + + V_I4(&v) = 0; + hr = ISAXXMLReader_putProperty(reader, _bstr_("max-element-depth"), v); + todo_wine + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + + hr = ISAXXMLReader_getProperty(reader, _bstr_("max-element-depth"), &v); + todo_wine + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(V_I4(&v) == 0, "Unexpected value %ld.\n", V_I4(&v)); + + V_I4(&v) = 1; + hr = ISAXXMLReader_putProperty(reader, _bstr_("max-element-depth"), v); + todo_wine + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + + V_VT(&v) = VT_BSTR; + V_BSTR(&v) = SysAllocString(L"<a>text</a>"); + hr = ISAXXMLReader_parse(reader, v); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + VariantClear(&v); + + V_VT(&v) = VT_BSTR; + V_BSTR(&v) = SysAllocString(L"<a>text<!-- comment --></a>"); + hr = ISAXXMLReader_parse(reader, v); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + VariantClear(&v); + + V_VT(&v) = VT_BSTR; + V_BSTR(&v) = SysAllocString(L"<a>text<!-- comment --><b/></a>"); + hr = ISAXXMLReader_parse(reader, v); + todo_wine + ok(hr == 0xc00cee92, "Unexpected hr %#lx.\n", hr); + VariantClear(&v); + + ISAXXMLReader_Release(reader); +} + START_TEST(saxreader) { HRESULT hr; @@ -5337,6 +5412,7 @@ START_TEST(saxreader) test_saxreader_cdata(); test_saxreader_characters(); test_saxreader_pi(); + test_saxreader_max_element_depth(); } if (is_class_supported(&CLSID_MXXMLWriter60)) -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/10706
From: Nikolay Sivov <nsivov@codeweavers.com> Signed-off-by: Nikolay Sivov <nsivov@codeweavers.com> --- dlls/msxml3/tests/domdoc.c | 102 ++++++++++++++++++++++++++++--------- dlls/msxml6/tests/domdoc.c | 90 ++++++++++++++++++++++++++++++++ 2 files changed, 167 insertions(+), 25 deletions(-) diff --git a/dlls/msxml3/tests/domdoc.c b/dlls/msxml3/tests/domdoc.c index 3f825ba83eb..f2b393c0979 100644 --- a/dlls/msxml3/tests/domdoc.c +++ b/dlls/msxml3/tests/domdoc.c @@ -14123,38 +14123,90 @@ static void test_transformNodeToObject(void) static void test_max_element_depth_values(void) { - IXMLDOMDocument2 *doc; + static const CLSID *classes[] = { &CLSID_DOMDocument, &CLSID_DOMDocument2, &CLSID_DOMDocument30 }; + IXMLDOMParseError *parse_error; + IXMLDOMDocument2 *doc, *doc3; + IXMLDOMDocument *doc2; VARIANT var; HRESULT hr; + LONG code; - doc = create_document_version(60, &IID_IXMLDOMDocument2); + for (int i = 0; i < ARRAYSIZE(classes); ++i) + { + hr = CoCreateInstance(classes[i], NULL, CLSCTX_INPROC_SERVER, &IID_IXMLDOMDocument2, (void **)&doc); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - /* The default max element depth value should be 256. */ - V_VT(&var) = VT_UI4; - V_UI4(&var) = 0xdeadbeef; - hr = IXMLDOMDocument2_getProperty(doc, _bstr_("MaxElementDepth"), &var); -todo_wine { - ok(hr == S_OK, "Failed to get property value, hr %#lx.\n", hr); - ok(V_VT(&var) == VT_I4, "Unexpected property value type, vt %d.\n", V_VT(&var)); - ok(V_I4(&var) == 256, "Unexpected property value.\n"); -} + /* The default max element depth value should be 256. */ + V_VT(&var) = VT_UI4; + V_UI4(&var) = 0xdeadbeef; + hr = IXMLDOMDocument2_getProperty(doc, _bstr_("MaxElementDepth"), &var); + todo_wine { + ok(hr == S_OK, "Failed to get property value, hr %#lx.\n", hr); + ok(V_VT(&var) == VT_I4, "Unexpected property value type, vt %d.\n", V_VT(&var)); + ok(V_I4(&var) == 5000, "Unexpected property value %ld.\n", V_I4(&var)); + } + /* Changes to the depth value should be observable when subsequently retrieved. */ + V_VT(&var) = VT_I4; + V_I4(&var) = 32; + hr = IXMLDOMDocument2_setProperty(doc, _bstr_("MaxElementDepth"), var); + ok(hr == S_OK, "Failed to set property, hr %#lx.\n", hr); + + V_VT(&var) = VT_UI4; + V_UI4(&var) = 0xdeadbeef; + hr = IXMLDOMDocument2_getProperty(doc, _bstr_("MaxElementDepth"), &var); + todo_wine { + ok(hr == S_OK, "Failed to get property value, hr %#lx.\n", hr); + ok(V_VT(&var) == VT_I4, "Unexpected property value type, vt %d.\n", V_VT(&var)); + ok(V_I4(&var) == 32, "Unexpected property value.\n"); + } + hr = IXMLDOMDocument2_cloneNode(doc, VARIANT_FALSE, (IXMLDOMNode **)&doc2); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + hr = IXMLDOMDocument_QueryInterface(doc2, &IID_IXMLDOMDocument2, (void **)&doc3); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + V_VT(&var) = VT_UI4; + V_UI4(&var) = 0xdeadbeef; + hr = IXMLDOMDocument2_getProperty(doc3, _bstr_("MaxElementDepth"), &var); + todo_wine { + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(V_VT(&var) == VT_I4, "Unexpected property value type, vt %d.\n", V_VT(&var)); + ok(V_I4(&var) == 32, "Unexpected property value.\n"); + } + IXMLDOMDocument2_Release(doc3); + IXMLDOMDocument_Release(doc2); - /* Changes to the depth value should be observable when subsequently retrieved. */ - V_VT(&var) = VT_I4; - V_I4(&var) = 32; - hr = IXMLDOMDocument2_setProperty(doc, _bstr_("MaxElementDepth"), var); - ok(hr == S_OK, "Failed to set property, hr %#lx.\n", hr); + V_VT(&var) = VT_I4; + V_I4(&var) = -1; + hr = IXMLDOMDocument2_setProperty(doc, _bstr_("MaxElementDepth"), var); + todo_wine + ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr); - V_VT(&var) = VT_UI4; - V_UI4(&var) = 0xdeadbeef; - hr = IXMLDOMDocument2_getProperty(doc, _bstr_("MaxElementDepth"), &var); -todo_wine { - ok(hr == S_OK, "Failed to get property value, hr %#lx.\n", hr); - ok(V_VT(&var) == VT_I4, "Unexpected property value type, vt %d.\n", V_VT(&var)); - ok(V_I4(&var) == 32, "Unexpected property value.\n"); -} + V_VT(&var) = VT_UI4; + V_UI4(&var) = 2147483648; + hr = IXMLDOMDocument2_setProperty(doc, _bstr_("MaxElementDepth"), var); + todo_wine + ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr); - IXMLDOMDocument2_Release(doc); + V_VT(&var) = VT_I4; + V_I4(&var) = 1; + hr = IXMLDOMDocument2_setProperty(doc, _bstr_("MaxElementDepth"), var); + hr = IXMLDOMDocument2_loadXML(doc, _bstr_("<a>text<!-- comment --></a>"), NULL); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + + hr = IXMLDOMDocument2_loadXML(doc, _bstr_("<a>text<!-- comment --><b/></a>"), NULL); + todo_wine + ok(hr == S_FALSE, "Unexpected hr %#lx.\n", hr); + hr = IXMLDOMDocument2_get_parseError(doc, &parse_error); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + hr = IXMLDOMParseError_get_errorCode(parse_error, &code); + todo_wine + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + todo_wine + ok(code == E_ABORT, "Unexpected error code %#lx.\n", code); + IXMLDOMParseError_Release(parse_error); + + IXMLDOMDocument2_Release(doc); + free_bstrs(); + } } typedef struct _namespace_as_attribute_t { diff --git a/dlls/msxml6/tests/domdoc.c b/dlls/msxml6/tests/domdoc.c index 8e9a327ddcc..80ad06fb8c5 100644 --- a/dlls/msxml6/tests/domdoc.c +++ b/dlls/msxml6/tests/domdoc.c @@ -647,6 +647,95 @@ todo_wine IXMLDOMDocument_Release(doc); } +static void test_max_element_depth_values(void) +{ + IXMLDOMParseError *parse_error; + IXMLDOMDocument2 *doc, *doc3; + IXMLDOMDocument *doc2; + VARIANT var; + HRESULT hr; + LONG code; + + hr = CoCreateInstance(&CLSID_DOMDocument60, NULL, CLSCTX_INPROC_SERVER, + &IID_IXMLDOMDocument2, (void **)&doc); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + + /* The default max element depth value should be 256. */ + V_VT(&var) = VT_UI4; + V_UI4(&var) = 0xdeadbeef; + hr = IXMLDOMDocument2_getProperty(doc, _bstr_(L"MaxElementDepth"), &var); +todo_wine { + ok(hr == S_OK, "Failed to get property value, hr %#lx.\n", hr); + ok(V_VT(&var) == VT_I4, "Unexpected property value type, vt %d.\n", V_VT(&var)); + ok(V_I4(&var) == 256, "Unexpected property value.\n"); +} + + /* Changes to the depth value should be observable when subsequently retrieved. */ + V_VT(&var) = VT_I4; + V_I4(&var) = 32; + hr = IXMLDOMDocument2_setProperty(doc, _bstr_(L"MaxElementDepth"), var); + ok(hr == S_OK, "Failed to set property, hr %#lx.\n", hr); + + V_VT(&var) = VT_UI4; + V_UI4(&var) = 0xdeadbeef; + hr = IXMLDOMDocument2_getProperty(doc, _bstr_(L"MaxElementDepth"), &var); +todo_wine { + ok(hr == S_OK, "Failed to get property value, hr %#lx.\n", hr); + ok(V_VT(&var) == VT_I4, "Unexpected property value type, vt %d.\n", V_VT(&var)); + ok(V_I4(&var) == 32, "Unexpected property value.\n"); +} + + hr = IXMLDOMDocument2_cloneNode(doc, VARIANT_FALSE, (IXMLDOMNode **)&doc2); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + hr = IXMLDOMDocument_QueryInterface(doc2, &IID_IXMLDOMDocument2, (void **)&doc3); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + V_VT(&var) = VT_UI4; + V_UI4(&var) = 0xdeadbeef; + hr = IXMLDOMDocument2_getProperty(doc3, _bstr_(L"MaxElementDepth"), &var); +todo_wine { + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(V_VT(&var) == VT_I4, "Unexpected property value type, vt %d.\n", V_VT(&var)); + ok(V_I4(&var) == 32, "Unexpected property value.\n"); +} + IXMLDOMDocument2_Release(doc3); + IXMLDOMDocument_Release(doc2); + + V_VT(&var) = VT_I4; + V_I4(&var) = -1; + hr = IXMLDOMDocument2_setProperty(doc, _bstr_(L"MaxElementDepth"), var); + todo_wine + ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr); + + V_VT(&var) = VT_UI4; + V_UI4(&var) = 2147483648; + hr = IXMLDOMDocument2_setProperty(doc, _bstr_(L"MaxElementDepth"), var); + todo_wine + ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr); + + V_VT(&var) = VT_I4; + V_I4(&var) = 1; + hr = IXMLDOMDocument2_setProperty(doc, _bstr_(L"MaxElementDepth"), var); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + + hr = IXMLDOMDocument2_loadXML(doc, _bstr_(L"<a>text<!-- comment --></a>"), NULL); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + + hr = IXMLDOMDocument2_loadXML(doc, _bstr_(L"<a>text<!-- comment --><b/></a>"), NULL); + todo_wine + ok(hr == S_FALSE, "Unexpected hr %#lx.\n", hr); + hr = IXMLDOMDocument2_get_parseError(doc, &parse_error); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + hr = IXMLDOMParseError_get_errorCode(parse_error, &code); + todo_wine + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + todo_wine + ok(code == 0xc00ce586, "Unexpected error code %#lx.\n", code); + IXMLDOMParseError_Release(parse_error); + + IXMLDOMDocument2_Release(doc); + free_bstrs(); +} + START_TEST(domdoc) { HRESULT hr; @@ -671,6 +760,7 @@ START_TEST(domdoc) test_normalize_attribute_values(); test_prohibitdtd(); test_interfaces(); + test_max_element_depth_values(); CoUninitialize(); } -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/10706
From: Nikolay Sivov <nsivov@codeweavers.com> Signed-off-by: Nikolay Sivov <nsivov@codeweavers.com> --- dlls/msxml3/domdoc.c | 32 +++++++++++--------------------- dlls/msxml3/tests/domdoc.c | 10 ++++++++++ dlls/msxml6/tests/domdoc.c | 35 +++++++++++++++++++++++++++++++++++ 3 files changed, 56 insertions(+), 21 deletions(-) diff --git a/dlls/msxml3/domdoc.c b/dlls/msxml3/domdoc.c index c36c43256c0..9da10ac05a7 100644 --- a/dlls/msxml3/domdoc.c +++ b/dlls/msxml3/domdoc.c @@ -1808,33 +1808,22 @@ static HRESULT WINAPI domdoc_setProperty(IXMLDOMDocument3 *iface, BSTR p, VARIAN TRACE("%p, %s, %s.\n", iface, debugstr_w(p), debugstr_variant(&value)); - if (wcsicmp(p, L"SelectionLanguage") == 0) + if (!wcscmp(p, L"SelectionLanguage")) { - VARIANT varStr; - BSTR bstr; - - V_VT(&varStr) = VT_EMPTY; if (V_VT(&value) != VT_BSTR) - { - if (FAILED(hr = VariantChangeType(&varStr, &value, 0, VT_BSTR))) - return hr; - bstr = V_BSTR(&varStr); - } - else - bstr = V_BSTR(&value); + return E_FAIL; - hr = S_OK; - if (wcsicmp(bstr, L"XPath") == 0) + if (!wcscmp(V_BSTR(&value), L"XPath")) properties->XPath = TRUE; - else if (wcsicmp(bstr, L"XSLPattern") == 0) + else if (!wcscmp(V_BSTR(&value), L"XSLPattern")) properties->XPath = FALSE; else - hr = E_FAIL; + return E_FAIL; - VariantClear(&varStr); - return hr; + return S_OK; } - else if (!wcsicmp(p, L"SelectionNamespaces")) + + if (!wcsicmp(p, L"SelectionNamespaces")) { xmlChar *nsStr = (xmlChar *)properties->selectNsStr; struct list *pNsList; @@ -2008,13 +1997,14 @@ static HRESULT WINAPI domdoc_getProperty(IXMLDOMDocument3 *iface, BSTR p, VARIAN if (!var) return E_INVALIDARG; - if (!wcsicmp(p, L"SelectionLanguage")) + if (!wcscmp(p, L"SelectionLanguage")) { V_VT(var) = VT_BSTR; V_BSTR(var) = SysAllocString(properties->XPath ? L"XPath" : L"XSLPattern"); return V_BSTR(var) ? S_OK : E_OUTOFMEMORY; } - else if (!wcsicmp(p, L"SelectionNamespaces")) + + if (!wcsicmp(p, L"SelectionNamespaces")) { int lenA, lenW; BSTR rebuiltStr, cur; diff --git a/dlls/msxml3/tests/domdoc.c b/dlls/msxml3/tests/domdoc.c index f2b393c0979..52509fde1f2 100644 --- a/dlls/msxml3/tests/domdoc.c +++ b/dlls/msxml3/tests/domdoc.c @@ -4719,6 +4719,14 @@ static void test_IXMLDOMDocument2(void) ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); hr = IXMLDOMDocument2_setProperty(doc2, _bstr_("SelectionLanguage"), _variantbstr_("XSLPattern")); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + hr = IXMLDOMDocument2_setProperty(doc2, _bstr_("selectionLanguage"), _variantbstr_("XPath")); + ok(hr == E_FAIL, "Unexpected hr %#lx.\n", hr); + hr = IXMLDOMDocument2_setProperty(doc2, _bstr_("SelectionLanguage"), _variantbstr_("xPath")); + ok(hr == E_FAIL, "Unexpected hr %#lx.\n", hr); + V_VT(&var) = VT_UI4; + V_UI4(&var) = 2; + hr = IXMLDOMDocument2_setProperty(doc2, _bstr_("SelectionLanguage"), var); + ok(hr == E_FAIL, "Unexpected hr %#lx.\n", hr); V_VT(&var) = VT_BSTR; V_BSTR(&var) = SysAllocString(L""); @@ -4737,6 +4745,8 @@ static void test_IXMLDOMDocument2(void) expect_eq(V_VT(&var), VT_BSTR, int, "%x"); ok(!wcscmp(V_BSTR(&var), L"XSLPattern"), "Unexpected value %s.\n", debugstr_w(V_BSTR(&var))); VariantClear(&var); + hr = IXMLDOMDocument2_getProperty(doc2, _bstr_("selectionLanguage"), &var); + ok(hr == E_FAIL, "Unexpected hr %#lx.\n", hr); IXMLDOMDocument2_Release( doc2 ); IXMLDOMDocument_Release( doc ); diff --git a/dlls/msxml6/tests/domdoc.c b/dlls/msxml6/tests/domdoc.c index 80ad06fb8c5..ac45e90749e 100644 --- a/dlls/msxml6/tests/domdoc.c +++ b/dlls/msxml6/tests/domdoc.c @@ -736,6 +736,40 @@ todo_wine { free_bstrs(); } +static void test_selectionlanguage(void) +{ + IXMLDOMDocument2 *doc; + VARIANT var; + HRESULT hr; + + hr = CoCreateInstance(&CLSID_DOMDocument60, NULL, CLSCTX_INPROC_SERVER, + &IID_IXMLDOMDocument2, (void **)&doc); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + + hr = IXMLDOMDocument2_getProperty(doc, _bstr_(L"SelectionLanguage"), &var); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(!wcscmp(V_BSTR(&var), L"XPath"), "Unexpected value %s.\n", debugstr_w(V_BSTR(&var))); + VariantClear(&var); + + hr = IXMLDOMDocument2_getProperty(doc, _bstr_(L"selectionLanguage"), &var); + ok(hr == E_FAIL, "Unexpected hr %#lx.\n", hr); + + V_BSTR(&var) = SysAllocString(L"XPath"); + V_VT(&var) = VT_BSTR; + hr = IXMLDOMDocument2_setProperty(doc, _bstr_(L"selectionLanguage"), var); + ok(hr == E_FAIL, "Unexpected hr %#lx.\n", hr); + VariantClear(&var); + + V_BSTR(&var) = SysAllocString(L"xPath"); + V_VT(&var) = VT_BSTR; + hr = IXMLDOMDocument2_setProperty(doc, _bstr_(L"SelectionLanguage"), var); + ok(hr == E_FAIL, "Unexpected hr %#lx.\n", hr); + VariantClear(&var); + + IXMLDOMDocument2_Release(doc); + free_bstrs(); +} + START_TEST(domdoc) { HRESULT hr; @@ -761,6 +795,7 @@ START_TEST(domdoc) test_prohibitdtd(); test_interfaces(); test_max_element_depth_values(); + test_selectionlanguage(); CoUninitialize(); } -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/10706
From: Nikolay Sivov <nsivov@codeweavers.com> Signed-off-by: Nikolay Sivov <nsivov@codeweavers.com> --- dlls/msxml3/saxreader.c | 34 ++++++++++++++++++++++++++++++---- dlls/msxml3/tests/saxreader.c | 11 ----------- dlls/msxml6/tests/saxreader.c | 11 ----------- 3 files changed, 30 insertions(+), 26 deletions(-) diff --git a/dlls/msxml3/saxreader.c b/dlls/msxml3/saxreader.c index 4b0ec0085d7..9da59602be2 100644 --- a/dlls/msxml3/saxreader.c +++ b/dlls/msxml3/saxreader.c @@ -209,6 +209,8 @@ enum error_codes E_SAX_BADXMLCASE = 0xc00ce576, E_SAX_INVALID_STANDALONE = 0xc00ce579, E_SAX_INVALID_VERSION = 0xc00ce57f, + + E_SAX_MAX_ELEMENT_DEPTH = 0xc00cee92, }; enum attdef_type @@ -465,6 +467,7 @@ struct saxreader BSTR xmldecl_standalone; BSTR xmldecl_encoding; int max_xml_size; + int max_element_depth; BSTR empty_bstr; MSXML_VERSION version; }; @@ -866,6 +869,7 @@ struct saxlocator bool vbInterface; struct list elements; enum saxreader_state state; + int depth; ISequentialStream *stream; bool eos; @@ -2358,19 +2362,25 @@ static void saxlocator_start_element(struct saxlocator *locator, const struct te struct element *element) { struct saxcontenthandler_iface *handler = saxreader_get_contenthandler(locator->saxreader); + int max_depth = locator->saxreader->max_element_depth; + MSXML_VERSION version = locator->saxreader->version; BSTR uri = NULL, local = NULL; HRESULT hr; if (locator->status != S_OK) return; + ++locator->depth; + if (max_depth && locator->depth > max_depth) + return saxreader_set_error(locator, version < MSXML6 ? E_ABORT : E_SAX_MAX_ELEMENT_DEPTH); + if (!saxreader_has_handler(locator, SAXContentHandler)) return; locator->line = position->line; locator->column = position->column; /* Point to the closing '>' */ - if (locator->saxreader->version >= MSXML4) + if (version >= MSXML4) --locator->column; if (is_namespaces_enabled(locator->saxreader)) @@ -2426,6 +2436,7 @@ static void saxlocator_end_element(struct saxlocator *locator, const struct text if (locator->status != S_OK) return; + --locator->depth; locator->line = position->line; /* Point to the closing '>' */ if (locator->saxreader->version >= MSXML4) @@ -5820,9 +5831,16 @@ static HRESULT saxreader_put_property(struct saxreader *reader, const WCHAR *pro if (!wcscmp(prop, L"max-element-depth")) { - if (V_VT(v) == VT_I4 && V_I4(v) == 0) return S_OK; - FIXME("(%p)->(%s): max-element-depth unsupported\n", reader, debugstr_variant(v)); - return E_NOTIMPL; + int depth; + + if (FAILED(saxreader_get_int_property(&value, &depth))) + return E_FAIL; + + if (depth < 0) + return E_INVALIDARG; + + reader->max_element_depth = depth; + return S_OK; } FIXME("(%p)->(%s:%s): unsupported property\n", reader, debugstr_w(prop), debugstr_variant(v)); @@ -5894,6 +5912,13 @@ static HRESULT saxreader_get_property(const struct saxreader *reader, const WCHA return S_OK; } + if (!wcscmp(prop, L"max-element-depth")) + { + V_VT(value) = VT_I4; + V_I4(value) = reader->max_element_depth; + return S_OK; + } + FIXME("(%p)->(%s) unsupported property\n", reader, debugstr_w(prop)); return E_NOTIMPL; @@ -6418,6 +6443,7 @@ static HRESULT saxreader_create(MSXML_VERSION version, struct saxreader **reader object->features = Namespaces | NamespacePrefixes | NormalizeLineBreaks; object->version = version; object->empty_bstr = SysAllocString(L""); + object->max_element_depth = version > MSXML3 ? 256 : 5000; init_dispex(&object->dispex, (IUnknown *)&object->IVBSAXXMLReader_iface, &saxreader_dispex); diff --git a/dlls/msxml3/tests/saxreader.c b/dlls/msxml3/tests/saxreader.c index 67cbe9c53ff..9ec329221e8 100644 --- a/dlls/msxml3/tests/saxreader.c +++ b/dlls/msxml3/tests/saxreader.c @@ -6470,43 +6470,33 @@ static void test_saxreader_max_element_depth(void) memset(&v, 0, sizeof(v)); hr = ISAXXMLReader_getProperty(reader, _bstr_("max-element-depth"), &v); - todo_wine ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - todo_wine ok(V_VT(&v) == VT_I4, "Unexpected type %d.\n", V_VT(&v)); - todo_wine ok(V_I4(&v) == 5000, "Unexpected value %ld.\n", V_I4(&v)); V_UI4(&v) = 2147483648; hr = ISAXXMLReader_putProperty(reader, _bstr_("max-element-depth"), v); - todo_wine ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr); V_I4(&v) = 2147483647; hr = ISAXXMLReader_putProperty(reader, _bstr_("max-element-depth"), v); - todo_wine ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); hr = ISAXXMLReader_getProperty(reader, _bstr_("max-element-depth"), &v); - todo_wine ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - todo_wine ok(V_VT(&v) == VT_I4, "Unexpected type %d.\n", V_VT(&v)); ok(V_I4(&v) == 2147483647, "Unexpected value %ld.\n", V_I4(&v)); V_I4(&v) = 0; hr = ISAXXMLReader_putProperty(reader, _bstr_("max-element-depth"), v); - todo_wine ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); hr = ISAXXMLReader_getProperty(reader, _bstr_("max-element-depth"), &v); - todo_wine ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); ok(V_I4(&v) == 0, "Unexpected value %ld.\n", V_I4(&v)); V_I4(&v) = 1; hr = ISAXXMLReader_putProperty(reader, _bstr_("max-element-depth"), v); - todo_wine ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); V_VT(&v) = VT_BSTR; @@ -6524,7 +6514,6 @@ static void test_saxreader_max_element_depth(void) V_VT(&v) = VT_BSTR; V_BSTR(&v) = SysAllocString(L"<a>text<!-- comment --><b/></a>"); hr = ISAXXMLReader_parse(reader, v); - todo_wine ok(hr == E_ABORT, "Unexpected hr %#lx.\n", hr); VariantClear(&v); diff --git a/dlls/msxml6/tests/saxreader.c b/dlls/msxml6/tests/saxreader.c index 0868344a34b..9c5676bc3ce 100644 --- a/dlls/msxml6/tests/saxreader.c +++ b/dlls/msxml6/tests/saxreader.c @@ -5326,43 +5326,33 @@ static void test_saxreader_max_element_depth(void) memset(&v, 0, sizeof(v)); hr = ISAXXMLReader_getProperty(reader, _bstr_("max-element-depth"), &v); - todo_wine ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - todo_wine ok(V_VT(&v) == VT_I4, "Unexpected type %d.\n", V_VT(&v)); - todo_wine ok(V_I4(&v) == 256, "Unexpected value %ld.\n", V_I4(&v)); V_UI4(&v) = 2147483648; hr = ISAXXMLReader_putProperty(reader, _bstr_("max-element-depth"), v); - todo_wine ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr); V_I4(&v) = 2147483647; hr = ISAXXMLReader_putProperty(reader, _bstr_("max-element-depth"), v); - todo_wine ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); hr = ISAXXMLReader_getProperty(reader, _bstr_("max-element-depth"), &v); - todo_wine ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - todo_wine ok(V_VT(&v) == VT_I4, "Unexpected type %d.\n", V_VT(&v)); ok(V_I4(&v) == 2147483647, "Unexpected value %ld.\n", V_I4(&v)); V_I4(&v) = 0; hr = ISAXXMLReader_putProperty(reader, _bstr_("max-element-depth"), v); - todo_wine ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); hr = ISAXXMLReader_getProperty(reader, _bstr_("max-element-depth"), &v); - todo_wine ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); ok(V_I4(&v) == 0, "Unexpected value %ld.\n", V_I4(&v)); V_I4(&v) = 1; hr = ISAXXMLReader_putProperty(reader, _bstr_("max-element-depth"), v); - todo_wine ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); V_VT(&v) = VT_BSTR; @@ -5380,7 +5370,6 @@ static void test_saxreader_max_element_depth(void) V_VT(&v) = VT_BSTR; V_BSTR(&v) = SysAllocString(L"<a>text<!-- comment --><b/></a>"); hr = ISAXXMLReader_parse(reader, v); - todo_wine ok(hr == 0xc00cee92, "Unexpected hr %#lx.\n", hr); VariantClear(&v); -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/10706
participants (2)
-
Nikolay Sivov -
Nikolay Sivov (@nsivov)