From d4c87f7aa8e680324be4117a431723818feafc04 Mon Sep 17 00:00:00 2001 From: Amine Khaldi Date: Sat, 20 Jan 2018 12:36:34 +0100 Subject: [PATCH] [MSXML3_WINETEST] Sync with Wine 3.0. CORE-14225 --- modules/rostests/winetests/msxml3/domdoc.c | 110 +++++++++++++++++--- modules/rostests/winetests/msxml3/httpreq.c | 91 ++++++++++++++-- modules/rostests/winetests/msxml3/schema.c | 28 ++--- 3 files changed, 196 insertions(+), 33 deletions(-) diff --git a/modules/rostests/winetests/msxml3/domdoc.c b/modules/rostests/winetests/msxml3/domdoc.c index cf0869f2638..03ac01675d0 100644 --- a/modules/rostests/winetests/msxml3/domdoc.c +++ b/modules/rostests/winetests/msxml3/domdoc.c @@ -29,6 +29,7 @@ #undef CLSID_DOMDocument DEFINE_GUID(GUID_NULL,0,0,0,0,0,0,0,0,0,0,0); +DEFINE_GUID(IID_transformdest_unknown,0xf5078f3a,0xc551,0x11d3,0x89,0xb9,0x00,0x00,0xf8,0x1f,0xe2,0x21); static int g_unexpectedcall, g_expectedcall; @@ -6475,7 +6476,8 @@ static void test_save(void) hr = IXMLDOMDocument_loadXML(doc, _bstr_(win1252xml), &b); EXPECT_HR(hr, S_OK); - CreateStreamOnHGlobal(NULL, TRUE, &stream); + hr = CreateStreamOnHGlobal(NULL, TRUE, &stream); + ok(hr == S_OK, "got 0x%08x\n", hr); V_VT(&dest) = VT_UNKNOWN; V_UNKNOWN(&dest) = (IUnknown*)stream; hr = IXMLDOMDocument_save(doc, dest); @@ -7482,6 +7484,7 @@ static void test_XSLPattern(void) ok(hr == S_OK, "query=%s, failed with 0x%08x\n", ptr->query, hr); len = 0; hr = IXMLDOMNodeList_get_length(list, &len); + ok(hr == S_OK, "Failed to get list length, hr %#x.\n", hr); if (*ptr->list) { ok(len != 0, "query=%s, empty list\n", ptr->query); @@ -10168,16 +10171,20 @@ static void write_to_file(const char *name, const char *data) static void test_load(void) { IXMLDOMDocument *doc, *doc2; + BSTR pathW, bstr1, bstr2; IXMLDOMNodeList *list; IXMLDOMElement *elem; + char path[MAX_PATH]; VARIANT_BOOL b; VARIANT src; HRESULT hr; - BSTR path, bstr1, bstr2; void* ptr; + GetTempPathA(MAX_PATH, path); + strcat(path, "winetest.xml"); + /* prepare a file */ - write_to_file("test.xml", win1252xml); + write_to_file(path, win1252xml); doc = create_document(&IID_IXMLDOMDocument); @@ -10188,11 +10195,11 @@ static void test_load(void) EXPECT_HR(hr, E_INVALIDARG); ok(b == VARIANT_FALSE, "got %d\n", b); - path = _bstr_("test.xml"); + pathW = _bstr_(path); /* load from path: VT_BSTR */ V_VT(&src) = VT_BSTR; - V_BSTR(&src) = path; + V_BSTR(&src) = pathW; hr = IXMLDOMDocument_load(doc, src, &b); EXPECT_HR(hr, S_OK); ok(b == VARIANT_TRUE, "got %d\n", b); @@ -10204,7 +10211,7 @@ static void test_load(void) /* load from a path: VT_BSTR|VT_BYREF */ V_VT(&src) = VT_BSTR | VT_BYREF; - V_BSTRREF(&src) = &path; + V_BSTRREF(&src) = &pathW; hr = IXMLDOMDocument_load(doc, src, &b); EXPECT_HR(hr, S_OK); ok(b == VARIANT_TRUE, "got %d\n", b); @@ -10242,13 +10249,13 @@ static void test_load(void) ok(hr == S_OK, "got 0x%08x\n", hr); SysFreeString(bstr1); - DeleteFileA("test.xml"); + DeleteFileA(path); /* load from existing path, no xml content */ - write_to_file("test.xml", nocontent); + write_to_file(path, nocontent); V_VT(&src) = VT_BSTR; - V_BSTR(&src) = path; + V_BSTR(&src) = pathW; b = VARIANT_TRUE; hr = IXMLDOMDocument_load(doc, src, &b); ok(hr == S_FALSE, "got 0x%08x\n", hr); @@ -10259,7 +10266,7 @@ static void test_load(void) ok(hr == S_FALSE, "got 0x%08x\n", hr); ok(bstr1 == NULL, "got %p\n", bstr1); - DeleteFileA("test.xml"); + DeleteFileA(path); IXMLDOMDocument_Release(doc); doc = create_document(&IID_IXMLDOMDocument); @@ -10964,7 +10971,8 @@ static void test_dispex(void) /* IXMLDOMNodeList */ hr = IXMLDOMDocument_getElementsByTagName(doc, _bstr_("*"), &node_list); EXPECT_HR(hr, S_OK); - IXMLDOMNodeList_QueryInterface(node_list, &IID_IUnknown, (void**)&unk); + hr = IXMLDOMNodeList_QueryInterface(node_list, &IID_IUnknown, (void**)&unk); + ok(hr == S_OK, "got 0x%08x\n", hr); test_domobj_dispex(unk); IUnknown_Release(unk); IXMLDOMNodeList_Release(node_list); @@ -12005,7 +12013,7 @@ static void test_get_namespaces(void) free_bstrs(); } -static DOMNodeType put_data_types[] = { +static const DOMNodeType put_data_types[] = { NODE_TEXT, NODE_CDATA_SECTION, NODE_PROCESSING_INSTRUCTION, @@ -12018,7 +12026,7 @@ static void test_put_data(void) static const WCHAR test_data[] = {'t','e','s','t',' ','n','o','d','e',' ','d','a','t','a',0}; WCHAR buff[100], *data; IXMLDOMDocument *doc; - DOMNodeType *type; + const DOMNodeType *type; IXMLDOMText *text; IXMLDOMNode *node; VARIANT v; @@ -12576,6 +12584,81 @@ static void test_merging_text(void) free_bstrs(); } +static HRESULT WINAPI transformdest_QueryInterface(IUnknown *iface, REFIID riid, void **obj) +{ + BOOL known_iid = IsEqualIID(riid, &IID_IHTMLObjectElement) || + IsEqualIID(riid, &IID_transformdest_unknown) || + IsEqualIID(riid, &IID_IServiceProvider) || + IsEqualIID(riid, &IID_IStream) || + IsEqualIID(riid, &IID_ISequentialStream) || + IsEqualIID(riid, &IID_IRequestDictionary); + +todo_wine_if(IsEqualIID(riid, &IID_IXMLDOMDocument)) + ok(known_iid, "Unexpected riid %s\n", wine_dbgstr_guid(riid)); + + return E_NOINTERFACE; +} + +static ULONG WINAPI transformdest_AddRef(IUnknown *iface) +{ + return 2; +} + +static ULONG WINAPI transformdest_Release(IUnknown *iface) +{ + return 1; +} + +static const IUnknownVtbl transformdestvtbl = +{ + transformdest_QueryInterface, + transformdest_AddRef, + transformdest_Release, +}; + +static void test_transformNodeToObject(void) +{ + IUnknown transformdest = { &transformdestvtbl }; + IXMLDOMDocument *doc, *doc2, *doc3; + VARIANT_BOOL b; + HRESULT hr; + VARIANT v; + + doc = create_document(&IID_IXMLDOMDocument); + doc2 = create_document(&IID_IXMLDOMDocument); + doc3 = create_document(&IID_IXMLDOMDocument); + + hr = IXMLDOMDocument_loadXML(doc, _bstr_(szTransformXML), &b); + ok(hr == S_OK, "Failed to load document, hr %#x.\n", hr); + hr = IXMLDOMDocument_loadXML(doc2, _bstr_(szTransformSSXML), &b); + ok(hr == S_OK, "Failed to load document, hr %#x.\n", hr); + + V_VT(&v) = VT_UNKNOWN; + V_UNKNOWN(&v) = &transformdest; + hr = IXMLDOMDocument_transformNodeToObject(doc, (IXMLDOMNode *)doc2, v); + ok(hr == E_INVALIDARG, "Failed to transform node, hr %#x.\n", hr); + + V_VT(&v) = VT_UNKNOWN; + V_UNKNOWN(&v) = NULL; + hr = IXMLDOMDocument_transformNodeToObject(doc, (IXMLDOMNode *)doc2, v); + ok(hr == E_INVALIDARG, "Failed to transform node, hr %#x.\n", hr); + + V_VT(&v) = VT_DISPATCH; + V_DISPATCH(&v) = NULL; + hr = IXMLDOMDocument_transformNodeToObject(doc, (IXMLDOMNode *)doc2, v); + ok(hr == E_INVALIDARG, "Failed to transform node, hr %#x.\n", hr); + + V_VT(&v) = VT_DISPATCH; + V_DISPATCH(&v) = (IDispatch *)doc3; + hr = IXMLDOMDocument_transformNodeToObject(doc, (IXMLDOMNode *)doc2, v); + ok(hr == S_OK, "Failed to transform node, hr %#x.\n", hr); + + IXMLDOMDocument_Release(doc3); + IXMLDOMDocument_Release(doc2); + IXMLDOMDocument_Release(doc); + free_bstrs(); +} + START_TEST(domdoc) { HRESULT hr; @@ -12657,6 +12740,7 @@ START_TEST(domdoc) test_xmlns_attribute(); test_url(); test_merging_text(); + test_transformNodeToObject(); test_xsltemplate(); test_xsltext(); diff --git a/modules/rostests/winetests/msxml3/httpreq.c b/modules/rostests/winetests/msxml3/httpreq.c index 8d97a48cd75..9c4e48864f4 100644 --- a/modules/rostests/winetests/msxml3/httpreq.c +++ b/modules/rostests/winetests/msxml3/httpreq.c @@ -1322,6 +1322,16 @@ static IXMLHttpRequest *create_xhr(void) return SUCCEEDED(hr) ? ret : NULL; } +static IServerXMLHTTPRequest *create_server_xhr(void) +{ + IServerXMLHTTPRequest *ret; + HRESULT hr; + + hr = CoCreateInstance(&CLSID_ServerXMLHTTP30, NULL, CLSCTX_INPROC_SERVER, &IID_IServerXMLHTTPRequest, (void **)&ret); + + return SUCCEEDED(hr) ? ret : NULL; +} + static void set_safety_opt(IUnknown *unk, DWORD mask, DWORD opts) { IObjectSafety *obj_safety; @@ -1714,6 +1724,28 @@ static void test_XMLHTTP(void) EXPECT_HR(hr, S_OK); IObjectWithSite_Release(obj_site); + + /* HEAD request */ + hr = IXMLHttpRequest_put_onreadystatechange(xhr, NULL); + ok(hr == S_OK, "Failed to reset state change handler, hr %#x.\n", hr); + + test_open(xhr, "HEAD", xmltestA, S_OK); + + V_VT(&varbody) = VT_EMPTY; + hr = IXMLHttpRequest_send(xhr, varbody); + ok(hr == S_OK, "Failed to send HEAD request, hr %#x.\n", hr); + + str = NULL; + hr = IXMLHttpRequest_get_responseText(xhr, &str); + ok(hr == S_OK, "Failed to get response text, hr %#x.\n", hr); + ok(!*str, "Unexpected text %s.\n", wine_dbgstr_w(str)); + SysFreeString(str); + + hr = IXMLHttpRequest_getAllResponseHeaders(xhr, &str); + ok(hr == S_OK, "Failed to get response headers, hr %#x.\n", hr); + ok(str && *str, "Expected response headers.\n"); + SysFreeString(str); + IXMLHttpRequest_Release(xhr); free_bstrs(); } @@ -1738,20 +1770,67 @@ static void test_safe_httpreq(void) free_bstrs(); } +static void test_supporterrorinfo(void) +{ + HRESULT hr; + IXMLHttpRequest *xhr; + IServerXMLHTTPRequest *server_xhr; + ISupportErrorInfo *errorinfo, *errorinfo2; + + xhr = create_xhr(); + + EXPECT_REF(xhr, 1); + hr = IXMLHttpRequest_QueryInterface(xhr, &IID_ISupportErrorInfo, (void **)&errorinfo); + ok(hr == S_OK, "Failed to get ISupportErrorInfo, hr %#x.\n", hr); + EXPECT_REF(xhr, 2); + + hr = IXMLHttpRequest_QueryInterface(xhr, &IID_ISupportErrorInfo, (void **)&errorinfo2); + ok(hr == S_OK, "Failed to get ISupportErrorInfo, hr %#x.\n", hr); + ok(errorinfo == errorinfo2, "Unexpected error info instance.\n"); + EXPECT_REF(xhr, 3); + + ISupportErrorInfo_Release(errorinfo2); + ISupportErrorInfo_Release(errorinfo); + + IXMLHttpRequest_Release(xhr); + + /* ServerXMLHTTP */ + server_xhr = create_server_xhr(); + + EXPECT_REF(server_xhr, 1); + hr = IServerXMLHTTPRequest_QueryInterface(server_xhr, &IID_ISupportErrorInfo, (void **)&errorinfo); + ok(hr == S_OK, "Failed to get ISupportErrorInfo, hr %#x.\n", hr); + EXPECT_REF(server_xhr, 2); + + hr = IServerXMLHTTPRequest_QueryInterface(server_xhr, &IID_ISupportErrorInfo, (void **)&errorinfo2); + ok(hr == S_OK, "Failed to get ISupportErrorInfo, hr %#x.\n", hr); + ok(errorinfo == errorinfo2, "Unexpected error info instance.\n"); + EXPECT_REF(server_xhr, 3); + + ISupportErrorInfo_Release(errorinfo2); + ISupportErrorInfo_Release(errorinfo); + + IServerXMLHTTPRequest_Release(server_xhr); +} + START_TEST(httpreq) { IXMLHttpRequest *xhr; CoInitialize(NULL); - if((xhr = create_xhr())) { - IXMLHttpRequest_Release(xhr); - - test_XMLHTTP(); - test_safe_httpreq(); - }else { + if (!(xhr = create_xhr())) + { win_skip("IXMLHTTPRequest is not available\n"); + CoUninitialize(); + return; } + IXMLHttpRequest_Release(xhr); + + test_XMLHTTP(); + test_safe_httpreq(); + test_supporterrorinfo(); + CoUninitialize(); } diff --git a/modules/rostests/winetests/msxml3/schema.c b/modules/rostests/winetests/msxml3/schema.c index e082b00f4c0..306c65dcf22 100644 --- a/modules/rostests/winetests/msxml3/schema.c +++ b/modules/rostests/winetests/msxml3/schema.c @@ -656,26 +656,26 @@ static void test_collection_refs(void) LONG length; schema1 = create_document(&IID_IXMLDOMDocument2); + ok(schema1 != NULL, "Failed to create a document.\n"); + + cache1 = create_cache(&IID_IXMLDOMSchemaCollection); + ok(cache1 != NULL, "Failed to create schema collection.\n"); + + if (!schema1 || !cache1) + { + if (schema1) + IXMLDOMDocument2_Release(schema1); + if (cache1) + IXMLDOMSchemaCollection_Release(cache1); + return; + } + schema2 = create_document(&IID_IXMLDOMDocument2); schema3 = create_document(&IID_IXMLDOMDocument2); - cache1 = create_cache(&IID_IXMLDOMSchemaCollection); cache2 = create_cache(&IID_IXMLDOMSchemaCollection); cache3 = create_cache(&IID_IXMLDOMSchemaCollection); - if (!schema1 || !schema2 || !schema3 || !cache1 || !cache2 || !cache3) - { - if (schema1) IXMLDOMDocument2_Release(schema1); - if (schema2) IXMLDOMDocument2_Release(schema2); - if (schema3) IXMLDOMDocument2_Release(schema3); - - if (cache1) IXMLDOMSchemaCollection_Release(cache1); - if (cache2) IXMLDOMSchemaCollection_Release(cache2); - if (cache3) IXMLDOMSchemaCollection_Release(cache2); - - return; - } - ole_check(IXMLDOMDocument2_loadXML(schema1, _bstr_(xdr_schema1_xml), &b)); ok(b == VARIANT_TRUE, "failed to load XML\n");