From: Gabriel Ivăncescu gabrielopcode@gmail.com
fdexEnumAll is useless.
Signed-off-by: Gabriel Ivăncescu gabrielopcode@gmail.com --- dlls/jscript/dispex.c | 22 +++++++++++++++++++ dlls/jscript/jscript.c | 7 ++++++ dlls/jscript/jscript.h | 1 + dlls/jscript/jsdisp.idl | 1 + dlls/jscript/tests/run.c | 44 ++++++++++++++++++++++++++++++++++++++ dlls/mshtml/htmlwindow.c | 4 ++++ dlls/mshtml/tests/script.c | 25 +++++++++++++++++++++- 7 files changed, 103 insertions(+), 1 deletion(-)
diff --git a/dlls/jscript/dispex.c b/dlls/jscript/dispex.c index 110c021b6b8..3b475237970 100644 --- a/dlls/jscript/dispex.c +++ b/dlls/jscript/dispex.c @@ -3632,3 +3632,25 @@ IWineJSDispatchHost *get_host_dispatch(IDispatch *disp) IWineJSDispatchHost_GetOuterDispatch(host_obj->host_iface, &ret); return ret; } + +HRESULT fill_globals(script_ctx_t *ctx, IWineJSDispatchHost *script_global) +{ + jsdisp_t *global = ctx->global; + DISPID id = DISPID_STARTENUM; + struct property_info desc; + HRESULT hres; + + for(;;) { + hres = jsdisp_next_prop(global, id, JSDISP_ENUM_OWN, &id); + if(hres == S_FALSE) + break; + if(FAILED(hres)) + return hres; + + hres = IWineJSDispatchHost_LookupProperty(script_global, get_prop(global, id)->name, fdexNameCaseSensitive, &desc); + if(FAILED(hres)) + return hres; + } + + return S_OK; +} diff --git a/dlls/jscript/jscript.c b/dlls/jscript/jscript.c index 9a74d010ab5..a7f468a677a 100644 --- a/dlls/jscript/jscript.c +++ b/dlls/jscript/jscript.c @@ -1465,12 +1465,19 @@ static HRESULT WINAPI WineJScript_InitHostConstructor(IWineJScript *iface, IWine return init_host_constructor(This->ctx, constr, method_name, ret); }
+static HRESULT WINAPI WineJScript_FillGlobals(IWineJScript *iface, IWineJSDispatchHost *script_global) +{ + JScript *This = impl_from_IWineJScript(iface); + return fill_globals(This->ctx, script_global); +} + static const IWineJScriptVtbl WineJScriptVtbl = { WineJScript_QueryInterface, WineJScript_AddRef, WineJScript_Release, WineJScript_InitHostObject, WineJScript_InitHostConstructor, + WineJScript_FillGlobals, };
HRESULT create_jscript_object(BOOL is_encode, REFIID riid, void **ppv) diff --git a/dlls/jscript/jscript.h b/dlls/jscript/jscript.h index 4f21cae941b..a3009239ba1 100644 --- a/dlls/jscript/jscript.h +++ b/dlls/jscript/jscript.h @@ -243,6 +243,7 @@ HRESULT init_dispex(jsdisp_t*,script_ctx_t*,const builtin_info_t*,jsdisp_t*); HRESULT init_dispex_from_constr(jsdisp_t*,script_ctx_t*,const builtin_info_t*,jsdisp_t*); HRESULT init_host_object(script_ctx_t*,IWineJSDispatchHost*,IWineJSDispatch*,UINT32,IWineJSDispatch**); HRESULT init_host_constructor(script_ctx_t*,IWineJSDispatchHost*,const WCHAR*,IWineJSDispatch**); +HRESULT fill_globals(script_ctx_t*,IWineJSDispatchHost*);
HRESULT disp_call(script_ctx_t*,IDispatch*,DISPID,WORD,unsigned,jsval_t*,jsval_t*); HRESULT disp_call_name(script_ctx_t*,IDispatch*,const WCHAR*,WORD,unsigned,jsval_t*,jsval_t*); diff --git a/dlls/jscript/jsdisp.idl b/dlls/jscript/jsdisp.idl index a96214a98b6..2eaadf44f94 100644 --- a/dlls/jscript/jsdisp.idl +++ b/dlls/jscript/jsdisp.idl @@ -86,4 +86,5 @@ interface IWineJScript : IUnknown { HRESULT InitHostObject(IWineJSDispatchHost *host_obj, IWineJSDispatch *prototype, UINT32 flags, IWineJSDispatch **ret); HRESULT InitHostConstructor(IWineJSDispatchHost *constr, const WCHAR *method_name, IWineJSDispatch **ret); + HRESULT FillGlobals(IWineJSDispatchHost *script_global); } diff --git a/dlls/jscript/tests/run.c b/dlls/jscript/tests/run.c index 106fd8c99d4..5d555b05eb0 100644 --- a/dlls/jscript/tests/run.c +++ b/dlls/jscript/tests/run.c @@ -3720,6 +3720,49 @@ static void test_members(void) IActiveScript_Release(script); }
+static void test_enum(void) +{ + DISPID id = DISPID_STARTENUM; + IActiveScriptParse *parser; + IActiveScript *engine; + IDispatchEx *dispex; + IDispatch *disp; + HRESULT hres; + + engine = create_script(); + + hres = IActiveScript_QueryInterface(engine, &IID_IActiveScriptParse, (void**)&parser); + ok(hres == S_OK, "Could not get IActiveScriptParse: %08lx\n", hres); + + hres = IActiveScriptParse_InitNew(parser); + ok(hres == S_OK, "InitNew failed: %08lx\n", hres); + IActiveScriptParse_Release(parser); + + hres = IActiveScript_SetScriptSite(engine, &ActiveScriptSite); + ok(hres == S_OK, "SetScriptSite failed: %08lx\n", hres); + + hres = IActiveScript_SetScriptState(engine, SCRIPTSTATE_STARTED); + ok(hres == S_OK, "SetScriptState(SCRIPTSTATE_STARTED) failed: %08lx\n", hres); + + hres = IActiveScript_GetScriptDispatch(engine, NULL, &disp); + ok(hres == S_OK, "GetScriptDispatch failed: %08lx\n", hres); + ok(disp != NULL, "script disp == NULL\n"); + + hres = IDispatch_QueryInterface(disp, &IID_IDispatchEx, (void**)&dispex); + ok(hres == S_OK, "Could not get IDispatchEx iface: %08lx\n", hres); + IDispatch_Release(disp); + + hres = IDispatchEx_GetNextDispID(dispex, 0, id, &id); + ok(hres == S_FALSE, "GetNextDispID returned: %08lx\n", hres); + + id = DISPID_STARTENUM; + hres = IDispatchEx_GetNextDispID(dispex, fdexEnumAll, id, &id); + ok(hres == S_FALSE, "GetNextDispID returned: %08lx\n", hres); + + IDispatchEx_Release(dispex); + close_script(engine); +} + static void test_destructors(void) { static const WCHAR cyclic_refs[] = L"(function() {\n" @@ -4379,6 +4422,7 @@ static BOOL run_tests(void) test_script_exprs(); test_invokeex(); test_members(); + test_enum(); test_destructors(); test_eval(); test_error_reports(); diff --git a/dlls/mshtml/htmlwindow.c b/dlls/mshtml/htmlwindow.c index bc4964f8b3f..de31da6fa48 100644 --- a/dlls/mshtml/htmlwindow.c +++ b/dlls/mshtml/htmlwindow.c @@ -4053,6 +4053,10 @@ static HRESULT HTMLWindow_fill_props(DispatchEx *dispex) This->static_props_filled = TRUE; }
+ hres = IWineJScript_FillGlobals(This->jscript, &This->event_target.dispex.IWineJSDispatchHost_iface); + if(FAILED(hres)) + return hres; + return S_FALSE; }
diff --git a/dlls/mshtml/tests/script.c b/dlls/mshtml/tests/script.c index f454de86711..2c0c907a9f4 100644 --- a/dlls/mshtml/tests/script.c +++ b/dlls/mshtml/tests/script.c @@ -319,11 +319,15 @@ fail:
static void test_sp_caller(IServiceProvider *sp) { + BOOL seen_doc, seen_undefined; IOleCommandTarget *cmdtarget; IServiceProvider *caller; IHTMLWindow2 *window; + IDispatchEx *dispex; HRESULT hres; VARIANT var; + DISPID id; + BSTR str;
hres = IServiceProvider_QueryService(sp, &SID_GetCaller, &IID_IServiceProvider, (void**)&caller); ok(hres == S_OK, "QueryService(SID_GetCaller) returned: %08lx\n", hres); @@ -343,8 +347,27 @@ static void test_sp_caller(IServiceProvider *sp) hres = IDispatch_QueryInterface(V_DISPATCH(&var), &IID_IHTMLWindow2, (void**)&window); ok(hres == S_OK, "QueryInterface(IHTMLWindow2) failed: %08lx\n", hres); ok(window != NULL, "window is NULL\n"); - IHTMLWindow2_Release(window); VariantClear(&var); + + hres = IHTMLWindow2_QueryInterface(window, &IID_IDispatchEx, (void**)&dispex); + ok(hres == S_OK, "Could not get IDispatchEx iface: %08lx\n", hres); + IHTMLWindow2_Release(window); + + for(id = DISPID_STARTENUM, seen_doc = FALSE, seen_undefined = FALSE;;) { + hres = IDispatchEx_GetNextDispID(dispex, fdexEnumAll, id, &id); + if(hres == S_FALSE) break; + ok(hres == S_OK, "GetNextDispID failed: %08lx\n", hres); + + hres = IDispatchEx_GetMemberName(dispex, id, &str); + ok(hres == S_OK, "GetMemberName failed: %08lx\n", hres); + if(!wcscmp(str, L"document")) seen_doc = TRUE; + if(!wcscmp(str, L"undefined")) seen_undefined = TRUE; + SysFreeString(str); + } + ok(seen_doc, "document was not enumerated from window\n"); + ok(!seen_undefined, "undefined was enumerated from window\n"); + + IDispatchEx_Release(dispex); }
static void test_script_vars(unsigned argc, VARIANTARG *argv)