Jacek Caban : mshtml: Post messages asynchronously in IE9+ modes.

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


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

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

mshtml: Post messages asynchronously in IE9+ modes.

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

---

 dlls/mshtml/htmlwindow.c          | 33 +++++++++++++++++++++++++++++++++
 dlls/mshtml/tests/documentmode.js | 11 +++++++++++
 dlls/mshtml/tests/events.js       |  1 -
 dlls/mshtml/tests/jstest.html     | 15 ---------------
 4 files changed, 44 insertions(+), 16 deletions(-)

diff --git a/dlls/mshtml/htmlwindow.c b/dlls/mshtml/htmlwindow.c
index 28862c4ad40..ecd530db7e2 100644
--- a/dlls/mshtml/htmlwindow.c
+++ b/dlls/mshtml/htmlwindow.c
@@ -2194,6 +2194,25 @@ static HRESULT WINAPI HTMLWindow6_get_maxConnectionsPerServer(IHTMLWindow6 *ifac
     return E_NOTIMPL;
 }
 
+struct post_message_task {
+    task_t header;
+    HTMLInnerWindow *window;
+    DOMEvent *event;
+} ;
+
+static void post_message_proc(task_t *_task)
+{
+    struct post_message_task *task = (struct post_message_task *)_task;
+    dispatch_event(&task->window->event_target, task->event);
+}
+
+static void post_message_destr(task_t *_task)
+{
+    struct post_message_task *task = (struct post_message_task *)_task;
+    IDOMEvent_Release(&task->event->IDOMEvent_iface);
+    IHTMLWindow2_Release(&task->window->base.IHTMLWindow2_iface);
+}
+
 static HRESULT WINAPI HTMLWindow6_postMessage(IHTMLWindow6 *iface, BSTR msg, VARIANT targetOrigin)
 {
     HTMLWindow *This = impl_from_IHTMLWindow6(iface);
@@ -2211,6 +2230,20 @@ static HRESULT WINAPI HTMLWindow6_postMessage(IHTMLWindow6 *iface, BSTR msg, VAR
     if(FAILED(hres))
         return hres;
 
+    if(dispex_compat_mode(&This->inner_window->event_target.dispex) >= COMPAT_MODE_IE9) {
+        struct post_message_task *task;
+        if(!(task = heap_alloc(sizeof(*task)))) {
+            IDOMEvent_Release(&event->IDOMEvent_iface);
+            return E_OUTOFMEMORY;
+        }
+
+        task->event = event;
+        task->window = This->inner_window;
+        IHTMLWindow2_AddRef(&task->window->base.IHTMLWindow2_iface);
+        return push_task(&task->header, post_message_proc, post_message_destr,
+                         This->inner_window->task_magic);
+    }
+
     dispatch_event(&This->inner_window->event_target, event);
     IDOMEvent_Release(&event->IDOMEvent_iface);
     return S_OK;
diff --git a/dlls/mshtml/tests/documentmode.js b/dlls/mshtml/tests/documentmode.js
index 6dcda4a8be0..ddcb738ab26 100644
--- a/dlls/mshtml/tests/documentmode.js
+++ b/dlls/mshtml/tests/documentmode.js
@@ -1331,3 +1331,14 @@ sync_test("__proto__", function() {
     r = Object.getPrototypeOf(x);
     ok(r === ctor.prototype, "x.__proto__ after delete = " + r);
 });
+
+async_test("postMessage", function() {
+    var v = document.documentMode;
+    var onmessage_called = false;
+    window.onmessage = function() {
+        onmessage_called = true;
+        next_test();
+    }
+    window.postMessage("test", "*");
+    ok(onmessage_called == (v < 9 ? true : false), "onmessage not called");
+});
diff --git a/dlls/mshtml/tests/events.js b/dlls/mshtml/tests/events.js
index d66b44a8ef2..75893cac204 100644
--- a/dlls/mshtml/tests/events.js
+++ b/dlls/mshtml/tests/events.js
@@ -809,6 +809,5 @@ async_test("message event", function() {
     });
 
     window.postMessage("test", "http://winetest.example.org");
-    todo_wine.
     ok(listener_called == false, "listener already called");
 });
diff --git a/dlls/mshtml/tests/jstest.html b/dlls/mshtml/tests/jstest.html
index 164593ee0d3..3bf9f316e7a 100644
--- a/dlls/mshtml/tests/jstest.html
+++ b/dlls/mshtml/tests/jstest.html
@@ -365,20 +365,6 @@ function test_xhr() {
     ok(typeof(xhr) === "object", "typeof(xhr) = " + typeof(xhr));
 }
 
-function test_postMessage() {
-    if(!("postMessage" in window)) {
-        win_skip("postMessage not available");
-        return;
-    }
-
-    var onmessage_called = false;
-    window.onmessage = function() {
-        onmessage_called = true;
-    }
-    window.postMessage("test", "*");
-    ok(onmessage_called, "onmessage not called");
-}
-
 var globalVar = false;
 
 function runTests() {
@@ -405,7 +391,6 @@ function runTests() {
     test_language_attribute();
     test_text_node();
     test_xhr();
-    test_postMessage();
 
     var r = window.execScript("globalVar = true;");
     ok(r === undefined, "execScript returned " + r);




More information about the wine-cvs mailing list