From: Jacek Caban jacek@codeweavers.com
--- dlls/jscript/dispex.c | 27 ++++++++++++++++++++++++--- dlls/jscript/jscript.h | 1 + dlls/jscript/jsdisp.idl | 3 +++ dlls/mshtml/dispex.c | 28 ++++++++++++++++++++++++---- dlls/mshtml/htmlwindow.c | 8 ++++++++ 5 files changed, 60 insertions(+), 7 deletions(-)
diff --git a/dlls/jscript/dispex.c b/dlls/jscript/dispex.c index da9594a5e6e..ec256c8643c 100644 --- a/dlls/jscript/dispex.c +++ b/dlls/jscript/dispex.c @@ -3303,14 +3303,26 @@ HRESULT jsdisp_change_prototype(jsdisp_t *obj, jsdisp_t *proto) return S_OK; }
+static void set_prop_flags(jsdisp_t *obj, dispex_prop_t *prop, UINT32 flags) +{ + if(prop->type == PROP_EXTERN && obj->builtin_info->prop_config) { + HRESULT hres = obj->builtin_info->prop_config(obj, prop->u.id, flags); + if(hres != S_OK) + return; + } + prop->flags = (prop->flags & ~PROPF_PUBLIC_MASK) | flags; +} + void jsdisp_freeze(jsdisp_t *obj, BOOL seal) { unsigned int i;
+ fill_props(obj); for(i = 0; i < obj->prop_cnt; i++) { + unsigned int mask = PROPF_CONFIGURABLE; if(!seal && obj->props[i].type == PROP_JSVAL) - obj->props[i].flags &= ~PROPF_WRITABLE; - obj->props[i].flags &= ~PROPF_CONFIGURABLE; + mask |= PROPF_WRITABLE; + set_prop_flags(obj, &obj->props[i], obj->props[i].flags & PROPF_PUBLIC_MASK & ~mask); }
obj->extensible = FALSE; @@ -3322,9 +3334,10 @@ BOOL jsdisp_is_frozen(jsdisp_t *obj, BOOL sealed)
if(obj->extensible) return FALSE; + fill_props(obj);
for(i = 0; i < obj->prop_cnt; i++) { - if(obj->props[i].type == PROP_JSVAL) { + if(obj->props[i].type == PROP_JSVAL || obj->props[i].type == PROP_EXTERN) { if(!sealed && (obj->props[i].flags & PROPF_WRITABLE)) return FALSE; }else if(obj->props[i].type != PROP_ACCESSOR) @@ -3429,6 +3442,13 @@ static HRESULT HostObject_prop_delete(jsdisp_t *jsdisp, unsigned id) return IWineJSDispatchHost_DeleteProperty(This->host_iface, id); }
+static HRESULT HostObject_prop_config(jsdisp_t *jsdisp, unsigned id, unsigned flags) +{ + HostObject *This = HostObject_from_jsdisp(jsdisp); + + return IWineJSDispatchHost_ConfigureProperty(This->host_iface, id, flags); +} + static HRESULT HostObject_to_string(jsdisp_t *jsdisp, jsstr_t **ret) { HostObject *This = HostObject_from_jsdisp(jsdisp); @@ -3453,6 +3473,7 @@ static const builtin_info_t HostObject_info = { .prop_put = HostObject_prop_put, .next_prop = HostObject_next_prop, .prop_delete = HostObject_prop_delete, + .prop_config = HostObject_prop_config, .to_string = HostObject_to_string, };
diff --git a/dlls/jscript/jscript.h b/dlls/jscript/jscript.h index 3642bf171c8..48738ca82f4 100644 --- a/dlls/jscript/jscript.h +++ b/dlls/jscript/jscript.h @@ -191,6 +191,7 @@ typedef struct { HRESULT (*prop_get)(jsdisp_t*,unsigned,jsval_t*); HRESULT (*prop_put)(jsdisp_t*,unsigned,jsval_t); HRESULT (*prop_delete)(jsdisp_t*,unsigned); + HRESULT (*prop_config)(jsdisp_t*,unsigned,unsigned); HRESULT (*to_string)(jsdisp_t*,jsstr_t**); HRESULT (*gc_traverse)(struct gc_ctx*,enum gc_traverse_op,jsdisp_t*); } builtin_info_t; diff --git a/dlls/jscript/jsdisp.idl b/dlls/jscript/jsdisp.idl index 4030a0110a3..a2b8762b2c0 100644 --- a/dlls/jscript/jsdisp.idl +++ b/dlls/jscript/jsdisp.idl @@ -34,6 +34,8 @@ const unsigned int PROPF_ENUMERABLE = 0x0400; const unsigned int PROPF_WRITABLE = 0x0800; const unsigned int PROPF_CONFIGURABLE = 0x1000;
+const unsigned int PROPF_PUBLIC_MASK = PROPF_ENUMERABLE | PROPF_WRITABLE | PROPF_CONFIGURABLE; + interface IWineJSDispatchHost;
[ @@ -60,6 +62,7 @@ interface IWineJSDispatchHost : IDispatchEx HRESULT GetProperty(DISPID id, LCID lcid, VARIANT *r, EXCEPINFO *ei, IServiceProvider *caller); HRESULT SetProperty(DISPID id, LCID lcid, VARIANT *v, EXCEPINFO *ei, IServiceProvider *caller); HRESULT DeleteProperty(DISPID id); + HRESULT ConfigureProperty(DISPID id, UINT32 flags); HRESULT CallFunction(DISPID id, UINT32 iid, DISPPARAMS *dp, VARIANT *ret, EXCEPINFO *ei, IServiceProvider *caller); HRESULT ToString(BSTR *str); } diff --git a/dlls/mshtml/dispex.c b/dlls/mshtml/dispex.c index 93dfe95c760..2e4cf244a87 100644 --- a/dlls/mshtml/dispex.c +++ b/dlls/mshtml/dispex.c @@ -680,7 +680,7 @@ static HRESULT alloc_dynamic_prop(DispatchEx *This, const WCHAR *name, dynamic_p return E_OUTOFMEMORY;
VariantInit(&prop->var); - prop->flags = 0; + prop->flags = PROPF_WRITABLE | PROPF_CONFIGURABLE | PROPF_ENUMERABLE; data->prop_cnt++; *ret = prop; return S_OK; @@ -2354,11 +2354,13 @@ static HRESULT get_host_property_descriptor(DispatchEx *This, DISPID id, struct } break; } - case DISPEXPROP_DYNAMIC: - desc->flags = PROPF_WRITABLE | PROPF_CONFIGURABLE | PROPF_ENUMERABLE; - desc->name = This->dynamic_data->props[id - DISPID_DYNPROP_0].name; + case DISPEXPROP_DYNAMIC: { + dynamic_prop_t *prop = &This->dynamic_data->props[id - DISPID_DYNPROP_0]; + desc->flags = prop->flags & PROPF_PUBLIC_MASK; + desc->name = prop->name; desc->func_iid = 0; break; + } case DISPEXPROP_CUSTOM: return This->info->desc->vtbl->get_prop_desc(This, id, desc); } @@ -2441,6 +2443,23 @@ static HRESULT WINAPI JSDispatchHost_DeleteProperty(IWineJSDispatchHost *iface, return dispex_prop_delete(This, id); }
+static HRESULT WINAPI JSDispatchHost_ConfigureProperty(IWineJSDispatchHost *iface, DISPID id, UINT32 flags) +{ + DispatchEx *This = impl_from_IWineJSDispatchHost(iface); + + TRACE("%s (%p)->(%lx %x)\n", This->info->desc->name, This, id, flags); + + if(is_dynamic_dispid(id)) { + DWORD idx = id - DISPID_DYNPROP_0; + if(This->dynamic_data && idx < This->dynamic_data->prop_cnt) { + dynamic_prop_t *prop = &This->dynamic_data->props[idx]; + prop->flags = (prop->flags & ~PROPF_PUBLIC_MASK) | flags; + } + } + + return S_OK; +} + static HRESULT WINAPI JSDispatchHost_CallFunction(IWineJSDispatchHost *iface, DISPID id, UINT32 iid, DISPPARAMS *dp, VARIANT *ret, EXCEPINFO *ei, IServiceProvider *caller) { @@ -2489,6 +2508,7 @@ static IWineJSDispatchHostVtbl JSDispatchHostVtbl = { JSDispatchHost_GetProperty, JSDispatchHost_SetProperty, JSDispatchHost_DeleteProperty, + JSDispatchHost_ConfigureProperty, JSDispatchHost_CallFunction, JSDispatchHost_ToString, }; diff --git a/dlls/mshtml/htmlwindow.c b/dlls/mshtml/htmlwindow.c index 41bef9c7fcf..c40d3fe889b 100644 --- a/dlls/mshtml/htmlwindow.c +++ b/dlls/mshtml/htmlwindow.c @@ -3492,6 +3492,13 @@ static HRESULT WINAPI WindowDispEx_DeleteProperty(IWineJSDispatchHost *iface, DI return IWineJSDispatchHost_DeleteProperty(&This->base.inner_window->event_target.dispex.IWineJSDispatchHost_iface, id); }
+static HRESULT WINAPI WindowDispEx_ConfigureProperty(IWineJSDispatchHost *iface, DISPID id, UINT32 flags) +{ + HTMLOuterWindow *This = impl_from_IWineJSDispatchHost(iface); + + return IWineJSDispatchHost_ConfigureProperty(&This->base.inner_window->event_target.dispex.IWineJSDispatchHost_iface, id, flags); +} + static HRESULT WINAPI WindowDispEx_CallFunction(IWineJSDispatchHost *iface, DISPID id, UINT32 iid, DISPPARAMS *dp, VARIANT *ret, EXCEPINFO *ei, IServiceProvider *caller) { @@ -3530,6 +3537,7 @@ static const IWineJSDispatchHostVtbl WindowDispExVtbl = { WindowDispEx_GetProperty, WindowDispEx_SetProperty, WindowDispEx_DeleteProperty, + WindowDispEx_ConfigureProperty, WindowDispEx_CallFunction, WindowDispEx_ToString, };