From: Gabriel Ivăncescu gabrielopcode@gmail.com
Signed-off-by: Gabriel Ivăncescu gabrielopcode@gmail.com ---
Will be tested in next patch when the url prop for the legacy event obj is implemented. --- dlls/mshtml/htmldoc.c | 2 +- dlls/mshtml/htmlevent.c | 4 ++-- dlls/mshtml/htmlevent.h | 2 +- dlls/mshtml/htmlstorage.c | 15 ++++++++++++--- 4 files changed, 16 insertions(+), 7 deletions(-)
diff --git a/dlls/mshtml/htmldoc.c b/dlls/mshtml/htmldoc.c index e37f04fee0b..e03a7698f3a 100644 --- a/dlls/mshtml/htmldoc.c +++ b/dlls/mshtml/htmldoc.c @@ -3035,7 +3035,7 @@ static HRESULT WINAPI HTMLDocument4_createEventObject(IHTMLDocument4 *iface, return E_NOTIMPL; }
- return create_event_obj(dispex_compat_mode(&This->node.event_target.dispex), ppEventObj); + return create_event_obj(NULL, dispex_compat_mode(&This->node.event_target.dispex), ppEventObj); }
static HRESULT WINAPI HTMLDocument4_fireEvent(IHTMLDocument4 *iface, BSTR bstrEventName, diff --git a/dlls/mshtml/htmlevent.c b/dlls/mshtml/htmlevent.c index 50f40ea62ae..f72670ad1c4 100644 --- a/dlls/mshtml/htmlevent.c +++ b/dlls/mshtml/htmlevent.c @@ -2035,11 +2035,11 @@ static HTMLEventObj *alloc_event_obj(DOMEvent *event, compat_mode_t compat_mode) return event_obj; }
-HRESULT create_event_obj(compat_mode_t compat_mode, IHTMLEventObj **ret) +HRESULT create_event_obj(DOMEvent *event, compat_mode_t compat_mode, IHTMLEventObj **ret) { HTMLEventObj *event_obj;
- event_obj = alloc_event_obj(NULL, compat_mode); + event_obj = alloc_event_obj(event, compat_mode); if(!event_obj) return E_OUTOFMEMORY;
diff --git a/dlls/mshtml/htmlevent.h b/dlls/mshtml/htmlevent.h index b50c74c029f..2d86ba08782 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(compat_mode_t,IHTMLEventObj**); +HRESULT create_event_obj(DOMEvent*,compat_mode_t,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 06d16e4e4aa..68452794449 100644 --- a/dlls/mshtml/htmlstorage.c +++ b/dlls/mshtml/htmlstorage.c @@ -208,12 +208,21 @@ static void storage_event_proc(event_task_t *_task) struct storage_event_task *task = (struct storage_event_task*)_task; HTMLInnerWindow *window = task->header.window; DOMEvent *event = task->event; + compat_mode_t compat_mode; VARIANT_BOOL cancelled; + HRESULT hres; + VARIANT var;
- if(event->event_id == EVENTID_STORAGE && dispex_compat_mode(&window->event_target.dispex) >= COMPAT_MODE_IE9) { + 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) - fire_event(&window->doc->node, L"onstorage", NULL, &cancelled); + if(window->doc) { + hres = create_event_obj(event, compat_mode, (IHTMLEventObj**)&V_DISPATCH(&var)); + if(SUCCEEDED(hres)) { + V_VT(&var) = VT_DISPATCH; + fire_event(&window->doc->node, L"onstorage", &var, &cancelled); + IDispatch_Release(V_DISPATCH(&var)); + } + } }else if(window->doc) { dispatch_event(&window->doc->node.event_target, event); }