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 _parse_script_a(unsigned line, IActiveScriptParse *parser, const char *script) { BSTR str; HRESULT hres; str = a2bstr(script); hres = IActiveScriptParse64_ParseScriptText(parser, str, NULL, NULL, NULL, 0, 0, 0, NULL, NULL); SysFreeString(str); ok_(__FILE__,line)(hres == S_OK, "ParseScriptText failed: %08x\n", hres); }
static void parse_script_af(DWORD flags, const char *src) { BSTR tmp; HRESULT hres; tmp = a2bstr(src); hres = parse_script(flags, tmp); SysFreeString(tmp); ok(hres == S_OK, "parse_script failed: %08x\n", hres); }
static HRESULT parse_script_ae(IActiveScriptParse *parser, const char *script) { BSTR str; HRESULT hres; str = a2bstr(script); hres = IActiveScriptParse64_ParseScriptText(parser, str, NULL, NULL, NULL, 0, 0, 0, NULL, NULL); SysFreeString(str); return hres; }
static void test_gc(void) { IActiveScriptParse *parser; IActiveScript *engine; BSTR src; HRESULT hres; strict_dispid_check = FALSE; engine = create_script(); if(!engine) return; hres = IActiveScript_QueryInterface(engine, &IID_IActiveScriptParse, (void**)&parser); ok(hres == S_OK, "Could not get IActiveScriptParse: %08x\n", hres); hres = IActiveScriptParse64_InitNew(parser); ok(hres == S_OK, "InitNew failed: %08x\n", hres); hres = IActiveScript_SetScriptSite(engine, &ActiveScriptSite); ok(hres == S_OK, "SetScriptSite failed: %08x\n", hres); hres = IActiveScript_AddNamedItem(engine, testW, SCRIPTITEM_ISVISIBLE|SCRIPTITEM_ISSOURCE|SCRIPTITEM_GLOBALMEMBERS); ok(hres == S_OK, "AddNamedItem failed: %08x\n", hres); hres = IActiveScript_SetScriptState(engine, SCRIPTSTATE_STARTED); ok(hres == S_OK, "SetScriptState(SCRIPTSTATE_STARTED) failed: %08x\n", hres); src = a2bstr( "class C\n" " Public ref\n" " Public Sub Class_Terminate\n" " Call reportSuccess()\n" " End Sub\n" "End Class\n" "Dim x\n" "set x = new C\n" "set x.ref = x\n" "set x = nothing\n"); hres = IActiveScriptParse64_ParseScriptText(parser, src, NULL, NULL, NULL, 0, 0, 0, NULL, NULL); ok(hres == S_OK, "ParseScriptText failed: %08x\n", hres); SysFreeString(src); SET_EXPECT(global_success_d); SET_EXPECT(global_success_i); IActiveScript_Close(engine); CHECK_CALLED(global_success_d); CHECK_CALLED(global_success_i); IActiveScript_Release(engine); IUnknown_Release(parser); }
static void test_script_dispatch(IDispatchEx *dispex) { DISPPARAMS dp = {NULL,NULL,0,0}; EXCEPINFO ei; BSTR str; DISPID id; VARIANT v; HRESULT hres; str = a2bstr("ActiveXObject"); hres = IDispatchEx_GetDispID(dispex, str, fdexNameCaseSensitive, &id); SysFreeString(str); ok(hres == S_OK, "GetDispID failed: %08x\n", hres); str = a2bstr("Math"); hres = IDispatchEx_GetDispID(dispex, str, fdexNameCaseSensitive, &id); SysFreeString(str); ok(hres == S_OK, "GetDispID failed: %08x\n", hres); memset(&ei, 0, sizeof(ei)); hres = IDispatchEx_InvokeEx(dispex, id, 0, DISPATCH_PROPERTYGET, &dp, &v, &ei, NULL); ok(hres == S_OK, "InvokeEx failed: %08x\n", hres); ok(V_VT(&v) == VT_DISPATCH, "V_VT(v) = %d\n", V_VT(&v)); ok(V_DISPATCH(&v) != NULL, "V_DISPATCH(v) = NULL\n"); VariantClear(&v); str = a2bstr("String"); hres = IDispatchEx_GetDispID(dispex, str, fdexNameCaseSensitive, &id); SysFreeString(str); ok(hres == S_OK, "GetDispID failed: %08x\n", hres); memset(&ei, 0, sizeof(ei)); hres = IDispatchEx_InvokeEx(dispex, id, 0, DISPATCH_PROPERTYGET, &dp, &v, &ei, NULL); ok(hres == S_OK, "InvokeEx failed: %08x\n", hres); ok(V_VT(&v) == VT_DISPATCH, "V_VT(v) = %d\n", V_VT(&v)); ok(V_DISPATCH(&v) != NULL, "V_DISPATCH(v) = NULL\n"); VariantClear(&v); }
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 void _get_disp_id(unsigned line, IDispatchEx *dispex, const char *name, HRESULT exhres, DISPID *id) { DISPID id2; BSTR str; HRESULT hres; str = a2bstr(name); hres = IDispatchEx_GetDispID(dispex, str, 0, id); ok_(__FILE__,line)(hres == exhres, "GetDispID(%s) returned %08x, expected %08x\n", name, hres, exhres); hres = IDispatchEx_GetIDsOfNames(dispex, &IID_NULL, &str, 1, 0, &id2); SysFreeString(str); ok_(__FILE__,line)(hres == exhres, "GetIDsOfNames(%s) returned %08x, expected %08x\n", name, hres, exhres); ok_(__FILE__,line)(*id == id2, "GetIDsOfNames(%s) id != id2\n", name); }
static void parse_script(IActiveScriptParse *parse, const char *src) { BSTR str; HRESULT hres; SET_EXPECT(OnEnterScript); SET_EXPECT(OnLeaveScript); str = a2bstr(src); hres = IActiveScriptParse_ParseScriptText(parse, str, NULL, NULL, NULL, 0, 0, 0, NULL, NULL); SysFreeString(str); ok(hres == S_OK, "ParseScriptText failed: %08x\n", hres); CHECK_CALLED(OnEnterScript); CHECK_CALLED(OnLeaveScript); }
static IHTMLDocument2 *create_doc_from_url(const char *start_url) { BSTR url; IBindCtx *bc; IMoniker *url_mon; IPersistMoniker *persist_mon; IHTMLDocument2 *doc; HRESULT hres; hres = CreateBindCtx(0, &bc); ok(hres == S_OK, "CreateBindCtx failed: 0x%08x\n", hres); url = a2bstr(start_url); hres = CreateURLMoniker(NULL, url, &url_mon); ok(hres == S_OK, "CreateURLMoniker failed: 0x%08x\n", hres); hres = CoCreateInstance(&CLSID_HTMLDocument, NULL, CLSCTX_INPROC_SERVER | CLSCTX_INPROC_HANDLER, &IID_IHTMLDocument2, (void**)&doc); ok(hres == S_OK, "CoCreateInstance failed: 0x%08x\n", hres); hres = IHTMLDocument2_QueryInterface(doc, &IID_IPersistMoniker, (void**)&persist_mon); ok(hres == S_OK, "IHTMLDocument2_QueryInterface failed: 0x%08x\n", hres); hres = IPersistMoniker_Load(persist_mon, FALSE, url_mon, bc, STGM_SHARE_EXCLUSIVE | STGM_READWRITE); ok(hres == S_OK, "IPersistMoniker_Load failed: 0x%08x\n", hres); IPersistMoniker_Release(persist_mon); IMoniker_Release(url_mon); IBindCtx_Release(bc); SysFreeString(url); doc_complete = FALSE; notif_doc = doc; do_advise((IUnknown*)doc, &IID_IPropertyNotifySink, (IUnknown*)&PropertyNotifySink); pump_msgs(&doc_complete); return doc; }
static void test_navigate(IWebBrowser2 *wb, const char *url) { VARIANT urlv, emptyv; MSG msg; HRESULT hres; SET_EXPECT(Invoke_NAVIGATECOMPLETE2); V_VT(&urlv) = VT_BSTR; V_BSTR(&urlv) = a2bstr(url); V_VT(&emptyv) = VT_EMPTY; hres = IWebBrowser2_Navigate2(wb, &urlv, &emptyv, &emptyv, &emptyv, &emptyv); ok(hres == S_OK, "Navigate2 failed: %08x\n", hres); SysFreeString(V_BSTR(&urlv)); while(!navigate_complete && GetMessageW(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } CHECK_CALLED(Invoke_NAVIGATECOMPLETE2); }
static BOOL check_jscript(void) { IActiveScriptProperty *script_prop; IActiveScriptParse *parser; BSTR str; HRESULT hres; parser = create_script(TRUE, TRUE); if(!parser) return FALSE; str = a2bstr("if(!('localeCompare' in String.prototype)) throw 1;"); hres = IActiveScriptParse64_ParseScriptText(parser, str, NULL, NULL, NULL, 0, 0, 0, NULL, NULL); SysFreeString(str); if(hres == S_OK) hres = IUnknown_QueryInterface(parser, &IID_IActiveScriptProperty, (void**)&script_prop); IUnknown_Release(parser); if(hres == S_OK) IActiveScriptProperty_Release(script_prop); return hres == S_OK; }
static IDispatchEx *parse_procedure_a(IActiveScriptParse *parser, const char *src) { IActiveScriptParseProcedure2 *parse_proc; IDispatchEx *dispex; IDispatch *disp; BSTR str; HRESULT hres; hres = IUnknown_QueryInterface(parser, &IID_IActiveScriptParseProcedure2, (void**)&parse_proc); ok(hres == S_OK, "Coult not get IActiveScriptParseProcedure2: %08x\n", hres); str = a2bstr(src); hres = IActiveScriptParseProcedure2_64_ParseProcedureText(parse_proc, str, NULL, NULL, NULL, NULL, NULL, 0, 0, 0, &disp); SysFreeString(str); IUnknown_Release(parse_proc); ok(hres == S_OK, "ParseProcedureText failed: %08x\n", hres); ok(disp != NULL, "disp == NULL\n"); hres = IDispatch_QueryInterface(disp, &IID_IDispatchEx, (void**)&dispex); IDispatch_Release(dispex); ok(hres == S_OK, "Could not get IDispatchEx iface: %08x\n", hres); return dispex; }
ADLL Abitmap * Amovie::getSnapshot(char *filename, float *fps) { Abitmap *bitmap=NULL; IMediaDet *pMD=NULL; byte *bits=NULL; WCHAR wname[1024]; *fps=0.f; if(CoCreateInstance(CLSID_MediaDet, NULL, CLSCTX_INPROC_SERVER, IID_IMediaDet, (void**)&pMD)!=S_OK) return NULL; if(pMD==NULL) return NULL; a2bstr(wname, filename); if(pMD->put_Filename((BSTR)wname)==S_OK) { long nstreams=0; if(pMD->get_OutputStreams(&nstreams)==S_OK) { bool bFound=false; long i; for(i=0; i<nstreams; i++) { GUID major_type; pMD->put_CurrentStream(i); pMD->get_StreamType(&major_type); if(major_type==MEDIATYPE_Video) { bFound=true; break; } } if(bFound) { AM_MEDIA_TYPE *pmt=(AM_MEDIA_TYPE *)malloc(sizeof(AM_MEDIA_TYPE)); long size; if(pmt) { memset(pmt, 0, sizeof(AM_MEDIA_TYPE)); if(pMD->get_StreamMediaType(pmt)==S_OK) { if((pmt->formattype==FORMAT_VideoInfo)&&(pmt->pbFormat)&&(pmt->cbFormat>=sizeof(VIDEOINFOHEADER))) { VIDEOINFOHEADER *pVih=reinterpret_cast<VIDEOINFOHEADER*>(pmt->pbFormat); long width=pVih->bmiHeader.biWidth; long height=pVih->bmiHeader.biHeight; double dfps; if(height<0) height*=-1; if(pMD->get_FrameRate(&dfps)==S_OK) { *fps=(float)dfps; bitmap=new Abitmap(width, height); if(pMD->GetBitmapBits(0, &size, NULL, width, height)==S_OK) { double time=0.0; int i; bool bok=false; int nok=0; int ntry=5; bits=(byte *)malloc(size); while((!bok)&&(ntry--)) { byte *s=bits; dword *d=bitmap->body32; int n=width*height; int npix=0; HRESULT ret=S_OK; if((ret=pMD->GetBitmapBits(time, &size, (char *)s, width, height))==S_OK) { s+=sizeof(BITMAPINFOHEADER); for(i=0; i<n; i++) { byte b=*(s++); byte g=*(s++); byte r=*(s++); dword v=r+g+b; *(d++)=color32(r, g, b); if(v>128) npix++; } bok=(npix>(width*height>>4)); nok++; } else { char *error=null; switch(ret) { case S_OK: error="Success"; break; case E_NOINTERFACE: error="Could not add the Sample Grabber filter to the graph"; break; case E_OUTOFMEMORY: error="Insufficient memory"; break; case E_POINTER: error="NULL pointer error"; break; case E_UNEXPECTED: error="Unexpected error"; break; case VFW_E_INVALIDMEDIATYPE: error="Invalid media type"; break; } if(nok) break; else { delete(bitmap); bitmap=NULL; break; } } time++; } if(bitmap) bitmap->flipY(); } }
static HRESULT WINAPI Global_InvokeEx(IDispatchEx *iface, DISPID id, LCID lcid, WORD wFlags, DISPPARAMS *pdp, VARIANT *pvarRes, EXCEPINFO *pei, IServiceProvider *pspCaller) { switch(id) { case DISPID_GLOBAL_OK: { VARIANT *b; ok(wFlags == INVOKE_FUNC || wFlags == (INVOKE_FUNC|INVOKE_PROPERTYGET), "wFlags = %x\n", wFlags); ok(pdp != NULL, "pdp == NULL\n"); ok(pdp->rgvarg != NULL, "rgvarg == NULL\n"); ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n"); ok(pdp->cArgs == 2, "cArgs = %d\n", pdp->cArgs); ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs); if(wFlags & INVOKE_PROPERTYGET) ok(pvarRes != NULL, "pvarRes == NULL\n"); else ok(!pvarRes, "pvarRes != NULL\n"); ok(pei != NULL, "pei == NULL\n"); ok(V_VT(pdp->rgvarg) == VT_BSTR, "V_VT(psp->rgvargs) = %d\n", V_VT(pdp->rgvarg)); b = pdp->rgvarg+1; if(V_VT(b) == (VT_BYREF|VT_VARIANT)) b = V_BYREF(b); ok(V_VT(b) == VT_BOOL, "V_VT(b) = %d\n", V_VT(b)); ok(V_BOOL(b), "%s: %s\n", test_name, wine_dbgstr_w(V_BSTR(pdp->rgvarg))); return S_OK; } case DISPID_GLOBAL_TRACE: ok(wFlags == INVOKE_FUNC, "wFlags = %x\n", wFlags); ok(pdp != NULL, "pdp == NULL\n"); ok(pdp->rgvarg != NULL, "rgvarg == NULL\n"); ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n"); ok(pdp->cArgs == 1, "cArgs = %d\n", pdp->cArgs); ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs); ok(!pvarRes, "pvarRes != NULL\n"); ok(pei != NULL, "pei == NULL\n"); ok(V_VT(pdp->rgvarg) == VT_BSTR, "V_VT(psp->rgvargs) = %d\n", V_VT(pdp->rgvarg)); if(V_VT(pdp->rgvarg) == VT_BSTR) trace("%s: %s\n", test_name, wine_dbgstr_w(V_BSTR(pdp->rgvarg))); return S_OK; case DISPID_GLOBAL_REPORTSUCCESS: CHECK_EXPECT(global_success_i); ok(wFlags == INVOKE_FUNC, "wFlags = %x\n", wFlags); ok(pdp != NULL, "pdp == NULL\n"); ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n"); ok(pdp->cArgs == 0, "cArgs = %d\n", pdp->cArgs); ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs); ok(!pvarRes, "pvarRes != NULL\n"); ok(pei != NULL, "pei == NULL\n"); return S_OK; case DISPID_GLOBAL_GETVT: ok(pdp != NULL, "pdp == NULL\n"); ok(pdp->rgvarg != NULL, "rgvarg == NULL\n"); ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n"); ok(pdp->cArgs == 1, "cArgs = %d\n", pdp->cArgs); ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs); ok(pvarRes != NULL, "pvarRes == NULL\n"); ok(V_VT(pvarRes) == VT_EMPTY, "V_VT(pvarRes) = %d\n", V_VT(pvarRes)); ok(pei != NULL, "pei == NULL\n"); V_VT(pvarRes) = VT_BSTR; V_BSTR(pvarRes) = a2bstr(vt2a(pdp->rgvarg)); return S_OK; case DISPID_GLOBAL_ISENGLANG: ok(wFlags == (INVOKE_FUNC|INVOKE_PROPERTYGET), "wFlags = %x\n", wFlags); ok(pdp != NULL, "pdp == NULL\n"); ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n"); ok(pdp->cArgs == 0, "cArgs = %d\n", pdp->cArgs); ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs); ok(pvarRes != NULL, "pvarRes == NULL\n"); ok(pei != NULL, "pei == NULL\n"); V_VT(pvarRes) = VT_BOOL; if(is_lang_english()) { V_BOOL(pvarRes) = VARIANT_TRUE; }else { skip("Skipping some tests in non-English UIs\n"); V_BOOL(pvarRes) = VARIANT_FALSE; } return S_OK; case DISPID_GLOBAL_VBVAR: CHECK_EXPECT(global_vbvar_i); ok(wFlags == DISPATCH_PROPERTYPUT, "wFlags = %x\n", wFlags); ok(pdp != NULL, "pdp == NULL\n"); ok(pdp->rgvarg != NULL, "rgvarg == NULL\n"); ok(pdp->rgdispidNamedArgs != NULL, "rgdispidNamedArgs == NULL\n"); ok(pdp->cArgs == 1, "cArgs = %d\n", pdp->cArgs); ok(pdp->cNamedArgs == 1, "cNamedArgs = %d\n", pdp->cNamedArgs); ok(pdp->rgdispidNamedArgs[0] == DISPID_PROPERTYPUT, "pdp->rgdispidNamedArgs[0] = %d\n", pdp->rgdispidNamedArgs[0]); ok(!pvarRes, "pvarRes != NULL\n"); ok(pei != NULL, "pei == NULL\n"); ok(V_VT(pdp->rgvarg) == VT_I2, "V_VT(psp->rgvargs) = %d\n", V_VT(pdp->rgvarg)); ok(V_I2(pdp->rgvarg) == 3, "V_I2(psp->rgvargs) = %d\n", V_I2(pdp->rgvarg)); return S_OK; case DISPID_GLOBAL_TESTOBJ: ok(wFlags == (DISPATCH_PROPERTYGET|DISPATCH_METHOD), "wFlags = %x\n", wFlags); ok(pdp != NULL, "pdp == NULL\n"); ok(!pdp->rgvarg, "rgvarg == NULL\n"); ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n"); ok(!pdp->cArgs, "cArgs = %d\n", pdp->cArgs); ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs); ok(pvarRes != NULL, "pvarRes == NULL\n"); ok(pei != NULL, "pei == NULL\n"); V_VT(pvarRes) = VT_DISPATCH; V_DISPATCH(pvarRes) = (IDispatch*)&testObj; return S_OK; case DISPID_GLOBAL_ISNULLDISP: { VARIANT *v; ok(wFlags == (INVOKE_FUNC|INVOKE_PROPERTYGET), "wFlags = %x\n", wFlags); ok(pdp != NULL, "pdp == NULL\n"); ok(pdp->rgvarg != NULL, "rgvarg == NULL\n"); ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n"); ok(pdp->cArgs == 1, "cArgs = %d\n", pdp->cArgs); ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs); ok(pvarRes != NULL, "pvarRes == NULL\n"); ok(pei != NULL, "pei == NULL\n"); v = pdp->rgvarg; if(V_VT(v) == (VT_VARIANT|VT_BYREF)) v = V_VARIANTREF(v); ok(V_VT(v) == VT_DISPATCH, "V_VT(psp->rgvargs) = %d\n", V_VT(pdp->rgvarg)); V_VT(pvarRes) = VT_BOOL; V_BOOL(pvarRes) = V_DISPATCH(v) ? VARIANT_FALSE : VARIANT_TRUE; return S_OK; } case DISPID_GLOBAL_TESTDISP: ok(wFlags == INVOKE_FUNC, "wFlags = %x\n", wFlags); ok(pdp != NULL, "pdp == NULL\n"); ok(pdp->rgvarg != NULL, "rgvarg == NULL\n"); ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n"); ok(pdp->cArgs == 1, "cArgs = %d\n", pdp->cArgs); ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs); ok(!pvarRes, "pvarRes != NULL\n"); ok(pei != NULL, "pei == NULL\n"); ok(V_VT(pdp->rgvarg) == VT_DISPATCH, "V_VT(psp->rgvargs) = %d\n", V_VT(pdp->rgvarg)); test_disp(V_DISPATCH(pdp->rgvarg)); return S_OK; } ok(0, "unexpected call %d\n", id); return DISP_E_MEMBERNOTFOUND; }
static void test_disp(IDispatch *disp) { DISPID id, public_prop_id, public_prop2_id, public_func_id, public_sub_id, defvalget_id; DISPID named_args[5] = {DISPID_PROPERTYPUT}; VARIANT v, args[5]; DISPPARAMS dp = {args, named_args}; IDispatchEx *dispex; EXCEPINFO ei = {0}; BSTR str; HRESULT hres; hres = IDispatch_QueryInterface(disp, &IID_IDispatchEx, (void**)&dispex); ok(hres == S_OK, "Could not get IDispatchEx iface: %08x\n", hres); str = a2bstr("publicProp"); hres = IDispatchEx_GetDispID(dispex, str, fdexNameCaseInsensitive, &public_prop_id); SysFreeString(str); ok(hres == S_OK, "GetDispID(publicProp) failed: %08x\n", hres); str = a2bstr("PUBLICPROP"); hres = IDispatchEx_GetDispID(dispex, str, 0, &id); SysFreeString(str); ok(hres == S_OK, "GetDispID(PUBLICPROP) failed: %08x\n", hres); ok(public_prop_id == id, "id = %d\n", public_prop_id); str = a2bstr("publicPROP2"); hres = IDispatchEx_GetDispID(dispex, str, fdexNameCaseInsensitive, &public_prop2_id); SysFreeString(str); ok(hres == S_OK, "GetDispID(publicProp2) failed: %08x\n", hres); str = a2bstr("defValGet"); hres = IDispatchEx_GetDispID(dispex, str, fdexNameCaseInsensitive, &defvalget_id); SysFreeString(str); ok(hres == S_OK, "GetDispID(defValGet) failed: %08x\n", hres); ok(defvalget_id == DISPID_VALUE, "id = %d\n", defvalget_id); str = a2bstr("privateProp"); hres = IDispatchEx_GetDispID(dispex, str, fdexNameCaseInsensitive, &id); SysFreeString(str); ok(hres == DISP_E_UNKNOWNNAME, "GetDispID(privateProp) failed: %08x, expected DISP_E_UNKNOWNNAME\n", hres); ok(id == -1, "id = %d\n", id); str = a2bstr("class_initialize"); hres = IDispatchEx_GetDispID(dispex, str, fdexNameCaseInsensitive, &id); SysFreeString(str); ok(hres == S_OK, "GetDispID(publicProp2) failed: %08x\n", hres); hres = IDispatchEx_InvokeEx(dispex, public_prop_id, 0, DISPATCH_PROPERTYGET|DISPATCH_METHOD, &dp, &v, &ei, NULL); ok(hres == S_OK, "InvokeEx failed: %08x\n", hres); ok(V_VT(&v) == VT_EMPTY, "V_VT(v) = %d\n", V_VT(&v)); V_VT(args) = VT_BOOL; V_BOOL(args) = VARIANT_TRUE; dp.cArgs = dp.cNamedArgs = 1; V_VT(&v) = VT_BOOL; hres = IDispatchEx_InvokeEx(dispex, public_prop_id, 0, DISPATCH_PROPERTYPUT, &dp, &v, &ei, NULL); ok(hres == S_OK, "InvokeEx failed: %08x\n", hres); ok(V_VT(&v) == VT_EMPTY, "V_VT(v) = %d\n", V_VT(&v)); dp.cArgs = dp.cNamedArgs = 0; hres = IDispatchEx_InvokeEx(dispex, public_prop_id, 0, DISPATCH_PROPERTYGET|DISPATCH_METHOD, &dp, &v, &ei, NULL); ok(hres == S_OK, "InvokeEx failed: %08x\n", hres); ok(V_VT(&v) == VT_BOOL, "V_VT(v) = %d\n", V_VT(&v)); ok(V_BOOL(&v), "V_BOOL(v) = %x\n", V_BOOL(&v)); dp.cArgs = 1; hres = IDispatchEx_InvokeEx(dispex, public_prop_id, 0, DISPATCH_PROPERTYGET|DISPATCH_METHOD, &dp, &v, &ei, NULL); ok(hres == DISP_E_MEMBERNOTFOUND, "InvokeEx failed: %08x, expected DISP_E_MEMBERNOTFOUND\n", hres); ok(V_VT(&v) == VT_EMPTY, "V_VT(v) = %d\n", V_VT(&v)); V_VT(args) = VT_BOOL; V_BOOL(args) = VARIANT_FALSE; dp.cArgs = 1; V_VT(&v) = VT_BOOL; hres = IDispatchEx_InvokeEx(dispex, public_prop_id, 0, DISPATCH_PROPERTYPUT, &dp, NULL, &ei, NULL); ok(hres == DISP_E_PARAMNOTOPTIONAL, "InvokeEx failed: %08x, expected DISP_E_PARAMNOTOPTIONAL\n", hres); str = a2bstr("publicFunction"); hres = IDispatchEx_GetDispID(dispex, str, fdexNameCaseInsensitive, &public_func_id); SysFreeString(str); ok(hres == S_OK, "GetDispID(publicFunction) failed: %08x\n", hres); ok(public_func_id != -1, "public_func_id = -1\n"); str = a2bstr("publicSub"); hres = IDispatchEx_GetDispID(dispex, str, fdexNameCaseInsensitive, &public_sub_id); SysFreeString(str); ok(hres == S_OK, "GetDispID(publicSub) failed: %08x\n", hres); ok(public_sub_id != -1, "public_func_id = -1\n"); dp.cArgs = dp.cNamedArgs = 0; hres = IDispatchEx_InvokeEx(dispex, public_func_id, 0, DISPATCH_PROPERTYGET|DISPATCH_METHOD, &dp, &v, &ei, NULL); ok(hres == S_OK, "InvokeEx failed: %08x\n", hres); ok(V_VT(&v) == VT_I2, "V_VT(v) = %d\n", V_VT(&v)); ok(V_I2(&v) == 4, "V_I2(v) = %d\n", V_I2(&v)); dp.cArgs = dp.cNamedArgs = 0; hres = IDispatchEx_InvokeEx(dispex, public_func_id, 0, DISPATCH_PROPERTYGET, &dp, &v, &ei, NULL); ok(hres == DISP_E_MEMBERNOTFOUND, "InvokeEx failed: %08x, expected DISP_E_MEMBERNOTFOUND\n", hres); ok(V_VT(&v) == VT_EMPTY, "V_VT(v) = %d\n", V_VT(&v)); dp.cArgs = dp.cNamedArgs = 0; hres = IDispatchEx_InvokeEx(dispex, public_func_id, 0, DISPATCH_METHOD, &dp, &v, &ei, NULL); ok(hres == S_OK, "InvokeEx failed: %08x\n", hres); ok(V_VT(&v) == VT_I2, "V_VT(v) = %d\n", V_VT(&v)); ok(V_I2(&v) == 4, "V_I2(v) = %d\n", V_I2(&v)); dp.cArgs = dp.cNamedArgs = 0; hres = IDispatchEx_InvokeEx(dispex, public_sub_id, 0, DISPATCH_PROPERTYGET|DISPATCH_METHOD, &dp, &v, &ei, NULL); ok(hres == S_OK, "InvokeEx failed: %08x\n", hres); ok(V_VT(&v) == VT_EMPTY, "V_VT(v) = %d\n", V_VT(&v)); dp.cArgs = dp.cNamedArgs = 0; hres = IDispatchEx_InvokeEx(dispex, public_sub_id, 0, DISPATCH_PROPERTYGET, &dp, &v, &ei, NULL); ok(hres == DISP_E_MEMBERNOTFOUND, "InvokeEx failed: %08x, expected DISP_E_MEMBERNOTFOUND\n", hres); ok(V_VT(&v) == VT_EMPTY, "V_VT(v) = %d\n", V_VT(&v)); dp.cArgs = dp.cNamedArgs = 0; hres = IDispatchEx_InvokeEx(dispex, public_sub_id, 0, DISPATCH_METHOD, &dp, &v, &ei, NULL); ok(hres == S_OK, "InvokeEx failed: %08x\n", hres); ok(V_VT(&v) == VT_EMPTY, "V_VT(v) = %d\n", V_VT(&v)); V_VT(args) = VT_BOOL; V_BOOL(args) = VARIANT_TRUE; dp.cArgs = dp.cNamedArgs = 1; hres = IDispatchEx_InvokeEx(dispex, public_sub_id, 0, DISPATCH_PROPERTYPUT, &dp, NULL, &ei, NULL); ok(FAILED(hres), "InvokeEx succeeded: %08x\n", hres); dp.cArgs = dp.cNamedArgs = 0; hres = IDispatchEx_InvokeEx(dispex, public_func_id, 0, DISPATCH_PROPERTYGET|DISPATCH_METHOD, &dp, &v, &ei, NULL); ok(hres == S_OK, "InvokeEx failed: %08x\n", hres); ok(V_VT(&v) == VT_I2, "V_VT(v) = %d\n", V_VT(&v)); ok(V_I2(&v) == 4, "V_I2(v) = %d\n", V_I2(&v)); dp.cArgs = dp.cNamedArgs = 0; hres = IDispatchEx_InvokeEx(dispex, public_func_id, 0, DISPATCH_METHOD, &dp, &v, &ei, NULL); ok(hres == S_OK, "InvokeEx failed: %08x\n", hres); ok(V_VT(&v) == VT_I2, "V_VT(v) = %d\n", V_VT(&v)); ok(V_I2(&v) == 4, "V_I2(v) = %d\n", V_I2(&v)); dp.cArgs = dp.cNamedArgs = 0; hres = IDispatchEx_InvokeEx(dispex, public_sub_id, 0, DISPATCH_PROPERTYGET|DISPATCH_METHOD, &dp, &v, &ei, NULL); ok(hres == S_OK, "InvokeEx failed: %08x\n", hres); ok(V_VT(&v) == VT_EMPTY, "V_VT(v) = %d\n", V_VT(&v)); dp.cArgs = dp.cNamedArgs = 0; hres = IDispatchEx_InvokeEx(dispex, public_sub_id, 0, DISPATCH_METHOD, &dp, &v, &ei, NULL); ok(hres == S_OK, "InvokeEx failed: %08x\n", hres); ok(V_VT(&v) == VT_EMPTY, "V_VT(v) = %d\n", V_VT(&v)); str = a2bstr("privateSub"); hres = IDispatchEx_GetDispID(dispex, str, fdexNameCaseInsensitive, &id); SysFreeString(str); ok(hres == DISP_E_UNKNOWNNAME, "GetDispID(privateSub) failed: %08x, expected DISP_E_UNKNOWNNAME\n", hres); ok(id == -1, "id = %d\n", id); str = a2bstr("dynprop"); hres = IDispatchEx_GetDispID(dispex, str, fdexNameCaseInsensitive|fdexNameEnsure, &id); ok(hres == DISP_E_UNKNOWNNAME, "GetDispID(privateProp) failed: %08x, expected DISP_E_UNKNOWNNAME\n", hres); ok(id == -1, "id = %d\n", id); hres = IDispatchEx_GetDispID(dispex, str, fdexNameEnsure, &id); ok(hres == DISP_E_UNKNOWNNAME, "GetDispID(privateProp) failed: %08x, expected DISP_E_UNKNOWNNAME\n", hres); ok(id == -1, "id = %d\n", id); SysFreeString(str); IDispatchEx_Release(dispex); }
static HRESULT WINAPI htmldoc2_get_URL(IHTMLDocument2 *iface, BSTR *p) { CHECK_EXPECT2(htmldoc2_get_url); *p = a2bstr("http://test.winehq.org/"); return S_OK; }
static void test_XMLHTTP(void) { static const char bodyA[] = "mode=Test"; static const char urlA[] = "http://crossover.codeweavers.com/posttest.php"; static const char xmltestA[] = "http://crossover.codeweavers.com/xmltest.xml"; static const char referertesturl[] = "http://test.winehq.org/tests/referer.php"; static const WCHAR wszExpectedResponse[] = {'F','A','I','L','E','D',0}; static const CHAR xmltestbodyA[] = "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<a>TEST</a>\n"; static const WCHAR norefererW[] = {'n','o',' ','r','e','f','e','r','e','r',' ','s','e','t',0}; IXMLHttpRequest *xhr; IObjectWithSite *obj_site, *obj_site2; BSTR bstrResponse, str, str1; VARIANT varbody, varbody_ref; VARIANT dummy; LONG state, status, bound; IDispatch *event; void *ptr; HRESULT hr; HGLOBAL g; xhr = create_xhr(); VariantInit(&dummy); V_VT(&dummy) = VT_ERROR; V_ERROR(&dummy) = DISP_E_MEMBERNOTFOUND; hr = IXMLHttpRequest_put_onreadystatechange(xhr, NULL); EXPECT_HR(hr, S_OK); hr = IXMLHttpRequest_abort(xhr); EXPECT_HR(hr, S_OK); V_VT(&varbody) = VT_I2; V_I2(&varbody) = 1; hr = IXMLHttpRequest_get_responseBody(xhr, &varbody); EXPECT_HR(hr, E_PENDING); ok(V_VT(&varbody) == VT_EMPTY, "got type %d\n", V_VT(&varbody)); ok(V_I2(&varbody) == 1, "got %d\n", V_I2(&varbody)); V_VT(&varbody) = VT_I2; V_I2(&varbody) = 1; hr = IXMLHttpRequest_get_responseStream(xhr, &varbody); EXPECT_HR(hr, E_PENDING); ok(V_VT(&varbody) == VT_EMPTY, "got type %d\n", V_VT(&varbody)); ok(V_I2(&varbody) == 1, "got %d\n", V_I2(&varbody)); /* send before open */ hr = IXMLHttpRequest_send(xhr, dummy); ok(hr == E_FAIL || broken(hr == E_UNEXPECTED) /* win2k */, "got 0x%08x\n", hr); /* initial status code */ hr = IXMLHttpRequest_get_status(xhr, NULL); ok(hr == E_POINTER || broken(hr == E_INVALIDARG) /* <win8 */, "got 0x%08x\n", hr); status = 0xdeadbeef; hr = IXMLHttpRequest_get_status(xhr, &status); ok(hr == E_FAIL || broken(hr == E_UNEXPECTED) /* win2k */, "got 0x%08x\n", hr); ok(status == READYSTATE_UNINITIALIZED || broken(status == 0xdeadbeef) /* <win8 */, "got %d\n", status); hr = IXMLHttpRequest_get_statusText(xhr, &str); ok(hr == E_FAIL, "got 0x%08x\n", hr); /* invalid parameters */ test_open(xhr, NULL, NULL, E_INVALIDARG); test_open(xhr, "POST", NULL, E_INVALIDARG); test_open(xhr, NULL, urlA, E_INVALIDARG); hr = IXMLHttpRequest_setRequestHeader(xhr, NULL, NULL); EXPECT_HR(hr, E_INVALIDARG); hr = IXMLHttpRequest_setRequestHeader(xhr, _bstr_("header1"), NULL); ok(hr == E_FAIL || broken(hr == E_UNEXPECTED) /* win2k */, "got 0x%08x\n", hr); hr = IXMLHttpRequest_setRequestHeader(xhr, NULL, _bstr_("value1")); EXPECT_HR(hr, E_INVALIDARG); hr = IXMLHttpRequest_setRequestHeader(xhr, _bstr_("header1"), _bstr_("value1")); ok(hr == E_FAIL || broken(hr == E_UNEXPECTED) /* win2k */, "got 0x%08x\n", hr); hr = IXMLHttpRequest_get_readyState(xhr, NULL); ok(hr == E_POINTER || broken(hr == E_INVALIDARG) /* <win8 */, "got 0x%08x\n", hr); state = -1; hr = IXMLHttpRequest_get_readyState(xhr, &state); EXPECT_HR(hr, S_OK); ok(state == READYSTATE_UNINITIALIZED, "got %d, expected READYSTATE_UNINITIALIZED\n", state); httpreq = xhr; event = create_dispevent(); EXPECT_REF(event, 1); hr = IXMLHttpRequest_put_onreadystatechange(xhr, event); EXPECT_HR(hr, S_OK); EXPECT_REF(event, 2); g_unexpectedcall = g_expectedcall = 0; test_open(xhr, "POST", urlA, S_OK); ok(g_unexpectedcall == 0, "unexpected disp event call\n"); ok(g_expectedcall == 1 || broken(g_expectedcall == 0) /* win2k */, "no expected disp event call\n"); /* status code after ::open() */ status = 0xdeadbeef; hr = IXMLHttpRequest_get_status(xhr, &status); ok(hr == E_FAIL || broken(hr == E_UNEXPECTED) /* win2k */, "got 0x%08x\n", hr); ok(status == READYSTATE_UNINITIALIZED || broken(status == 0xdeadbeef) /* <win8 */, "got %d\n", status); state = -1; hr = IXMLHttpRequest_get_readyState(xhr, &state); EXPECT_HR(hr, S_OK); ok(state == READYSTATE_LOADING, "got %d, expected READYSTATE_LOADING\n", state); hr = IXMLHttpRequest_abort(xhr); EXPECT_HR(hr, S_OK); state = -1; hr = IXMLHttpRequest_get_readyState(xhr, &state); EXPECT_HR(hr, S_OK); ok(state == READYSTATE_UNINITIALIZED || broken(state == READYSTATE_LOADING) /* win2k */, "got %d, expected READYSTATE_UNINITIALIZED\n", state); test_open(xhr, "POST", urlA, S_OK); hr = IXMLHttpRequest_setRequestHeader(xhr, _bstr_("header1"), _bstr_("value1")); EXPECT_HR(hr, S_OK); hr = IXMLHttpRequest_setRequestHeader(xhr, NULL, _bstr_("value1")); EXPECT_HR(hr, E_INVALIDARG); hr = IXMLHttpRequest_setRequestHeader(xhr, _bstr_(""), _bstr_("value1")); EXPECT_HR(hr, E_INVALIDARG); V_VT(&varbody) = VT_BSTR; V_BSTR(&varbody) = _bstr_(bodyA); hr = IXMLHttpRequest_send(xhr, varbody); if (hr == INET_E_RESOURCE_NOT_FOUND) { skip("No connection could be made with crossover.codeweavers.com\n"); IXMLHttpRequest_Release(xhr); return; } EXPECT_HR(hr, S_OK); /* response headers */ hr = IXMLHttpRequest_getAllResponseHeaders(xhr, NULL); ok(hr == E_POINTER || broken(hr == E_INVALIDARG) /* <win8 */, "got 0x%08x\n", hr); hr = IXMLHttpRequest_getAllResponseHeaders(xhr, &str); EXPECT_HR(hr, S_OK); /* status line is stripped already */ ok(memcmp(str, _bstr_("HTTP"), 4*sizeof(WCHAR)), "got response headers %s\n", wine_dbgstr_w(str)); ok(*str, "got empty headers\n"); hr = IXMLHttpRequest_getAllResponseHeaders(xhr, &str1); EXPECT_HR(hr, S_OK); ok(str1 != str, "got %p\n", str1); SysFreeString(str1); SysFreeString(str); hr = IXMLHttpRequest_getResponseHeader(xhr, NULL, NULL); EXPECT_HR(hr, E_INVALIDARG); hr = IXMLHttpRequest_getResponseHeader(xhr, _bstr_("Date"), NULL); ok(hr == E_POINTER || broken(hr == E_INVALIDARG) /* <win8 */, "got 0x%08x\n", hr); hr = IXMLHttpRequest_getResponseHeader(xhr, _bstr_("Date"), &str); EXPECT_HR(hr, S_OK); ok(*str != ' ', "got leading space in header %s\n", wine_dbgstr_w(str)); SysFreeString(str); /* status code after ::send() */ status = 0xdeadbeef; hr = IXMLHttpRequest_get_status(xhr, &status); EXPECT_HR(hr, S_OK); ok(status == 200, "got %d\n", status); hr = IXMLHttpRequest_get_statusText(xhr, NULL); ok(hr == E_POINTER || broken(hr == E_INVALIDARG) /* <win8 */, "got 0x%08x\n", hr); hr = IXMLHttpRequest_get_statusText(xhr, &str); EXPECT_HR(hr, S_OK); ok(!lstrcmpW(str, _bstr_("OK")), "got status %s\n", wine_dbgstr_w(str)); SysFreeString(str); /* another ::send() after completed request */ V_VT(&varbody) = VT_BSTR; V_BSTR(&varbody) = _bstr_(bodyA); hr = IXMLHttpRequest_send(xhr, varbody); ok(hr == E_FAIL || broken(hr == E_UNEXPECTED) /* win2k */, "got 0x%08x\n", hr); hr = IXMLHttpRequest_get_responseText(xhr, &bstrResponse); EXPECT_HR(hr, S_OK); /* the server currently returns "FAILED" because the Content-Type header is * not what the server expects */ if(hr == S_OK) { ok(!memcmp(bstrResponse, wszExpectedResponse, sizeof(wszExpectedResponse)), "expected %s, got %s\n", wine_dbgstr_w(wszExpectedResponse), wine_dbgstr_w(bstrResponse)); SysFreeString(bstrResponse); } /* POST: VT_VARIANT|VT_BYREF body */ test_open(xhr, "POST", urlA, S_OK); V_VT(&varbody_ref) = VT_VARIANT|VT_BYREF; V_VARIANTREF(&varbody_ref) = &varbody; hr = IXMLHttpRequest_send(xhr, varbody_ref); EXPECT_HR(hr, S_OK); /* GET request */ test_open(xhr, "GET", xmltestA, S_OK); V_VT(&varbody) = VT_EMPTY; hr = IXMLHttpRequest_send(xhr, varbody); if (hr == INET_E_RESOURCE_NOT_FOUND) { skip("No connection could be made with crossover.codeweavers.com\n"); IXMLHttpRequest_Release(xhr); return; } EXPECT_HR(hr, S_OK); hr = IXMLHttpRequest_get_responseText(xhr, NULL); ok(hr == E_POINTER || broken(hr == E_INVALIDARG) /* <win8 */, "got 0x%08x\n", hr); hr = IXMLHttpRequest_get_responseText(xhr, &bstrResponse); EXPECT_HR(hr, S_OK); ok(!memcmp(bstrResponse, _bstr_(xmltestbodyA), sizeof(xmltestbodyA)*sizeof(WCHAR)), "expected %s, got %s\n", xmltestbodyA, wine_dbgstr_w(bstrResponse)); SysFreeString(bstrResponse); hr = IXMLHttpRequest_get_responseBody(xhr, NULL); EXPECT_HR(hr, E_INVALIDARG); V_VT(&varbody) = VT_EMPTY; hr = IXMLHttpRequest_get_responseBody(xhr, &varbody); EXPECT_HR(hr, S_OK); ok(V_VT(&varbody) == (VT_ARRAY|VT_UI1), "got type %d, expected %d\n", V_VT(&varbody), VT_ARRAY|VT_UI1); ok(SafeArrayGetDim(V_ARRAY(&varbody)) == 1, "got %d, expected one dimension\n", SafeArrayGetDim(V_ARRAY(&varbody))); bound = -1; hr = SafeArrayGetLBound(V_ARRAY(&varbody), 1, &bound); EXPECT_HR(hr, S_OK); ok(bound == 0, "got %d, expected zero bound\n", bound); hr = SafeArrayAccessData(V_ARRAY(&varbody), &ptr); EXPECT_HR(hr, S_OK); ok(memcmp(ptr, xmltestbodyA, sizeof(xmltestbodyA)-1) == 0, "got wrong body data\n"); SafeArrayUnaccessData(V_ARRAY(&varbody)); VariantClear(&varbody); /* get_responseStream */ hr = IXMLHttpRequest_get_responseStream(xhr, NULL); EXPECT_HR(hr, E_INVALIDARG); V_VT(&varbody) = VT_EMPTY; hr = IXMLHttpRequest_get_responseStream(xhr, &varbody); ok(V_VT(&varbody) == VT_UNKNOWN, "got type %d\n", V_VT(&varbody)); EXPECT_HR(hr, S_OK); EXPECT_REF(V_UNKNOWN(&varbody), 1); g = NULL; hr = GetHGlobalFromStream((IStream*)V_UNKNOWN(&varbody), &g); EXPECT_HR(hr, S_OK); ok(g != NULL, "got %p\n", g); IDispatch_Release(event); /* test if referrer header is sent */ test_open(xhr, "GET", referertesturl, S_OK); V_VT(&varbody) = VT_EMPTY; hr = IXMLHttpRequest_send(xhr, varbody); ok(hr == S_OK, "got 0x%08x\n", hr); hr = IXMLHttpRequest_get_responseText(xhr, &str); ok(hr == S_OK, "got 0x%08x\n", hr); ok(!lstrcmpW(str, norefererW), "got response text %s\n", wine_dbgstr_w(str)); SysFreeString(str); /* interaction with object site */ hr = IXMLHttpRequest_QueryInterface(xhr, &IID_IObjectWithSite, (void**)&obj_site); EXPECT_HR(hr, S_OK); hr = IObjectWithSite_SetSite(obj_site, NULL); ok(hr == S_OK, "got 0x%08x\n", hr); hr = IXMLHttpRequest_QueryInterface(xhr, &IID_IObjectWithSite, (void**)&obj_site2); EXPECT_HR(hr, S_OK); ok(obj_site == obj_site2 || broken(obj_site != obj_site2), "got new instance\n"); IObjectWithSite_Release(obj_site2); set_xhr_site(xhr); test_open(xhr, "GET", "tests/referer.php", S_OK); str1 = a2bstr("http://test.winehq.org/"); V_VT(&varbody) = VT_EMPTY; hr = IXMLHttpRequest_send(xhr, varbody); ok(hr == S_OK, "got 0x%08x\n", hr); hr = IXMLHttpRequest_get_responseText(xhr, &str); ok(hr == S_OK, "got 0x%08x\n", hr); ok(!lstrcmpW(str, str1), "got response text %s, expected %s\n", wine_dbgstr_w(str), wine_dbgstr_w(str1)); SysFreeString(str); SysFreeString(str1); /* try to set site another time */ hr = IObjectWithSite_SetSite(obj_site, &testsite); EXPECT_HR(hr, S_OK); IObjectWithSite_Release(obj_site); IXMLHttpRequest_Release(xhr); free_bstrs(); }
static HRESULT WINAPI Dispatch_Invoke(IDispatch *iface, DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pdp, VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr) { switch(dispIdMember) { case DISPID_TESTOBJ_OK: { VARIANT *expr, *msg; ok(wFlags == INVOKE_FUNC, "wFlags = %x\n", wFlags); ok(pdp->cArgs == 2, "cArgs = %d\n", pdp->cArgs); ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs); expr = pdp->rgvarg+1; if(V_VT(expr) == (VT_VARIANT|VT_BYREF)) expr = V_VARIANTREF(expr); msg = pdp->rgvarg; if(V_VT(msg) == (VT_VARIANT|VT_BYREF)) msg = V_VARIANTREF(msg); ok(V_VT(msg) == VT_BSTR, "V_VT(psp->rgvargs) = %d\n", V_VT(msg)); ok(V_VT(expr) == VT_BOOL, "V_VT(psp->rgvargs+1) = %d\n", V_VT(expr)); ok(V_BOOL(expr), "%s: %s\n", script_name, wine_dbgstr_w(V_BSTR(msg))); if(pVarResult) V_VT(pVarResult) = VT_EMPTY; break; } case DISPID_TESTOBJ_TRACE: ok(wFlags == INVOKE_FUNC, "wFlags = %x\n", wFlags); ok(pdp->cArgs == 1, "cArgs = %d\n", pdp->cArgs); ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs); ok(V_VT(pdp->rgvarg) == VT_BSTR, "V_VT(psp->rgvargs) = %d\n", V_VT(pdp->rgvarg)); trace("%s: %s\n", script_name, wine_dbgstr_w(V_BSTR(pdp->rgvarg))); if(pVarResult) V_VT(pVarResult) = VT_EMPTY; break; case DISPID_TESTOBJ_REPORTSUCCESS: CHECK_EXPECT(reportSuccess); ok(wFlags == INVOKE_FUNC, "wFlags = %x\n", wFlags); ok(pdp->cArgs == 0, "cArgs = %d\n", pdp->cArgs); ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs); if(pVarResult) V_VT(pVarResult) = VT_EMPTY; break; case DISPID_TESTOBJ_WSCRIPTFULLNAME: { WCHAR fullName[MAX_PATH]; DWORD res; ok(wFlags == INVOKE_PROPERTYGET, "wFlags = %x\n", wFlags); ok(pdp->cArgs == 0, "cArgs = %d\n", pdp->cArgs); ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs); V_VT(pVarResult) = VT_BSTR; res = GetModuleFileNameExW(wscript_process, NULL, fullName, sizeof(fullName)/sizeof(WCHAR)); if(res == 0) return E_FAIL; if(!(V_BSTR(pVarResult) = SysAllocString(fullName))) return E_OUTOFMEMORY; break; } case DISPID_TESTOBJ_WSCRIPTPATH: { WCHAR fullPath[MAX_PATH]; DWORD res; const WCHAR *pos; ok(wFlags == INVOKE_PROPERTYGET, "wFlags = %x\n", wFlags); ok(pdp->cArgs == 0, "cArgs = %d\n", pdp->cArgs); ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs); V_VT(pVarResult) = VT_BSTR; res = GetModuleFileNameExW(wscript_process, NULL, fullPath, sizeof(fullPath)/sizeof(WCHAR)); if(res == 0) return E_FAIL; pos = mystrrchr(fullPath, '\\'); if(!(V_BSTR(pVarResult) = SysAllocStringLen(fullPath, pos-fullPath))) return E_OUTOFMEMORY; break; } case DISPID_TESTOBJ_WSCRIPTSCRIPTNAME: { char fullPath[MAX_PATH]; char *pos; long res; ok(wFlags == INVOKE_PROPERTYGET, "wFlags = %x\n", wFlags); ok(pdp->cArgs == 0, "cArgs = %d\n", pdp->cArgs); ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs); V_VT(pVarResult) = VT_BSTR; res = GetFullPathNameA(script_name, sizeof(fullPath)/sizeof(WCHAR), fullPath, &pos); if(!res || res > sizeof(fullPath)/sizeof(WCHAR)) return E_FAIL; if(!(V_BSTR(pVarResult) = SysAllocString(a2bstr(pos)))) return E_OUTOFMEMORY; break; } case DISPID_TESTOBJ_WSCRIPTSCRIPTFULLNAME: { char fullPath[MAX_PATH]; long res; ok(wFlags == INVOKE_PROPERTYGET, "wFlags = %x\n", wFlags); ok(pdp->cArgs == 0, "cArgs = %d\n", pdp->cArgs); ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs); V_VT(pVarResult) = VT_BSTR; res = GetFullPathNameA(script_name, sizeof(fullPath)/sizeof(WCHAR), fullPath, NULL); if(!res || res > sizeof(fullPath)/sizeof(WCHAR)) return E_FAIL; if(!(V_BSTR(pVarResult) = SysAllocString(a2bstr(fullPath)))) return E_OUTOFMEMORY; break; } default: ok(0, "unexpected dispIdMember %d\n", dispIdMember); return E_NOTIMPL; } return S_OK; }
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; }
static void test_async_xhr_abort(IHTMLDocument2 *doc, const char *xml_url) { VARIANT vbool, vempty, var; BSTR method, url; LONG val; HRESULT hres; method = a2bstr("GET"); url = a2bstr(xml_url); V_VT(&vbool) = VT_BOOL; V_BOOL(&vbool) = VARIANT_TRUE; V_VT(&vempty) = VT_EMPTY; trace("abort before send() is fired\n"); create_xmlhttprequest(doc); if(!xhr) return; V_VT(&var) = VT_DISPATCH; V_DISPATCH(&var) = (IDispatch*)&xmlhttprequest_onreadystatechange_obj; hres = IHTMLXMLHttpRequest_put_onreadystatechange(xhr, var); 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); hres = IHTMLXMLHttpRequest_abort(xhr); ok(hres == S_OK, "abort failed: %08x\n", hres); 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_readyState(xhr, &val); ok(hres == S_OK, "get_readyState failed: %08x\n", hres); ok(val == 0, "Expect UNSENT, got %d\n", val); IHTMLXMLHttpRequest_Release(xhr); xhr = NULL; trace("abort after send() is fired\n"); create_xmlhttprequest(doc); V_VT(&var) = VT_DISPATCH; V_DISPATCH(&var) = (IDispatch*)&xmlhttprequest_onreadystatechange_obj; hres = IHTMLXMLHttpRequest_put_onreadystatechange(xhr, var); 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); loading_cnt = 0; readystatechange_cnt = 0; SET_EXPECT(xmlhttprequest_onreadystatechange_opened); SET_EXPECT(xmlhttprequest_onreadystatechange_done); hres = IHTMLXMLHttpRequest_send(xhr, vempty); ok(hres == S_OK, "send failed: %08x\n", hres); todo_wine CHECK_CALLED(xmlhttprequest_onreadystatechange_opened); hres = IHTMLXMLHttpRequest_abort(xhr); ok(hres == S_OK, "abort failed: %08x\n", hres); CHECK_CALLED(xmlhttprequest_onreadystatechange_done); 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); 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); ok(loading_cnt == 0, "loading_cnt = %d, expect 0, loading_cnt\n", loading_cnt); todo_wine ok(readystatechange_cnt == 2, "readystatechange_cnt = %d, expect 2\n", readystatechange_cnt); IHTMLXMLHttpRequest_Release(xhr); xhr = NULL; SysFreeString(method); SysFreeString(url); }
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; }