From e3e17965f332e4b1d1a051d245bb6fcaa044db18 Mon Sep 17 00:00:00 2001 From: Jacek Caban Date: Tue, 1 Mar 2022 20:10:35 +0100 Subject: [PATCH] mshtml: Implement IDOMMessageEvent::data property. Signed-off-by: Jacek Caban Signed-off-by: Alexandre Julliard --- dlls/mshtml/htmlevent.c | 28 +++++++++++++++++++++++++--- dlls/mshtml/htmlevent.h | 1 + dlls/mshtml/htmlwindow.c | 2 +- dlls/mshtml/tests/events.js | 16 ++++++++++++++++ 4 files changed, 43 insertions(+), 4 deletions(-) diff --git a/dlls/mshtml/htmlevent.c b/dlls/mshtml/htmlevent.c index abf357a66ad..fe3433692f3 100644 --- a/dlls/mshtml/htmlevent.c +++ b/dlls/mshtml/htmlevent.c @@ -2150,6 +2150,7 @@ static void DOMCustomEvent_destroy(DOMEvent *event) typedef struct { DOMEvent event; IDOMMessageEvent IDOMMessageEvent_iface; + WCHAR *data; } DOMMessageEvent; static inline DOMMessageEvent *impl_from_IDOMMessageEvent(IDOMMessageEvent *iface) @@ -2209,10 +2210,9 @@ static HRESULT WINAPI DOMMessageEvent_get_data(IDOMMessageEvent *iface, BSTR *p) { DOMMessageEvent *This = impl_from_IDOMMessageEvent(iface); - FIXME("(%p)->(%p)\n", This, p); + TRACE("(%p)->(%p)\n", This, p); - *p = NULL; - return S_OK; + return (*p = SysAllocString(This->data)) ? S_OK : E_OUTOFMEMORY; } static HRESULT WINAPI DOMMessageEvent_get_origin(IDOMMessageEvent *iface, BSTR *p) @@ -2268,6 +2268,8 @@ static void *DOMMessageEvent_query_interface(DOMEvent *event, REFIID riid) static void DOMMessageEvent_destroy(DOMEvent *event) { + DOMMessageEvent *message_event = DOMMessageEvent_from_DOMEvent(event); + heap_free(message_event->data); } static const tid_t DOMEvent_iface_tids[] = { @@ -2513,6 +2515,26 @@ HRESULT create_document_event(HTMLDocumentNode *doc, eventid_t event_id, DOMEven return S_OK; } +HRESULT create_message_event(HTMLDocumentNode *doc, BSTR data, DOMEvent **ret) +{ + DOMMessageEvent *message_event; + DOMEvent *event; + HRESULT hres; + + hres = create_document_event(doc, EVENTID_MESSAGE, &event); + if(FAILED(hres)) + return hres; + message_event = DOMMessageEvent_from_DOMEvent(event); + + if(!(message_event->data = heap_strdupW(data))) { + IDOMEvent_Release(&event->IDOMEvent_iface); + return E_OUTOFMEMORY; + } + + *ret = event; + return S_OK; +} + static HRESULT call_disp_func(IDispatch *disp, DISPPARAMS *dp, VARIANT *retv) { IDispatchEx *dispex; diff --git a/dlls/mshtml/htmlevent.h b/dlls/mshtml/htmlevent.h index ae3131e48b2..7f62bd69a7f 100644 --- a/dlls/mshtml/htmlevent.h +++ b/dlls/mshtml/htmlevent.h @@ -112,6 +112,7 @@ void dispatch_event(EventTarget*,DOMEvent*) DECLSPEC_HIDDEN; HRESULT create_document_event(HTMLDocumentNode*,eventid_t,DOMEvent**) DECLSPEC_HIDDEN; HRESULT create_document_event_str(HTMLDocumentNode*,const WCHAR*,IDOMEvent**) DECLSPEC_HIDDEN; HRESULT create_event_from_nsevent(nsIDOMEvent*,compat_mode_t,DOMEvent**) DECLSPEC_HIDDEN; +HRESULT create_message_event(HTMLDocumentNode*,BSTR,DOMEvent**) DECLSPEC_HIDDEN; void init_nsevents(HTMLDocumentNode*) DECLSPEC_HIDDEN; void release_nsevents(HTMLDocumentNode*) DECLSPEC_HIDDEN; diff --git a/dlls/mshtml/htmlwindow.c b/dlls/mshtml/htmlwindow.c index 3784c3a9736..28862c4ad40 100644 --- a/dlls/mshtml/htmlwindow.c +++ b/dlls/mshtml/htmlwindow.c @@ -2207,7 +2207,7 @@ static HRESULT WINAPI HTMLWindow6_postMessage(IHTMLWindow6 *iface, BSTR msg, VAR return E_FAIL; } - hres = create_document_event(This->inner_window->doc, EVENTID_MESSAGE, &event); + hres = create_message_event(This->inner_window->doc, msg, &event); if(FAILED(hres)) return hres; diff --git a/dlls/mshtml/tests/events.js b/dlls/mshtml/tests/events.js index 6d451a641c2..d66b44a8ef2 100644 --- a/dlls/mshtml/tests/events.js +++ b/dlls/mshtml/tests/events.js @@ -796,3 +796,19 @@ async_test("detached_img_error_event", function() { } img.src = "about:blank"; }); + +async_test("message event", function() { + var listener_called = false; + + window.addEventListener("message", function(e) { + listener_called = true; + ok(e.data === "test", "e.data = " + e.data); + ok(e.bubbles === false, "bubbles = " + e.bubbles); + ok(e.cancelable === false, "cancelable = " + e.cancelable); + next_test(); + }); + + window.postMessage("test", "http://winetest.example.org"); + todo_wine. + ok(listener_called == false, "listener already called"); +});