Module: wine Branch: master Commit: f08a2be026046113cdcd6e55ca2e9b0393d40913 URL: https://gitlab.winehq.org/wine/wine/-/commit/f08a2be026046113cdcd6e55ca2e9b0...
Author: Jacek Caban jacek@codeweavers.com Date: Mon Jul 15 13:57:51 2024 +0200
mshtml: Use host object script bindings for MSEventObj class.
---
dlls/mshtml/htmldoc.c | 2 +- dlls/mshtml/htmlevent.c | 19 +++++++++++-------- dlls/mshtml/htmlevent.h | 2 +- dlls/mshtml/htmlstorage.c | 2 +- dlls/mshtml/tests/documentmode.js | 2 +- 5 files changed, 15 insertions(+), 12 deletions(-)
diff --git a/dlls/mshtml/htmldoc.c b/dlls/mshtml/htmldoc.c index 172ad524538..a5f4f558bdd 100644 --- a/dlls/mshtml/htmldoc.c +++ b/dlls/mshtml/htmldoc.c @@ -2863,7 +2863,7 @@ static HRESULT WINAPI HTMLDocument4_createEventObject(IHTMLDocument4 *iface, return E_NOTIMPL; }
- return create_event_obj(NULL, dispex_compat_mode(&This->node.event_target.dispex), ppEventObj); + return create_event_obj(NULL, This, ppEventObj); }
static HRESULT WINAPI HTMLDocument4_fireEvent(IHTMLDocument4 *iface, BSTR bstrEventName, diff --git a/dlls/mshtml/htmlevent.c b/dlls/mshtml/htmlevent.c index b56cf8030e5..12e947fecd3 100644 --- a/dlls/mshtml/htmlevent.c +++ b/dlls/mshtml/htmlevent.c @@ -1815,7 +1815,7 @@ static dispex_static_data_t HTMLEventObj_dispex = { HTMLEventObj_iface_tids };
-static HTMLEventObj *alloc_event_obj(DOMEvent *event, compat_mode_t compat_mode) +static HTMLEventObj *alloc_event_obj(DOMEvent *event, HTMLInnerWindow *script_global) { HTMLEventObj *event_obj;
@@ -1830,18 +1830,21 @@ static HTMLEventObj *alloc_event_obj(DOMEvent *event, compat_mode_t compat_mode) event_obj->IHTMLEventObj5_iface.lpVtbl = &HTMLEventObj5Vtbl; event_obj->IHTMLEventObj6_iface.lpVtbl = &HTMLEventObj6Vtbl; event_obj->event = event; - if(event) + if(event) { IDOMEvent_AddRef(&event->IDOMEvent_iface); - - init_dispatch(&event_obj->dispex, &HTMLEventObj_dispex, NULL, compat_mode); + init_dispatch_with_owner(&event_obj->dispex, &HTMLEventObj_dispex, &event->dispex); + }else { + init_dispatch(&event_obj->dispex, &HTMLEventObj_dispex, script_global, + dispex_compat_mode(&script_global->event_target.dispex)); + } return event_obj; }
-HRESULT create_event_obj(DOMEvent *event, compat_mode_t compat_mode, IHTMLEventObj **ret) +HRESULT create_event_obj(DOMEvent *event, HTMLDocumentNode *doc, IHTMLEventObj **ret) { HTMLEventObj *event_obj;
- event_obj = alloc_event_obj(event, compat_mode); + event_obj = alloc_event_obj(event, doc->script_global); if(!event_obj) return E_OUTOFMEMORY;
@@ -4424,7 +4427,7 @@ static HRESULT dispatch_event_object(EventTarget *event_target, DOMEvent *event, } while(iter);
if(!event->event_obj && !event->no_event_obj) { - event_obj_ref = alloc_event_obj(event, dispex_compat_mode(&event->dispex)); + event_obj_ref = alloc_event_obj(event, NULL); if(event_obj_ref) event->event_obj = &event_obj_ref->IHTMLEventObj_iface; } @@ -4556,7 +4559,7 @@ HRESULT fire_event(HTMLDOMNode *node, const WCHAR *event_name, VARIANT *event_va }
if(!event_obj) { - event_obj = alloc_event_obj(NULL, dispex_compat_mode(&node->event_target.dispex)); + event_obj = alloc_event_obj(NULL, node->doc->script_global); if(!event_obj) return E_OUTOFMEMORY; } diff --git a/dlls/mshtml/htmlevent.h b/dlls/mshtml/htmlevent.h index 2fc72fb4a34..cd099850771 100644 --- a/dlls/mshtml/htmlevent.h +++ b/dlls/mshtml/htmlevent.h @@ -107,7 +107,7 @@ HRESULT fire_event(HTMLDOMNode*,const WCHAR*,VARIANT*,VARIANT_BOOL*); void update_doc_cp_events(HTMLDocumentNode*,cp_static_data_t*); HRESULT doc_init_events(HTMLDocumentNode*); void detach_events(HTMLDocumentNode *doc); -HRESULT create_event_obj(DOMEvent*,compat_mode_t,IHTMLEventObj**); +HRESULT create_event_obj(DOMEvent*,HTMLDocumentNode*,IHTMLEventObj**); void bind_target_event(HTMLDocumentNode*,EventTarget*,const WCHAR*,IDispatch*); HRESULT ensure_doc_nsevent_handler(HTMLDocumentNode*,nsIDOMNode*,eventid_t);
diff --git a/dlls/mshtml/htmlstorage.c b/dlls/mshtml/htmlstorage.c index 174813a3fef..d4a84a05a3c 100644 --- a/dlls/mshtml/htmlstorage.c +++ b/dlls/mshtml/htmlstorage.c @@ -216,7 +216,7 @@ static void storage_event_proc(event_task_t *_task) if(event->event_id == EVENTID_STORAGE && (compat_mode = dispex_compat_mode(&window->event_target.dispex)) >= COMPAT_MODE_IE9) { dispatch_event(&window->event_target, event); if(window->doc) { - hres = create_event_obj(event, compat_mode, (IHTMLEventObj**)&V_DISPATCH(&var)); + hres = create_event_obj(event, window->doc, (IHTMLEventObj**)&V_DISPATCH(&var)); if(SUCCEEDED(hres)) { V_VT(&var) = VT_DISPATCH; fire_event(&window->doc->node, L"onstorage", &var, &cancelled); diff --git a/dlls/mshtml/tests/documentmode.js b/dlls/mshtml/tests/documentmode.js index e6a39922157..24cd27ce64b 100644 --- a/dlls/mshtml/tests/documentmode.js +++ b/dlls/mshtml/tests/documentmode.js @@ -323,7 +323,7 @@ sync_test("builtin_toString", function() { test("namespaces", document.namespaces, "MSNamespaceInfoCollection"); } if(v < 11) { - test("eventObject", document.createEventObject(), "MSEventObj", null, true); + test("eventObject", document.createEventObject(), "MSEventObj"); test("selection", document.selection, "MSSelection"); } if(v >= 9) {