mshtml: Use host object script bindings for MSEventObj class.

This commit is contained in:
Jacek Caban 2024-07-15 13:57:51 +02:00 committed by Alexandre Julliard
parent 4a4582d2e0
commit f08a2be026
5 changed files with 15 additions and 12 deletions

View file

@ -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,

View file

@ -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;
}

View file

@ -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);

View file

@ -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);

View file

@ -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) {