diff --git a/dlls/mshtml/htmlevent.c b/dlls/mshtml/htmlevent.c index 31adc7907bc..4b201c4c463 100644 --- a/dlls/mshtml/htmlevent.c +++ b/dlls/mshtml/htmlevent.c @@ -1386,7 +1386,7 @@ void check_event_attr(HTMLDocumentNode *doc, nsIDOMElement *nselem) TRACE("%p.%s = %s\n", nselem, debugstr_w(event_info[i].attr_name), debugstr_w(attr_value)); - disp = script_parse_event(doc->basedoc.window, attr_value); + disp = script_parse_event(doc->basedoc.window->base.inner_window, attr_value); if(disp) { hres = get_node(doc, (nsIDOMNode*)nselem, TRUE, &node); if(SUCCEEDED(hres)) { diff --git a/dlls/mshtml/htmlwindow.c b/dlls/mshtml/htmlwindow.c index f6d62122002..c20d765d5b9 100644 --- a/dlls/mshtml/htmlwindow.c +++ b/dlls/mshtml/htmlwindow.c @@ -208,8 +208,6 @@ static void release_outer_window(HTMLOuterWindow *This) This->window_ref->window = NULL; windowref_release(This->window_ref); - release_script_hosts(This); - if(This->nswindow) nsIDOMWindow_Release(This->nswindow); @@ -221,6 +219,8 @@ static void release_inner_window(HTMLInnerWindow *This) { unsigned i; + release_script_hosts(This); + htmldoc_release(&This->doc->basedoc); release_dispex(&This->dispex); @@ -1183,7 +1183,7 @@ static HRESULT WINAPI HTMLWindow2_execScript(IHTMLWindow2 *iface, BSTR scode, BS TRACE("(%p)->(%s %s %p)\n", This, debugstr_w(scode), debugstr_w(language), pvarRet); - return exec_script(This->outer_window, scode, language, pvarRet); + return exec_script(This->inner_window, scode, language, pvarRet); } static HRESULT WINAPI HTMLWindow2_toString(IHTMLWindow2 *iface, BSTR *String) @@ -1468,7 +1468,7 @@ static HRESULT window_set_timer(HTMLInnerWindow *This, VARIANT *expr, LONG msec, break; case VT_BSTR: - disp = script_parse_event(This->base.outer_window, V_BSTR(expr)); + disp = script_parse_event(This->base.inner_window, V_BSTR(expr)); break; default: @@ -2238,7 +2238,7 @@ HRESULT search_window_props(HTMLInnerWindow *This, BSTR bstrName, DWORD grfdex, } } - if(find_global_prop(This->base.outer_window, bstrName, grfdex, &script_host, &id)) { + if(find_global_prop(This->base.inner_window, bstrName, grfdex, &script_host, &id)) { global_prop_t *prop; prop = alloc_global_prop(This, GLOBAL_SCRIPTVAR, bstrName); @@ -2580,6 +2580,8 @@ static HRESULT create_inner_window(HTMLOuterWindow *outer_window, HTMLDocumentNo if(!window) return E_OUTOFMEMORY; + list_init(&window->script_hosts); + window->base.outer_window = outer_window; window->base.inner_window = window; @@ -2623,7 +2625,6 @@ HRESULT HTMLOuterWindow_Create(HTMLDocumentObj *doc_obj, nsIDOMWindow *nswindow, window->scriptmode = parent ? parent->scriptmode : SCRIPTMODE_GECKO; window->readystate = READYSTATE_UNINITIALIZED; - list_init(&window->script_hosts); hres = update_window_doc(window); if(FAILED(hres)) { @@ -2663,7 +2664,7 @@ static HRESULT window_set_docnode(HTMLOuterWindow *window, HTMLDocumentNode *doc window->base.inner_window->doc->basedoc.cp_container.forward_container = NULL; detach_events(window->base.inner_window->doc); abort_document_bindings(window->base.inner_window->doc); - release_script_hosts(window); + release_script_hosts(window->base.inner_window); } if(doc_node) { diff --git a/dlls/mshtml/mshtml_private.h b/dlls/mshtml/mshtml_private.h index 35800d8a497..de0a23777aa 100644 --- a/dlls/mshtml/mshtml_private.h +++ b/dlls/mshtml/mshtml_private.h @@ -334,7 +334,6 @@ struct HTMLOuterWindow { IHTMLEventObj *event; SCRIPTMODE scriptmode; - struct list script_hosts; IInternetSecurityManager *secmgr; @@ -354,6 +353,8 @@ struct HTMLInnerWindow { HTMLDocumentNode *doc; + struct list script_hosts; + HTMLOptionElementFactory *option_factory; global_prop_t *global_props; @@ -843,13 +844,13 @@ void release_nodes(HTMLDocumentNode*) DECLSPEC_HIDDEN; HTMLElement *unsafe_impl_from_IHTMLElement(IHTMLElement*) DECLSPEC_HIDDEN; -void release_script_hosts(HTMLOuterWindow*) DECLSPEC_HIDDEN; -void connect_scripts(HTMLOuterWindow*) DECLSPEC_HIDDEN; -void doc_insert_script(HTMLOuterWindow*,nsIDOMHTMLScriptElement*) DECLSPEC_HIDDEN; -IDispatch *script_parse_event(HTMLOuterWindow*,LPCWSTR) DECLSPEC_HIDDEN; -HRESULT exec_script(HTMLOuterWindow*,const WCHAR*,const WCHAR*,VARIANT*) DECLSPEC_HIDDEN; +void release_script_hosts(HTMLInnerWindow*) DECLSPEC_HIDDEN; +void connect_scripts(HTMLInnerWindow*) DECLSPEC_HIDDEN; +void doc_insert_script(HTMLInnerWindow*,nsIDOMHTMLScriptElement*) DECLSPEC_HIDDEN; +IDispatch *script_parse_event(HTMLInnerWindow*,LPCWSTR) DECLSPEC_HIDDEN; +HRESULT exec_script(HTMLInnerWindow*,const WCHAR*,const WCHAR*,VARIANT*) DECLSPEC_HIDDEN; void set_script_mode(HTMLOuterWindow*,SCRIPTMODE) DECLSPEC_HIDDEN; -BOOL find_global_prop(HTMLOuterWindow*,BSTR,DWORD,ScriptHost**,DISPID*) DECLSPEC_HIDDEN; +BOOL find_global_prop(HTMLInnerWindow*,BSTR,DWORD,ScriptHost**,DISPID*) DECLSPEC_HIDDEN; IDispatch *get_script_disp(ScriptHost*) DECLSPEC_HIDDEN; HRESULT search_window_props(HTMLInnerWindow*,BSTR,DWORD,DISPID*) DECLSPEC_HIDDEN; diff --git a/dlls/mshtml/mutation.c b/dlls/mshtml/mutation.c index 6a25346a50b..e81011021f6 100644 --- a/dlls/mshtml/mutation.c +++ b/dlls/mshtml/mutation.c @@ -316,7 +316,7 @@ static nsresult run_insert_script(HTMLDocumentNode *doc, nsISupports *script_ifa if(nsparser) nsIParser_BeginEvaluatingParserInsertedScript(nsparser); - doc_insert_script(doc->basedoc.window, nsscript); + doc_insert_script(doc->basedoc.window->base.inner_window, nsscript); if(nsparser) { nsIParser_EndEvaluatingParserInsertedScript(nsparser); diff --git a/dlls/mshtml/navigate.c b/dlls/mshtml/navigate.c index 3c536a35725..3fec433aab6 100644 --- a/dlls/mshtml/navigate.c +++ b/dlls/mshtml/navigate.c @@ -1807,7 +1807,7 @@ static void navigate_javascript_proc(task_t *_task) set_download_state(window->doc_obj, 1); V_VT(&v) = VT_EMPTY; - hres = exec_script(window, code, jscriptW, &v); + hres = exec_script(window->base.inner_window, code, jscriptW, &v); SysFreeString(code); if(SUCCEEDED(hres) && V_VT(&v) != VT_EMPTY) { FIXME("javascirpt URL returned %s\n", debugstr_variant(&v)); diff --git a/dlls/mshtml/nsevents.c b/dlls/mshtml/nsevents.c index 56d43847d94..e6d6fbcaefc 100644 --- a/dlls/mshtml/nsevents.c +++ b/dlls/mshtml/nsevents.c @@ -241,7 +241,7 @@ static nsresult NSAPI handle_load(nsIDOMEventListener *iface, nsIDOMEvent *event if(doc->basedoc.doc_obj && doc->basedoc.doc_obj->basedoc.doc_node == doc) doc_obj = doc->basedoc.doc_obj; - connect_scripts(doc->basedoc.window); + connect_scripts(doc->basedoc.window->base.inner_window); if(doc_obj) handle_docobj_load(doc_obj); diff --git a/dlls/mshtml/script.c b/dlls/mshtml/script.c index 84990e7c11a..099266eaab2 100644 --- a/dlls/mshtml/script.c +++ b/dlls/mshtml/script.c @@ -66,7 +66,7 @@ struct ScriptHost { SCRIPTSTATE script_state; - HTMLOuterWindow *window; + HTMLInnerWindow *window; GUID guid; struct list entry; @@ -211,7 +211,7 @@ static void release_script_engine(ScriptHost *This) This->script_state = SCRIPTSTATE_UNINITIALIZED; } -void connect_scripts(HTMLOuterWindow *window) +void connect_scripts(HTMLInnerWindow *window) { ScriptHost *iter; @@ -316,11 +316,11 @@ static HRESULT WINAPI ActiveScriptSite_GetItemInfo(IActiveScriptSite *iface, LPC if(strcmpW(pstrName, windowW)) return DISP_E_MEMBERNOTFOUND; - if(!This->window) + if(!This->window || !This->window->base.outer_window) return E_FAIL; /* FIXME: Return proxy object */ - *ppiunkItem = (IUnknown*)&This->window->base.IHTMLWindow2_iface; + *ppiunkItem = (IUnknown*)&This->window->base.outer_window->base.IHTMLWindow2_iface; IUnknown_AddRef(*ppiunkItem); return S_OK; @@ -591,7 +591,7 @@ static const IServiceProviderVtbl ASServiceProviderVtbl = { ASServiceProvider_QueryService }; -static ScriptHost *create_script_host(HTMLOuterWindow *window, const GUID *guid) +static ScriptHost *create_script_host(HTMLInnerWindow *window, const GUID *guid) { ScriptHost *ret; HRESULT hres; @@ -796,7 +796,7 @@ static BOOL get_script_guid(nsIDOMHTMLScriptElement *nsscript, GUID *guid) return ret; } -static ScriptHost *get_script_host(HTMLOuterWindow *window, const GUID *guid) +static ScriptHost *get_script_host(HTMLInnerWindow *window, const GUID *guid) { ScriptHost *iter; @@ -808,7 +808,7 @@ static ScriptHost *get_script_host(HTMLOuterWindow *window, const GUID *guid) return create_script_host(window, guid); } -void doc_insert_script(HTMLOuterWindow *window, nsIDOMHTMLScriptElement *nsscript) +void doc_insert_script(HTMLInnerWindow *window, nsIDOMHTMLScriptElement *nsscript) { ScriptHost *script_host; GUID guid; @@ -818,7 +818,8 @@ void doc_insert_script(HTMLOuterWindow *window, nsIDOMHTMLScriptElement *nsscrip return; } - if(IsEqualGUID(&CLSID_JScript, &guid) && window->scriptmode != SCRIPTMODE_ACTIVESCRIPT) { + if(IsEqualGUID(&CLSID_JScript, &guid) + && (!window->base.outer_window || window->base.outer_window->scriptmode != SCRIPTMODE_ACTIVESCRIPT)) { TRACE("Ignoring JScript\n"); return; } @@ -831,7 +832,7 @@ void doc_insert_script(HTMLOuterWindow *window, nsIDOMHTMLScriptElement *nsscrip parse_script_elem(script_host, nsscript); } -IDispatch *script_parse_event(HTMLOuterWindow *window, LPCWSTR text) +IDispatch *script_parse_event(HTMLInnerWindow *window, LPCWSTR text) { ScriptHost *script_host; GUID guid = CLSID_JScript; @@ -864,7 +865,8 @@ IDispatch *script_parse_event(HTMLOuterWindow *window, LPCWSTR text) ptr = text; } - if(IsEqualGUID(&CLSID_JScript, &guid) && window->scriptmode != SCRIPTMODE_ACTIVESCRIPT) { + if(IsEqualGUID(&CLSID_JScript, &guid) + && (!window->base.outer_window || window->base.outer_window->scriptmode != SCRIPTMODE_ACTIVESCRIPT)) { TRACE("Ignoring JScript\n"); return NULL; } @@ -885,7 +887,7 @@ IDispatch *script_parse_event(HTMLOuterWindow *window, LPCWSTR text) return disp; } -HRESULT exec_script(HTMLOuterWindow *window, const WCHAR *code, const WCHAR *lang, VARIANT *ret) +HRESULT exec_script(HTMLInnerWindow *window, const WCHAR *code, const WCHAR *lang, VARIANT *ret) { ScriptHost *script_host; EXCEPINFO ei; @@ -936,7 +938,7 @@ IDispatch *get_script_disp(ScriptHost *script_host) return disp; } -BOOL find_global_prop(HTMLOuterWindow *window, BSTR name, DWORD flags, ScriptHost **ret_host, DISPID *ret_id) +BOOL find_global_prop(HTMLInnerWindow *window, BSTR name, DWORD flags, ScriptHost **ret_host, DISPID *ret_id) { IDispatchEx *dispex; IDispatch *disp; @@ -1015,7 +1017,7 @@ void set_script_mode(HTMLOuterWindow *window, SCRIPTMODE mode) ERR("JavaScript setup failed: %08x\n", nsres); } -void release_script_hosts(HTMLOuterWindow *window) +void release_script_hosts(HTMLInnerWindow *window) { ScriptHost *iter;