Module: wine Branch: master Commit: 34209915a34fa1e42db03d52ee60d725b44208d9 URL: https://gitlab.winehq.org/wine/wine/-/commit/34209915a34fa1e42db03d52ee60d72...
Author: Gabriel Ivăncescu gabrielopcode@gmail.com Date: Thu Jan 26 17:58:17 2023 +0200
mshtml: Defer populating the IActiveScript field until it's fully initialized.
Signed-off-by: Gabriel Ivăncescu gabrielopcode@gmail.com
---
dlls/mshtml/script.c | 41 +++++++++++++++++++++++------------------ 1 file changed, 23 insertions(+), 18 deletions(-)
diff --git a/dlls/mshtml/script.c b/dlls/mshtml/script.c index 5321080a8f9..32005728bd6 100644 --- a/dlls/mshtml/script.c +++ b/dlls/mshtml/script.c @@ -91,12 +91,12 @@ struct ScriptHost {
static ScriptHost *get_elem_script_host(HTMLInnerWindow*,HTMLScriptElement*);
-static BOOL set_script_prop(ScriptHost *script_host, DWORD property, VARIANT *val) +static BOOL set_script_prop(IActiveScript *script, DWORD property, VARIANT *val) { IActiveScriptProperty *script_prop; HRESULT hres;
- hres = IActiveScript_QueryInterface(script_host->script, &IID_IActiveScriptProperty, + hres = IActiveScript_QueryInterface(script, &IID_IActiveScriptProperty, (void**)&script_prop); if(FAILED(hres)) { WARN("Could not get IActiveScriptProperty iface: %08lx\n", hres); @@ -113,7 +113,7 @@ static BOOL set_script_prop(ScriptHost *script_host, DWORD property, VARIANT *va return TRUE; }
-static BOOL init_script_engine(ScriptHost *script_host) +static BOOL init_script_engine(ScriptHost *script_host, IActiveScript *script) { compat_mode_t compat_mode; IObjectSafety *safety; @@ -122,13 +122,13 @@ static BOOL init_script_engine(ScriptHost *script_host) VARIANT var; HRESULT hres;
- hres = IActiveScript_QueryInterface(script_host->script, &IID_IActiveScriptParse, (void**)&script_host->parse); + hres = IActiveScript_QueryInterface(script, &IID_IActiveScriptParse, (void**)&script_host->parse); if(FAILED(hres)) { WARN("Could not get IActiveScriptParse: %08lx\n", hres); return FALSE; }
- hres = IActiveScript_QueryInterface(script_host->script, &IID_IObjectSafety, (void**)&safety); + hres = IActiveScript_QueryInterface(script, &IID_IObjectSafety, (void**)&safety); if(FAILED(hres)) { FIXME("Could not get IObjectSafety: %08lx\n", hres); return FALSE; @@ -162,16 +162,16 @@ static BOOL init_script_engine(ScriptHost *script_host) } V_VT(&var) = VT_I4; V_I4(&var) = script_mode; - if(!set_script_prop(script_host, SCRIPTPROP_INVOKEVERSIONING, &var) && (script_mode & SCRIPTLANGUAGEVERSION_HTML)) { + if(!set_script_prop(script, SCRIPTPROP_INVOKEVERSIONING, &var) && (script_mode & SCRIPTLANGUAGEVERSION_HTML)) { /* If this failed, we're most likely using native jscript. */ WARN("Failed to set script mode to HTML version.\n"); V_I4(&var) = compat_mode < COMPAT_MODE_IE8 ? SCRIPTLANGUAGEVERSION_5_7 : SCRIPTLANGUAGEVERSION_5_8; - set_script_prop(script_host, SCRIPTPROP_INVOKEVERSIONING, &var); + set_script_prop(script, SCRIPTPROP_INVOKEVERSIONING, &var); }
V_VT(&var) = VT_BOOL; V_BOOL(&var) = VARIANT_TRUE; - set_script_prop(script_host, SCRIPTPROP_HACK_TRIDENTEVENTSINK, &var); + set_script_prop(script, SCRIPTPROP_HACK_TRIDENTEVENTSINK, &var);
hres = IActiveScriptParse_InitNew(script_host->parse); if(FAILED(hres)) { @@ -179,36 +179,36 @@ static BOOL init_script_engine(ScriptHost *script_host) return FALSE; }
- hres = IActiveScript_SetScriptSite(script_host->script, &script_host->IActiveScriptSite_iface); + hres = IActiveScript_SetScriptSite(script, &script_host->IActiveScriptSite_iface); if(FAILED(hres)) { WARN("SetScriptSite failed: %08lx\n", hres); - IActiveScript_Close(script_host->script); + IActiveScript_Close(script); return FALSE; }
- hres = IActiveScript_GetScriptState(script_host->script, &state); + hres = IActiveScript_GetScriptState(script, &state); if(FAILED(hres)) WARN("GetScriptState failed: %08lx\n", hres); else if(state != SCRIPTSTATE_INITIALIZED) FIXME("state = %x\n", state);
- hres = IActiveScript_SetScriptState(script_host->script, SCRIPTSTATE_STARTED); + hres = IActiveScript_SetScriptState(script, SCRIPTSTATE_STARTED); if(FAILED(hres)) { WARN("Starting script failed: %08lx\n", hres); return FALSE; }
- hres = IActiveScript_AddNamedItem(script_host->script, L"window", + hres = IActiveScript_AddNamedItem(script, L"window", SCRIPTITEM_ISVISIBLE|SCRIPTITEM_ISSOURCE|SCRIPTITEM_GLOBALMEMBERS); if(SUCCEEDED(hres)) { V_VT(&var) = VT_BOOL; V_BOOL(&var) = VARIANT_TRUE; - set_script_prop(script_host, SCRIPTPROP_ABBREVIATE_GLOBALNAME_RESOLUTION, &var); + set_script_prop(script, SCRIPTPROP_ABBREVIATE_GLOBALNAME_RESOLUTION, &var); }else { WARN("AddNamedItem failed: %08lx\n", hres); }
- hres = IActiveScript_QueryInterface(script_host->script, &IID_IActiveScriptParseProcedure2, + hres = IActiveScript_QueryInterface(script, &IID_IActiveScriptParseProcedure2, (void**)&script_host->parse_proc); if(FAILED(hres)) { /* FIXME: QI for IActiveScriptParseProcedure */ @@ -690,6 +690,7 @@ static const IServiceProviderVtbl ASServiceProviderVtbl = {
static ScriptHost *create_script_host(HTMLInnerWindow *window, const GUID *guid) { + IActiveScript *script; ScriptHost *ret; HRESULT hres;
@@ -711,11 +712,15 @@ static ScriptHost *create_script_host(HTMLInnerWindow *window, const GUID *guid) list_add_tail(&window->script_hosts, &ret->entry);
hres = CoCreateInstance(&ret->guid, NULL, CLSCTX_INPROC_SERVER|CLSCTX_INPROC_HANDLER, - &IID_IActiveScript, (void**)&ret->script); + &IID_IActiveScript, (void**)&script); if(FAILED(hres)) WARN("Could not load script engine: %08lx\n", hres); - else if(!init_script_engine(ret)) - release_script_engine(ret); + else { + BOOL succeeded = init_script_engine(ret, script); + ret->script = script; + if(!succeeded) + release_script_engine(ret); + }
return ret; }