void release_dispex(DispatchEx *This) { dynamic_prop_t *prop; if(!This->dynamic_data) return; for(prop = This->dynamic_data->props; prop < This->dynamic_data->props + This->dynamic_data->prop_cnt; prop++) { VariantClear(&prop->var); heap_free(prop->name); } heap_free(This->dynamic_data->props); if(This->dynamic_data->func_disps) { func_obj_entry_t *iter; for(iter = This->dynamic_data->func_disps; iter < This->dynamic_data->func_disps+This->data->data->func_disp_cnt; iter++) { if(iter->func_obj) { iter->func_obj->obj = NULL; IDispatchEx_Release(&iter->func_obj->dispex.IDispatchEx_iface); } if(iter->val) IDispatch_Release(iter->val); } heap_free(This->dynamic_data->func_disps); } heap_free(This->dynamic_data); }
static ULONG WINAPI Function_Release(IUnknown *iface) { func_disp_t *This = FUNCTION_THIS(iface); TRACE("(%p)\n", This); return IDispatchEx_Release(DISPATCHEX(This->obj)); }
static ULONG WINAPI Function_Release(IUnknown *iface) { func_disp_t *This = impl_from_IUnknown(iface); TRACE("(%p)\n", This); return IDispatchEx_Release(&This->obj->IDispatchEx_iface); }
HRESULT create_vbdisp(const class_desc_t *desc, vbdisp_t **ret) { vbdisp_t *vbdisp; HRESULT hres = S_OK; vbdisp = heap_alloc_zero( FIELD_OFFSET( vbdisp_t, props[desc->prop_cnt] )); if(!vbdisp) return E_OUTOFMEMORY; vbdisp->IDispatchEx_iface.lpVtbl = &DispatchExVtbl; vbdisp->ref = 1; vbdisp->desc = desc; list_add_tail(&desc->ctx->objects, &vbdisp->entry); if(desc->array_cnt) { vbdisp->arrays = heap_alloc_zero(desc->array_cnt * sizeof(*vbdisp->arrays)); if(vbdisp->arrays) { unsigned i, j; for(i=0; i < desc->array_cnt; i++) { if(!desc->array_descs[i].dim_cnt) continue; vbdisp->arrays[i] = SafeArrayCreate(VT_VARIANT, desc->array_descs[i].dim_cnt, desc->array_descs[i].bounds); if(!vbdisp->arrays[i]) { hres = E_OUTOFMEMORY; break; } } if(SUCCEEDED(hres)) { for(i=0, j=0; i < desc->prop_cnt; i++) { if(desc->props[i].is_array) { V_VT(vbdisp->props+i) = VT_ARRAY|VT_BYREF|VT_VARIANT; V_ARRAYREF(vbdisp->props+i) = vbdisp->arrays + j++; } } } }else { hres = E_OUTOFMEMORY; } } if(SUCCEEDED(hres) && desc->class_initialize_id) { DISPPARAMS dp = {0}; hres = exec_script(desc->ctx, desc->funcs[desc->class_initialize_id].entries[VBDISP_CALLGET], vbdisp, &dp, NULL); } if(FAILED(hres)) { IDispatchEx_Release(&vbdisp->IDispatchEx_iface); return hres; } *ret = vbdisp; return S_OK; }
HRESULT disp_call(IDispatch *disp, DISPID id, LCID lcid, WORD flags, DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller) { DispatchEx *jsdisp; IDispatchEx *dispex; HRESULT hres; jsdisp = iface_to_jsdisp((IUnknown*)disp); if(jsdisp) { hres = jsdisp_call(jsdisp, id, lcid, flags, dp, retv, ei, caller); IDispatchEx_Release(_IDispatchEx_(jsdisp)); return hres; } memset(ei, 0, sizeof(*ei)); if(retv) V_VT(retv) = VT_EMPTY; hres = IDispatch_QueryInterface(disp, &IID_IDispatchEx, (void**)&dispex); if(FAILED(hres)) { UINT err = 0; if(flags == DISPATCH_CONSTRUCT) { WARN("IDispatch cannot be constructor\n"); return DISP_E_MEMBERNOTFOUND; } TRACE("using IDispatch\n"); return IDispatch_Invoke(disp, id, &IID_NULL, lcid, flags, dp, retv, &ei->ei, &err); } hres = IDispatchEx_InvokeEx(dispex, id, lcid, flags, dp, retv, &ei->ei, caller); IDispatchEx_Release(dispex); return hres; }
void collect_objects(script_ctx_t *ctx) { vbdisp_t *iter, *iter2; LIST_FOR_EACH_ENTRY_SAFE(iter, iter2, &ctx->objects, vbdisp_t, entry) run_terminator(iter); while(!list_empty(&ctx->objects)) { iter = LIST_ENTRY(list_head(&ctx->objects), vbdisp_t, entry); IDispatchEx_AddRef(&iter->IDispatchEx_iface); clean_props(iter); iter->desc = NULL; list_remove(&iter->entry); list_init(&iter->entry); IDispatchEx_Release(&iter->IDispatchEx_iface); } }
HRESULT disp_propput(script_ctx_t *ctx, IDispatch *disp, DISPID id, WORD flags, DISPPARAMS *dp) { IDispatchEx *dispex; EXCEPINFO ei = {0}; HRESULT hres; hres = IDispatch_QueryInterface(disp, &IID_IDispatchEx, (void**)&dispex); if(SUCCEEDED(hres)) { hres = IDispatchEx_InvokeEx(dispex, id, ctx->lcid, flags, dp, NULL, &ei, NULL /* FIXME! */); IDispatchEx_Release(dispex); }else { ULONG err = 0; TRACE("using IDispatch\n"); hres = IDispatch_Invoke(disp, id, &IID_NULL, ctx->lcid, flags, dp, NULL, &ei, &err); } return hres; }
static HRESULT call_disp_func(IDispatch *disp, DISPPARAMS *dp, VARIANT *retv) { IDispatchEx *dispex; EXCEPINFO ei; HRESULT hres; memset(&ei, 0, sizeof(ei)); hres = IDispatch_QueryInterface(disp, &IID_IDispatchEx, (void**)&dispex); if(SUCCEEDED(hres)) { hres = IDispatchEx_InvokeEx(dispex, 0, GetUserDefaultLCID(), DISPATCH_METHOD, dp, retv, &ei, NULL); IDispatchEx_Release(dispex); }else { TRACE("Could not get IDispatchEx interface: %08x\n", hres); hres = IDispatch_Invoke(disp, 0, &IID_NULL, GetUserDefaultLCID(), DISPATCH_METHOD, dp, retv, &ei, NULL); } return hres; }
HRESULT disp_get_id(IDispatch *disp, BSTR name, vbdisp_invoke_type_t invoke_type, BOOL search_private, DISPID *id) { IDispatchEx *dispex; vbdisp_t *vbdisp; HRESULT hres; vbdisp = unsafe_impl_from_IDispatch(disp); if(vbdisp) return vbdisp_get_id(vbdisp, name, invoke_type, search_private, id); hres = IDispatch_QueryInterface(disp, &IID_IDispatchEx, (void**)&dispex); if(FAILED(hres)) { TRACE("using IDispatch\n"); return IDispatch_GetIDsOfNames(disp, &IID_NULL, &name, 1, 0, id); } hres = IDispatchEx_GetDispID(dispex, name, fdexNameCaseInsensitive, id); IDispatchEx_Release(dispex); return hres; }
static HRESULT invoke_disp_value(DispatchEx *This, IDispatch *func_disp, LCID lcid, WORD flags, DISPPARAMS *dp, VARIANT *res, EXCEPINFO *ei, IServiceProvider *caller) { DISPID named_arg = DISPID_THIS; DISPPARAMS new_dp = {NULL, &named_arg, 0, 1}; IDispatchEx *dispex; HRESULT hres; if(dp->cNamedArgs) { FIXME("named args not supported\n"); return E_NOTIMPL; } new_dp.rgvarg = heap_alloc((dp->cArgs+1)*sizeof(VARIANTARG)); if(!new_dp.rgvarg) return E_OUTOFMEMORY; new_dp.cArgs = dp->cArgs+1; memcpy(new_dp.rgvarg+1, dp->rgvarg, dp->cArgs*sizeof(VARIANTARG)); V_VT(new_dp.rgvarg) = VT_DISPATCH; V_DISPATCH(new_dp.rgvarg) = (IDispatch*)&This->IDispatchEx_iface; hres = IDispatch_QueryInterface(func_disp, &IID_IDispatchEx, (void**)&dispex); TRACE(">>>\n"); if(SUCCEEDED(hres)) { hres = IDispatchEx_InvokeEx(dispex, DISPID_VALUE, lcid, flags, &new_dp, res, ei, caller); IDispatchEx_Release(dispex); }else { ULONG err = 0; hres = IDispatch_Invoke(func_disp, DISPID_VALUE, &IID_NULL, lcid, flags, &new_dp, res, ei, &err); } if(SUCCEEDED(hres)) TRACE("<<< %s\n", debugstr_variant(res)); else WARN("<<< %08x\n", hres); heap_free(new_dp.rgvarg); return hres; }
static HRESULT WINAPI ActiveScript_AddNamedItem(IActiveScript *iface, LPCOLESTR pstrName, DWORD dwFlags) { IDispatchEx *dispex; IDispatch *disp; IUnknown *unk = NULL, *unk2; HRESULT hres; static const WCHAR windowW[] = {'w','i','n','d','o','w',0}; static const IID unknown_iid = {0x719C3050,0xF9D3,0x11CF,{0xA4,0x93,0x00,0x40,0x05,0x23,0xA8,0xA0}}; CHECK_EXPECT(AddNamedItem); ok(!lstrcmpW(pstrName, windowW), "pstrName=%s\n", debugstr_w(pstrName)); ok(dwFlags == (SCRIPTITEM_ISVISIBLE|SCRIPTITEM_ISSOURCE|SCRIPTITEM_GLOBALMEMBERS), "dwFlags=%x\n", dwFlags); hres = IActiveScriptSite_GetItemInfo(site, windowW, SCRIPTINFO_IUNKNOWN, &unk, NULL); ok(hres == S_OK, "GetItemInfo failed: %08x\n", hres); ok(unk != NULL, "unk == NULL\n"); hres = IUnknown_QueryInterface(unk, &IID_IDispatch, (void**)&disp); ok(hres == S_OK, "Could not get IDispatch interface: %08x\n", hres); if(SUCCEEDED(hres)) IDispatch_Release(disp); hres = IUnknown_QueryInterface(unk, &unknown_iid, (void**)&unk2); ok(hres == E_NOINTERFACE, "Got ?? interface: %p\n", unk2); if(SUCCEEDED(hres)) IUnknown_Release(unk2); hres = IUnknown_QueryInterface(unk, &IID_IDispatchEx, (void**)&dispex); ok(hres == S_OK, "Could not get IDispatchEx interface: %08x\n", hres); if(SUCCEEDED(hres)) IDispatchEx_Release(dispex); IUnknown_Release(unk); return S_OK; }
HRESULT disp_call(script_ctx_t *ctx, IDispatch *disp, DISPID id, DISPPARAMS *dp, VARIANT *retv) { const WORD flags = DISPATCH_METHOD|(retv ? DISPATCH_PROPERTYGET : 0); IDispatchEx *dispex; EXCEPINFO ei; HRESULT hres; memset(&ei, 0, sizeof(ei)); if(retv) V_VT(retv) = VT_EMPTY; hres = IDispatch_QueryInterface(disp, &IID_IDispatchEx, (void**)&dispex); if(FAILED(hres)) { UINT err = 0; TRACE("using IDispatch\n"); return IDispatch_Invoke(disp, id, &IID_NULL, ctx->lcid, flags, dp, retv, &ei, &err); } hres = IDispatchEx_InvokeEx(dispex, id, ctx->lcid, flags, dp, retv, &ei, NULL /* CALLER_FIXME */); IDispatchEx_Release(dispex); return hres; }
static HRESULT create_function(script_ctx_t *ctx, DWORD flags, BOOL funcprot, DispatchEx *prototype, FunctionInstance **ret) { FunctionInstance *function; HRESULT hres; function = heap_alloc_zero(sizeof(FunctionInstance)); if(!function) return E_OUTOFMEMORY; if(funcprot) hres = init_dispex(&function->dispex, ctx, &Function_info, prototype); else hres = init_dispex_from_constr(&function->dispex, ctx, &Function_info, ctx->function_constr); if(FAILED(hres)) return hres; function->flags = flags; function->length = flags & PROPF_ARGMASK; if(prototype) { jsexcept_t jsexcept; VARIANT var; V_VT(&var) = VT_DISPATCH; V_DISPATCH(&var) = (IDispatch*)_IDispatchEx_(prototype); memset(&jsexcept, 0, sizeof(jsexcept)); hres = jsdisp_propput_name(&function->dispex, prototypeW, ctx->lcid, &var, &jsexcept, NULL/*FIXME*/); if(FAILED(hres)) { IDispatchEx_Release(_IDispatchEx_(&function->dispex)); return hres; } } *ret = function; return S_OK; }
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 DispatchEx_InvokeEx(IDispatchEx *iface, DISPID id, LCID lcid, WORD wFlags, DISPPARAMS *pdp, VARIANT *pvarRes, EXCEPINFO *pei, IServiceProvider *pspCaller) { DispatchEx *This = DISPATCHEX_THIS(iface); IUnknown *unk; ITypeInfo *ti; dispex_data_t *data; UINT argerr=0; int min, max, n; HRESULT hres; TRACE("(%p)->(%x %x %x %p %p %p %p)\n", This, id, lcid, wFlags, pdp, pvarRes, pei, pspCaller); if(is_custom_dispid(id) && This->data->vtbl && This->data->vtbl->invoke) return This->data->vtbl->invoke(This->outer, id, lcid, wFlags, pdp, pvarRes, pei, pspCaller); if(wFlags == DISPATCH_CONSTRUCT) { FIXME("DISPATCH_CONSTRUCT not implemented\n"); return E_NOTIMPL; } if(is_dynamic_dispid(id)) { DWORD idx = id - DISPID_DYNPROP_0; VARIANT *var; if(!This->dynamic_data || This->dynamic_data->prop_cnt <= idx) return DISP_E_UNKNOWNNAME; var = &This->dynamic_data->props[idx].var; switch(wFlags) { case INVOKE_FUNC: { DISPID named_arg = DISPID_THIS; DISPPARAMS dp = {NULL, &named_arg, 0, 1}; IDispatchEx *dispex; if(V_VT(var) != VT_DISPATCH) { FIXME("invoke vt %d\n", V_VT(var)); return E_NOTIMPL; } if(pdp->cNamedArgs) { FIXME("named args not supported\n"); return E_NOTIMPL; } dp.rgvarg = heap_alloc((pdp->cArgs+1)*sizeof(VARIANTARG)); if(!dp.rgvarg) return E_OUTOFMEMORY; dp.cArgs = pdp->cArgs+1; memcpy(dp.rgvarg+1, pdp->rgvarg, pdp->cArgs*sizeof(VARIANTARG)); V_VT(dp.rgvarg) = VT_DISPATCH; V_DISPATCH(dp.rgvarg) = (IDispatch*)DISPATCHEX(This); hres = IDispatch_QueryInterface(V_DISPATCH(var), &IID_IDispatchEx, (void**)&dispex); TRACE("%s call\n", debugstr_w(This->dynamic_data->props[idx].name)); if(SUCCEEDED(hres)) { hres = IDispatchEx_InvokeEx(dispex, DISPID_VALUE, lcid, wFlags, &dp, pvarRes, pei, pspCaller); IDispatchEx_Release(dispex); }else { ULONG err = 0; hres = IDispatch_Invoke(V_DISPATCH(var), DISPID_VALUE, &IID_NULL, lcid, wFlags, pdp, pvarRes, pei, &err); } TRACE("%s ret %08x\n", debugstr_w(This->dynamic_data->props[idx].name), hres); heap_free(dp.rgvarg); return hres; } case INVOKE_PROPERTYGET: return VariantCopy(pvarRes, var); case INVOKE_PROPERTYPUT: VariantClear(var); return VariantCopy(var, pdp->rgvarg); default: FIXME("unhandled wFlags %x\n", wFlags); return E_NOTIMPL; } } data = get_dispex_data(This); if(!data) return E_FAIL; min = 0; max = data->func_cnt-1; while(min <= max) { n = (min+max)/2; if(data->funcs[n].id == id) break; if(data->funcs[n].id < id) min = n+1; else max = n-1; } if(min > max) { WARN("invalid id %x\n", id); return DISP_E_UNKNOWNNAME; } hres = get_typeinfo(data->funcs[n].tid, &ti); if(FAILED(hres)) { ERR("Could not get type info: %08x\n", hres); return hres; } hres = IUnknown_QueryInterface(This->outer, tid_ids[data->funcs[n].tid], (void**)&unk); if(FAILED(hres)) { ERR("Could not get iface %s: %08x\n", debugstr_guid(tid_ids[data->funcs[n].tid]), hres); return E_FAIL; } hres = ITypeInfo_Invoke(ti, unk, id, wFlags, pdp, pvarRes, pei, &argerr); IUnknown_Release(unk); return hres; }
static void test_vbscript_uninitializing(void) { IActiveScriptParse *parse; IActiveScript *script; IDispatchEx *dispex; ULONG ref; HRESULT hres; static const WCHAR script_textW[] = {'F','u','n','c','t','i','o','n',' ','f','\n','E','n','d',' ','F','u','n','c','t','i','o','n','\n',0}; script = create_vbscript(); hres = IActiveScript_QueryInterface(script, &IID_IActiveScriptParse, (void**)&parse); ok(hres == S_OK, "Could not get IActiveScriptParse: %08x\n", hres); test_state(script, SCRIPTSTATE_UNINITIALIZED); hres = IActiveScriptParse_InitNew(parse); ok(hres == S_OK, "InitNew failed: %08x\n", hres); SET_EXPECT(GetLCID); SET_EXPECT(OnStateChange_INITIALIZED); hres = IActiveScript_SetScriptSite(script, &ActiveScriptSite); ok(hres == S_OK, "SetScriptSite failed: %08x\n", hres); CHECK_CALLED(GetLCID); CHECK_CALLED(OnStateChange_INITIALIZED); test_state(script, SCRIPTSTATE_INITIALIZED); hres = IActiveScriptParse_ParseScriptText(parse, script_textW, NULL, NULL, NULL, 0, 1, 0x42, NULL, NULL); ok(hres == S_OK, "ParseScriptText failed: %08x\n", hres); hres = IActiveScript_SetScriptSite(script, &ActiveScriptSite); ok(hres == E_UNEXPECTED, "SetScriptSite failed: %08x, expected E_UNEXPECTED\n", hres); SET_EXPECT(OnStateChange_UNINITIALIZED); hres = IActiveScript_SetScriptState(script, SCRIPTSTATE_UNINITIALIZED); ok(hres == S_OK, "SetScriptState(SCRIPTSTATE_UNINITIALIZED) failed: %08x\n", hres); CHECK_CALLED(OnStateChange_UNINITIALIZED); test_state(script, SCRIPTSTATE_UNINITIALIZED); hres = IActiveScript_SetScriptState(script, SCRIPTSTATE_UNINITIALIZED); ok(hres == S_OK, "SetScriptState(SCRIPTSTATE_UNINITIALIZED) failed: %08x\n", hres); SET_EXPECT(GetLCID); SET_EXPECT(OnStateChange_INITIALIZED); hres = IActiveScript_SetScriptSite(script, &ActiveScriptSite); ok(hres == S_OK, "SetScriptSite failed: %08x\n", hres); CHECK_CALLED(GetLCID); CHECK_CALLED(OnStateChange_INITIALIZED); SET_EXPECT(OnStateChange_CONNECTED); SET_EXPECT(OnEnterScript); SET_EXPECT(OnLeaveScript); hres = IActiveScript_SetScriptState(script, SCRIPTSTATE_CONNECTED); ok(hres == S_OK, "SetScriptState(SCRIPTSTATE_CONNECTED) failed: %08x\n", hres); CHECK_CALLED(OnStateChange_CONNECTED); CHECK_CALLED(OnEnterScript); CHECK_CALLED(OnLeaveScript); test_state(script, SCRIPTSTATE_CONNECTED); dispex = get_script_dispatch(script); ok(dispex != NULL, "dispex == NULL\n"); if(dispex) IDispatchEx_Release(dispex); SET_EXPECT(OnStateChange_DISCONNECTED); SET_EXPECT(OnStateChange_INITIALIZED); SET_EXPECT(OnStateChange_UNINITIALIZED); hres = IActiveScript_SetScriptState(script, SCRIPTSTATE_UNINITIALIZED); ok(hres == S_OK, "SetScriptState(SCRIPTSTATE_UNINITIALIZED) failed: %08x\n", hres); CHECK_CALLED(OnStateChange_DISCONNECTED); CHECK_CALLED(OnStateChange_INITIALIZED); CHECK_CALLED(OnStateChange_UNINITIALIZED); test_state(script, SCRIPTSTATE_UNINITIALIZED); hres = IActiveScript_Close(script); ok(hres == S_OK, "Close failed: %08x\n", hres); test_state(script, SCRIPTSTATE_CLOSED); hres = IActiveScript_SetScriptState(script, SCRIPTSTATE_UNINITIALIZED); ok(hres == E_UNEXPECTED, "SetScriptState(SCRIPTSTATE_UNINITIALIZED) failed: %08x, expected E_UNEXPECTED\n", hres); test_state(script, SCRIPTSTATE_CLOSED); SET_EXPECT(GetLCID); SET_EXPECT(OnStateChange_INITIALIZED); hres = IActiveScript_SetScriptSite(script, &ActiveScriptSite); ok(hres == S_OK, "SetScriptSite failed: %08x\n", hres); CHECK_CALLED(GetLCID); CHECK_CALLED(OnStateChange_INITIALIZED); test_state(script, SCRIPTSTATE_INITIALIZED); SET_EXPECT(OnStateChange_CLOSED); hres = IActiveScript_Close(script); ok(hres == S_OK, "Close failed: %08x\n", hres); CHECK_CALLED(OnStateChange_CLOSED); test_state(script, SCRIPTSTATE_CLOSED); IActiveScriptParse_Release(parse); ref = IActiveScript_Release(script); ok(!ref, "ref = %d\n", ref); }
static void test_scriptdisp(void) { IActiveScriptParse *parser; IDispatchEx *script_disp; IActiveScript *vbscript; DISPID id, id2; DISPPARAMS dp; EXCEPINFO ei; VARIANT v; ULONG ref; HRESULT hres; vbscript = create_vbscript(); hres = IActiveScript_QueryInterface(vbscript, &IID_IActiveScriptParse, (void**)&parser); ok(hres == S_OK, "Could not get IActiveScriptParse iface: %08x\n", hres); test_state(vbscript, SCRIPTSTATE_UNINITIALIZED); test_safety(vbscript); SET_EXPECT(GetLCID); hres = IActiveScript_SetScriptSite(vbscript, &ActiveScriptSite); ok(hres == S_OK, "SetScriptSite failed: %08x\n", hres); CHECK_CALLED(GetLCID); test_state(vbscript, SCRIPTSTATE_UNINITIALIZED); SET_EXPECT(OnStateChange_INITIALIZED); hres = IActiveScriptParse_InitNew(parser); ok(hres == S_OK, "InitNew failed: %08x\n", hres); CHECK_CALLED(OnStateChange_INITIALIZED); test_state(vbscript, SCRIPTSTATE_INITIALIZED); SET_EXPECT(OnStateChange_CONNECTED); hres = IActiveScript_SetScriptState(vbscript, SCRIPTSTATE_CONNECTED); ok(hres == S_OK, "SetScriptState(SCRIPTSTATE_CONNECTED) failed: %08x\n", hres); CHECK_CALLED(OnStateChange_CONNECTED); test_state(vbscript, SCRIPTSTATE_CONNECTED); script_disp = get_script_dispatch(vbscript); id = 100; get_disp_id(script_disp, "LCase", DISP_E_UNKNOWNNAME, &id); ok(id == -1, "id = %d, expected -1\n", id); get_disp_id(script_disp, "globalVariable", DISP_E_UNKNOWNNAME, &id); parse_script(parser, "dim globalVariable\nglobalVariable = 3"); get_disp_id(script_disp, "globalVariable", S_OK, &id); memset(&dp, 0, sizeof(dp)); memset(&ei, 0, sizeof(ei)); V_VT(&v) = VT_EMPTY; hres = IDispatchEx_InvokeEx(script_disp, 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) == 3, "V_I2(v) = %d\n", V_I2(&v)); get_disp_id(script_disp, "globalVariable2", DISP_E_UNKNOWNNAME, &id); parse_script(parser, "globalVariable2 = 4"); get_disp_id(script_disp, "globalVariable2", S_OK, &id); get_disp_id(script_disp, "globalFunction", DISP_E_UNKNOWNNAME, &id); parse_script(parser, "function globalFunction()\nglobalFunction=5\nend function"); get_disp_id(script_disp, "globalFunction", S_OK, &id); SET_EXPECT(OnEnterScript); SET_EXPECT(OnLeaveScript); memset(&dp, 0, sizeof(dp)); memset(&ei, 0, sizeof(ei)); V_VT(&v) = VT_EMPTY; hres = IDispatchEx_InvokeEx(script_disp, 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) == 5, "V_I2(v) = %d\n", V_I2(&v)); CHECK_CALLED(OnEnterScript); CHECK_CALLED(OnLeaveScript); SET_EXPECT(OnEnterScript); SET_EXPECT(OnLeaveScript); memset(&dp, 0, sizeof(dp)); memset(&ei, 0, sizeof(ei)); V_VT(&v) = VT_EMPTY; hres = IDispatchEx_Invoke(script_disp, id, &IID_NULL, 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) == 5, "V_I2(v) = %d\n", V_I2(&v)); CHECK_CALLED(OnEnterScript); CHECK_CALLED(OnLeaveScript); get_disp_id(script_disp, "globalSub", DISP_E_UNKNOWNNAME, &id); parse_script(parser, "sub globalSub()\nend sub"); get_disp_id(script_disp, "globalSub", S_OK, &id); get_disp_id(script_disp, "globalSub", S_OK, &id2); ok(id == id2, "id != id2\n"); get_disp_id(script_disp, "constVariable", DISP_E_UNKNOWNNAME, &id); parse_script(parser, "const constVariable = 6"); get_disp_id(script_disp, "ConstVariable", S_OK, &id); get_disp_id(script_disp, "Constvariable", S_OK, &id2); ok(id == id2, "id != id2\n"); IDispatchEx_Release(script_disp); IActiveScriptParse_Release(parser); SET_EXPECT(OnStateChange_DISCONNECTED); SET_EXPECT(OnStateChange_INITIALIZED); SET_EXPECT(OnStateChange_CLOSED); hres = IActiveScript_Close(vbscript); ok(hres == S_OK, "Close failed: %08x\n", hres); CHECK_CALLED(OnStateChange_DISCONNECTED); CHECK_CALLED(OnStateChange_INITIALIZED); CHECK_CALLED(OnStateChange_CLOSED); ref = IActiveScript_Release(vbscript); ok(!ref, "ref = %d\n", ref); }
static HRESULT WINAPI DispatchEx_InvokeEx(IDispatchEx *iface, DISPID id, LCID lcid, WORD wFlags, DISPPARAMS *pdp, VARIANT *pvarRes, EXCEPINFO *pei, IServiceProvider *pspCaller) { DispatchEx *This = impl_from_IDispatchEx(iface); HRESULT hres; TRACE("(%p)->(%x %x %x %p %p %p %p)\n", This, id, lcid, wFlags, pdp, pvarRes, pei, pspCaller); if(is_custom_dispid(id) && This->data->vtbl && This->data->vtbl->invoke) return This->data->vtbl->invoke(This, id, lcid, wFlags, pdp, pvarRes, pei, pspCaller); if(wFlags == DISPATCH_CONSTRUCT) { if(id == DISPID_VALUE) { if(This->data->vtbl && This->data->vtbl->value) { return This->data->vtbl->value(This, lcid, wFlags, pdp, pvarRes, pei, pspCaller); } FIXME("DISPATCH_CONSTRUCT flag but missing value function\n"); return E_FAIL; } FIXME("DISPATCH_CONSTRUCT flag without DISPID_VALUE\n"); return E_FAIL; } if(is_dynamic_dispid(id)) { DWORD idx = id - DISPID_DYNPROP_0; dynamic_prop_t *prop; if(!get_dynamic_data(This) || This->dynamic_data->prop_cnt <= idx) return DISP_E_UNKNOWNNAME; prop = This->dynamic_data->props+idx; switch(wFlags) { case DISPATCH_METHOD|DISPATCH_PROPERTYGET: if(!pvarRes) return E_INVALIDARG; /* fall through */ case DISPATCH_METHOD: { DISPID named_arg = DISPID_THIS; DISPPARAMS dp = {NULL, &named_arg, 0, 1}; IDispatchEx *dispex; if(V_VT(&prop->var) != VT_DISPATCH) { FIXME("invoke %s\n", debugstr_variant(&prop->var)); return E_NOTIMPL; } if(pdp->cNamedArgs) { FIXME("named args not supported\n"); return E_NOTIMPL; } dp.rgvarg = heap_alloc((pdp->cArgs+1)*sizeof(VARIANTARG)); if(!dp.rgvarg) return E_OUTOFMEMORY; dp.cArgs = pdp->cArgs+1; memcpy(dp.rgvarg+1, pdp->rgvarg, pdp->cArgs*sizeof(VARIANTARG)); V_VT(dp.rgvarg) = VT_DISPATCH; V_DISPATCH(dp.rgvarg) = (IDispatch*)&This->IDispatchEx_iface; hres = IDispatch_QueryInterface(V_DISPATCH(&prop->var), &IID_IDispatchEx, (void**)&dispex); TRACE("%s call\n", debugstr_w(This->dynamic_data->props[idx].name)); if(SUCCEEDED(hres)) { hres = IDispatchEx_InvokeEx(dispex, DISPID_VALUE, lcid, wFlags, &dp, pvarRes, pei, pspCaller); IDispatchEx_Release(dispex); }else { ULONG err = 0; hres = IDispatch_Invoke(V_DISPATCH(&prop->var), DISPID_VALUE, &IID_NULL, lcid, wFlags, pdp, pvarRes, pei, &err); } TRACE("%s ret %08x\n", debugstr_w(This->dynamic_data->props[idx].name), hres); heap_free(dp.rgvarg); return hres; } case DISPATCH_PROPERTYGET: if(prop->flags & DYNPROP_DELETED) return DISP_E_UNKNOWNNAME; V_VT(pvarRes) = VT_EMPTY; return variant_copy(pvarRes, &prop->var); case DISPATCH_PROPERTYPUT|DISPATCH_PROPERTYPUTREF: case DISPATCH_PROPERTYPUT: if(pdp->cArgs != 1 || (pdp->cNamedArgs == 1 && *pdp->rgdispidNamedArgs != DISPID_PROPERTYPUT) || pdp->cNamedArgs > 1) { FIXME("invalid args\n"); return E_INVALIDARG; } TRACE("put %s\n", debugstr_variant(pdp->rgvarg)); VariantClear(&prop->var); hres = variant_copy(&prop->var, pdp->rgvarg); if(FAILED(hres)) return hres; prop->flags &= ~DYNPROP_DELETED; return S_OK; default: FIXME("unhandled wFlags %x\n", wFlags); return E_NOTIMPL; } } return invoke_builtin_prop(This, id, lcid, wFlags, pdp, pvarRes, pei, pspCaller); }
static void test_ActiveXObject(void) { IActiveScriptParse *parser; IDispatchEx *proc; parser = create_script(FALSE, TRUE); SET_EXPECT(Host_QS_SecMgr); SET_EXPECT(ProcessUrlAction); SET_EXPECT(CreateInstance); SET_EXPECT(QueryCustomPolicy); SET_EXPECT(QI_IObjectWithSite); SET_EXPECT(reportSuccess); parse_script_a(parser, "(new ActiveXObject('Wine.Test')).reportSuccess();"); CHECK_CALLED(Host_QS_SecMgr); CHECK_CALLED(ProcessUrlAction); CHECK_CALLED(CreateInstance); CHECK_CALLED(QueryCustomPolicy); CHECK_CALLED(QI_IObjectWithSite); CHECK_CALLED(reportSuccess); proc = parse_procedure_a(parser, "(new ActiveXObject('Wine.Test')).reportSuccess();"); SET_EXPECT(ProcessUrlAction); SET_EXPECT(CreateInstance); SET_EXPECT(QueryCustomPolicy); SET_EXPECT(QI_IObjectWithSite); SET_EXPECT(reportSuccess); call_procedure(proc, NULL); CHECK_CALLED(ProcessUrlAction); CHECK_CALLED(CreateInstance); CHECK_CALLED(QueryCustomPolicy); CHECK_CALLED(QI_IObjectWithSite); CHECK_CALLED(reportSuccess); SET_EXPECT(ProcessUrlAction); SET_EXPECT(CreateInstance); SET_EXPECT(QueryCustomPolicy); SET_EXPECT(QI_IObjectWithSite); SET_EXPECT(reportSuccess); call_procedure(proc, &caller_sp); CHECK_CALLED(ProcessUrlAction); CHECK_CALLED(CreateInstance); CHECK_CALLED(QueryCustomPolicy); CHECK_CALLED(QI_IObjectWithSite); CHECK_CALLED(reportSuccess); IDispatchEx_Release(proc); IUnknown_Release(parser); parser = create_script(FALSE, TRUE); proc = parse_procedure_a(parser, "(new ActiveXObject('Wine.Test')).reportSuccess();"); SET_EXPECT(Host_QS_SecMgr); SET_EXPECT(ProcessUrlAction); SET_EXPECT(CreateInstance); SET_EXPECT(QueryCustomPolicy); SET_EXPECT(QI_IObjectWithSite); SET_EXPECT(reportSuccess); call_procedure(proc, &caller_sp); CHECK_CALLED(Host_QS_SecMgr); CHECK_CALLED(ProcessUrlAction); CHECK_CALLED(CreateInstance); CHECK_CALLED(QueryCustomPolicy); CHECK_CALLED(QI_IObjectWithSite); CHECK_CALLED(reportSuccess); parse_script_a(parser, "testException(function() { new ActiveXObject('Wine.TestABC'); }, 'Error', -2146827859);"); IDispatchEx_Release(proc); IUnknown_Release(parser); parser = create_script(FALSE, TRUE); QS_SecMgr_hres = E_NOINTERFACE; SET_EXPECT(Host_QS_SecMgr); parse_script_a(parser, "testException(function() { new ActiveXObject('Wine.Test'); }, 'Error', -2146827859);"); CHECK_CALLED(Host_QS_SecMgr); IUnknown_Release(parser); parser = create_script(FALSE, TRUE); ProcessUrlAction_hres = E_FAIL; SET_EXPECT(Host_QS_SecMgr); SET_EXPECT(ProcessUrlAction); parse_script_a(parser, "testException(function() { new ActiveXObject('Wine.Test'); }, 'Error', -2146827859);"); CHECK_CALLED(Host_QS_SecMgr); CHECK_CALLED(ProcessUrlAction); IUnknown_Release(parser); parser = create_script(FALSE, TRUE); ProcessUrlAction_policy = URLPOLICY_DISALLOW; SET_EXPECT(Host_QS_SecMgr); SET_EXPECT(ProcessUrlAction); parse_script_a(parser, "testException(function() { new ActiveXObject('Wine.Test'); }, 'Error', -2146827859);"); CHECK_CALLED(Host_QS_SecMgr); CHECK_CALLED(ProcessUrlAction); IUnknown_Release(parser); parser = create_script(FALSE, TRUE); CreateInstance_hres = E_FAIL; SET_EXPECT(Host_QS_SecMgr); SET_EXPECT(ProcessUrlAction); SET_EXPECT(CreateInstance); parse_script_a(parser, "testException(function() { new ActiveXObject('Wine.Test'); }, 'Error', -2146827859);"); CHECK_CALLED(Host_QS_SecMgr); CHECK_CALLED(ProcessUrlAction); CHECK_CALLED(CreateInstance); IUnknown_Release(parser); parser = create_script(FALSE, TRUE); QueryCustomPolicy_hres = E_FAIL; SET_EXPECT(Host_QS_SecMgr); SET_EXPECT(ProcessUrlAction); SET_EXPECT(CreateInstance); SET_EXPECT(QueryCustomPolicy); parse_script_a(parser, "testException(function() { new ActiveXObject('Wine.Test'); }, 'Error', -2146827859);"); CHECK_CALLED(Host_QS_SecMgr); CHECK_CALLED(ProcessUrlAction); CHECK_CALLED(CreateInstance); CHECK_CALLED(QueryCustomPolicy); IUnknown_Release(parser); parser = create_script(FALSE, TRUE); QueryCustomPolicy_psize = 6; SET_EXPECT(Host_QS_SecMgr); SET_EXPECT(ProcessUrlAction); SET_EXPECT(CreateInstance); SET_EXPECT(QueryCustomPolicy); SET_EXPECT(QI_IObjectWithSite); SET_EXPECT(reportSuccess); parse_script_a(parser, "(new ActiveXObject('Wine.Test')).reportSuccess();"); CHECK_CALLED(Host_QS_SecMgr); CHECK_CALLED(ProcessUrlAction); CHECK_CALLED(CreateInstance); CHECK_CALLED(QueryCustomPolicy); CHECK_CALLED(QI_IObjectWithSite); CHECK_CALLED(reportSuccess); IUnknown_Release(parser); parser = create_script(FALSE, TRUE); QueryCustomPolicy_policy = URLPOLICY_DISALLOW; SET_EXPECT(Host_QS_SecMgr); SET_EXPECT(ProcessUrlAction); SET_EXPECT(CreateInstance); SET_EXPECT(QueryCustomPolicy); parse_script_a(parser, "testException(function() { new ActiveXObject('Wine.Test'); }, 'Error', -2146827859);"); CHECK_CALLED(Host_QS_SecMgr); CHECK_CALLED(ProcessUrlAction); CHECK_CALLED(CreateInstance); CHECK_CALLED(QueryCustomPolicy); QueryCustomPolicy_psize = 6; SET_EXPECT(ProcessUrlAction); SET_EXPECT(CreateInstance); SET_EXPECT(QueryCustomPolicy); parse_script_a(parser, "testException(function() { new ActiveXObject('Wine.Test'); }, 'Error', -2146827859);"); CHECK_CALLED(ProcessUrlAction); CHECK_CALLED(CreateInstance); CHECK_CALLED(QueryCustomPolicy); QueryCustomPolicy_policy = URLPOLICY_ALLOW; QueryCustomPolicy_psize = 3; SET_EXPECT(ProcessUrlAction); SET_EXPECT(CreateInstance); SET_EXPECT(QueryCustomPolicy); parse_script_a(parser, "testException(function() { new ActiveXObject('Wine.Test'); }, 'Error', -2146827859);"); CHECK_CALLED(ProcessUrlAction); CHECK_CALLED(CreateInstance); CHECK_CALLED(QueryCustomPolicy); IUnknown_Release(parser); parser = create_script(FALSE, FALSE); SET_EXPECT(CreateInstance); SET_EXPECT(QI_IObjectWithSite); SET_EXPECT(reportSuccess); parse_script_a(parser, "(new ActiveXObject('Wine.Test')).reportSuccess();"); CHECK_CALLED(CreateInstance); CHECK_CALLED(QI_IObjectWithSite); CHECK_CALLED(reportSuccess); IUnknown_Release(parser); parser = create_script(FALSE, TRUE); object_with_site = &ObjectWithSite; SET_EXPECT(Host_QS_SecMgr); SET_EXPECT(ProcessUrlAction); SET_EXPECT(CreateInstance); SET_EXPECT(QueryCustomPolicy); SET_EXPECT(QI_IObjectWithSite); SET_EXPECT(SetSite); SET_EXPECT(reportSuccess); parse_script_a(parser, "(new ActiveXObject('Wine.Test')).reportSuccess();"); CHECK_CALLED(Host_QS_SecMgr); CHECK_CALLED(ProcessUrlAction); CHECK_CALLED(CreateInstance); CHECK_CALLED(QueryCustomPolicy); CHECK_CALLED(QI_IObjectWithSite); CHECK_CALLED(SetSite); CHECK_CALLED(reportSuccess); SetSite_hres = E_FAIL; SET_EXPECT(ProcessUrlAction); SET_EXPECT(CreateInstance); SET_EXPECT(QueryCustomPolicy); SET_EXPECT(QI_IObjectWithSite); SET_EXPECT(SetSite); parse_script_a(parser, "testException(function() { new ActiveXObject('Wine.Test'); }, 'Error', -2146827859);"); CHECK_CALLED(ProcessUrlAction); CHECK_CALLED(CreateInstance); CHECK_CALLED(QueryCustomPolicy); CHECK_CALLED(QI_IObjectWithSite); CHECK_CALLED(SetSite); IUnknown_Release(parser); }
static void test_jscript(void) { IActiveScriptParse *parse; IActiveScript *script; IDispatchEx *dispex; ULONG ref; HRESULT hres; script = create_jscript(); hres = IActiveScript_QueryInterface(script, &IID_IActiveScriptParse, (void**)&parse); ok(hres == S_OK, "Could not get IActiveScriptParse: %08x\n", hres); test_state(script, SCRIPTSTATE_UNINITIALIZED); test_safety((IUnknown*)script); test_invoke_versioning(script); hres = IActiveScriptParse_InitNew(parse); ok(hres == S_OK, "InitNew failed: %08x\n", hres); hres = IActiveScriptParse_InitNew(parse); ok(hres == E_UNEXPECTED, "InitNew failed: %08x, expected E_UNEXPECTED\n", hres); hres = IActiveScript_SetScriptSite(script, NULL); ok(hres == E_POINTER, "SetScriptSite failed: %08x, expected E_POINTER\n", hres); test_state(script, SCRIPTSTATE_UNINITIALIZED); test_no_script_dispatch(script); SET_EXPECT(GetLCID); SET_EXPECT(OnStateChange_INITIALIZED); hres = IActiveScript_SetScriptSite(script, &ActiveScriptSite); ok(hres == S_OK, "SetScriptSite failed: %08x\n", hres); CHECK_CALLED(GetLCID); CHECK_CALLED(OnStateChange_INITIALIZED); test_state(script, SCRIPTSTATE_INITIALIZED); hres = IActiveScript_SetScriptSite(script, &ActiveScriptSite); ok(hres == E_UNEXPECTED, "SetScriptSite failed: %08x, expected E_UNEXPECTED\n", hres); dispex = get_script_dispatch(script); test_script_dispatch(dispex); SET_EXPECT(OnStateChange_STARTED); hres = IActiveScript_SetScriptState(script, SCRIPTSTATE_STARTED); ok(hres == S_OK, "SetScriptState(SCRIPTSTATE_STARTED) failed: %08x\n", hres); CHECK_CALLED(OnStateChange_STARTED); test_state(script, SCRIPTSTATE_STARTED); SET_EXPECT(OnStateChange_CLOSED); hres = IActiveScript_Close(script); ok(hres == S_OK, "Close failed: %08x\n", hres); CHECK_CALLED(OnStateChange_CLOSED); test_state(script, SCRIPTSTATE_CLOSED); test_no_script_dispatch(script); test_script_dispatch(dispex); IDispatchEx_Release(dispex); IActiveScriptParse_Release(parse); ref = IActiveScript_Release(script); ok(!ref, "ref = %d\n", ref); }
static void test_jscript(void) { IActiveScriptParse *parse; IActiveScript *script; IDispatchEx *dispex; IUnknown *unk; ULONG ref; HRESULT hres; hres = CoCreateInstance(&CLSID_JScript, NULL, CLSCTX_INPROC_SERVER|CLSCTX_INPROC_HANDLER, &IID_IUnknown, (void**)&unk); ok(hres == S_OK, "CoCreateInstance failed: %08x\n", hres); if(FAILED(hres)) return; hres = IUnknown_QueryInterface(unk, &IID_IActiveScript, (void**)&script); ok(hres == S_OK, "Could not get IActiveScript: %08x\n", hres); hres = IUnknown_QueryInterface(unk, &IID_IActiveScriptParse, (void**)&parse); ok(hres == S_OK, "Could not get IActiveScriptParse: %08x\n", hres); if (FAILED(hres)) { IActiveScript_Release(script); return; } test_state(script, SCRIPTSTATE_UNINITIALIZED); test_safety(unk); test_invoke_versioning(script); hres = IActiveScriptParse64_InitNew(parse); ok(hres == S_OK, "InitNew failed: %08x\n", hres); hres = IActiveScriptParse64_InitNew(parse); ok(hres == E_UNEXPECTED, "InitNew failed: %08x, expected E_UNEXPECTED\n", hres); hres = IActiveScript_SetScriptSite(script, NULL); ok(hres == E_POINTER, "SetScriptSite failed: %08x, expected E_POINTER\n", hres); test_state(script, SCRIPTSTATE_UNINITIALIZED); test_no_script_dispatch(script); SET_EXPECT(GetLCID); SET_EXPECT(OnStateChange_INITIALIZED); hres = IActiveScript_SetScriptSite(script, &ActiveScriptSite); ok(hres == S_OK, "SetScriptSite failed: %08x\n", hres); CHECK_CALLED(GetLCID); CHECK_CALLED(OnStateChange_INITIALIZED); test_state(script, SCRIPTSTATE_INITIALIZED); hres = IActiveScript_SetScriptSite(script, &ActiveScriptSite); ok(hres == E_UNEXPECTED, "SetScriptSite failed: %08x, expected E_UNEXPECTED\n", hres); dispex = get_script_dispatch(script); test_script_dispatch(dispex); SET_EXPECT(OnStateChange_STARTED); hres = IActiveScript_SetScriptState(script, SCRIPTSTATE_STARTED); ok(hres == S_OK, "SetScriptState(SCRIPTSTATE_STARTED) failed: %08x\n", hres); CHECK_CALLED(OnStateChange_STARTED); test_state(script, SCRIPTSTATE_STARTED); SET_EXPECT(OnStateChange_CLOSED); hres = IActiveScript_Close(script); ok(hres == S_OK, "Close failed: %08x\n", hres); CHECK_CALLED(OnStateChange_CLOSED); test_state(script, SCRIPTSTATE_CLOSED); test_no_script_dispatch(script); test_script_dispatch(dispex); IDispatchEx_Release(dispex); IUnknown_Release(parse); IActiveScript_Release(script); ref = IUnknown_Release(unk); ok(!ref, "ref = %d\n", ref); }