From: Jacek Caban jacek@codeweavers.com
Based on patch by Gabriel Ivăncescu. --- dlls/mshtml/dispex.c | 130 ++++++++++++++------------- dlls/mshtml/htmlattr.c | 6 +- dlls/mshtml/htmldoc.c | 4 +- dlls/mshtml/htmlelem.c | 22 ++--- dlls/mshtml/htmlelemcol.c | 2 +- dlls/mshtml/htmlevent.c | 6 +- dlls/mshtml/htmlframe.c | 4 +- dlls/mshtml/htmlstyle.c | 2 +- dlls/mshtml/htmlwindow.c | 81 ++++++++--------- dlls/mshtml/mshtml_private.h | 18 ++-- dlls/mshtml/mshtml_private_iface.idl | 9 ++ dlls/mshtml/mutation.c | 2 +- dlls/mshtml/oleobj.c | 18 ++-- dlls/mshtml/omnavigator.c | 2 +- dlls/mshtml/script.c | 6 +- 15 files changed, 162 insertions(+), 150 deletions(-)
diff --git a/dlls/mshtml/dispex.c b/dlls/mshtml/dispex.c index 9c0e9a0b9ec..ab901908901 100644 --- a/dlls/mshtml/dispex.c +++ b/dlls/mshtml/dispex.c @@ -787,7 +787,7 @@ static HRESULT typeinfo_invoke(DispatchEx *This, func_info_t *func, WORD flags, return hres; }
- hres = IDispatchEx_QueryInterface(&This->IDispatchEx_iface, tid_ids[func->tid], (void**)&unk); + hres = IWineJSDispatchHost_QueryInterface(&This->IWineJSDispatchHost_iface, tid_ids[func->tid], (void**)&unk); if(FAILED(hres)) { ERR("Could not get iface %s: %08lx\n", debugstr_mshtml_guid(tid_ids[func->tid]), hres); return E_FAIL; @@ -916,7 +916,7 @@ static HRESULT invoke_disp_value(DispatchEx *This, IDispatch *func_disp, LCID lc 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; + V_DISPATCH(new_dp.rgvarg) = (IDispatch*)&This->IWineJSDispatchHost_iface;
hres = IDispatch_QueryInterface(func_disp, &IID_IDispatchEx, (void**)&dispex); TRACE(">>>\n"); @@ -957,9 +957,9 @@ static HRESULT get_func_obj_entry(DispatchEx *This, func_info_t *func, func_obj_ if(!entry->func_obj) return E_OUTOFMEMORY;
- IDispatchEx_AddRef(&entry->func_obj->dispex.IDispatchEx_iface); + IWineJSDispatchHost_AddRef(&entry->func_obj->dispex.IWineJSDispatchHost_iface); V_VT(&entry->val) = VT_DISPATCH; - V_DISPATCH(&entry->val) = (IDispatch*)&entry->func_obj->dispex.IDispatchEx_iface; + V_DISPATCH(&entry->val) = (IDispatch*)&entry->func_obj->dispex.IWineJSDispatchHost_iface; }
*ret = entry; @@ -1082,7 +1082,7 @@ static HRESULT builtin_propget(DispatchEx *This, func_info_t *func, DISPPARAMS *
assert(func->get_vtbl_off);
- hres = IDispatchEx_QueryInterface(&This->IDispatchEx_iface, tid_ids[func->tid], (void**)&iface); + hres = IWineJSDispatchHost_QueryInterface(&This->IWineJSDispatchHost_iface, tid_ids[func->tid], (void**)&iface); if(SUCCEEDED(hres)) { switch(func->prop_vt) { #define CASE_VT(vt,type,access) \ @@ -1139,7 +1139,7 @@ static HRESULT builtin_propput(DispatchEx *This, func_info_t *func, DISPPARAMS * v = &tmpv; }
- hres = IDispatchEx_QueryInterface(&This->IDispatchEx_iface, tid_ids[func->tid], (void**)&iface); + hres = IWineJSDispatchHost_QueryInterface(&This->IWineJSDispatchHost_iface, tid_ids[func->tid], (void**)&iface); if(SUCCEEDED(hres)) { switch(func->prop_vt) { #define CASE_VT(vt,type,access) \ @@ -1183,7 +1183,7 @@ static HRESULT invoke_builtin_function(DispatchEx *This, func_info_t *func, DISP return E_INVALIDARG; }
- hres = IDispatchEx_QueryInterface(&This->IDispatchEx_iface, tid_ids[func->tid], (void**)&iface); + hres = IWineJSDispatchHost_QueryInterface(&This->IWineJSDispatchHost_iface, tid_ids[func->tid], (void**)&iface); if(FAILED(hres)) return hres;
@@ -1288,7 +1288,7 @@ static HRESULT function_invoke(DispatchEx *This, func_info_t *func, WORD flags, return E_NOTIMPL; }
- if((IDispatch*)&entry->func_obj->dispex.IDispatchEx_iface != V_DISPATCH(&entry->val)) { + if((IDispatch*)&entry->func_obj->dispex.IWineJSDispatchHost_iface != V_DISPATCH(&entry->val)) { if(!V_DISPATCH(&entry->val)) { FIXME("Calling null\n"); return E_FAIL; @@ -1464,14 +1464,14 @@ HRESULT remove_attribute(DispatchEx *This, DISPID id, VARIANT_BOOL *success)
entry = This->dynamic_data->func_disps + func->func_disp_idx; if(V_VT(&entry->val) == VT_DISPATCH - && V_DISPATCH(&entry->val) == (IDispatch*)&entry->func_obj->dispex.IDispatchEx_iface) { + && V_DISPATCH(&entry->val) == (IDispatch*)&entry->func_obj->dispex.IWineJSDispatchHost_iface) { *success = VARIANT_FALSE; return S_OK; }
VariantClear(&entry->val); V_VT(&entry->val) = VT_DISPATCH; - V_DISPATCH(&entry->val) = (IDispatch*)&entry->func_obj->dispex.IDispatchEx_iface; + V_DISPATCH(&entry->val) = (IDispatch*)&entry->func_obj->dispex.IWineJSDispatchHost_iface; IDispatch_AddRef(V_DISPATCH(&entry->val)); *success = VARIANT_TRUE; return S_OK; @@ -1549,14 +1549,14 @@ static BOOL ensure_real_info(DispatchEx *dispex) return dispex->info != NULL; }
-static inline DispatchEx *impl_from_IDispatchEx(IDispatchEx *iface) +static inline DispatchEx *impl_from_IWineJSDispatchHost(IWineJSDispatchHost *iface) { - return CONTAINING_RECORD(iface, DispatchEx, IDispatchEx_iface); + return CONTAINING_RECORD(iface, DispatchEx, IWineJSDispatchHost_iface); }
-static HRESULT WINAPI DispatchEx_QueryInterface(IDispatchEx *iface, REFIID riid, void **ppv) +static HRESULT WINAPI DispatchEx_QueryInterface(IWineJSDispatchHost *iface, REFIID riid, void **ppv) { - DispatchEx *This = impl_from_IDispatchEx(iface); + DispatchEx *This = impl_from_IWineJSDispatchHost(iface);
TRACE("%s (%p)->(%s %p)\n", This->info->desc->name, This, debugstr_mshtml_guid(riid), ppv);
@@ -1567,12 +1567,14 @@ static HRESULT WINAPI DispatchEx_QueryInterface(IDispatchEx *iface, REFIID riid, }
if(IsEqualGUID(&IID_IUnknown, riid) || IsEqualGUID(&IID_IDispatch, riid) || IsEqualGUID(&IID_IDispatchEx, riid)) - *ppv = &This->IDispatchEx_iface; + *ppv = &This->IWineJSDispatchHost_iface; + else if(IsEqualGUID(&IID_IWineJSDispatchHost, riid)) + *ppv = &This->IWineJSDispatchHost_iface; else if(IsEqualGUID(&IID_nsXPCOMCycleCollectionParticipant, riid)) { *ppv = &dispex_ccp; return S_OK; }else if(IsEqualGUID(&IID_nsCycleCollectionISupports, riid)) { - *ppv = &This->IDispatchEx_iface; + *ppv = &This->IWineJSDispatchHost_iface; return S_OK; }else if(IsEqualGUID(&IID_IDispatchJS, riid) || IsEqualGUID(&IID_UndocumentedScriptIface, riid) || @@ -1587,24 +1589,24 @@ static HRESULT WINAPI DispatchEx_QueryInterface(IDispatchEx *iface, REFIID riid, }
ret: - IDispatchEx_AddRef(&This->IDispatchEx_iface); + IWineJSDispatchHost_AddRef(&This->IWineJSDispatchHost_iface); return S_OK; }
-static ULONG WINAPI DispatchEx_AddRef(IDispatchEx *iface) +static ULONG WINAPI DispatchEx_AddRef(IWineJSDispatchHost *iface) { - DispatchEx *This = impl_from_IDispatchEx(iface); - LONG ref = ccref_incr(&This->ccref, (nsISupports*)&This->IDispatchEx_iface); + DispatchEx *This = impl_from_IWineJSDispatchHost(iface); + LONG ref = ccref_incr(&This->ccref, (nsISupports*)&This->IWineJSDispatchHost_iface);
TRACE("%s (%p) ref=%ld\n", This->info->desc->name, This, ref);
return ref; }
-static ULONG WINAPI DispatchEx_Release(IDispatchEx *iface) +static ULONG WINAPI DispatchEx_Release(IWineJSDispatchHost *iface) { - DispatchEx *This = impl_from_IDispatchEx(iface); - LONG ref = ccref_decr(&This->ccref, (nsISupports*)&This->IDispatchEx_iface, &dispex_ccp); + DispatchEx *This = impl_from_IWineJSDispatchHost(iface); + LONG ref = ccref_decr(&This->ccref, (nsISupports*)&This->IWineJSDispatchHost_iface, &dispex_ccp);
TRACE("%s (%p) ref=%ld\n", This->info->desc->name, This, ref);
@@ -1612,17 +1614,17 @@ static ULONG WINAPI DispatchEx_Release(IDispatchEx *iface) * an extra care for objects that need an immediate clean up. See Gecko's * NS_IMPL_CYCLE_COLLECTING_NATIVE_RELEASE_WITH_LAST_RELEASE for details. */ if(!ref && This->info->desc->vtbl->last_release) { - ccref_incr(&This->ccref, (nsISupports*)&This->IDispatchEx_iface); + ccref_incr(&This->ccref, (nsISupports*)&This->IWineJSDispatchHost_iface); This->info->desc->vtbl->last_release(This); - ccref_decr(&This->ccref, (nsISupports*)&This->IDispatchEx_iface, &dispex_ccp); + ccref_decr(&This->ccref, (nsISupports*)&This->IWineJSDispatchHost_iface, &dispex_ccp); }
return ref; }
-static HRESULT WINAPI DispatchEx_GetTypeInfoCount(IDispatchEx *iface, UINT *pctinfo) +static HRESULT WINAPI DispatchEx_GetTypeInfoCount(IWineJSDispatchHost *iface, UINT *pctinfo) { - DispatchEx *This = impl_from_IDispatchEx(iface); + DispatchEx *This = impl_from_IWineJSDispatchHost(iface);
TRACE("%s (%p)->(%p)\n", This->info->desc->name, This, pctinfo);
@@ -1630,10 +1632,10 @@ static HRESULT WINAPI DispatchEx_GetTypeInfoCount(IDispatchEx *iface, UINT *pcti return S_OK; }
-static HRESULT WINAPI DispatchEx_GetTypeInfo(IDispatchEx *iface, UINT iTInfo, - LCID lcid, ITypeInfo **ppTInfo) +static HRESULT WINAPI DispatchEx_GetTypeInfo(IWineJSDispatchHost *iface, UINT iTInfo, + LCID lcid, ITypeInfo **ppTInfo) { - DispatchEx *This = impl_from_IDispatchEx(iface); + DispatchEx *This = impl_from_IWineJSDispatchHost(iface); HRESULT hres;
TRACE("%s (%p)->(%u %lu %p)\n", This->info->desc->name, This, iTInfo, lcid, ppTInfo); @@ -1646,11 +1648,11 @@ static HRESULT WINAPI DispatchEx_GetTypeInfo(IDispatchEx *iface, UINT iTInfo, return S_OK; }
-static HRESULT WINAPI DispatchEx_GetIDsOfNames(IDispatchEx *iface, REFIID riid, - LPOLESTR *rgszNames, UINT cNames, - LCID lcid, DISPID *rgDispId) +static HRESULT WINAPI DispatchEx_GetIDsOfNames(IWineJSDispatchHost *iface, REFIID riid, + LPOLESTR *rgszNames, UINT cNames, + LCID lcid, DISPID *rgDispId) { - DispatchEx *This = impl_from_IDispatchEx(iface); + DispatchEx *This = impl_from_IWineJSDispatchHost(iface); HRESULT hres = S_OK;
TRACE("%s (%p)->(%s %p %u %lu %p)\n", This->info->desc->name, This, debugstr_guid(riid), rgszNames, @@ -1658,27 +1660,27 @@ static HRESULT WINAPI DispatchEx_GetIDsOfNames(IDispatchEx *iface, REFIID riid,
/* Native ignores all cNames > 1, and doesn't even fill them */ if(cNames) - hres = IDispatchEx_GetDispID(&This->IDispatchEx_iface, rgszNames[0], 0, rgDispId); + hres = IWineJSDispatchHost_GetDispID(&This->IWineJSDispatchHost_iface, rgszNames[0], 0, rgDispId);
return hres; }
-static HRESULT WINAPI DispatchEx_Invoke(IDispatchEx *iface, DISPID dispIdMember, +static HRESULT WINAPI DispatchEx_Invoke(IWineJSDispatchHost *iface, DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr) { - DispatchEx *This = impl_from_IDispatchEx(iface); + DispatchEx *This = impl_from_IWineJSDispatchHost(iface);
TRACE("%s (%p)->(%ld %s %ld %d %p %p %p %p)\n", This->info->desc->name, This, dispIdMember, debugstr_guid(riid), lcid, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr);
- return IDispatchEx_InvokeEx(&This->IDispatchEx_iface, dispIdMember, lcid, wFlags, pDispParams, + return IWineJSDispatchHost_InvokeEx(&This->IWineJSDispatchHost_iface, dispIdMember, lcid, wFlags, pDispParams, pVarResult, pExcepInfo, NULL); }
-static HRESULT WINAPI DispatchEx_GetDispID(IDispatchEx *iface, BSTR bstrName, DWORD grfdex, DISPID *pid) +static HRESULT WINAPI DispatchEx_GetDispID(IWineJSDispatchHost *iface, BSTR bstrName, DWORD grfdex, DISPID *pid) { - DispatchEx *This = impl_from_IDispatchEx(iface); + DispatchEx *This = impl_from_IWineJSDispatchHost(iface); dynamic_prop_t *dprop = NULL; HRESULT hres;
@@ -1711,10 +1713,10 @@ static HRESULT WINAPI DispatchEx_GetDispID(IDispatchEx *iface, BSTR bstrName, DW return S_OK; }
-static HRESULT WINAPI DispatchEx_InvokeEx(IDispatchEx *iface, DISPID id, LCID lcid, WORD wFlags, DISPPARAMS *pdp, +static HRESULT WINAPI DispatchEx_InvokeEx(IWineJSDispatchHost *iface, DISPID id, LCID lcid, WORD wFlags, DISPPARAMS *pdp, VARIANT *pvarRes, EXCEPINFO *pei, IServiceProvider *pspCaller) { - DispatchEx *This = impl_from_IDispatchEx(iface); + DispatchEx *This = impl_from_IWineJSDispatchHost(iface); HRESULT hres;
TRACE("%s (%p)->(%lx %lx %x %p %p %p %p)\n", This->info->desc->name, This, id, lcid, wFlags, pdp, pvarRes, pei, pspCaller); @@ -1803,9 +1805,9 @@ static HRESULT WINAPI DispatchEx_InvokeEx(IDispatchEx *iface, DISPID id, LCID lc } }
-static HRESULT WINAPI DispatchEx_DeleteMemberByName(IDispatchEx *iface, BSTR name, DWORD grfdex) +static HRESULT WINAPI DispatchEx_DeleteMemberByName(IWineJSDispatchHost *iface, BSTR name, DWORD grfdex) { - DispatchEx *This = impl_from_IDispatchEx(iface); + DispatchEx *This = impl_from_IWineJSDispatchHost(iface); DISPID id; HRESULT hres;
@@ -1814,7 +1816,7 @@ static HRESULT WINAPI DispatchEx_DeleteMemberByName(IDispatchEx *iface, BSTR nam if(dispex_compat_mode(This) < COMPAT_MODE_IE8 && !This->info->desc->vtbl->delete) return E_NOTIMPL;
- hres = IDispatchEx_GetDispID(&This->IDispatchEx_iface, name, grfdex & ~fdexNameEnsure, &id); + hres = IWineJSDispatchHost_GetDispID(&This->IWineJSDispatchHost_iface, name, grfdex & ~fdexNameEnsure, &id); if(FAILED(hres)) { compat_mode_t compat_mode = dispex_compat_mode(This); TRACE("property %s not found\n", debugstr_w(name)); @@ -1822,12 +1824,12 @@ static HRESULT WINAPI DispatchEx_DeleteMemberByName(IDispatchEx *iface, BSTR nam compat_mode < COMPAT_MODE_IE9 ? hres : S_OK; }
- return IDispatchEx_DeleteMemberByDispID(&This->IDispatchEx_iface, id); + return IWineJSDispatchHost_DeleteMemberByDispID(&This->IWineJSDispatchHost_iface, id); }
-static HRESULT WINAPI DispatchEx_DeleteMemberByDispID(IDispatchEx *iface, DISPID id) +static HRESULT WINAPI DispatchEx_DeleteMemberByDispID(IWineJSDispatchHost *iface, DISPID id) { - DispatchEx *This = impl_from_IDispatchEx(iface); + DispatchEx *This = impl_from_IWineJSDispatchHost(iface);
TRACE("%s (%p)->(%lx)\n", This->info->desc->name, This, id);
@@ -1855,16 +1857,16 @@ static HRESULT WINAPI DispatchEx_DeleteMemberByDispID(IDispatchEx *iface, DISPID return S_OK; }
-static HRESULT WINAPI DispatchEx_GetMemberProperties(IDispatchEx *iface, DISPID id, DWORD grfdexFetch, DWORD *pgrfdex) +static HRESULT WINAPI DispatchEx_GetMemberProperties(IWineJSDispatchHost *iface, DISPID id, DWORD grfdexFetch, DWORD *pgrfdex) { - DispatchEx *This = impl_from_IDispatchEx(iface); + DispatchEx *This = impl_from_IWineJSDispatchHost(iface); FIXME("%s (%p)->(%lx %lx %p)\n", This->info->desc->name, This, id, grfdexFetch, pgrfdex); return E_NOTIMPL; }
-static HRESULT WINAPI DispatchEx_GetMemberName(IDispatchEx *iface, DISPID id, BSTR *pbstrName) +static HRESULT WINAPI DispatchEx_GetMemberName(IWineJSDispatchHost *iface, DISPID id, BSTR *pbstrName) { - DispatchEx *This = impl_from_IDispatchEx(iface); + DispatchEx *This = impl_from_IWineJSDispatchHost(iface); func_info_t *func; HRESULT hres;
@@ -1917,9 +1919,9 @@ static HRESULT next_dynamic_id(DispatchEx *dispex, DWORD idx, DISPID *ret_id) return S_OK; }
-static HRESULT WINAPI DispatchEx_GetNextDispID(IDispatchEx *iface, DWORD grfdex, DISPID id, DISPID *pid) +static HRESULT WINAPI DispatchEx_GetNextDispID(IWineJSDispatchHost *iface, DWORD grfdex, DISPID id, DISPID *pid) { - DispatchEx *This = impl_from_IDispatchEx(iface); + DispatchEx *This = impl_from_IWineJSDispatchHost(iface); func_info_t *func; HRESULT hres;
@@ -1971,14 +1973,14 @@ static HRESULT WINAPI DispatchEx_GetNextDispID(IDispatchEx *iface, DWORD grfdex, return S_FALSE; }
-static HRESULT WINAPI DispatchEx_GetNameSpaceParent(IDispatchEx *iface, IUnknown **ppunk) +static HRESULT WINAPI DispatchEx_GetNameSpaceParent(IWineJSDispatchHost *iface, IUnknown **ppunk) { - DispatchEx *This = impl_from_IDispatchEx(iface); + DispatchEx *This = impl_from_IWineJSDispatchHost(iface); FIXME("%s (%p)->(%p)\n", This->info->desc->name, This, ppunk); return E_NOTIMPL; }
-static IDispatchExVtbl DispatchExVtbl = { +static IWineJSDispatchHostVtbl JSDispatchHostVtbl = { DispatchEx_QueryInterface, DispatchEx_AddRef, DispatchEx_Release, @@ -1998,7 +2000,7 @@ static IDispatchExVtbl DispatchExVtbl = {
static nsresult NSAPI dispex_traverse(void *ccp, void *p, nsCycleCollectionTraversalCallback *cb) { - DispatchEx *This = impl_from_IDispatchEx(p); + DispatchEx *This = impl_from_IWineJSDispatchHost(p); dynamic_prop_t *prop;
describe_cc_node(&This->ccref, This->info->desc->name, cb); @@ -2018,7 +2020,7 @@ static nsresult NSAPI dispex_traverse(void *ccp, void *p, nsCycleCollectionTrave for(iter = This->dynamic_data->func_disps; iter < end; iter++) { if(!iter->func_obj) continue; - note_cc_edge((nsISupports*)&iter->func_obj->dispex.IDispatchEx_iface, "func_obj", cb); + note_cc_edge((nsISupports*)&iter->func_obj->dispex.IWineJSDispatchHost_iface, "func_obj", cb); traverse_variant(&iter->val, "func_val", cb); } } @@ -2045,7 +2047,7 @@ void dispex_props_unlink(DispatchEx *This) if(!iter->func_obj) continue; iter->func_obj->obj = NULL; - IDispatchEx_Release(&iter->func_obj->dispex.IDispatchEx_iface); + IWineJSDispatchHost_Release(&iter->func_obj->dispex.IWineJSDispatchHost_iface); VariantClear(&iter->val); }
@@ -2056,7 +2058,7 @@ void dispex_props_unlink(DispatchEx *This)
static nsresult NSAPI dispex_unlink(void *p) { - DispatchEx *This = impl_from_IDispatchEx(p); + DispatchEx *This = impl_from_IWineJSDispatchHost(p);
if(This->info->desc->vtbl->unlink) This->info->desc->vtbl->unlink(This); @@ -2067,7 +2069,7 @@ static nsresult NSAPI dispex_unlink(void *p)
static void NSAPI dispex_delete_cycle_collectable(void *p) { - DispatchEx *This = impl_from_IDispatchEx(p); + DispatchEx *This = impl_from_IWineJSDispatchHost(p); dynamic_prop_t *prop;
if(This->info->desc->vtbl->unlink) @@ -2089,7 +2091,7 @@ static void NSAPI dispex_delete_cycle_collectable(void *p) for(iter = This->dynamic_data->func_disps; iter < This->dynamic_data->func_disps + This->info->func_disp_cnt; iter++) { if(iter->func_obj) { iter->func_obj->obj = NULL; - IDispatchEx_Release(&iter->func_obj->dispex.IDispatchEx_iface); + IWineJSDispatchHost_Release(&iter->func_obj->dispex.IWineJSDispatchHost_iface); } VariantClear(&iter->val); } @@ -2122,7 +2124,7 @@ void init_dispatch(DispatchEx *dispex, dispex_static_data_t *data, compat_mode_t { assert(compat_mode < COMPAT_MODE_CNT);
- dispex->IDispatchEx_iface.lpVtbl = &DispatchExVtbl; + dispex->IWineJSDispatchHost_iface.lpVtbl = &JSDispatchHostVtbl; dispex->dynamic_data = NULL; ccref_init(&dispex->ccref, 1);
diff --git a/dlls/mshtml/htmlattr.c b/dlls/mshtml/htmlattr.c index 8a652619b59..eaf7e4fc9c5 100644 --- a/dlls/mshtml/htmlattr.c +++ b/dlls/mshtml/htmlattr.c @@ -55,7 +55,7 @@ static HRESULT WINAPI HTMLDOMAttribute_get_nodeName(IHTMLDOMAttribute *iface, BS return *p ? S_OK : E_OUTOFMEMORY; }
- return IDispatchEx_GetMemberName(&This->elem->node.event_target.dispex.IDispatchEx_iface, This->dispid, p); + return IWineJSDispatchHost_GetMemberName(&This->elem->node.event_target.dispex.IWineJSDispatchHost_iface, This->dispid, p); }
static HRESULT WINAPI HTMLDOMAttribute_put_nodeValue(IHTMLDOMAttribute *iface, VARIANT v) @@ -73,7 +73,7 @@ static HRESULT WINAPI HTMLDOMAttribute_put_nodeValue(IHTMLDOMAttribute *iface, V
memset(&ei, 0, sizeof(ei));
- return IDispatchEx_InvokeEx(&This->elem->node.event_target.dispex.IDispatchEx_iface, This->dispid, LOCALE_SYSTEM_DEFAULT, + return IWineJSDispatchHost_InvokeEx(&This->elem->node.event_target.dispex.IWineJSDispatchHost_iface, This->dispid, LOCALE_SYSTEM_DEFAULT, DISPATCH_PROPERTYPUT, &dp, &ret, &ei, NULL); }
@@ -110,7 +110,7 @@ static HRESULT WINAPI HTMLDOMAttribute_get_specified(IHTMLDOMAttribute *iface, V return S_OK; }
- hres = IDispatchEx_GetMemberName(&This->elem->node.event_target.dispex.IDispatchEx_iface, This->dispid, &name); + hres = IWineJSDispatchHost_GetMemberName(&This->elem->node.event_target.dispex.IWineJSDispatchHost_iface, This->dispid, &name); if(FAILED(hres)) return hres;
diff --git a/dlls/mshtml/htmldoc.c b/dlls/mshtml/htmldoc.c index 9aa0cefc21d..d45cc4cc7a9 100644 --- a/dlls/mshtml/htmldoc.c +++ b/dlls/mshtml/htmldoc.c @@ -5529,8 +5529,8 @@ static HRESULT HTMLDocumentNode_location_hook(DispatchEx *dispex, WORD flags, DI if(!This->window->base.outer_window) return E_FAIL;
- return IDispatchEx_InvokeEx(&This->window->event_target.dispex.IDispatchEx_iface, DISPID_IHTMLWINDOW2_LOCATION, - 0, flags, dp, res, ei, caller); + return IWineJSDispatchHost_InvokeEx(&This->window->event_target.dispex.IWineJSDispatchHost_iface, + DISPID_IHTMLWINDOW2_LOCATION, 0, flags, dp, res, ei, caller); }
static HRESULT HTMLDocumentNode_pre_handle_event(DispatchEx* dispex, DOMEvent *event) diff --git a/dlls/mshtml/htmlelem.c b/dlls/mshtml/htmlelem.c index e62c08f1148..1e20e75366a 100644 --- a/dlls/mshtml/htmlelem.c +++ b/dlls/mshtml/htmlelem.c @@ -1170,7 +1170,7 @@ static HRESULT set_elem_attr_value_by_dispid(HTMLElement *elem, DISPID dispid, V return S_OK; }
- return IDispatchEx_InvokeEx(&elem->node.event_target.dispex.IDispatchEx_iface, dispid, + return IWineJSDispatchHost_InvokeEx(&elem->node.event_target.dispex.IWineJSDispatchHost_iface, dispid, LOCALE_SYSTEM_DEFAULT, DISPATCH_PROPERTYPUT, &dp, NULL, &ei, NULL); }
@@ -1189,7 +1189,7 @@ static HRESULT WINAPI HTMLElement_setAttribute(IHTMLElement *iface, BSTR strAttr TRACE("(%p)->(%s %s %08lx)\n", This, debugstr_w(strAttributeName), debugstr_variant(&AttributeValue), lFlags);
if(compat_mode < COMPAT_MODE_IE9 || !This->dom_element) { - hres = IDispatchEx_GetDispID(&This->node.event_target.dispex.IDispatchEx_iface, translate_attr_name(strAttributeName, compat_mode), + hres = IWineJSDispatchHost_GetDispID(&This->node.event_target.dispex.IWineJSDispatchHost_iface, translate_attr_name(strAttributeName, compat_mode), (lFlags&ATTRFLAG_CASESENSITIVE ? fdexNameCaseSensitive : fdexNameCaseInsensitive) | fdexNameEnsure, &dispid); if(FAILED(hres)) return hres; @@ -1241,7 +1241,7 @@ HRESULT get_elem_attr_value_by_dispid(HTMLElement *elem, DISPID dispid, VARIANT DISPPARAMS dispParams = {NULL, NULL, 0, 0}; EXCEPINFO excep;
- return IDispatchEx_InvokeEx(&elem->node.event_target.dispex.IDispatchEx_iface, dispid, LOCALE_SYSTEM_DEFAULT, + return IWineJSDispatchHost_InvokeEx(&elem->node.event_target.dispex.IWineJSDispatchHost_iface, dispid, LOCALE_SYSTEM_DEFAULT, DISPATCH_PROPERTYGET, &dispParams, ret, &excep, NULL); }
@@ -1288,7 +1288,7 @@ static HRESULT WINAPI HTMLElement_getAttribute(IHTMLElement *iface, BSTR strAttr FIXME("Unsupported flags %lx\n", lFlags);
if(compat_mode < COMPAT_MODE_IE9 || !This->dom_element) { - hres = IDispatchEx_GetDispID(&This->node.event_target.dispex.IDispatchEx_iface, translate_attr_name(strAttributeName, compat_mode), + hres = IWineJSDispatchHost_GetDispID(&This->node.event_target.dispex.IWineJSDispatchHost_iface, translate_attr_name(strAttributeName, compat_mode), lFlags&ATTRFLAG_CASESENSITIVE ? fdexNameCaseSensitive : fdexNameCaseInsensitive, &dispid); if(FAILED(hres)) { V_VT(AttributeValue) = VT_NULL; @@ -1336,7 +1336,7 @@ static HRESULT WINAPI HTMLElement_removeAttribute(IHTMLElement *iface, BSTR strA TRACE("(%p)->(%s %lx %p)\n", This, debugstr_w(strAttributeName), lFlags, pfSuccess);
if(compat_mode < COMPAT_MODE_IE9 || !This->dom_element) { - hres = IDispatchEx_GetDispID(&This->node.event_target.dispex.IDispatchEx_iface, translate_attr_name(strAttributeName, compat_mode), + hres = IWineJSDispatchHost_GetDispID(&This->node.event_target.dispex.IWineJSDispatchHost_iface, translate_attr_name(strAttributeName, compat_mode), lFlags&ATTRFLAG_CASESENSITIVE ? fdexNameCaseSensitive : fdexNameCaseInsensitive, &id); if(hres == DISP_E_UNKNOWNNAME) { *pfSuccess = VARIANT_FALSE; @@ -2483,7 +2483,7 @@ static HRESULT WINAPI HTMLElement_toString(IHTMLElement *iface, BSTR *String) if(!String) return E_INVALIDARG;
- hres = IDispatchEx_InvokeEx(&This->node.event_target.dispex.IDispatchEx_iface, DISPID_VALUE, + hres = IWineJSDispatchHost_InvokeEx(&This->node.event_target.dispex.IWineJSDispatchHost_iface, DISPID_VALUE, LOCALE_SYSTEM_DEFAULT, DISPATCH_PROPERTYGET, NULL, &var, NULL, NULL); if(SUCCEEDED(hres)) { assert(V_VT(&var) == VT_BSTR); @@ -4429,7 +4429,7 @@ static HRESULT WINAPI HTMLElement4_setAttributeNode(IHTMLElement4 *iface, IHTMLD return E_INVALIDARG; }
- hres = IDispatchEx_GetDispID(&This->node.event_target.dispex.IDispatchEx_iface, + hres = IWineJSDispatchHost_GetDispID(&This->node.event_target.dispex.IWineJSDispatchHost_iface, attr->name, fdexNameCaseInsensitive|fdexNameEnsure, &dispid); if(FAILED(hres)) return hres; @@ -6399,7 +6399,7 @@ HRESULT HTMLElement_populate_props(DispatchEx *dispex) continue; }
- hres = IDispatchEx_GetDispID(&dispex->IDispatchEx_iface, name, fdexNameCaseInsensitive, &id); + hres = IWineJSDispatchHost_GetDispID(&dispex->IWineJSDispatchHost_iface, name, fdexNameCaseInsensitive, &id); if(hres != DISP_E_UNKNOWNNAME) { nsIDOMAttr_Release(attr); SysFreeString(name); @@ -7544,7 +7544,7 @@ static HRESULT create_filters_collection(compat_mode_t compat_mode, IHTMLFilters
static HRESULT get_attr_dispid_by_relative_idx(HTMLAttributeCollection *This, LONG *idx, DISPID start, DISPID *dispid) { - IDispatchEx *dispex = &This->elem->node.event_target.dispex.IDispatchEx_iface; + IWineJSDispatchHost *dispex = &This->elem->node.event_target.dispex.IWineJSDispatchHost_iface; DISPID id = start; LONG len = -1; HRESULT hres; @@ -7552,7 +7552,7 @@ static HRESULT get_attr_dispid_by_relative_idx(HTMLAttributeCollection *This, LO FIXME("filter non-enumerable attributes out\n");
while(1) { - hres = IDispatchEx_GetNextDispID(dispex, fdexEnumAll, id, &id); + hres = IWineJSDispatchHost_GetNextDispID(dispex, fdexEnumAll, id, &id); if(FAILED(hres)) return hres; else if(hres == S_FALSE) @@ -7593,7 +7593,7 @@ static inline HRESULT get_attr_dispid_by_name(HTMLAttributeCollection *This, BST } }
- hres = IDispatchEx_GetDispID(&This->elem->node.event_target.dispex.IDispatchEx_iface, + hres = IWineJSDispatchHost_GetDispID(&This->elem->node.event_target.dispex.IWineJSDispatchHost_iface, name, fdexNameCaseInsensitive, id); return hres; } diff --git a/dlls/mshtml/htmlelemcol.c b/dlls/mshtml/htmlelemcol.c index 8b69de72a17..191fa8cbc1e 100644 --- a/dlls/mshtml/htmlelemcol.c +++ b/dlls/mshtml/htmlelemcol.c @@ -315,7 +315,7 @@ static BOOL is_elem_name(HTMLElement *elem, LPCWSTR name) static HRESULT get_item_idx(HTMLElementCollection *This, UINT idx, IDispatch **ret) { if(idx < This->len) { - *ret = (IDispatch*)&This->elems[idx]->node.event_target.dispex.IDispatchEx_iface; + *ret = (IDispatch*)&This->elems[idx]->node.event_target.dispex.IWineJSDispatchHost_iface; IDispatch_AddRef(*ret); }
diff --git a/dlls/mshtml/htmlevent.c b/dlls/mshtml/htmlevent.c index f83153fc084..dad7174681d 100644 --- a/dlls/mshtml/htmlevent.c +++ b/dlls/mshtml/htmlevent.c @@ -2056,7 +2056,7 @@ static HRESULT WINAPI DOMEvent_get_srcElement(IDOMEvent *iface, IHTMLElement **p TRACE("(%p)->(%p)\n", This, p);
if(This->target) - IDispatchEx_QueryInterface(&This->target->dispex.IDispatchEx_iface, &IID_IHTMLElement, (void**)p); + IWineJSDispatchHost_QueryInterface(&This->target->dispex.IWineJSDispatchHost_iface, &IID_IHTMLElement, (void**)p); else *p = NULL; return S_OK; @@ -4167,7 +4167,7 @@ static void call_event_handlers(EventTarget *event_target, DOMEvent *event, disp skip_onevent_listener = TRUE;
V_VT(&arg) = VT_DISPATCH; - V_DISPATCH(&arg) = (IDispatch*)&event_target->dispex.IDispatchEx_iface; + V_DISPATCH(&arg) = (IDispatch*)&event_target->dispex.IWineJSDispatchHost_iface; V_VT(&v) = VT_EMPTY; if(vtbl->get_dispatch_this) V_DISPATCH(&arg) = vtbl->get_dispatch_this(&event_target->dispex); @@ -4249,7 +4249,7 @@ static void call_event_handlers(EventTarget *event_target, DOMEvent *event, disp DISPPARAMS dp = {args, &named_arg, 2, 1};
V_VT(args) = VT_DISPATCH; - V_DISPATCH(args) = (IDispatch*)&event_target->dispex.IDispatchEx_iface; + V_DISPATCH(args) = (IDispatch*)&event_target->dispex.IWineJSDispatchHost_iface; if(vtbl->get_dispatch_this) V_DISPATCH(args) = vtbl->get_dispatch_this(&event_target->dispex); IDispatch_AddRef(V_DISPATCH(args)); diff --git a/dlls/mshtml/htmlframe.c b/dlls/mshtml/htmlframe.c index d842f82672d..953add5672d 100644 --- a/dlls/mshtml/htmlframe.c +++ b/dlls/mshtml/htmlframe.c @@ -893,7 +893,7 @@ static HRESULT HTMLFrameElement_invoke(DispatchEx *dispex, DISPID id, LCID lcid, return E_FAIL; }
- return IDispatchEx_InvokeEx(&This->framebase.content_window->IDispatchEx_iface, id, lcid, + return IWineJSDispatchHost_InvokeEx(&This->framebase.content_window->IWineJSDispatchHost_iface, id, lcid, flags, params, res, ei, caller); }
@@ -1330,7 +1330,7 @@ static HRESULT HTMLIFrame_invoke(DispatchEx *dispex, DISPID id, LCID lcid, WORD return E_FAIL; }
- return IDispatchEx_InvokeEx(&This->framebase.content_window->IDispatchEx_iface, id, lcid, + return IWineJSDispatchHost_InvokeEx(&This->framebase.content_window->IWineJSDispatchHost_iface, id, lcid, flags, params, res, ei, caller); }
diff --git a/dlls/mshtml/htmlstyle.c b/dlls/mshtml/htmlstyle.c index 0585f8314d6..5816139854f 100644 --- a/dlls/mshtml/htmlstyle.c +++ b/dlls/mshtml/htmlstyle.c @@ -2917,7 +2917,7 @@ static HRESULT WINAPI HTMLStyle_removeAttribute(IHTMLStyle *iface, BSTR strAttri DISPID dispid; unsigned i;
- hres = IDispatchEx_GetDispID(&This->css_style.dispex.IDispatchEx_iface, strAttributeName, + hres = IWineJSDispatchHost_GetDispID(&This->css_style.dispex.IWineJSDispatchHost_iface, strAttributeName, (lFlags&1) ? fdexNameCaseSensitive : fdexNameCaseInsensitive, &dispid); if(hres != S_OK) { *pfSuccess = VARIANT_FALSE; diff --git a/dlls/mshtml/htmlwindow.c b/dlls/mshtml/htmlwindow.c index 82c1b1db029..1f4fe6ffd7a 100644 --- a/dlls/mshtml/htmlwindow.c +++ b/dlls/mshtml/htmlwindow.c @@ -211,8 +211,8 @@ static HRESULT WINAPI outer_window_QueryInterface(IHTMLWindow2 *iface, REFIID ri }else if(IsEqualGUID(&IID_nsCycleCollectionISupports, riid)) { *ppv = &This->base.IHTMLWindow2_iface; return S_OK; - }else if(IsEqualGUID(&IID_IDispatchEx, riid)) { - *ppv = &This->IDispatchEx_iface; + }else if(IsEqualGUID(&IID_IDispatchEx, riid) || IsEqualGUID(&IID_IWineJSDispatchHost, riid)) { + *ppv = &This->IWineJSDispatchHost_iface; }else if(IsEqualGUID(&IID_IEventTarget, riid)) { if(!This->base.inner_window->doc || This->base.inner_window->doc->document_mode < COMPAT_MODE_IE9) return E_NOINTERFACE; @@ -3277,34 +3277,34 @@ static const IWineHTMLWindowCompatPrivateVtbl WineHTMLWindowCompatPrivateVtbl = window_compat_private_get_performance, };
-static inline HTMLOuterWindow *impl_from_IDispatchEx(IDispatchEx *iface) +static inline HTMLOuterWindow *impl_from_IWineJSDispatchHost(IWineJSDispatchHost *iface) { - return CONTAINING_RECORD(iface, HTMLOuterWindow, IDispatchEx_iface); + return CONTAINING_RECORD(iface, HTMLOuterWindow, IWineJSDispatchHost_iface); }
-static HRESULT WINAPI WindowDispEx_QueryInterface(IDispatchEx *iface, REFIID riid, void **ppv) +static HRESULT WINAPI WindowDispEx_QueryInterface(IWineJSDispatchHost *iface, REFIID riid, void **ppv) { - HTMLOuterWindow *This = impl_from_IDispatchEx(iface); + HTMLOuterWindow *This = impl_from_IWineJSDispatchHost(iface);
return IHTMLWindow2_QueryInterface(&This->base.IHTMLWindow2_iface, riid, ppv); }
-static ULONG WINAPI WindowDispEx_AddRef(IDispatchEx *iface) +static ULONG WINAPI WindowDispEx_AddRef(IWineJSDispatchHost *iface) { - HTMLOuterWindow *This = impl_from_IDispatchEx(iface); + HTMLOuterWindow *This = impl_from_IWineJSDispatchHost(iface);
return IHTMLWindow2_AddRef(&This->base.IHTMLWindow2_iface); }
-static ULONG WINAPI WindowDispEx_Release(IDispatchEx *iface) +static ULONG WINAPI WindowDispEx_Release(IWineJSDispatchHost *iface) { - HTMLOuterWindow *This = impl_from_IDispatchEx(iface); + HTMLOuterWindow *This = impl_from_IWineJSDispatchHost(iface);
return IHTMLWindow2_Release(&This->base.IHTMLWindow2_iface); }
-DISPEX_IDISPATCH_NOUNK_IMPL(WindowDispEx, IDispatchEx, - impl_from_IDispatchEx(iface)->base.inner_window->event_target.dispex) +DISPEX_IDISPATCH_NOUNK_IMPL(WindowDispEx, IWineJSDispatchHost, + impl_from_IWineJSDispatchHost(iface)->base.inner_window->event_target.dispex)
static global_prop_t *alloc_global_prop(HTMLInnerWindow *This, global_prop_type_t type, BSTR name) { @@ -3369,69 +3369,70 @@ HRESULT search_window_props(HTMLInnerWindow *This, BSTR bstrName, DWORD grfdex, return DISP_E_UNKNOWNNAME; }
-static HRESULT WINAPI WindowDispEx_GetDispID(IDispatchEx *iface, BSTR bstrName, DWORD grfdex, DISPID *pid) +static HRESULT WINAPI WindowDispEx_GetDispID(IWineJSDispatchHost *iface, BSTR bstrName, DWORD grfdex, DISPID *pid) { - HTMLOuterWindow *This = impl_from_IDispatchEx(iface); + HTMLOuterWindow *This = impl_from_IWineJSDispatchHost(iface);
- return IDispatchEx_GetDispID(&This->base.inner_window->event_target.dispex.IDispatchEx_iface, bstrName, grfdex, pid); + return IWineJSDispatchHost_GetDispID(&This->base.inner_window->event_target.dispex.IWineJSDispatchHost_iface, bstrName, grfdex, pid); }
-static HRESULT WINAPI WindowDispEx_InvokeEx(IDispatchEx *iface, DISPID id, LCID lcid, WORD wFlags, DISPPARAMS *pdp, +static HRESULT WINAPI WindowDispEx_InvokeEx(IWineJSDispatchHost *iface, DISPID id, LCID lcid, WORD wFlags, DISPPARAMS *pdp, VARIANT *pvarRes, EXCEPINFO *pei, IServiceProvider *pspCaller) { - HTMLOuterWindow *This = impl_from_IDispatchEx(iface); - return IDispatchEx_InvokeEx(&This->base.inner_window->event_target.dispex.IDispatchEx_iface, id, lcid, wFlags, pdp, pvarRes, pei, pspCaller); + HTMLOuterWindow *This = impl_from_IWineJSDispatchHost(iface); + return IWineJSDispatchHost_InvokeEx(&This->base.inner_window->event_target.dispex.IWineJSDispatchHost_iface, id, lcid, wFlags, + pdp, pvarRes, pei, pspCaller); }
-static HRESULT WINAPI WindowDispEx_DeleteMemberByName(IDispatchEx *iface, BSTR bstrName, DWORD grfdex) +static HRESULT WINAPI WindowDispEx_DeleteMemberByName(IWineJSDispatchHost *iface, BSTR bstrName, DWORD grfdex) { - HTMLOuterWindow *This = impl_from_IDispatchEx(iface); + HTMLOuterWindow *This = impl_from_IWineJSDispatchHost(iface);
TRACE("(%p)->(%s %lx)\n", This, debugstr_w(bstrName), grfdex);
- return IDispatchEx_DeleteMemberByName(&This->base.inner_window->event_target.dispex.IDispatchEx_iface, bstrName, grfdex); + return IWineJSDispatchHost_DeleteMemberByName(&This->base.inner_window->event_target.dispex.IWineJSDispatchHost_iface, bstrName, grfdex); }
-static HRESULT WINAPI WindowDispEx_DeleteMemberByDispID(IDispatchEx *iface, DISPID id) +static HRESULT WINAPI WindowDispEx_DeleteMemberByDispID(IWineJSDispatchHost *iface, DISPID id) { - HTMLOuterWindow *This = impl_from_IDispatchEx(iface); + HTMLOuterWindow *This = impl_from_IWineJSDispatchHost(iface);
TRACE("(%p)->(%lx)\n", This, id);
- return IDispatchEx_DeleteMemberByDispID(&This->base.inner_window->event_target.dispex.IDispatchEx_iface, id); + return IWineJSDispatchHost_DeleteMemberByDispID(&This->base.inner_window->event_target.dispex.IWineJSDispatchHost_iface, id); }
-static HRESULT WINAPI WindowDispEx_GetMemberProperties(IDispatchEx *iface, DISPID id, DWORD grfdexFetch, DWORD *pgrfdex) +static HRESULT WINAPI WindowDispEx_GetMemberProperties(IWineJSDispatchHost *iface, DISPID id, DWORD grfdexFetch, DWORD *pgrfdex) { - HTMLOuterWindow *This = impl_from_IDispatchEx(iface); + HTMLOuterWindow *This = impl_from_IWineJSDispatchHost(iface);
TRACE("(%p)->(%lx %lx %p)\n", This, id, grfdexFetch, pgrfdex);
- return IDispatchEx_GetMemberProperties(&This->base.inner_window->event_target.dispex.IDispatchEx_iface, id, grfdexFetch, + return IWineJSDispatchHost_GetMemberProperties(&This->base.inner_window->event_target.dispex.IWineJSDispatchHost_iface, id, grfdexFetch, pgrfdex); }
-static HRESULT WINAPI WindowDispEx_GetMemberName(IDispatchEx *iface, DISPID id, BSTR *pbstrName) +static HRESULT WINAPI WindowDispEx_GetMemberName(IWineJSDispatchHost *iface, DISPID id, BSTR *pbstrName) { - HTMLOuterWindow *This = impl_from_IDispatchEx(iface); + HTMLOuterWindow *This = impl_from_IWineJSDispatchHost(iface);
TRACE("(%p)->(%lx %p)\n", This, id, pbstrName);
- return IDispatchEx_GetMemberName(&This->base.inner_window->event_target.dispex.IDispatchEx_iface, id, pbstrName); + return IWineJSDispatchHost_GetMemberName(&This->base.inner_window->event_target.dispex.IWineJSDispatchHost_iface, id, pbstrName); }
-static HRESULT WINAPI WindowDispEx_GetNextDispID(IDispatchEx *iface, DWORD grfdex, DISPID id, DISPID *pid) +static HRESULT WINAPI WindowDispEx_GetNextDispID(IWineJSDispatchHost *iface, DWORD grfdex, DISPID id, DISPID *pid) { - HTMLOuterWindow *This = impl_from_IDispatchEx(iface); + HTMLOuterWindow *This = impl_from_IWineJSDispatchHost(iface);
TRACE("(%p)->(%lx %lx %p)\n", This, grfdex, id, pid);
- return IDispatchEx_GetNextDispID(&This->base.inner_window->event_target.dispex.IDispatchEx_iface, grfdex, id, pid); + return IWineJSDispatchHost_GetNextDispID(&This->base.inner_window->event_target.dispex.IWineJSDispatchHost_iface, grfdex, id, pid); }
-static HRESULT WINAPI WindowDispEx_GetNameSpaceParent(IDispatchEx *iface, IUnknown **ppunk) +static HRESULT WINAPI WindowDispEx_GetNameSpaceParent(IWineJSDispatchHost *iface, IUnknown **ppunk) { - HTMLOuterWindow *This = impl_from_IDispatchEx(iface); + HTMLOuterWindow *This = impl_from_IWineJSDispatchHost(iface);
TRACE("(%p)->(%p)\n", This, ppunk);
@@ -3439,7 +3440,7 @@ static HRESULT WINAPI WindowDispEx_GetNameSpaceParent(IDispatchEx *iface, IUnkno return S_OK; }
-static const IDispatchExVtbl WindowDispExVtbl = { +static const IWineJSDispatchHostVtbl WindowDispExVtbl = { WindowDispEx_QueryInterface, WindowDispEx_AddRef, WindowDispEx_Release, @@ -3810,7 +3811,7 @@ static HRESULT HTMLWindow_invoke(DispatchEx *dispex, DISPID id, LCID lcid, WORD
prop->type = GLOBAL_DISPEXVAR; prop->id = dispex_id; - return IDispatchEx_InvokeEx(&This->event_target.dispex.IDispatchEx_iface, dispex_id, 0, flags, params, res, ei, caller); + return IWineJSDispatchHost_InvokeEx(&This->event_target.dispex.IWineJSDispatchHost_iface, dispex_id, 0, flags, params, res, ei, caller); } default: FIXME("Not supported flags: %x\n", flags); @@ -3838,7 +3839,7 @@ static HRESULT HTMLWindow_invoke(DispatchEx *dispex, DISPID id, LCID lcid, WORD return E_NOTIMPL; } case GLOBAL_DISPEXVAR: - return IDispatchEx_InvokeEx(&This->event_target.dispex.IDispatchEx_iface, prop->id, 0, flags, params, res, ei, caller); + return IWineJSDispatchHost_InvokeEx(&This->event_target.dispex.IWineJSDispatchHost_iface, prop->id, 0, flags, params, res, ei, caller); default: ERR("invalid type %d\n", prop->type); hres = DISP_E_MEMBERNOTFOUND; @@ -3901,7 +3902,7 @@ static HRESULT IHTMLWindow2_location_hook(DispatchEx *dispex, WORD flags, DISPPA if(FAILED(hres)) return hres;
- hres = IDispatchEx_InvokeEx(&location->dispex.IDispatchEx_iface, DISPID_VALUE, 0, flags, dp, res, ei, caller); + hres = IWineJSDispatchHost_InvokeEx(&location->dispex.IWineJSDispatchHost_iface, DISPID_VALUE, 0, flags, dp, res, ei, caller); IHTMLLocation_Release(&location->IHTMLLocation_iface); return hres; } @@ -4204,7 +4205,7 @@ HRESULT create_outer_window(GeckoBrowser *browser, mozIDOMWindowProxy *mozwindow if(!window) return E_OUTOFMEMORY; window->base.IHTMLWindow2_iface.lpVtbl = &outer_window_HTMLWindow2Vtbl; - window->IDispatchEx_iface.lpVtbl = &WindowDispExVtbl; + window->IWineJSDispatchHost_iface.lpVtbl = &WindowDispExVtbl; window->IEventTarget_iface.lpVtbl = &EventTargetVtbl;
window->base.outer_window = window; diff --git a/dlls/mshtml/mshtml_private.h b/dlls/mshtml/mshtml_private.h index 4b2cffd0f54..1a8c666ae57 100644 --- a/dlls/mshtml/mshtml_private.h +++ b/dlls/mshtml/mshtml_private.h @@ -413,7 +413,7 @@ typedef struct { } dispex_hook_t;
struct DispatchEx { - IDispatchEx IDispatchEx_iface; + IWineJSDispatchHost IWineJSDispatchHost_iface;
nsCycleCollectingAutoRefCnt ccref;
@@ -424,38 +424,38 @@ struct DispatchEx { #define DISPEX_IDISPATCH_NOUNK_IMPL(prefix, iface_name, dispex) \ static HRESULT WINAPI prefix##_GetTypeInfoCount(iface_name *iface, UINT *count) \ { \ - return IDispatchEx_GetTypeInfoCount(&(dispex).IDispatchEx_iface, count); \ + return IWineJSDispatchHost_GetTypeInfoCount(&(dispex).IWineJSDispatchHost_iface, count); \ } \ static HRESULT WINAPI prefix##_GetTypeInfo(iface_name *iface, \ UINT index, LCID lcid, ITypeInfo **ret) \ { \ - return IDispatchEx_GetTypeInfo(&(dispex).IDispatchEx_iface, index, lcid, ret); \ + return IWineJSDispatchHost_GetTypeInfo(&(dispex).IWineJSDispatchHost_iface, index, lcid, ret); \ } \ static HRESULT WINAPI prefix##_GetIDsOfNames(iface_name *iface, REFIID riid, \ LPOLESTR *names, UINT count, LCID lcid, DISPID *dispid) \ { \ - return IDispatchEx_GetIDsOfNames(&(dispex).IDispatchEx_iface, \ + return IWineJSDispatchHost_GetIDsOfNames(&(dispex).IWineJSDispatchHost_iface, \ riid, names, count, lcid, dispid); \ } \ static HRESULT WINAPI prefix##_Invoke(iface_name *iface, DISPID dispid, REFIID riid, \ LCID lcid, WORD flags, DISPPARAMS *params, VARIANT *res, EXCEPINFO *ei, UINT *err) \ { \ - return IDispatchEx_Invoke(&(dispex).IDispatchEx_iface, dispid, \ + return IWineJSDispatchHost_Invoke(&(dispex).IWineJSDispatchHost_iface, dispid, \ riid, lcid, flags, params, res, ei, err); \ }
#define DISPEX_IDISPATCH_IMPL(prefix, iface_name, dispex) \ static HRESULT WINAPI prefix##_QueryInterface(iface_name *iface, REFIID riid, void **ppv) \ { \ - return IDispatchEx_QueryInterface(&(dispex).IDispatchEx_iface, riid, ppv); \ + return IWineJSDispatchHost_QueryInterface(&(dispex).IWineJSDispatchHost_iface, riid, ppv); \ } \ static ULONG WINAPI prefix##_AddRef(iface_name *iface) \ { \ - return IDispatchEx_AddRef(&(dispex).IDispatchEx_iface); \ + return IWineJSDispatchHost_AddRef(&(dispex).IWineJSDispatchHost_iface); \ } \ static ULONG WINAPI prefix##_Release(iface_name *iface) \ { \ - return IDispatchEx_Release(&(dispex).IDispatchEx_iface); \ + return IWineJSDispatchHost_Release(&(dispex).IWineJSDispatchHost_iface); \ } \ DISPEX_IDISPATCH_NOUNK_IMPL(prefix, iface_name, dispex)
@@ -594,7 +594,7 @@ struct HTMLWindow { struct HTMLOuterWindow { HTMLWindow base; IEventTarget IEventTarget_iface; - IDispatchEx IDispatchEx_iface; + IWineJSDispatchHost IWineJSDispatchHost_iface;
nsCycleCollectingAutoRefCnt ccref; LONG task_magic; diff --git a/dlls/mshtml/mshtml_private_iface.idl b/dlls/mshtml/mshtml_private_iface.idl index 503593d1c25..46bf692b240 100644 --- a/dlls/mshtml/mshtml_private_iface.idl +++ b/dlls/mshtml/mshtml_private_iface.idl @@ -258,3 +258,12 @@ interface IWineXMLHttpRequestPrivate : IDispatch }
} /* library MSHTML_private */ + +[ + object, + uuid(d359f2fe-5531-741b-a41a-5cf92edc971b), + local +] +interface IWineJSDispatchHost : IDispatchEx +{ +} diff --git a/dlls/mshtml/mutation.c b/dlls/mshtml/mutation.c index 44cb2f491af..290174e4785 100644 --- a/dlls/mshtml/mutation.c +++ b/dlls/mshtml/mutation.c @@ -1301,6 +1301,6 @@ HRESULT create_mutation_observer_ctor(compat_mode_t compat_mode, IDispatch **ret
init_dispatch(&obj->dispex, &mutation_observer_ctor_dispex, compat_mode);
- *ret = (IDispatch *)&obj->dispex.IDispatchEx_iface; + *ret = (IDispatch *)&obj->dispex.IWineJSDispatchHost_iface; return S_OK; } diff --git a/dlls/mshtml/oleobj.c b/dlls/mshtml/oleobj.c index cd09117645d..2374ce0ea81 100644 --- a/dlls/mshtml/oleobj.c +++ b/dlls/mshtml/oleobj.c @@ -3542,7 +3542,7 @@ static HRESULT WINAPI DocObjDispatchEx_GetDispID(IDispatchEx *iface, BSTR name, { HTMLDocumentObj *This = impl_from_IDispatchEx(iface);
- return IDispatchEx_GetDispID(&This->doc_node->node.event_target.dispex.IDispatchEx_iface, name, grfdex, pid); + return IWineJSDispatchHost_GetDispID(&This->doc_node->node.event_target.dispex.IWineJSDispatchHost_iface, name, grfdex, pid); }
static HRESULT WINAPI DocObjDispatchEx_InvokeEx(IDispatchEx *iface, DISPID id, LCID lcid, WORD wFlags, DISPPARAMS *pdp, @@ -3550,29 +3550,29 @@ static HRESULT WINAPI DocObjDispatchEx_InvokeEx(IDispatchEx *iface, DISPID id, L { HTMLDocumentObj *This = impl_from_IDispatchEx(iface);
- return IDispatchEx_InvokeEx(&This->doc_node->node.event_target.dispex.IDispatchEx_iface, id, lcid, - wFlags, pdp, pvarRes, pei, pspCaller); + return IWineJSDispatchHost_InvokeEx(&This->doc_node->node.event_target.dispex.IWineJSDispatchHost_iface, id, lcid, + wFlags, pdp, pvarRes, pei, pspCaller); }
static HRESULT WINAPI DocObjDispatchEx_DeleteMemberByName(IDispatchEx *iface, BSTR bstrName, DWORD grfdex) { HTMLDocumentObj *This = impl_from_IDispatchEx(iface);
- return IDispatchEx_DeleteMemberByName(&This->doc_node->node.event_target.dispex.IDispatchEx_iface, bstrName, grfdex); + return IWineJSDispatchHost_DeleteMemberByName(&This->doc_node->node.event_target.dispex.IWineJSDispatchHost_iface, bstrName, grfdex); }
static HRESULT WINAPI DocObjDispatchEx_DeleteMemberByDispID(IDispatchEx *iface, DISPID id) { HTMLDocumentObj *This = impl_from_IDispatchEx(iface);
- return IDispatchEx_DeleteMemberByDispID(&This->doc_node->node.event_target.dispex.IDispatchEx_iface, id); + return IWineJSDispatchHost_DeleteMemberByDispID(&This->doc_node->node.event_target.dispex.IWineJSDispatchHost_iface, id); }
static HRESULT WINAPI DocObjDispatchEx_GetMemberProperties(IDispatchEx *iface, DISPID id, DWORD grfdexFetch, DWORD *pgrfdex) { HTMLDocumentObj *This = impl_from_IDispatchEx(iface);
- return IDispatchEx_GetMemberProperties(&This->doc_node->node.event_target.dispex.IDispatchEx_iface, id, grfdexFetch, + return IWineJSDispatchHost_GetMemberProperties(&This->doc_node->node.event_target.dispex.IWineJSDispatchHost_iface, id, grfdexFetch, pgrfdex); }
@@ -3580,21 +3580,21 @@ static HRESULT WINAPI DocObjDispatchEx_GetMemberName(IDispatchEx *iface, DISPID { HTMLDocumentObj *This = impl_from_IDispatchEx(iface);
- return IDispatchEx_GetMemberName(&This->doc_node->node.event_target.dispex.IDispatchEx_iface, id, name); + return IWineJSDispatchHost_GetMemberName(&This->doc_node->node.event_target.dispex.IWineJSDispatchHost_iface, id, name); }
static HRESULT WINAPI DocObjDispatchEx_GetNextDispID(IDispatchEx *iface, DWORD grfdex, DISPID id, DISPID *pid) { HTMLDocumentObj *This = impl_from_IDispatchEx(iface);
- return IDispatchEx_GetNextDispID(&This->doc_node->node.event_target.dispex.IDispatchEx_iface, grfdex, id, pid); + return IWineJSDispatchHost_GetNextDispID(&This->doc_node->node.event_target.dispex.IWineJSDispatchHost_iface, grfdex, id, pid); }
static HRESULT WINAPI DocObjDispatchEx_GetNameSpaceParent(IDispatchEx *iface, IUnknown **ppunk) { HTMLDocumentObj *This = impl_from_IDispatchEx(iface);
- return IDispatchEx_GetNameSpaceParent(&This->doc_node->node.event_target.dispex.IDispatchEx_iface, ppunk); + return IWineJSDispatchHost_GetNameSpaceParent(&This->doc_node->node.event_target.dispex.IWineJSDispatchHost_iface, ppunk); }
static const IDispatchExVtbl DocObjDispatchExVtbl = { diff --git a/dlls/mshtml/omnavigator.c b/dlls/mshtml/omnavigator.c index 49e7685d71d..69a47c2706d 100644 --- a/dlls/mshtml/omnavigator.c +++ b/dlls/mshtml/omnavigator.c @@ -2313,7 +2313,7 @@ static nsresult NSAPI media_query_list_callback_HandleChange(nsIDOMMediaQueryLis DISPPARAMS dp = { args, NULL, 1, 0 };
V_VT(args) = VT_DISPATCH; - V_DISPATCH(args) = (IDispatch*)&media_query_list->dispex.IDispatchEx_iface; + V_DISPATCH(args) = (IDispatch*)&media_query_list->dispex.IWineJSDispatchHost_iface; V_VT(&v) = VT_EMPTY;
TRACE("%p >>>\n", media_query_list); diff --git a/dlls/mshtml/script.c b/dlls/mshtml/script.c index d1da451cb98..b1f24f9d8d3 100644 --- a/dlls/mshtml/script.c +++ b/dlls/mshtml/script.c @@ -1573,7 +1573,7 @@ static EventTarget *find_event_target(HTMLDocumentNode *doc, HTMLScriptElement * }else if(!wcscmp(target_id, L"window")) { if(doc->window) { event_target = &doc->window->event_target; - IDispatchEx_AddRef(&event_target->dispex.IDispatchEx_iface); + IWineJSDispatchHost_AddRef(&event_target->dispex.IWineJSDispatchHost_iface); } }else { HTMLElement *target_elem; @@ -1731,14 +1731,14 @@ void bind_event_scripts(HTMLDocumentNode *doc) if(event_disp) { event_target = find_event_target(doc, script_elem); if(event_target) { - hres = IDispatchEx_QueryInterface(&event_target->dispex.IDispatchEx_iface, &IID_HTMLPluginContainer, + hres = IWineJSDispatchHost_QueryInterface(&event_target->dispex.IWineJSDispatchHost_iface, &IID_HTMLPluginContainer, (void**)&plugin_container); if(SUCCEEDED(hres)) bind_activex_event(doc, plugin_container, event, event_disp); else bind_target_event(doc, event_target, event, event_disp);
- IDispatchEx_Release(&event_target->dispex.IDispatchEx_iface); + IWineJSDispatchHost_Release(&event_target->dispex.IWineJSDispatchHost_iface); if(plugin_container) node_release(&plugin_container->element.node); }
From: Jacek Caban jacek@codeweavers.com
--- dlls/mshtml/dispex.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-)
diff --git a/dlls/mshtml/dispex.c b/dlls/mshtml/dispex.c index ab901908901..a6cb664469f 100644 --- a/dlls/mshtml/dispex.c +++ b/dlls/mshtml/dispex.c @@ -1161,8 +1161,8 @@ static HRESULT builtin_propput(DispatchEx *This, func_info_t *func, DISPPARAMS * return hres; }
-static HRESULT invoke_builtin_function(DispatchEx *This, func_info_t *func, DISPPARAMS *dp, - VARIANT *res, EXCEPINFO *ei, IServiceProvider *caller) +static HRESULT call_builtin_function(DispatchEx *This, func_info_t *func, DISPPARAMS *dp, + VARIANT *res, EXCEPINFO *ei, IServiceProvider *caller) { VARIANT arg_buf[MAX_ARGS], *arg_ptrs[MAX_ARGS], *arg, retv, ret_ref, vhres; unsigned i, nconv = 0; @@ -1268,7 +1268,7 @@ static HRESULT invoke_builtin_function(DispatchEx *This, func_info_t *func, DISP return V_ERROR(&vhres); }
-static HRESULT function_invoke(DispatchEx *This, func_info_t *func, WORD flags, DISPPARAMS *dp, VARIANT *res, +static HRESULT invoke_builtin_function(DispatchEx *This, func_info_t *func, WORD flags, DISPPARAMS *dp, VARIANT *res, EXCEPINFO *ei, IServiceProvider *caller) { HRESULT hres; @@ -1299,7 +1299,7 @@ static HRESULT function_invoke(DispatchEx *This, func_info_t *func, WORD flags, } }
- hres = invoke_builtin_function(This, func, dp, res, ei, caller); + hres = call_builtin_function(This, func, dp, res, ei, caller); break; case DISPATCH_PROPERTYGET: { func_obj_entry_t *entry; @@ -1365,7 +1365,7 @@ static HRESULT invoke_builtin_prop(DispatchEx *This, DISPID id, LCID lcid, WORD return hres;
if(func->func_disp_idx >= 0) - return function_invoke(This, func, flags, dp, res, ei, caller); + return invoke_builtin_function(This, func, flags, dp, res, ei, caller);
if(func->hook) { hres = func->hook(This, flags, dp, res, ei, caller); @@ -1422,7 +1422,7 @@ HRESULT dispex_call_builtin(DispatchEx *dispex, DISPID id, DISPPARAMS *dp, if(FAILED(hres)) return hres;
- return invoke_builtin_function(dispex, func, dp, res, ei, caller); + return call_builtin_function(dispex, func, dp, res, ei, caller); }
HRESULT remove_attribute(DispatchEx *This, DISPID id, VARIANT_BOOL *success)
From: Jacek Caban jacek@codeweavers.com
Based on patch by Gabriel Ivăncescu. --- dlls/mshtml/dispex.c | 96 +++++++++++++++++++++++++++- dlls/mshtml/htmlwindow.c | 12 +++- dlls/mshtml/mshtml_private_iface.idl | 1 + dlls/mshtml/tests/documentmode.js | 52 +++++++++++++++ 4 files changed, 159 insertions(+), 2 deletions(-)
diff --git a/dlls/mshtml/dispex.c b/dlls/mshtml/dispex.c index a6cb664469f..65e04343b88 100644 --- a/dlls/mshtml/dispex.c +++ b/dlls/mshtml/dispex.c @@ -799,6 +799,33 @@ static HRESULT typeinfo_invoke(DispatchEx *This, func_info_t *func, WORD flags, return hres; }
+static HRESULT function_call(func_disp_t *func, DISPPARAMS *dp, LCID lcid, VARIANT *res, EXCEPINFO *ei, IServiceProvider *caller) +{ + DISPPARAMS params = { dp->rgvarg, NULL, dp->cArgs - 1, 0 }; + IWineJSDispatchHost *this_iface; + VARIANT *arg; + HRESULT hres; + + arg = dp->rgvarg + dp->cArgs - 1; + if(dp->cArgs < 1 || V_VT(arg) != VT_DISPATCH || !V_DISPATCH(arg)) + return CTL_E_ILLEGALFUNCTIONCALL; + + hres = IDispatch_QueryInterface(V_DISPATCH(arg), &IID_IWineJSDispatchHost, (void**)&this_iface); + if(FAILED(hres)) + return CTL_E_ILLEGALFUNCTIONCALL; + + hres = IWineJSDispatchHost_CallFunction(this_iface, func->info->id, func->info->tid, ¶ms, res, ei, caller); + IWineJSDispatchHost_Release(this_iface); + return (hres == E_UNEXPECTED) ? CTL_E_ILLEGALFUNCTIONCALL : hres; +} + +static const struct { + const WCHAR *name; + HRESULT (*invoke)(func_disp_t*,DISPPARAMS*,LCID,VARIANT*,EXCEPINFO*,IServiceProvider*); +} function_props[] = { + { L"call", function_call } +}; + static inline func_disp_t *impl_from_DispatchEx(DispatchEx *iface) { return CONTAINING_RECORD(iface, func_disp_t, dispex); @@ -866,9 +893,58 @@ static HRESULT function_value(DispatchEx *dispex, LCID lcid, WORD flags, DISPPAR return hres; }
+static HRESULT function_get_dispid(DispatchEx *dispex, BSTR name, DWORD flags, DISPID *dispid) +{ + DWORD i; + + for(i = 0; i < ARRAY_SIZE(function_props); i++) { + if((flags & fdexNameCaseInsensitive) ? wcsicmp(name, function_props[i].name) : wcscmp(name, function_props[i].name)) + continue; + *dispid = MSHTML_DISPID_CUSTOM_MIN + i; + return S_OK; + } + return DISP_E_UNKNOWNNAME; +} + +static HRESULT function_get_name(DispatchEx *dispex, DISPID id, BSTR *name) +{ + DWORD idx = id - MSHTML_DISPID_CUSTOM_MIN; + + if(idx >= ARRAY_SIZE(function_props)) + return DISP_E_MEMBERNOTFOUND; + + return (*name = SysAllocString(function_props[idx].name)) ? S_OK : E_OUTOFMEMORY; +} + +static HRESULT function_invoke(DispatchEx *dispex, DISPID id, LCID lcid, WORD flags, DISPPARAMS *params, + VARIANT *res, EXCEPINFO *ei, IServiceProvider *caller) +{ + func_disp_t *This = impl_from_DispatchEx(dispex); + DWORD idx = id - MSHTML_DISPID_CUSTOM_MIN; + + if(idx >= ARRAY_SIZE(function_props)) + return DISP_E_MEMBERNOTFOUND; + + switch(flags) { + case DISPATCH_METHOD|DISPATCH_PROPERTYGET: + if(!res) + return E_INVALIDARG; + /* fall through */ + case DISPATCH_METHOD: + return function_props[idx].invoke(This, params, lcid, res, ei, caller); + default: + return MSHTML_E_INVALID_PROPERTY; + } + + return S_OK; +} + static const dispex_static_data_vtbl_t function_dispex_vtbl = { .destructor = function_destructor, .value = function_value, + .get_dispid = function_get_dispid, + .get_name = function_get_name, + .invoke = function_invoke };
static const tid_t function_iface_tids[] = {0}; @@ -1980,6 +2056,23 @@ static HRESULT WINAPI DispatchEx_GetNameSpaceParent(IWineJSDispatchHost *iface, return E_NOTIMPL; }
+static HRESULT WINAPI DispatchEx_CallFunction(IWineJSDispatchHost *iface, DISPID id, UINT32 iid, DISPPARAMS *dp, VARIANT *ret, + EXCEPINFO *ei, IServiceProvider *caller) +{ + DispatchEx *This = impl_from_IWineJSDispatchHost(iface); + func_info_t *func; + HRESULT hres; + + TRACE("%s (%p)->(%lx %x %p %p %p %p)\n", This->info->desc->name, This, id, iid, dp, ret, ei, caller); + + hres = get_builtin_func(This->info, id, &func); + if(FAILED(hres)) + return hres; + if(func->tid != iid || func->func_disp_idx < 0) + return E_UNEXPECTED; + return call_builtin_function(This, func, dp, ret, ei, caller); +} + static IWineJSDispatchHostVtbl JSDispatchHostVtbl = { DispatchEx_QueryInterface, DispatchEx_AddRef, @@ -1995,7 +2088,8 @@ static IWineJSDispatchHostVtbl JSDispatchHostVtbl = { DispatchEx_GetMemberProperties, DispatchEx_GetMemberName, DispatchEx_GetNextDispID, - DispatchEx_GetNameSpaceParent + DispatchEx_GetNameSpaceParent, + DispatchEx_CallFunction, };
static nsresult NSAPI dispex_traverse(void *ccp, void *p, nsCycleCollectionTraversalCallback *cb) diff --git a/dlls/mshtml/htmlwindow.c b/dlls/mshtml/htmlwindow.c index 1f4fe6ffd7a..cf0920783d7 100644 --- a/dlls/mshtml/htmlwindow.c +++ b/dlls/mshtml/htmlwindow.c @@ -3440,6 +3440,15 @@ static HRESULT WINAPI WindowDispEx_GetNameSpaceParent(IWineJSDispatchHost *iface return S_OK; }
+static HRESULT WINAPI WindowDispEx_CallFunction(IWineJSDispatchHost *iface, DISPID id, UINT32 iid, DISPPARAMS *dp, VARIANT *ret, + EXCEPINFO *ei, IServiceProvider *caller) +{ + HTMLOuterWindow *This = impl_from_IWineJSDispatchHost(iface); + + return IWineJSDispatchHost_CallFunction(&This->base.inner_window->event_target.dispex.IWineJSDispatchHost_iface, + id, iid, dp, ret, ei, caller); +} + static const IWineJSDispatchHostVtbl WindowDispExVtbl = { WindowDispEx_QueryInterface, WindowDispEx_AddRef, @@ -3455,7 +3464,8 @@ static const IWineJSDispatchHostVtbl WindowDispExVtbl = { WindowDispEx_GetMemberProperties, WindowDispEx_GetMemberName, WindowDispEx_GetNextDispID, - WindowDispEx_GetNameSpaceParent + WindowDispEx_GetNameSpaceParent, + WindowDispEx_CallFunction, };
static inline HTMLOuterWindow *impl_from_IEventTarget(IEventTarget *iface) diff --git a/dlls/mshtml/mshtml_private_iface.idl b/dlls/mshtml/mshtml_private_iface.idl index 46bf692b240..f4292e298d0 100644 --- a/dlls/mshtml/mshtml_private_iface.idl +++ b/dlls/mshtml/mshtml_private_iface.idl @@ -266,4 +266,5 @@ interface IWineXMLHttpRequestPrivate : IDispatch ] interface IWineJSDispatchHost : IDispatchEx { + HRESULT CallFunction(DISPID id, UINT32 iid, DISPPARAMS *dp, VARIANT *ret, EXCEPINFO *ei, IServiceProvider *caller); } diff --git a/dlls/mshtml/tests/documentmode.js b/dlls/mshtml/tests/documentmode.js index 23fd2128e5f..327d744f00d 100644 --- a/dlls/mshtml/tests/documentmode.js +++ b/dlls/mshtml/tests/documentmode.js @@ -352,6 +352,58 @@ sync_test("builtin_toString", function() { } });
+sync_test("builtin_obj", function() { + var v = document.documentMode; + var f = document.createElement; + var e; + + if(v < 9) { + ok(!(window instanceof Object), "window instance of Object"); + ok(!(document instanceof Object), "document instance of Object"); + ok(!("arguments" in f), "arguments in f"); + ok(!("length" in f), "length in f"); + e = 0; + try { + f.toString(); + }catch(ex) { + e = ex.number; + } + ok(e === 0xa01b6 - 0x80000000, "[f.toString] e = " + e); + try { + window.toString.call(null); + ok(false, "expected exception calling window.toString with null context"); + }catch(ex) {} + } + + e = 0; + try { + f.call(Object, "div"); + }catch(ex) { + e = ex.number; + } + todo_wine_if(v >= 9). + ok(e === (v < 9 ? 0xa0005 : 0x0ffff) - 0x80000000, "[f.call(Object, 'div')] e = " + e); + + e = 0; + try { + f.call(null, "div"); + }catch(ex) { + e = ex.number; + } + todo_wine_if(v >= 9). + ok(e === (v < 9 ? 0xa0005 : 0x0ffff) - 0x80000000, "[f.call(null, 'div')] e = " + e); + + var elem1 = f.call(document, "div"); + var elem2 = f.call(document, "br"); + document.body.appendChild(elem1); + document.body.appendChild(elem2); + elem1.onclick = function() { ok(false, "unexpected elem1.onclick"); }; + var clicked = false; + elem2.onclick = function() { clicked = true; }; + elem1.click.call(elem2); + ok(clicked === true, "elem2.onclick not called"); +}); + sync_test("elem_props", function() { var elem = document.documentElement;
From: Jacek Caban jacek@codeweavers.com
Based on patch by Gabriel Ivăncescu. --- dlls/mshtml/dispex.c | 105 ++++++++++++++++++++++++++++++ dlls/mshtml/tests/documentmode.js | 15 +++++ 2 files changed, 120 insertions(+)
diff --git a/dlls/mshtml/dispex.c b/dlls/mshtml/dispex.c index 65e04343b88..c40b63cb980 100644 --- a/dlls/mshtml/dispex.c +++ b/dlls/mshtml/dispex.c @@ -799,6 +799,110 @@ static HRESULT typeinfo_invoke(DispatchEx *This, func_info_t *func, WORD flags, return hres; }
+static HRESULT get_disp_prop(IDispatchEx *dispex, const WCHAR *name, LCID lcid, VARIANT *res, + EXCEPINFO *ei, IServiceProvider *caller) +{ + DISPPARAMS dp = { 0 }; + DISPID dispid; + HRESULT hres; + BSTR bstr; + + if(!(bstr = SysAllocString(name))) + return E_OUTOFMEMORY; + hres = IDispatchEx_GetDispID(dispex, bstr, fdexNameCaseSensitive, &dispid); + SysFreeString(bstr); + if(SUCCEEDED(hres)) + hres = IDispatchEx_InvokeEx(dispex, dispid, lcid, DISPATCH_PROPERTYGET, &dp, res, ei, caller); + return hres; +} + +static HRESULT function_apply(func_disp_t *func, DISPPARAMS *dp, LCID lcid, VARIANT *res, EXCEPINFO *ei, IServiceProvider *caller) +{ + IWineJSDispatchHost *this_iface; + DISPPARAMS params = { 0 }; + IDispatchEx *array = NULL; + UINT argc = 0; + VARIANT *arg; + HRESULT hres; + + arg = dp->rgvarg + dp->cArgs - 1; + if(dp->cArgs < 1 || V_VT(arg) != VT_DISPATCH || !V_DISPATCH(arg)) + return CTL_E_ILLEGALFUNCTIONCALL; + + hres = IDispatch_QueryInterface(V_DISPATCH(arg), &IID_IWineJSDispatchHost, (void**)&this_iface); + if(FAILED(hres)) + return CTL_E_ILLEGALFUNCTIONCALL; + + if(dp->cArgs >= 2) { + VARIANT length; + + arg--; + if(V_VT(arg) != VT_DISPATCH) { + hres = CTL_E_ILLEGALFUNCTIONCALL; + goto fail; + } + + /* FIXME: Native checks if it's an acual JS array. */ + hres = IDispatch_QueryInterface(V_DISPATCH(arg), &IID_IDispatchEx, (void**)&array); + if(FAILED(hres)) + goto fail; + + V_VT(&length) = VT_EMPTY; + hres = get_disp_prop(array, L"length", lcid, &length, ei, caller); + if(FAILED(hres)) { + if(hres == DISP_E_UNKNOWNNAME) + hres = CTL_E_ILLEGALFUNCTIONCALL; + goto fail; + } + if(V_VT(&length) != VT_I4) { + VARIANT tmp = length; + hres = change_type(&length, &tmp, VT_I4, caller); + if(FAILED(hres)) { + hres = CTL_E_ILLEGALFUNCTIONCALL; + goto fail; + } + } + if(V_I4(&length) < 0) { + hres = CTL_E_ILLEGALFUNCTIONCALL; + goto fail; + } + params.cArgs = V_I4(&length); + + /* alloc new params */ + if(params.cArgs) { + if(!(params.rgvarg = malloc(params.cArgs * sizeof(VARIANTARG)))) { + hres = E_OUTOFMEMORY; + goto fail; + } + for(argc = 0; argc < params.cArgs; argc++) { + WCHAR buf[12]; + + arg = params.rgvarg + params.cArgs - argc - 1; + swprintf(buf, ARRAY_SIZE(buf), L"%u", argc); + hres = get_disp_prop(array, buf, lcid, arg, ei, caller); + if(FAILED(hres)) { + if(hres == DISP_E_UNKNOWNNAME) { + V_VT(arg) = VT_EMPTY; + continue; + } + goto fail; + } + } + } + } + + hres = IWineJSDispatchHost_CallFunction(this_iface, func->info->id, func->info->tid, ¶ms, res, ei, caller); + +fail: + while(argc--) + VariantClear(¶ms.rgvarg[params.cArgs - argc - 1]); + free(params.rgvarg); + if(array) + IDispatchEx_Release(array); + IWineJSDispatchHost_Release(this_iface); + return hres == E_UNEXPECTED ? CTL_E_ILLEGALFUNCTIONCALL : hres; +} + static HRESULT function_call(func_disp_t *func, DISPPARAMS *dp, LCID lcid, VARIANT *res, EXCEPINFO *ei, IServiceProvider *caller) { DISPPARAMS params = { dp->rgvarg, NULL, dp->cArgs - 1, 0 }; @@ -823,6 +927,7 @@ static const struct { const WCHAR *name; HRESULT (*invoke)(func_disp_t*,DISPPARAMS*,LCID,VARIANT*,EXCEPINFO*,IServiceProvider*); } function_props[] = { + { L"apply", function_apply }, { L"call", function_call } };
diff --git a/dlls/mshtml/tests/documentmode.js b/dlls/mshtml/tests/documentmode.js index 327d744f00d..c8ce01b0443 100644 --- a/dlls/mshtml/tests/documentmode.js +++ b/dlls/mshtml/tests/documentmode.js @@ -402,6 +402,21 @@ sync_test("builtin_obj", function() { elem2.onclick = function() { clicked = true; }; elem1.click.call(elem2); ok(clicked === true, "elem2.onclick not called"); + + elem1 = f.apply(document, ["div"]); + elem2 = f.apply(document, ["br"]); + document.body.appendChild(elem1); + document.body.appendChild(elem2); + elem1.onclick = function() { ok(false, "unexpected elem1.onclick"); }; + clicked = false; + elem2.onclick = function() { clicked = true; }; + elem1.click.apply(elem2); + ok(clicked === true, "elem2.onclick not called"); + + try { + elem1.click.apply(elem2, { length: -1 }); + ok(false, "exception expected"); + }catch(ex) {} });
sync_test("elem_props", function() {
Hi,
It looks like your patch introduced the new failures shown below. Please investigate and fix them before resubmitting your patch. If they are not new, fixing them anyway would help a lot. Otherwise please ask for the known failures list to be updated.
The tests also ran into some preexisting test failures. If you know how to fix them that would be helpful. See the TestBot job for the details:
The full results can be found at: https://testbot.winehq.org/JobDetails.pl?Key=146427
Your paranoid android.
=== w7u_el (32 bit report) ===
mshtml: script.c:1223: Test failed: L"/index.html?dom.js:document_lastModified: lastModified too far from navigationStart: 1216"