static HRESULT WINAPI Global_GetDispID(IDispatchEx *iface, BSTR bstrName, DWORD grfdex, DISPID *pid) { if(!strcmp_wa(bstrName, "ok")) { test_grfdex(grfdex, fdexNameCaseInsensitive); *pid = DISPID_GLOBAL_OK; return S_OK; } if(!strcmp_wa(bstrName, "trace")) { test_grfdex(grfdex, fdexNameCaseInsensitive); *pid = DISPID_GLOBAL_TRACE; return S_OK; } if(!strcmp_wa(bstrName, "reportSuccess")) { CHECK_EXPECT(global_success_d); test_grfdex(grfdex, fdexNameCaseInsensitive); *pid = DISPID_GLOBAL_REPORTSUCCESS; return S_OK; } if(!strcmp_wa(bstrName, "getVT")) { test_grfdex(grfdex, fdexNameCaseInsensitive); *pid = DISPID_GLOBAL_GETVT; return S_OK; } if(!strcmp_wa(bstrName, "isEnglishLang")) { test_grfdex(grfdex, fdexNameCaseInsensitive); *pid = DISPID_GLOBAL_ISENGLANG; return S_OK; } if(!strcmp_wa(bstrName, "testObj")) { test_grfdex(grfdex, fdexNameCaseInsensitive); *pid = DISPID_GLOBAL_TESTOBJ; return S_OK; } if(!strcmp_wa(bstrName, "vbvar")) { CHECK_EXPECT(global_vbvar_d); test_grfdex(grfdex, fdexNameCaseInsensitive); *pid = DISPID_GLOBAL_VBVAR; return S_OK; } if(!strcmp_wa(bstrName, "isNullDisp")) { test_grfdex(grfdex, fdexNameCaseInsensitive); *pid = DISPID_GLOBAL_ISNULLDISP; return S_OK; } if(!strcmp_wa(bstrName, "testDisp")) { test_grfdex(grfdex, fdexNameCaseInsensitive); *pid = DISPID_GLOBAL_TESTDISP; return S_OK; } if(strict_dispid_check && strcmp_wa(bstrName, "x")) ok(0, "unexpected call %s %x\n", wine_dbgstr_w(bstrName), grfdex); return DISP_E_UNKNOWNNAME; }
static void test_header(const struct HEADER_TYPE expect[], int num) { int i; BSTR key, text, all_header; HRESULT hres; char all[4096], buf[512]; all_header = NULL; hres = IHTMLXMLHttpRequest_getAllResponseHeaders(xhr, &all_header); ok(hres == S_OK, "getAllResponseHeader failed: %08x\n", hres); ok(all_header != NULL, "all_header == NULL\n"); WideCharToMultiByte(CP_UTF8, 0, all_header, -1, all, sizeof(all), NULL, NULL); SysFreeString(all_header); for(i = 0; i < num; ++i) { text = NULL; key = a2bstr(expect[i].key); hres = IHTMLXMLHttpRequest_getResponseHeader(xhr, key, &text); ok(hres == S_OK, "getResponseHeader failed, got %08x\n", hres); ok(text != NULL, "text == NULL\n"); ok(!strcmp_wa(text, expect[i].value), "Expect %s: %s, got %s\n", expect[i].key, expect[i].value, wine_dbgstr_w(text)); SysFreeString(key); SysFreeString(text); strcpy(buf, expect[i].key); strcat(buf, ": "); strcat(buf, expect[i].value); ok(strstr(all, buf) != NULL, "AllResponseHeaders(%s) don't have expected substr(%s)\n", all, buf); } }
static void test_change_type(IVariantChangeType *change_type, VARIANT *src, const conv_results_t *ex) { VARIANT v; call_change_type(change_type, &v, src, VT_I4); ok(V_I4(&v) == ex->int_result, "V_I4(v) = %d, expected %d\n", V_I4(&v), ex->int_result); call_change_type(change_type, &v, src, VT_BSTR); ok(!strcmp_wa(V_BSTR(&v), ex->str_result), "V_BSTR(v) = %s, expected %s\n", wine_dbgstr_w(V_BSTR(&v)), ex->str_result); VariantClear(&v); call_change_type(change_type, &v, src, VT_BOOL); ok(V_BOOL(&v) == ex->bool_result, "V_BOOL(v) = %x, expected %x\n", V_BOOL(&v), ex->bool_result); if(ex->test_double) { call_change_type(change_type, &v, src, VT_R8); ok(V_R8(&v) == ex->double_result, "V_R8(v) = %lf, expected %lf\n", V_R8(&v), ex->double_result); call_change_type(change_type, &v, src, VT_R4); ok(V_R4(&v) == (float)ex->double_result, "V_R4(v) = %f, expected %f\n", V_R4(&v), (float)ex->double_result); } if(V_VT(src) == VT_NULL) call_change_type(change_type, &v, src, VT_NULL); else change_type_fail(change_type, src, VT_NULL, E_NOTIMPL); if(V_VT(src) == VT_EMPTY) call_change_type(change_type, &v, src, VT_EMPTY); else change_type_fail(change_type, src, VT_EMPTY, E_NOTIMPL); call_change_type(change_type, &v, src, VT_I2); ok(V_I2(&v) == (INT16)ex->int_result, "V_I2(v) = %d, expected %d\n", V_I2(&v), ex->int_result); }
static HRESULT WINAPI Dispatch_GetIDsOfNames(IDispatch *iface, REFIID riid, LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgDispId) { unsigned i; for(i=0; i<cNames; i++) { if(!strcmp_wa(rgszNames[i], "ok")) { rgDispId[i] = DISPID_TESTOBJ_OK; }else if(!strcmp_wa(rgszNames[i], "trace")) { rgDispId[i] = DISPID_TESTOBJ_TRACE; }else if(!strcmp_wa(rgszNames[i], "reportSuccess")) { rgDispId[i] = DISPID_TESTOBJ_REPORTSUCCESS; }else if(!strcmp_wa(rgszNames[i], "wscriptFullName")) { rgDispId[i] = DISPID_TESTOBJ_WSCRIPTFULLNAME; }else if(!strcmp_wa(rgszNames[i], "wscriptPath")) { rgDispId[i] = DISPID_TESTOBJ_WSCRIPTPATH; }else if(!strcmp_wa(rgszNames[i], "wscriptScriptName")) { rgDispId[i] = DISPID_TESTOBJ_WSCRIPTSCRIPTNAME; }else if(!strcmp_wa(rgszNames[i], "wscriptScriptFullName")) { rgDispId[i] = DISPID_TESTOBJ_WSCRIPTSCRIPTFULLNAME; }else { ok(0, "unexpected name %s\n", wine_dbgstr_w(rgszNames[i])); return DISP_E_UNKNOWNNAME; } } return S_OK; }
static HRESULT WINAPI testObj_GetDispID(IDispatchEx *iface, BSTR bstrName, DWORD grfdex, DISPID *pid) { if(!strcmp_wa(bstrName, "propget")) { CHECK_EXPECT(testobj_propget_d); test_grfdex(grfdex, fdexNameCaseInsensitive); *pid = DISPID_TESTOBJ_PROPGET; return S_OK; } if(!strcmp_wa(bstrName, "propput")) { CHECK_EXPECT(testobj_propput_d); test_grfdex(grfdex, fdexNameCaseInsensitive); *pid = DISPID_TESTOBJ_PROPPUT; return S_OK; } ok(0, "unexpected call %s\n", wine_dbgstr_w(bstrName)); return DISP_E_UNKNOWNNAME; }
static HRESULT WINAPI ActiveScriptSite_GetItemInfo(IActiveScriptSite *iface, LPCOLESTR pstrName, DWORD dwReturnMask, IUnknown **ppiunkItem, ITypeInfo **ppti) { ok(dwReturnMask == SCRIPTINFO_IUNKNOWN, "unexpected dwReturnMask %x\n", dwReturnMask); ok(!ppti, "ppti != NULL\n"); ok(!strcmp_wa(pstrName, "test"), "pstrName = %s\n", wine_dbgstr_w(pstrName)); *ppiunkItem = (IUnknown*)&globalObj; return S_OK; }
static HRESULT WINAPI Test_GetDispID(IDispatchEx *iface, BSTR bstrName, DWORD grfdex, DISPID *pid) { if(!strcmp_wa(bstrName, "testArgConv")) { ok(grfdex == fdexNameCaseSensitive, "grfdex = %x\n", grfdex); *pid = DISPID_TEST_TESTARGCONV; return S_OK; } return E_NOTIMPL; }
static HRESULT WINAPI Global_GetDispID(IDispatchEx *iface, BSTR bstrName, DWORD grfdex, DISPID *pid) { if(!strcmp_wa(bstrName, "ok")) { ok(grfdex == fdexNameCaseSensitive, "grfdex = %x\n", grfdex); *pid = DISPID_GLOBAL_OK; return S_OK; } ok(0, "unexpected name %s\n", wine_dbgstr_w(bstrName)); return E_NOTIMPL; }
static HRESULT WINAPI Test_GetDispID(IDispatchEx *iface, BSTR bstrName, DWORD grfdex, DISPID *pid) { if(!strcmp_wa(bstrName, "reportSuccess")) { ok(grfdex == fdexNameCaseSensitive, "grfdex = %x\n", grfdex); *pid = DISPID_TEST_REPORTSUCCESS; return S_OK; } ok(0, "unexpected name %s\n", wine_dbgstr_w(bstrName)); return E_NOTIMPL; }
static void _test_alg_name(unsigned line, void *handle, const char *exname) { ULONG size = 0xdeadbeef; UCHAR buf[256]; const WCHAR *name = (const WCHAR*)buf; NTSTATUS status; status = BCryptGetProperty(handle, BCRYPT_ALGORITHM_NAME, buf, sizeof(buf), &size, 0); ok_(__FILE__,line)(status == STATUS_SUCCESS, "BCryptGetProperty failed: %08x\n", status); ok_(__FILE__,line)(size == (strlen(exname)+1)*sizeof(WCHAR), "got %u\n", size); ok_(__FILE__,line)(!strcmp_wa(name, exname), "alg name = %s, expected %s\n", wine_dbgstr_w(name), exname); }
static NTSTATUS is_8_3_w(const smb_ucs2_t *fname, bool allow_wildcards) { smb_ucs2_t *pref = 0, *ext = 0; size_t plen; NTSTATUS ret = NT_STATUS_UNSUCCESSFUL; if (!fname || !*fname) return NT_STATUS_INVALID_PARAMETER; if (strlen_w(fname) > 12) return NT_STATUS_UNSUCCESSFUL; if (strcmp_wa(fname, ".") == 0 || strcmp_wa(fname, "..") == 0) return NT_STATUS_OK; /* Name cannot start with '.' */ if (*fname == UCS2_CHAR('.')) return NT_STATUS_UNSUCCESSFUL; if (!NT_STATUS_IS_OK(is_valid_name(fname, allow_wildcards, True))) goto done; if (!NT_STATUS_IS_OK(mangle_get_prefix(fname, &pref, &ext, allow_wildcards))) goto done; plen = strlen_w(pref); if (strchr_wa(pref, '.')) goto done; if (plen < 1 || plen > 8) goto done; if (ext && (strlen_w(ext) > 3)) goto done; ret = NT_STATUS_OK; done: SAFE_FREE(pref); SAFE_FREE(ext); return ret; }
static HRESULT WINAPI PropertyBag_Read(IPropertyBag *iface, LPCOLESTR pszPropName, VARIANT *pVar, IErrorLog *pErrorLog) { ok(!pErrorLog, "pErrorLog = %p\n", pErrorLog); if(!strcmp_wa(pszPropName, "FccHandler")) { CHECK_EXPECT(Read_FccHandler); V_VT(pVar) = VT_BSTR; V_BSTR(pVar) = a2bstr("mrle"); return S_OK; } ok(0, "unexpected call: %s\n", wine_dbgstr_w(pszPropName)); return E_NOTIMPL; }
static HRESULT WINAPI PropertyNotifySink_OnChanged(IPropertyNotifySink *iface, DISPID dispID) { if(dispID == DISPID_READYSTATE){ BSTR state; HRESULT hres; hres = IHTMLDocument2_get_readyState(notif_doc, &state); ok(hres == S_OK, "get_readyState failed: %08x\n", hres); if(!strcmp_wa(state, "complete")) doc_complete = TRUE; SysFreeString(state); } return S_OK; }
static void test_illegal_xml(IXMLDOMDocument *xmldom) { IXMLDOMNode *first, *last; VARIANT variant; HRESULT hres; BSTR bstr; hres = IXMLDOMDocument_get_baseName(xmldom, NULL); ok(hres == E_INVALIDARG, "Expect E_INVALIDARG, got %08x\n", hres); hres = IXMLDOMDocument_get_baseName(xmldom, &bstr); ok(hres == S_FALSE, "get_baseName failed: %08x\n", hres); ok(bstr == NULL, "bstr(%p): %s\n", bstr, wine_dbgstr_w(bstr)); SysFreeString(bstr); hres = IXMLDOMDocument_get_dataType(xmldom, NULL); ok(hres == E_INVALIDARG, "Expect E_INVALIDARG, got %08x\n", hres); hres = IXMLDOMDocument_get_dataType(xmldom, &variant); ok(hres == S_FALSE, "get_dataType failed: %08x\n", hres); ok(V_VT(&variant) == VT_NULL, "got %s\n", debugstr_variant(&variant)); VariantClear(&variant); hres = IXMLDOMDocument_get_text(xmldom, &bstr); ok(!strcmp_wa(bstr, ""), "text = %s\n", wine_dbgstr_w(bstr)); SysFreeString(bstr); hres = IXMLDOMDocument_get_firstChild(xmldom, NULL); ok(hres == E_INVALIDARG, "Expect E_INVALIDARG, got %08x\n", hres); first = (void*)0xdeadbeef; hres = IXMLDOMDocument_get_firstChild(xmldom, &first); ok(hres == S_FALSE, "get_firstChild failed: %08x\n", hres); ok(first == NULL, "first != NULL\n"); last = (void*)0xdeadbeef; hres = IXMLDOMDocument_get_lastChild(xmldom, &last); ok(hres == S_FALSE, "get_lastChild failed: %08x\n", hres); ok(last == NULL, "last != NULL\n"); }
static NTSTATUS is_valid_name(const smb_ucs2_t *fname, bool allow_wildcards, bool only_8_3) { smb_ucs2_t *str, *p; size_t num_ucs2_chars; NTSTATUS ret = NT_STATUS_OK; if (!fname || !*fname) return NT_STATUS_INVALID_PARAMETER; /* . and .. are valid names. */ if (strcmp_wa(fname, ".")==0 || strcmp_wa(fname, "..")==0) return NT_STATUS_OK; if (only_8_3) { ret = has_valid_83_chars(fname, allow_wildcards); if (!NT_STATUS_IS_OK(ret)) return ret; } ret = has_illegal_chars(fname, allow_wildcards); if (!NT_STATUS_IS_OK(ret)) return ret; /* Name can't end in '.' or ' ' */ num_ucs2_chars = strlen_w(fname); if (fname[num_ucs2_chars-1] == UCS2_CHAR('.') || fname[num_ucs2_chars-1] == UCS2_CHAR(' ')) { return NT_STATUS_UNSUCCESSFUL; } str = strdup_w(fname); /* Truncate copy after the first dot. */ p = strchr_w(str, UCS2_CHAR('.')); if (p) { *p = 0; } strupper_w(str); p = &str[1]; switch(str[0]) { case UCS2_CHAR('A'): if(strcmp_wa(p, "UX") == 0) ret = NT_STATUS_UNSUCCESSFUL; break; case UCS2_CHAR('C'): if((strcmp_wa(p, "LOCK$") == 0) || (strcmp_wa(p, "ON") == 0) || (strcmp_wa(p, "OM1") == 0) || (strcmp_wa(p, "OM2") == 0) || (strcmp_wa(p, "OM3") == 0) || (strcmp_wa(p, "OM4") == 0) ) ret = NT_STATUS_UNSUCCESSFUL; break; case UCS2_CHAR('L'): if((strcmp_wa(p, "PT1") == 0) || (strcmp_wa(p, "PT2") == 0) || (strcmp_wa(p, "PT3") == 0) ) ret = NT_STATUS_UNSUCCESSFUL; break; case UCS2_CHAR('N'): if(strcmp_wa(p, "UL") == 0) ret = NT_STATUS_UNSUCCESSFUL; break; case UCS2_CHAR('P'): if(strcmp_wa(p, "RN") == 0) ret = NT_STATUS_UNSUCCESSFUL; break; default: break; } SAFE_FREE(str); return ret; }
static void test_async_xhr(IHTMLDocument2 *doc, const char *xml_url) { VARIANT vbool, vempty, var; BSTR method, url; BSTR text; LONG val; HRESULT hres; create_xmlhttprequest(doc); if(!xhr) return; V_VT(&var) = VT_DISPATCH; V_DISPATCH(&var) = (IDispatch*)&xmlhttprequest_onreadystatechange_obj; hres = IHTMLXMLHttpRequest_put_onreadystatechange(xhr, var); ok(hres == S_OK, "put_onreadystatechange failed: %08x\n", hres); V_VT(&var) = VT_EMPTY; hres = IHTMLXMLHttpRequest_get_onreadystatechange(xhr, &var); ok(hres == S_OK, "get_onreadystatechange failed: %08x\n", hres); ok(V_VT(&var) == VT_DISPATCH, "V_VT(onreadystatechange) = %d\n", V_VT(&var)); ok(V_DISPATCH(&var) == (IDispatch*)&xmlhttprequest_onreadystatechange_obj, "unexpected onreadystatechange value\n"); val = 0xdeadbeef; hres = IHTMLXMLHttpRequest_get_status(xhr, &val); ok(hres == E_FAIL, "Expect E_FAIL, got: %08x\n", hres); ok(val == 0, "Expect 0, got %d\n", val); text = (BSTR)0xdeadbeef; hres = IHTMLXMLHttpRequest_get_statusText(xhr, &text); todo_wine ok(hres == E_FAIL, "Expect E_FAIL, got: %08x\n", hres); todo_wine ok(text == NULL, "Expect NULL, got %p\n", text); val = 0xdeadbeef; hres = IHTMLXMLHttpRequest_get_readyState(xhr, &val); ok(hres == S_OK, "get_readyState failed: %08x\n", hres); ok(val == 0, "Expect UNSENT, got %d\n", val); method = a2bstr("GET"); url = a2bstr(xml_url); V_VT(&vbool) = VT_BOOL; V_BOOL(&vbool) = VARIANT_TRUE; V_VT(&vempty) = VT_EMPTY; SET_EXPECT(xmlhttprequest_onreadystatechange_opened); hres = IHTMLXMLHttpRequest_open(xhr, method, url, vbool, vempty, vempty); ok(hres == S_OK, "open failed: %08x\n", hres); CHECK_CALLED(xmlhttprequest_onreadystatechange_opened); SysFreeString(method); SysFreeString(url); if(FAILED(hres)) { IHTMLXMLHttpRequest_Release(xhr); xhr = NULL; return; } val = 0xdeadbeef; hres = IHTMLXMLHttpRequest_get_status(xhr, &val); ok(hres == E_FAIL, "Expect E_FAIL, got: %08x\n", hres); ok(val == 0, "Expect 0, got %d\n", val); hres = IHTMLXMLHttpRequest_get_statusText(xhr, &text); todo_wine ok(hres == E_FAIL, "Expect E_FAIL, got: %08x\n", hres); todo_wine ok(text == NULL, "Expect NULL, got %p\n", text); val = 0xdeadbeef; hres = IHTMLXMLHttpRequest_get_readyState(xhr, &val); ok(hres == S_OK, "get_readyState failed: %08x\n", hres); ok(val == 1, "Expect OPENED, got %d\n", val); SET_EXPECT(xmlhttprequest_onreadystatechange_opened); SET_EXPECT(xmlhttprequest_onreadystatechange_headers_received); SET_EXPECT(xmlhttprequest_onreadystatechange_loading); SET_EXPECT(xmlhttprequest_onreadystatechange_done); hres = IHTMLXMLHttpRequest_send(xhr, vempty); ok(hres == S_OK, "send failed: %08x\n", hres); if(SUCCEEDED(hres)) pump_msgs(&called_xmlhttprequest_onreadystatechange_done); todo_wine CHECK_CALLED(xmlhttprequest_onreadystatechange_opened); CHECK_CALLED(xmlhttprequest_onreadystatechange_headers_received); CHECK_CALLED(xmlhttprequest_onreadystatechange_loading); CHECK_CALLED(xmlhttprequest_onreadystatechange_done); if(FAILED(hres)) { IHTMLXMLHttpRequest_Release(xhr); xhr = NULL; return; } val = 0xdeadbeef; hres = IHTMLXMLHttpRequest_get_status(xhr, &val); ok(hres == S_OK, "get_status failed: %08x\n", hres); ok(val == 200, "Expect 200, got %d\n", val); text = NULL; hres = IHTMLXMLHttpRequest_get_statusText(xhr, &text); todo_wine ok(hres == S_OK, "get_statusText failed: %08x\n", hres); todo_wine ok(text != NULL, "text == NULL\n"); todo_wine ok(!strcmp_wa(text, "OK"), "Expected \"OK\", got %s\n", wine_dbgstr_w(text)); SysFreeString(text); val = 0xdeadbeef; hres = IHTMLXMLHttpRequest_get_readyState(xhr, &val); ok(hres == S_OK, "get_readyState failed: %08x\n", hres); ok(val == 4, "Expect DONE, got %d\n", val); text = NULL; hres = IHTMLXMLHttpRequest_get_responseText(xhr, &text); ok(hres == S_OK, "get_responseText failed: %08x\n", hres); ok(text != NULL, "test == NULL\n"); ok(!strcmp_wa(text, EXPECT_RESPONSE_TEXT), "expect %s, got %s\n", EXPECT_RESPONSE_TEXT, wine_dbgstr_w(text)); SysFreeString(text); IHTMLXMLHttpRequest_Release(xhr); xhr = NULL; }
static void test_async_xhr(IHTMLDocument2 *doc, const char *xml_url, const char *expect_text) { VARIANT vbool, vempty, var; BSTR method, url; BSTR text; LONG val; HRESULT hres; static const struct HEADER_TYPE expect_headers[] = { {"Content-Length", "51"}, {"Content-Type", "application/xml"} }; create_xmlhttprequest(doc); if(!xhr) return; V_VT(&var) = VT_DISPATCH; V_DISPATCH(&var) = (IDispatch*)&xmlhttprequest_onreadystatechange_obj; hres = IHTMLXMLHttpRequest_put_onreadystatechange(xhr, var); ok(hres == S_OK, "put_onreadystatechange failed: %08x\n", hres); V_VT(&var) = VT_EMPTY; hres = IHTMLXMLHttpRequest_get_onreadystatechange(xhr, &var); ok(hres == S_OK, "get_onreadystatechange failed: %08x\n", hres); ok(V_VT(&var) == VT_DISPATCH, "V_VT(onreadystatechange) = %d\n", V_VT(&var)); ok(V_DISPATCH(&var) == (IDispatch*)&xmlhttprequest_onreadystatechange_obj, "unexpected onreadystatechange value\n"); hres = IHTMLXMLHttpRequest_getResponseHeader(xhr, NULL, &text); ok(hres == E_INVALIDARG, "Expect E_INVALIDARG, got %08x\n", hres); hres = IHTMLXMLHttpRequest_getResponseHeader(xhr, content_type, NULL); ok(hres == E_POINTER, "Expect E_POINTER, got %08x\n", hres); hres = IHTMLXMLHttpRequest_getResponseHeader(xhr, NULL, NULL); ok(hres == E_POINTER || broken(hres == E_INVALIDARG), /* Vista and before */ "Expect E_POINTER, got %08x\n", hres); text = (BSTR)0xdeadbeef; hres = IHTMLXMLHttpRequest_getResponseHeader(xhr, content_type, &text); ok(hres == E_FAIL, "got %08x\n", hres); ok(text == NULL, "text = %p\n", text); hres = IHTMLXMLHttpRequest_getAllResponseHeaders(xhr, NULL); ok(hres == E_POINTER, "Expect E_POINTER, got %08x\n", hres); text = (BSTR)0xdeadbeef; hres = IHTMLXMLHttpRequest_getAllResponseHeaders(xhr, &text); ok(hres == E_FAIL, "got %08x\n", hres); ok(text == NULL, "text = %p\n", text); val = 0xdeadbeef; hres = IHTMLXMLHttpRequest_get_status(xhr, &val); ok(hres == E_FAIL, "Expect E_FAIL, got: %08x\n", hres); ok(val == 0, "Expect 0, got %d\n", val); text = (BSTR)0xdeadbeef; hres = IHTMLXMLHttpRequest_get_statusText(xhr, &text); ok(hres == E_FAIL, "Expect E_FAIL, got: %08x\n", hres); ok(text == NULL, "Expect NULL, got %p\n", text); val = 0xdeadbeef; hres = IHTMLXMLHttpRequest_get_readyState(xhr, &val); ok(hres == S_OK, "get_readyState failed: %08x\n", hres); ok(val == 0, "Expect UNSENT, got %d\n", val); method = a2bstr("GET"); url = a2bstr(xml_url); V_VT(&vbool) = VT_BOOL; V_BOOL(&vbool) = VARIANT_TRUE; V_VT(&vempty) = VT_EMPTY; SET_EXPECT(xmlhttprequest_onreadystatechange_opened); hres = IHTMLXMLHttpRequest_open(xhr, method, url, vbool, vempty, vempty); ok(hres == S_OK, "open failed: %08x\n", hres); CHECK_CALLED(xmlhttprequest_onreadystatechange_opened); SysFreeString(method); SysFreeString(url); if(FAILED(hres)) { IHTMLXMLHttpRequest_Release(xhr); xhr = NULL; return; } text = (BSTR)0xdeadbeef; hres = IHTMLXMLHttpRequest_getAllResponseHeaders(xhr, &text); ok(hres == E_FAIL, "got %08x\n", hres); ok(text == NULL, "text = %p\n", text); text = (BSTR)0xdeadbeef; hres = IHTMLXMLHttpRequest_getResponseHeader(xhr, content_type, &text); ok(hres == E_FAIL, "got %08x\n", hres); ok(text == NULL, "text = %p\n", text); val = 0xdeadbeef; hres = IHTMLXMLHttpRequest_get_status(xhr, &val); ok(hres == E_FAIL, "Expect E_FAIL, got: %08x\n", hres); ok(val == 0, "Expect 0, got %d\n", val); hres = IHTMLXMLHttpRequest_get_statusText(xhr, &text); ok(hres == E_FAIL, "Expect E_FAIL, got: %08x\n", hres); ok(text == NULL, "Expect NULL, got %p\n", text); val = 0xdeadbeef; hres = IHTMLXMLHttpRequest_get_readyState(xhr, &val); ok(hres == S_OK, "get_readyState failed: %08x\n", hres); ok(val == 1, "Expect OPENED, got %d\n", val); SET_EXPECT(xmlhttprequest_onreadystatechange_opened); SET_EXPECT(xmlhttprequest_onreadystatechange_headers_received); SET_EXPECT(xmlhttprequest_onreadystatechange_loading); SET_EXPECT(xmlhttprequest_onreadystatechange_done); loading_cnt = 0; hres = IHTMLXMLHttpRequest_send(xhr, vempty); ok(hres == S_OK, "send failed: %08x\n", hres); if(SUCCEEDED(hres)) pump_msgs(&called_xmlhttprequest_onreadystatechange_done); todo_wine CHECK_CALLED(xmlhttprequest_onreadystatechange_opened); CHECK_CALLED(xmlhttprequest_onreadystatechange_headers_received); CHECK_CALLED(xmlhttprequest_onreadystatechange_loading); CHECK_CALLED(xmlhttprequest_onreadystatechange_done); /* Workaround for loading large files */ todo_wine_if(!expect_text) ok(loading_cnt == 1, "loading_cnt = %d\n", loading_cnt); if(FAILED(hres)) { IHTMLXMLHttpRequest_Release(xhr); xhr = NULL; return; } text = NULL; hres = IHTMLXMLHttpRequest_getAllResponseHeaders(xhr, &text); ok(hres == S_OK, "getAllResponseHeader failed, got %08x\n", hres); ok(text != NULL, "text == NULL\n"); SysFreeString(text); if(expect_text) test_header(expect_headers, sizeof(expect_headers)/sizeof(expect_headers[0])); val = 0xdeadbeef; hres = IHTMLXMLHttpRequest_get_status(xhr, &val); ok(hres == S_OK, "get_status failed: %08x\n", hres); ok(val == 200, "Expect 200, got %d\n", val); text = NULL; hres = IHTMLXMLHttpRequest_get_statusText(xhr, &text); ok(hres == S_OK, "get_statusText failed: %08x\n", hres); ok(text != NULL, "text == NULL\n"); ok(!strcmp_wa(text, "OK"), "Expected \"OK\", got %s\n", wine_dbgstr_w(text)); SysFreeString(text); val = 0xdeadbeef; hres = IHTMLXMLHttpRequest_get_readyState(xhr, &val); ok(hres == S_OK, "get_readyState failed: %08x\n", hres); ok(val == 4, "Expect DONE, got %d\n", val); text = NULL; hres = IHTMLXMLHttpRequest_get_responseText(xhr, &text); ok(hres == S_OK, "get_responseText failed: %08x\n", hres); ok(text != NULL, "test == NULL\n"); if(expect_text) ok(!strcmp_wa(text, expect_text), "expect %s, got %s\n", expect_text, wine_dbgstr_w(text)); SysFreeString(text); test_responseXML(expect_text); IHTMLXMLHttpRequest_Release(xhr); xhr = NULL; }