From: Jacek Caban jacek@codeweavers.com
Based on patch by Gabriel Ivăncescu. --- dlls/jscript/dispex.c | 3 ++- dlls/mshtml/dispex.c | 2 +- dlls/mshtml/htmlwindow.c | 22 ++++++++--------- dlls/mshtml/script.c | 41 ++++++++++++++++++++----------- dlls/mshtml/tests/documentmode.js | 2 +- dlls/mshtml/tests/es5.js | 2 -- 6 files changed, 41 insertions(+), 31 deletions(-)
diff --git a/dlls/jscript/dispex.c b/dlls/jscript/dispex.c index bd509a2e6f2..95954866345 100644 --- a/dlls/jscript/dispex.c +++ b/dlls/jscript/dispex.c @@ -2362,7 +2362,8 @@ static HRESULT WINAPI WineJSDispatch_GetScriptGlobal(IWineJSDispatch *iface, IWi if(!(disp = lookup_global_host(This->ctx))) return E_NOINTERFACE;
- return IDispatch_QueryInterface(disp, &IID_IWineJSDispatchHost, (void **)ret); + *ret = get_host_dispatch(disp); + return S_OK; }
static IWineJSDispatchVtbl DispatchExVtbl = { diff --git a/dlls/mshtml/dispex.c b/dlls/mshtml/dispex.c index 57c9cf8bcf5..f26789f49e7 100644 --- a/dlls/mshtml/dispex.c +++ b/dlls/mshtml/dispex.c @@ -1730,7 +1730,7 @@ static dispex_data_t *ensure_dispex_info(DispatchEx *dispex, dispex_static_data_ if(compat_mode >= COMPAT_MODE_IE9 && script_global) { if(!script_global->jscript) initialize_script_global(script_global); - if(script_global->jscript) { + if(script_global->jscript && !dispex->jsdisp) { hres = IWineJScript_InitHostObject(script_global->jscript, &dispex->IWineJSDispatchHost_iface, &dispex->jsdisp); if(FAILED(hres)) diff --git a/dlls/mshtml/htmlwindow.c b/dlls/mshtml/htmlwindow.c index 27d99f19ff6..a428158f4ac 100644 --- a/dlls/mshtml/htmlwindow.c +++ b/dlls/mshtml/htmlwindow.c @@ -2151,17 +2151,14 @@ static IHTMLWindow2 *get_source_window(IServiceProvider *caller, compat_mode_t c if(hres != S_OK) cmdtarget = NULL;
- if(compat_mode < COMPAT_MODE_IE9) { - /* Legacy modes query caller unconditionally, and use it instead, if it has a command target */ - hres = IServiceProvider_QueryService(caller, &SID_GetCaller, &IID_IServiceProvider, (void**)&parent); - if(hres == S_OK && parent) { - hres = IServiceProvider_QueryService(parent, &IID_IActiveScriptSite, &IID_IOleCommandTarget, (void**)&parent_cmdtarget); - IServiceProvider_Release(parent); - if(hres == S_OK && parent_cmdtarget) { - if(cmdtarget) - IOleCommandTarget_Release(cmdtarget); - cmdtarget = parent_cmdtarget; - } + hres = IServiceProvider_QueryService(caller, &SID_GetCaller, &IID_IServiceProvider, (void**)&parent); + if(hres == S_OK && parent) { + hres = IServiceProvider_QueryService(parent, &IID_IActiveScriptSite, &IID_IOleCommandTarget, (void**)&parent_cmdtarget); + IServiceProvider_Release(parent); + if(hres == S_OK && parent_cmdtarget) { + if(cmdtarget) + IOleCommandTarget_Release(cmdtarget); + cmdtarget = parent_cmdtarget; } }
@@ -3966,6 +3963,7 @@ HRESULT HTMLWindow_get_prop_desc(DispatchEx *dispex, DISPID id, struct property_ static compat_mode_t HTMLWindow_get_compat_mode(DispatchEx *dispex, HTMLInnerWindow **script_global) { HTMLInnerWindow *This = impl_from_DispatchEx(dispex); + *script_global = This; return lock_document_mode(This->doc); }
@@ -4310,7 +4308,7 @@ static HRESULT create_inner_window(HTMLOuterWindow *outer_window, IMoniker *mon, window->base.outer_window = outer_window; window->base.inner_window = window;
- EventTarget_Init(&window->event_target, &HTMLWindow_dispex, COMPAT_MODE_NONE); + init_event_target(&window->event_target, &HTMLWindow_dispex, NULL);
window->task_magic = get_task_target_magic();
diff --git a/dlls/mshtml/script.c b/dlls/mshtml/script.c index 295c8a0dc15..e985912c526 100644 --- a/dlls/mshtml/script.c +++ b/dlls/mshtml/script.c @@ -199,6 +199,27 @@ static BOOL init_script_engine(ScriptHost *script_host, IActiveScript *script) return FALSE; }
+ if(compat_mode >= COMPAT_MODE_IE9 && IsEqualGUID(&CLSID_JScript, &script_host->guid)) { + IWineJScript *jscript; + hres = IActiveScript_QueryInterface(script, &IID_IWineJScript, (void **)&jscript); + if(SUCCEEDED(hres)) { + assert(!script_host->window->jscript); + assert(!script_host->window->event_target.dispex.jsdisp); + script_host->window->jscript = jscript; + + hres = IWineJScript_InitHostObject(jscript, + &script_host->window->event_target.dispex.IWineJSDispatchHost_iface, + &script_host->window->event_target.dispex.jsdisp); + if(FAILED(hres)) + ERR("Could not initialize script global: %08lx\n", hres); + + /* make sure that script global is fully initialized */ + dispex_compat_mode(&script_host->window->event_target.dispex); + }else { + ERR("Could not get IWineJScript, don't use native jscript.dll\n"); + } + } + hres = IActiveScript_AddNamedItem(script, L"window", SCRIPTITEM_ISVISIBLE|SCRIPTITEM_ISSOURCE|SCRIPTITEM_GLOBALMEMBERS); if(SUCCEEDED(hres)) { @@ -381,8 +402,10 @@ static HRESULT WINAPI ActiveScriptSite_GetItemInfo(IActiveScriptSite *iface, LPC if(!This->window || !This->window->base.outer_window) return E_FAIL;
- /* FIXME: Return proxy object */ - *ppiunkItem = (IUnknown*)&This->window->base.outer_window->base.IHTMLWindow2_iface; + if(dispex_compat_mode(&This->window->event_target.dispex) >= COMPAT_MODE_IE9) + *ppiunkItem = (IUnknown*)This->window->event_target.dispex.jsdisp; + else + *ppiunkItem = (IUnknown*)&This->window->base.outer_window->base.IHTMLWindow2_iface; IUnknown_AddRef(*ppiunkItem);
return S_OK; @@ -1390,19 +1413,9 @@ static ScriptHost *get_script_host(HTMLInnerWindow *window, const GUID *guid)
void initialize_script_global(HTMLInnerWindow *script_global) { - ScriptHost *script_host; - HRESULT hres; - - if(script_global->jscript) + if(!script_global->base.outer_window) return; - - script_host = get_script_host(script_global, &CLSID_JScript); - if(!script_host) - return; - - hres = IActiveScript_QueryInterface(script_host->script, &IID_IWineJScript, (void **)&script_global->jscript); - if(FAILED(hres)) - ERR("Could not get IWineJScript, don't use native jscript.dll\n"); + get_script_host(script_global, &CLSID_JScript); }
static ScriptHost *get_elem_script_host(HTMLInnerWindow *window, HTMLScriptElement *script_elem) diff --git a/dlls/mshtml/tests/documentmode.js b/dlls/mshtml/tests/documentmode.js index ff4fbdf306b..ec670ec0756 100644 --- a/dlls/mshtml/tests/documentmode.js +++ b/dlls/mshtml/tests/documentmode.js @@ -317,7 +317,7 @@ sync_test("builtin_toString", function() { test("styleSheets", document.styleSheets, "StyleSheetList", null, true); test("textNode", document.createTextNode("testNode"), "Text", v < 9 ? "testNode" : null); test("textRange", txtRange, "TextRange"); - test("window", window, "Window", "[object Window]", true); + test("window", window, "Window", "[object Window]"); test("xmlHttpRequest", new XMLHttpRequest(), "XMLHttpRequest"); if(v < 10) { test("namespaces", document.namespaces, "MSNamespaceInfoCollection"); diff --git a/dlls/mshtml/tests/es5.js b/dlls/mshtml/tests/es5.js index ddffea263a6..0b22861fb34 100644 --- a/dlls/mshtml/tests/es5.js +++ b/dlls/mshtml/tests/es5.js @@ -1151,7 +1151,6 @@ sync_test("toString", function() { todo_wine. ok(tmp === "[object Arguments]", "toString.call(arguments) = " + tmp); tmp = Object.prototype.toString.call(this); - todo_wine. ok(tmp === "[object Window]", "toString.call(null) = " + tmp); tmp = Object.prototype.toString.call(null); ok(tmp === "[object Null]", "toString.call(null) = " + tmp); @@ -2297,7 +2296,6 @@ sync_test("substituted this", function() { ok(r === "[object Undefined]", "detached scope Object.toString returned " + r);
var r = (function() { this.f = Object.prototype.toString; return this.f(); })(); - todo_wine. ok(r === "[object Window]", "Object.toString returned " + r);
var r = (function() { var f = Object.prototype.toString; return f(); })();