From: Jacek Caban jacek@codeweavers.com
--- dlls/mshtml/htmlevent.c | 69 ++++++++++++++++++------------- dlls/mshtml/htmlevent.h | 2 +- dlls/mshtml/nsembed.c | 3 +- dlls/mshtml/nsevents.c | 8 ++-- dlls/mshtml/tests/documentmode.js | 14 +++---- dlls/mshtml/tests/xhr.js | 1 - dlls/mshtml/xmlhttprequest.c | 2 +- 7 files changed, 55 insertions(+), 44 deletions(-)
diff --git a/dlls/mshtml/htmlevent.c b/dlls/mshtml/htmlevent.c index 29bf94b9eea..b56cf8030e5 100644 --- a/dlls/mshtml/htmlevent.c +++ b/dlls/mshtml/htmlevent.c @@ -3740,7 +3740,7 @@ static dispex_static_data_t DOMStorageEvent_dispex = { };
static void *event_ctor(unsigned size, dispex_static_data_t *dispex_data, nsIDOMEvent *nsevent, eventid_t event_id, - compat_mode_t compat_mode) + HTMLInnerWindow *script_global, compat_mode_t compat_mode) { DOMEvent *event = calloc(1, size);
@@ -3761,7 +3761,7 @@ static void *event_ctor(unsigned size, dispex_static_data_t *dispex_data, nsIDOM
event->time_stamp = get_time_stamp();
- init_dispatch(&event->dispex, dispex_data, NULL, compat_mode); + init_dispatch(&event->dispex, dispex_data, script_global, compat_mode); return event; }
@@ -3771,23 +3771,26 @@ static void fill_parent_ui_event(nsIDOMEvent *nsevent, DOMUIEvent *ui_event) nsIDOMEvent_QueryInterface(nsevent, &IID_nsIDOMUIEvent, (void**)&ui_event->nsevent); }
-static DOMEvent *generic_event_ctor(void *iface, nsIDOMEvent *nsevent, eventid_t event_id, compat_mode_t compat_mode) +static DOMEvent *generic_event_ctor(void *iface, nsIDOMEvent *nsevent, eventid_t event_id, HTMLInnerWindow *script_global, + compat_mode_t compat_mode) { - return event_ctor(sizeof(DOMEvent), &DOMEvent_dispex, nsevent, event_id, compat_mode); + return event_ctor(sizeof(DOMEvent), &DOMEvent_dispex, nsevent, event_id, script_global, compat_mode); }
-static DOMEvent *ui_event_ctor(void *iface, nsIDOMEvent *nsevent, eventid_t event_id, compat_mode_t compat_mode) +static DOMEvent *ui_event_ctor(void *iface, nsIDOMEvent *nsevent, eventid_t event_id, HTMLInnerWindow *script_global, + compat_mode_t compat_mode) { - DOMUIEvent *ui_event = event_ctor(sizeof(DOMUIEvent), &DOMUIEvent_dispex, nsevent, event_id, compat_mode); + DOMUIEvent *ui_event = event_ctor(sizeof(DOMUIEvent), &DOMUIEvent_dispex, nsevent, event_id, script_global, compat_mode); if(!ui_event) return NULL; ui_event->IDOMUIEvent_iface.lpVtbl = &DOMUIEventVtbl; ui_event->nsevent = iface; return &ui_event->event; }
-static DOMEvent *mouse_event_ctor(void *iface, nsIDOMEvent *nsevent, eventid_t event_id, compat_mode_t compat_mode) +static DOMEvent *mouse_event_ctor(void *iface, nsIDOMEvent *nsevent, eventid_t event_id, HTMLInnerWindow *script_global, + compat_mode_t compat_mode) { - DOMMouseEvent *mouse_event = event_ctor(sizeof(DOMMouseEvent), &DOMMouseEvent_dispex, nsevent, event_id, compat_mode); + DOMMouseEvent *mouse_event = event_ctor(sizeof(DOMMouseEvent), &DOMMouseEvent_dispex, nsevent, event_id, script_global, compat_mode); if(!mouse_event) return NULL; mouse_event->IDOMMouseEvent_iface.lpVtbl = &DOMMouseEventVtbl; mouse_event->nsevent = iface; @@ -3795,9 +3798,11 @@ static DOMEvent *mouse_event_ctor(void *iface, nsIDOMEvent *nsevent, eventid_t e return &mouse_event->ui_event.event; }
-static DOMEvent *keyboard_event_ctor(void *iface, nsIDOMEvent *nsevent, eventid_t event_id, compat_mode_t compat_mode) +static DOMEvent *keyboard_event_ctor(void *iface, nsIDOMEvent *nsevent, eventid_t event_id, HTMLInnerWindow *script_global, + compat_mode_t compat_mode) { - DOMKeyboardEvent *keyboard_event = event_ctor(sizeof(DOMKeyboardEvent), &DOMKeyboardEvent_dispex, nsevent, event_id, compat_mode); + DOMKeyboardEvent *keyboard_event = event_ctor(sizeof(DOMKeyboardEvent), &DOMKeyboardEvent_dispex, nsevent, event_id, script_global, + compat_mode); if(!keyboard_event) return NULL; keyboard_event->IDOMKeyboardEvent_iface.lpVtbl = &DOMKeyboardEventVtbl; keyboard_event->nsevent = iface; @@ -3805,45 +3810,54 @@ static DOMEvent *keyboard_event_ctor(void *iface, nsIDOMEvent *nsevent, eventid_ return &keyboard_event->ui_event.event; }
-static DOMEvent *page_transition_event_ctor(void *iface, nsIDOMEvent *nsevent, eventid_t event_id, compat_mode_t compat_mode) +static DOMEvent *page_transition_event_ctor(void *iface, nsIDOMEvent *nsevent, eventid_t event_id, HTMLInnerWindow *script_global, + compat_mode_t compat_mode) { - DOMPageTransitionEvent *page_transition_event = event_ctor(sizeof(DOMCustomEvent), &DOMPageTransitionEvent_dispex, nsevent, event_id, compat_mode); + DOMPageTransitionEvent *page_transition_event = event_ctor(sizeof(DOMCustomEvent), &DOMPageTransitionEvent_dispex, nsevent, event_id, + script_global, compat_mode); if(!page_transition_event) return NULL; page_transition_event->IWinePageTransitionEvent_iface.lpVtbl = &DOMPageTransitionEventVtbl; return &page_transition_event->event; }
-static DOMEvent *custom_event_ctor(void *iface, nsIDOMEvent *nsevent, eventid_t event_id, compat_mode_t compat_mode) +static DOMEvent *custom_event_ctor(void *iface, nsIDOMEvent *nsevent, eventid_t event_id, HTMLInnerWindow *script_global, + compat_mode_t compat_mode) { - DOMCustomEvent *custom_event = event_ctor(sizeof(DOMCustomEvent), &DOMCustomEvent_dispex, nsevent, event_id, compat_mode); + DOMCustomEvent *custom_event = event_ctor(sizeof(DOMCustomEvent), &DOMCustomEvent_dispex, nsevent, event_id, script_global, + compat_mode); if(!custom_event) return NULL; custom_event->IDOMCustomEvent_iface.lpVtbl = &DOMCustomEventVtbl; nsIDOMCustomEvent_Release(iface); return &custom_event->event; }
-static DOMEvent *progress_event_ctor(void *iface, nsIDOMEvent *nsevent, eventid_t event_id, compat_mode_t compat_mode) +static DOMEvent *progress_event_ctor(void *iface, nsIDOMEvent *nsevent, eventid_t event_id, HTMLInnerWindow *script_global, + compat_mode_t compat_mode) { DOMProgressEvent *progress_event;
- if(!(progress_event = event_ctor(sizeof(DOMProgressEvent), &DOMProgressEvent_dispex, nsevent, event_id, compat_mode))) + if(!(progress_event = event_ctor(sizeof(DOMProgressEvent), &DOMProgressEvent_dispex, nsevent, event_id, script_global, compat_mode))) return NULL; progress_event->IDOMProgressEvent_iface.lpVtbl = &DOMProgressEventVtbl; progress_event->nsevent = iface; return &progress_event->event; }
-static DOMEvent *message_event_ctor(void *iface, nsIDOMEvent *nsevent, eventid_t event_id, compat_mode_t compat_mode) +static DOMEvent *message_event_ctor(void *iface, nsIDOMEvent *nsevent, eventid_t event_id, HTMLInnerWindow *script_global, + compat_mode_t compat_mode) { - DOMMessageEvent *message_event = event_ctor(sizeof(DOMMessageEvent), &DOMMessageEvent_dispex, nsevent, event_id, compat_mode); + DOMMessageEvent *message_event = event_ctor(sizeof(DOMMessageEvent), &DOMMessageEvent_dispex, nsevent, event_id, script_global, + compat_mode); if(!message_event) return NULL; message_event->IDOMMessageEvent_iface.lpVtbl = &DOMMessageEventVtbl; return &message_event->event; }
-static DOMEvent *storage_event_ctor(void *iface, nsIDOMEvent *nsevent, eventid_t event_id, compat_mode_t compat_mode) +static DOMEvent *storage_event_ctor(void *iface, nsIDOMEvent *nsevent, eventid_t event_id, HTMLInnerWindow *script_global, + compat_mode_t compat_mode) { - DOMStorageEvent *storage_event = event_ctor(sizeof(DOMStorageEvent), &DOMStorageEvent_dispex, nsevent, event_id, compat_mode); + DOMStorageEvent *storage_event = event_ctor(sizeof(DOMStorageEvent), &DOMStorageEvent_dispex, nsevent, event_id, script_global, + compat_mode); if(!storage_event) return NULL; storage_event->IDOMStorageEvent_iface.lpVtbl = &DOMStorageEventVtbl; return &storage_event->event; @@ -3851,7 +3865,7 @@ static DOMEvent *storage_event_ctor(void *iface, nsIDOMEvent *nsevent, eventid_t
static const struct { REFIID iid; - DOMEvent *(*ctor)(void *iface, nsIDOMEvent *nsevent, eventid_t, compat_mode_t); + DOMEvent *(*ctor)(void *iface, nsIDOMEvent *nsevent, eventid_t, HTMLInnerWindow *sceript_global, compat_mode_t compat_mode); compat_mode_t min_compat_mode; } event_types_ctor_table[] = { [EVENT_TYPE_EVENT] = { NULL, generic_event_ctor }, @@ -3868,7 +3882,7 @@ static const struct { [EVENT_TYPE_STORAGE] = { NULL, storage_event_ctor }, };
-static DOMEvent *alloc_event(nsIDOMEvent *nsevent, compat_mode_t compat_mode, event_type_t event_type, +static DOMEvent *alloc_event(nsIDOMEvent *nsevent, HTMLInnerWindow *script_global, compat_mode_t compat_mode, event_type_t event_type, eventid_t event_id) { void *iface = NULL; @@ -3881,12 +3895,12 @@ static DOMEvent *alloc_event(nsIDOMEvent *nsevent, compat_mode_t compat_mode, ev nsIDOMEvent_QueryInterface(nsevent, event_types_ctor_table[event_type].iid, &iface);
/* Transfer the iface ownership to the ctor on success */ - if(!(event = event_types_ctor_table[event_type].ctor(iface, nsevent, event_id, compat_mode)) && iface) + if(!(event = event_types_ctor_table[event_type].ctor(iface, nsevent, event_id, script_global, compat_mode)) && iface) nsISupports_Release(iface); return event; }
-HRESULT create_event_from_nsevent(nsIDOMEvent *nsevent, compat_mode_t compat_mode, DOMEvent **ret_event) +HRESULT create_event_from_nsevent(nsIDOMEvent *nsevent, HTMLInnerWindow *script_global, compat_mode_t compat_mode, DOMEvent **ret_event) { event_type_t event_type = EVENT_TYPE_EVENT; eventid_t event_id = EVENTID_LAST; @@ -3918,7 +3932,7 @@ HRESULT create_event_from_nsevent(nsIDOMEvent *nsevent, compat_mode_t compat_mod } }
- event = alloc_event(nsevent, compat_mode, event_type, event_id); + event = alloc_event(nsevent, script_global, compat_mode, event_type, event_id); if(!event) return E_OUTOFMEMORY;
@@ -3951,8 +3965,7 @@ HRESULT create_document_event_str(HTMLDocumentNode *doc, const WCHAR *type, IDOM } }
- event = alloc_event(nsevent, dispex_compat_mode(&doc->node.event_target.dispex), - event_type, EVENTID_LAST); + event = alloc_event(nsevent, doc->script_global, dispex_compat_mode(&doc->node.event_target.dispex), event_type, EVENTID_LAST); nsIDOMEvent_Release(nsevent); if(!event) return E_OUTOFMEMORY; @@ -3976,7 +3989,7 @@ HRESULT create_document_event(HTMLDocumentNode *doc, eventid_t event_id, DOMEven return E_FAIL; }
- event = alloc_event(nsevent, doc->document_mode, event_info[event_id].type, event_id); + event = alloc_event(nsevent, doc->script_global, doc->document_mode, event_info[event_id].type, event_id); nsIDOMEvent_Release(nsevent); if(!event) return E_OUTOFMEMORY; diff --git a/dlls/mshtml/htmlevent.h b/dlls/mshtml/htmlevent.h index 333f8add57e..2fc72fb4a34 100644 --- a/dlls/mshtml/htmlevent.h +++ b/dlls/mshtml/htmlevent.h @@ -115,7 +115,7 @@ void dispatch_event(EventTarget*,DOMEvent*);
HRESULT create_document_event(HTMLDocumentNode*,eventid_t,DOMEvent**); HRESULT create_document_event_str(HTMLDocumentNode*,const WCHAR*,IDOMEvent**); -HRESULT create_event_from_nsevent(nsIDOMEvent*,compat_mode_t,DOMEvent**); +HRESULT create_event_from_nsevent(nsIDOMEvent*,HTMLInnerWindow*,compat_mode_t,DOMEvent**); HRESULT create_message_event(HTMLDocumentNode*,IHTMLWindow2*,VARIANT*,DOMEvent**); HRESULT create_storage_event(HTMLDocumentNode*,BSTR,BSTR,BSTR,const WCHAR*,BOOL,DOMEvent**);
diff --git a/dlls/mshtml/nsembed.c b/dlls/mshtml/nsembed.c index 1b31e4f7159..b06c08ff496 100644 --- a/dlls/mshtml/nsembed.c +++ b/dlls/mshtml/nsembed.c @@ -1663,7 +1663,8 @@ static nsresult NSAPI nsContextMenuListener_OnShowContextMenu(nsIContextMenuList if(FAILED(hres)) return NS_ERROR_FAILURE;
- hres = create_event_from_nsevent(aEvent, dispex_compat_mode(&node->event_target.dispex), &event); + hres = create_event_from_nsevent(aEvent, This->doc->doc_node->script_global, + dispex_compat_mode(&node->event_target.dispex), &event); if(SUCCEEDED(hres)) { dispatch_event(&node->event_target, event); IDOMEvent_Release(&event->IDOMEvent_iface); diff --git a/dlls/mshtml/nsevents.c b/dlls/mshtml/nsevents.c index c4843fa45b6..0604fb997c7 100644 --- a/dlls/mshtml/nsevents.c +++ b/dlls/mshtml/nsevents.c @@ -356,7 +356,7 @@ static nsresult handle_load(HTMLDocumentNode *doc, nsIDOMEvent *event) WARN("no dom_document\n"); }
- hres = create_event_from_nsevent(event, dispex_compat_mode(&doc->node.event_target.dispex), &load_event); + hres = create_event_from_nsevent(event, doc->script_global, dispex_compat_mode(&doc->node.event_target.dispex), &load_event); if(SUCCEEDED(hres)) { dispatch_event(&doc->window->event_target, load_event); IDOMEvent_Release(&load_event->IDOMEvent_iface); @@ -376,7 +376,7 @@ static nsresult handle_beforeunload(HTMLDocumentNode *doc, nsIDOMEvent *nsevent) return NS_OK;
/* Gecko dispatches this to the document, but IE dispatches it to the window */ - hres = create_event_from_nsevent(nsevent, dispex_compat_mode(&doc->node.event_target.dispex), &event); + hres = create_event_from_nsevent(nsevent, doc->script_global, dispex_compat_mode(&doc->node.event_target.dispex), &event); if(SUCCEEDED(hres)) { dispatch_event(&window->event_target, event); IDOMEvent_Release(&event->IDOMEvent_iface); @@ -399,7 +399,7 @@ static nsresult handle_unload(HTMLDocumentNode *doc, nsIDOMEvent *nsevent) if(pending_window) pending_window->unload_event_start_time = get_time_stamp();
- hres = create_event_from_nsevent(nsevent, dispex_compat_mode(&doc->node.event_target.dispex), &event); + hres = create_event_from_nsevent(nsevent, doc->script_global, dispex_compat_mode(&doc->node.event_target.dispex), &event); if(SUCCEEDED(hres)) { dispatch_event(&window->event_target, event); IDOMEvent_Release(&event->IDOMEvent_iface); @@ -444,7 +444,7 @@ static nsresult handle_htmlevent(HTMLDocumentNode *doc, nsIDOMEvent *nsevent) target = &node->event_target; }
- hres = create_event_from_nsevent(nsevent, dispex_compat_mode(&target->dispex), &event); + hres = create_event_from_nsevent(nsevent, doc->script_global, dispex_compat_mode(&target->dispex), &event); if(FAILED(hres)) { IEventTarget_Release(&target->IEventTarget_iface); return NS_OK; diff --git a/dlls/mshtml/tests/documentmode.js b/dlls/mshtml/tests/documentmode.js index 2fd940737c9..a00647c5ddd 100644 --- a/dlls/mshtml/tests/documentmode.js +++ b/dlls/mshtml/tests/documentmode.js @@ -58,7 +58,6 @@ if(window.addEventListener) { pageshow_fired = true;
var r = Object.prototype.toString.call(e); - todo_wine. ok(r === "[object PageTransitionEvent]", "pageshow toString = " + r); ok("persisted" in e, "'persisted' not in pageshow event"); ok(document.readyState === "complete", "pageshow readyState = " + document.readyState); @@ -70,7 +69,6 @@ if(window.addEventListener) { ok(document.documentMode >= 11, "pagehide fired");
var r = Object.prototype.toString.call(e); - todo_wine. ok(r === "[object PageTransitionEvent]", "pagehide toString = " + r); ok("persisted" in e, "'persisted' not in pagehide event"); }, true); @@ -332,11 +330,11 @@ sync_test("builtin_toString", function() { test("computedStyle", window.getComputedStyle(e), "CSSStyleDeclaration", null, true); test("doctype", document.doctype, "DocumentType", null, true);
- test("Event", document.createEvent("Event"), "Event", null, true); - test("CustomEvent", document.createEvent("CustomEvent"), "CustomEvent", null, true); - test("KeyboardEvent", document.createEvent("KeyboardEvent"), "KeyboardEvent", null, true); - test("MouseEvent", document.createEvent("MouseEvent"), "MouseEvent", null, true); - test("UIEvent", document.createEvent("UIEvent"), "UIEvent", null, true); + test("Event", document.createEvent("Event"), "Event"); + test("CustomEvent", document.createEvent("CustomEvent"), "CustomEvent"); + test("KeyboardEvent", document.createEvent("KeyboardEvent"), "KeyboardEvent"); + test("MouseEvent", document.createEvent("MouseEvent"), "MouseEvent"); + test("UIEvent", document.createEvent("UIEvent"), "UIEvent"); } if(v >= 10) { test("classList", e.classList, "DOMTokenList", "testclass another ", true); @@ -1958,7 +1956,7 @@ async_test("storage events", function() { return; } var s = Object.prototype.toString.call(e); - todo_wine. + todo_wine_if(e.target != window && e.target != document). ok(s === "[object StorageEvent]", "Object.toString = " + s); ok(e.key === key, "key = " + e.key + ", expected " + key); ok(e.oldValue === oldValue, "oldValue = " + e.oldValue + ", expected " + oldValue); diff --git a/dlls/mshtml/tests/xhr.js b/dlls/mshtml/tests/xhr.js index 336f03c1b2f..661eafc54d9 100644 --- a/dlls/mshtml/tests/xhr.js +++ b/dlls/mshtml/tests/xhr.js @@ -306,7 +306,6 @@ function test_timeout() { xhr.onload = function() { ok(false, "onload called"); } xhr.ontimeout = function(e) { var r = Object.prototype.toString.call(e); - todo_wine. ok(r === ("[object " + (v < 10 ? "Event" : "ProgressEvent") + "]"), "Object.toString = " + r); var props = [ "initProgressEvent", "lengthComputable", "loaded", "total" ]; for(r = 0; r < props.length; r++) { diff --git a/dlls/mshtml/xmlhttprequest.c b/dlls/mshtml/xmlhttprequest.c index efb343e6f16..d5faf971a33 100644 --- a/dlls/mshtml/xmlhttprequest.c +++ b/dlls/mshtml/xmlhttprequest.c @@ -398,7 +398,7 @@ static nsresult NSAPI XMLHttpReqEventListener_HandleEvent(nsIDOMEventListener *i blocking_xhr = thread_data->blocking_xhr;
compat_mode = dispex_compat_mode(&This->xhr->event_target.dispex); - hres = create_event_from_nsevent(nsevent, compat_mode, &event); + hres = create_event_from_nsevent(nsevent, This->xhr->window, compat_mode, &event); if(FAILED(hres)) { if(!blocking_xhr || This->xhr == blocking_xhr) This->xhr->ready_state = ready_state;