From: Jacek Caban jacek@codeweavers.com
--- dlls/mshtml/dispex.c | 6 ++---- dlls/mshtml/htmlwindow.c | 16 +++++++--------- dlls/mshtml/mshtml_private.h | 4 +++- dlls/mshtml/script.c | 11 ++++++++--- dlls/mshtml/tests/documentmode.js | 2 ++ 5 files changed, 22 insertions(+), 17 deletions(-)
diff --git a/dlls/mshtml/dispex.c b/dlls/mshtml/dispex.c index e4e678a7efd..817547581e3 100644 --- a/dlls/mshtml/dispex.c +++ b/dlls/mshtml/dispex.c @@ -45,8 +45,6 @@ static CRITICAL_SECTION_DEBUG cs_dispex_static_data_dbg = }; static CRITICAL_SECTION cs_dispex_static_data = { &cs_dispex_static_data_dbg, -1, 0, 0, 0, 0 };
-static HRESULT get_prototype(HTMLInnerWindow *script_global, prototype_id_t id, DispatchEx **ret); - typedef struct { IID iid; VARIANT default_value; @@ -2818,9 +2816,9 @@ static const dispex_static_data_vtbl_t prototype_dispex_vtbl = { .find_dispid = prototype_find_dispid, };
-static HRESULT get_prototype(HTMLInnerWindow *script_global, prototype_id_t id, DispatchEx **ret) +HRESULT get_prototype(HTMLInnerWindow *script_global, prototype_id_t id, DispatchEx **ret) { - compat_mode_t compat_mode = dispex_compat_mode(&script_global->event_target.dispex); + compat_mode_t compat_mode = script_global->doc->document_mode; DispatchEx *prototype, *prot_prototype = NULL; dispex_static_data_t *desc; dispex_data_t *info; diff --git a/dlls/mshtml/htmlwindow.c b/dlls/mshtml/htmlwindow.c index 3569b9caad1..a2afcdfdfbc 100644 --- a/dlls/mshtml/htmlwindow.c +++ b/dlls/mshtml/htmlwindow.c @@ -4207,14 +4207,12 @@ static const event_target_vtbl_t HTMLWindow_event_target_vtbl = { .set_current_event = HTMLWindow_set_current_event };
-static const tid_t HTMLWindow_iface_tids[] = { 0 }; - -static dispex_static_data_t HTMLWindow_dispex = { - "Window", - &HTMLWindow_event_target_vtbl.dispex_vtbl, - DispHTMLWindow2_tid, - HTMLWindow_iface_tids, - HTMLWindow_init_dispex_info +dispex_static_data_t Window_dispex = { + .name = "Window", + .id = PROT_Window, + .vtbl = &HTMLWindow_event_target_vtbl.dispex_vtbl, + .disp_tid = DispHTMLWindow2_tid, + .init_info = HTMLWindow_init_dispex_info, };
static nsresult NSAPI outer_window_traverse(void *ccp, void *p, nsCycleCollectionTraversalCallback *cb) @@ -4352,7 +4350,7 @@ static HRESULT create_inner_window(HTMLOuterWindow *outer_window, IMoniker *mon, window->base.outer_window = outer_window; window->base.inner_window = window;
- init_event_target(&window->event_target, &HTMLWindow_dispex, NULL); + init_event_target(&window->event_target, &Window_dispex, NULL);
window->task_magic = get_task_target_magic();
diff --git a/dlls/mshtml/mshtml_private.h b/dlls/mshtml/mshtml_private.h index c30a2355605..e5f842a2f4d 100644 --- a/dlls/mshtml/mshtml_private.h +++ b/dlls/mshtml/mshtml_private.h @@ -415,7 +415,8 @@ typedef struct { X(HTMLElement) \ X(Navigator) \ X(Node) \ - X(Storage) + X(Storage) \ + X(Window)
typedef enum { PROT_NONE, @@ -552,6 +553,7 @@ HRESULT dispex_define_property(DispatchEx *dispex, const WCHAR *name, DWORD flag HRESULT dispex_index_prop_desc(DispatchEx*,DISPID,struct property_info*); IWineJSDispatchHost *dispex_outer_iface(DispatchEx *dispex); HRESULT get_constructor(HTMLInnerWindow *script_global, prototype_id_t id, DispatchEx **ret); +HRESULT get_prototype(HTMLInnerWindow *script_global, prototype_id_t id, DispatchEx **ret);
typedef enum { DISPEXPROP_CUSTOM, diff --git a/dlls/mshtml/script.c b/dlls/mshtml/script.c index 30571c15fff..7ac26e63a3b 100644 --- a/dlls/mshtml/script.c +++ b/dlls/mshtml/script.c @@ -203,13 +203,18 @@ static BOOL init_script_engine(ScriptHost *script_host, IActiveScript *script) IWineJScript *jscript; hres = IActiveScript_QueryInterface(script, &IID_IWineJScript, (void **)&jscript); if(SUCCEEDED(hres)) { + DispatchEx *prototype; + 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, - NULL, 0, &script_host->window->event_target.dispex.jsdisp); + hres = get_prototype(script_host->window, PROT_Window, &prototype); + if(SUCCEEDED(hres)) + hres = IWineJScript_InitHostObject(jscript, + &script_host->window->event_target.dispex.IWineJSDispatchHost_iface, + prototype->jsdisp, object_descriptors[PROT_Window]->js_flags, + &script_host->window->event_target.dispex.jsdisp); if(FAILED(hres)) ERR("Could not initialize script global: %08lx\n", hres);
diff --git a/dlls/mshtml/tests/documentmode.js b/dlls/mshtml/tests/documentmode.js index 85a063a564e..08e2daeff1e 100644 --- a/dlls/mshtml/tests/documentmode.js +++ b/dlls/mshtml/tests/documentmode.js @@ -3134,4 +3134,6 @@ sync_test("prototypes", function() { check(HTMLDocument.prototype, Document.prototype, "html document prototype"); check(Document.prototype, Node.prototype, "document prototype"); } + check(window, Window.prototype, "window"); + check(Window.prototype, Object.prototype, "window prototype"); });