From: Jacek Caban jacek@codeweavers.com
Based on patch by Gabriel Ivăncescu. --- dlls/mshtml/dispex.c | 102 ++++++++++++++++++++++++++- dlls/mshtml/htmlwindow.c | 55 +++++++++++++++ dlls/mshtml/mshtml_private.h | 1 + dlls/mshtml/mshtml_private_iface.idl | 10 --- 4 files changed, 156 insertions(+), 12 deletions(-)
diff --git a/dlls/mshtml/dispex.c b/dlls/mshtml/dispex.c index 2e436b364c4..a5526f2901c 100644 --- a/dlls/mshtml/dispex.c +++ b/dlls/mshtml/dispex.c @@ -2243,7 +2243,90 @@ 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, +static HRESULT WINAPI JSDispatchHost_GetJSDispatch(IWineJSDispatchHost *iface, IWineJSDispatch **ret) +{ + DispatchEx *This = impl_from_IWineJSDispatchHost(iface); + FIXME("%p\n", This); + return E_NOINTERFACE; +} + +static HRESULT WINAPI JSDispatchHost_LookupProperty(IWineJSDispatchHost *iface, const WCHAR *name, DWORD flags, + struct property_info *desc) +{ + DispatchEx *This = impl_from_IWineJSDispatchHost(iface); + func_info_t *func; + DISPID id; + HRESULT hres; + + TRACE("%s (%p)->(%s)\n", This->info->desc->name, This, debugstr_w(name)); + + /* FIXME: name cast works as long as the object doesn't require the actual BSTR for its custom + * properties, we will need to fix it properly. */ + hres = get_builtin_id(This, (BSTR)name, flags, &id); + if(FAILED(hres)) + return hres; + + hres = get_builtin_func(This->info, id, &func); + if(FAILED(hres)) + return hres; + desc->id = id; + desc->flags = PROPF_WRITABLE | PROPF_CONFIGURABLE; + if(func->func_disp_idx < 0) + desc->flags |= PROPF_ENUMERABLE; + desc->name = func->name; + return S_OK; +} + +static HRESULT WINAPI JSDispatchHost_NextProperty(IWineJSDispatchHost *iface, DISPID id, struct property_info *desc) +{ + DispatchEx *This = impl_from_IWineJSDispatchHost(iface); + func_info_t *func; + HRESULT hres; + + TRACE("%s (%p)->(%lx)\n", This->info->desc->name, This, id); + + if(id == DISPID_STARTENUM) { + func = This->info->funcs; + }else { + hres = get_builtin_func(This->info, id, &func); + if(FAILED(hres)) + return hres; + func++; + } + + while(func < This->info->funcs + This->info->func_cnt) { + if(func->func_disp_idx == -1) { + desc->id = func->id; + desc->name = func->name; + desc->flags = PROPF_WRITABLE | PROPF_CONFIGURABLE | PROPF_ENUMERABLE; + return S_OK; + } + func++; + } + return S_FALSE; +} + +static HRESULT WINAPI JSDispatchHost_GetProperty(IWineJSDispatchHost *iface, DISPID id, LCID lcid, VARIANT *r, + EXCEPINFO *ei, IServiceProvider *caller) +{ + DispatchEx *This = impl_from_IWineJSDispatchHost(iface); + + TRACE("%s (%p)->(%lx)\n", This->info->desc->name, This, id); + + return dispex_prop_get(This, id, lcid, r, ei, caller); +} + +static HRESULT WINAPI JSDispatchHost_SetProperty(IWineJSDispatchHost *iface, DISPID id, LCID lcid, VARIANT *v, + EXCEPINFO *ei, IServiceProvider *caller) +{ + DispatchEx *This = impl_from_IWineJSDispatchHost(iface); + + TRACE("%s (%p)->(%lx)\n", This->info->desc->name, This, id); + + return dispex_prop_put(This, id, lcid, v, ei, caller); +} + +static HRESULT WINAPI JSDispatchHost_CallFunction(IWineJSDispatchHost *iface, DISPID id, UINT32 iid, DISPPARAMS *dp, VARIANT *ret, EXCEPINFO *ei, IServiceProvider *caller) { DispatchEx *This = impl_from_IWineJSDispatchHost(iface); @@ -2260,6 +2343,15 @@ static HRESULT WINAPI DispatchEx_CallFunction(IWineJSDispatchHost *iface, DISPID return call_builtin_function(This, func, dp, ret, ei, caller); }
+static HRESULT WINAPI JSDispatchHost_ToString(IWineJSDispatchHost *iface, BSTR *str) +{ + DispatchEx *This = impl_from_IWineJSDispatchHost(iface); + + TRACE("%s (%p)\n", This->info->desc->name, This); + + return dispex_to_string(This, str); +} + static IWineJSDispatchHostVtbl JSDispatchHostVtbl = { DispatchEx_QueryInterface, DispatchEx_AddRef, @@ -2276,7 +2368,13 @@ static IWineJSDispatchHostVtbl JSDispatchHostVtbl = { DispatchEx_GetMemberName, DispatchEx_GetNextDispID, DispatchEx_GetNameSpaceParent, - DispatchEx_CallFunction, + JSDispatchHost_GetJSDispatch, + JSDispatchHost_LookupProperty, + JSDispatchHost_NextProperty, + JSDispatchHost_GetProperty, + JSDispatchHost_SetProperty, + JSDispatchHost_CallFunction, + JSDispatchHost_ToString, };
static nsresult NSAPI dispex_traverse(void *ccp, void *p, nsCycleCollectionTraversalCallback *cb) diff --git a/dlls/mshtml/htmlwindow.c b/dlls/mshtml/htmlwindow.c index cf0920783d7..59abd1a857e 100644 --- a/dlls/mshtml/htmlwindow.c +++ b/dlls/mshtml/htmlwindow.c @@ -3440,6 +3440,48 @@ static HRESULT WINAPI WindowDispEx_GetNameSpaceParent(IWineJSDispatchHost *iface return S_OK; }
+static HRESULT WINAPI WindowDispEx_GetJSDispatch(IWineJSDispatchHost *iface, IWineJSDispatch **ret) +{ + HTMLOuterWindow *This = impl_from_IWineJSDispatchHost(iface); + + return IWineJSDispatchHost_GetJSDispatch(&This->base.inner_window->event_target.dispex.IWineJSDispatchHost_iface, ret); +} + +static HRESULT WINAPI WindowDispEx_LookupProperty(IWineJSDispatchHost *iface, const WCHAR *name, DWORD flags, + struct property_info *desc) +{ + HTMLOuterWindow *This = impl_from_IWineJSDispatchHost(iface); + + return IWineJSDispatchHost_LookupProperty(&This->base.inner_window->event_target.dispex.IWineJSDispatchHost_iface, + name, flags, desc); +} + +static HRESULT WINAPI WindowDispEx_NextProperty(IWineJSDispatchHost *iface, DISPID id, struct property_info *desc) +{ + HTMLOuterWindow *This = impl_from_IWineJSDispatchHost(iface); + + return IWineJSDispatchHost_NextProperty(&This->base.inner_window->event_target.dispex.IWineJSDispatchHost_iface, + id, desc); +} + +static HRESULT WINAPI WindowDispEx_GetProperty(IWineJSDispatchHost *iface, DISPID id, LCID lcid, VARIANT *r, + EXCEPINFO *ei, IServiceProvider *caller) +{ + HTMLOuterWindow *This = impl_from_IWineJSDispatchHost(iface); + + return IWineJSDispatchHost_GetProperty(&This->base.inner_window->event_target.dispex.IWineJSDispatchHost_iface, + id, lcid, r, ei, caller); +} + +static HRESULT WINAPI WindowDispEx_SetProperty(IWineJSDispatchHost *iface, DISPID id, LCID lcid, VARIANT *v, + EXCEPINFO *ei, IServiceProvider *caller) +{ + HTMLOuterWindow *This = impl_from_IWineJSDispatchHost(iface); + + return IWineJSDispatchHost_SetProperty(&This->base.inner_window->event_target.dispex.IWineJSDispatchHost_iface, + id, lcid, v, ei, caller); +} + static HRESULT WINAPI WindowDispEx_CallFunction(IWineJSDispatchHost *iface, DISPID id, UINT32 iid, DISPPARAMS *dp, VARIANT *ret, EXCEPINFO *ei, IServiceProvider *caller) { @@ -3449,6 +3491,13 @@ static HRESULT WINAPI WindowDispEx_CallFunction(IWineJSDispatchHost *iface, DISP id, iid, dp, ret, ei, caller); }
+static HRESULT WINAPI WindowDispEx_ToString(IWineJSDispatchHost *iface, BSTR *str) +{ + HTMLOuterWindow *This = impl_from_IWineJSDispatchHost(iface); + + return IWineJSDispatchHost_ToString(&This->base.inner_window->event_target.dispex.IWineJSDispatchHost_iface, str); +} + static const IWineJSDispatchHostVtbl WindowDispExVtbl = { WindowDispEx_QueryInterface, WindowDispEx_AddRef, @@ -3465,7 +3514,13 @@ static const IWineJSDispatchHostVtbl WindowDispExVtbl = { WindowDispEx_GetMemberName, WindowDispEx_GetNextDispID, WindowDispEx_GetNameSpaceParent, + WindowDispEx_GetJSDispatch, + WindowDispEx_LookupProperty, + WindowDispEx_NextProperty, + WindowDispEx_GetProperty, + WindowDispEx_SetProperty, WindowDispEx_CallFunction, + WindowDispEx_ToString, };
static inline HTMLOuterWindow *impl_from_IEventTarget(IEventTarget *iface) diff --git a/dlls/mshtml/mshtml_private.h b/dlls/mshtml/mshtml_private.h index 1a8c666ae57..8520c2711eb 100644 --- a/dlls/mshtml/mshtml_private.h +++ b/dlls/mshtml/mshtml_private.h @@ -40,6 +40,7 @@ #include "nsiface.h"
#include "mshtml_private_iface.h" +#include "../jscript/jsdisp.h"
#include <assert.h>
diff --git a/dlls/mshtml/mshtml_private_iface.idl b/dlls/mshtml/mshtml_private_iface.idl index f4292e298d0..503593d1c25 100644 --- a/dlls/mshtml/mshtml_private_iface.idl +++ b/dlls/mshtml/mshtml_private_iface.idl @@ -258,13 +258,3 @@ interface IWineXMLHttpRequestPrivate : IDispatch }
} /* library MSHTML_private */ - -[ - object, - uuid(d359f2fe-5531-741b-a41a-5cf92edc971b), - local -] -interface IWineJSDispatchHost : IDispatchEx -{ - HRESULT CallFunction(DISPID id, UINT32 iid, DISPPARAMS *dp, VARIANT *ret, EXCEPINFO *ei, IServiceProvider *caller); -}