Jacek Caban : mshtml: Implement IDOMMessageEvent::data property.

Alexandre Julliard julliard at winehq.org
Tue Mar 1 15:45:34 CST 2022


Module: wine
Branch: master
Commit: e3e17965f332e4b1d1a051d245bb6fcaa044db18
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=e3e17965f332e4b1d1a051d245bb6fcaa044db18

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Tue Mar  1 20:10:35 2022 +0100

mshtml: Implement IDOMMessageEvent::data property.

Signed-off-by: Jacek Caban <jacek at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 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");
+});




More information about the wine-cvs mailing list