Title: [284101] trunk
Revision
284101
Author
[email protected]
Date
2021-10-13 10:20:20 -0700 (Wed, 13 Oct 2021)

Log Message

MessagePort messages sent in iframe unload event not received
https://bugs.webkit.org/show_bug.cgi?id=231167
<rdar://problem/84095357>

Reviewed by Alex Christensen.

Source/WebCore:

When removing an iframe from the document, frameDetached() was stopping all ActiveDOMObjects
before firing the "unload" event instead of after. As a result, MessagePorts would be closed
before the "unload" event handler had a chance to run and any attempt to post messages on
MessagePorts then would fail.

Test: fast/frames/message-port-postMessage-unload-event.html

* loader/FrameLoader.cpp:
(WebCore::FrameLoader::frameDetached):

LayoutTests:

Add layout test coverage.

* fast/frames/message-port-postMessage-unload-event-expected.txt: Added.
* fast/frames/message-port-postMessage-unload-event.html: Added.

Modified Paths

Added Paths

Diff

Modified: trunk/LayoutTests/ChangeLog (284100 => 284101)


--- trunk/LayoutTests/ChangeLog	2021-10-13 17:03:35 UTC (rev 284100)
+++ trunk/LayoutTests/ChangeLog	2021-10-13 17:20:20 UTC (rev 284101)
@@ -1,3 +1,16 @@
+2021-10-13  Chris Dumez  <[email protected]>
+
+        MessagePort messages sent in iframe unload event not received
+        https://bugs.webkit.org/show_bug.cgi?id=231167
+        <rdar://problem/84095357>
+
+        Reviewed by Alex Christensen.
+
+        Add layout test coverage.
+
+        * fast/frames/message-port-postMessage-unload-event-expected.txt: Added.
+        * fast/frames/message-port-postMessage-unload-event.html: Added.
+
 2021-10-13  Ayumi Kojima  <[email protected]>
 
         [ iOS MacOS wk2 Release ] 2 fast/canvas tests are flaky failing.

Added: trunk/LayoutTests/fast/frames/message-port-postMessage-unload-event-expected.txt (0 => 284101)


--- trunk/LayoutTests/fast/frames/message-port-postMessage-unload-event-expected.txt	                        (rev 0)
+++ trunk/LayoutTests/fast/frames/message-port-postMessage-unload-event-expected.txt	2021-10-13 17:20:20 UTC (rev 284101)
@@ -0,0 +1,21 @@
+Tests that MessagePort.postMessage() works from inside an iframe's unload event handler.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+
+PASS iframe received "pagehide" event
+PASS iframe received "visibilitychange" event
+PASS iframe received "unload" event
+PASS Parent frame received "message" event
+PASS Parent frame received "message" event
+PASS Parent frame received "message" event
+PASS MessagePort in parent frame received message
+PASS MessagePort in parent frame received message
+PASS MessagePort in parent frame received message
+PASS eventsReceivedByFrameWindow is 3
+PASS eventsReceivedByTopWindow is 3
+PASS eventsReceivedByTopWindowMessagePort is 3
+PASS successfullyParsed is true
+
+TEST COMPLETE
+

Added: trunk/LayoutTests/fast/frames/message-port-postMessage-unload-event.html (0 => 284101)


--- trunk/LayoutTests/fast/frames/message-port-postMessage-unload-event.html	                        (rev 0)
+++ trunk/LayoutTests/fast/frames/message-port-postMessage-unload-event.html	2021-10-13 17:20:20 UTC (rev 284101)
@@ -0,0 +1,63 @@
+<!DOCTYPE html>
+<html>
+<body>
+<script src=""
+<script>
+description("Tests that MessagePort.postMessage() works from inside an iframe's unload event handler.");
+jsTestIsAsync = true;
+
+let eventsReceivedByFrameWindow = 0;
+let eventsReceivedByTopWindow = 0;
+let eventsReceivedByTopWindowMessagePort = 0;
+
+function finishIfNecessary()
+{
+    if (eventsReceivedByTopWindow < 3 || eventsReceivedByTopWindowMessagePort < 3)
+        return;
+
+    setTimeout(() => {
+        shouldBe("eventsReceivedByFrameWindow", "3");
+        shouldBe("eventsReceivedByTopWindow", "3");
+        shouldBe("eventsReceivedByTopWindowMessagePort", "3");
+        finishJSTest();
+    }, 0);
+}
+
+_onload_ = () => {
+    const testFrame = document.getElementById("testFrame");
+    testFrame.contentWindow.addEventListener("message", (e) => {
+        const framePort = e.data.port;
+        for (let event of ["unload", "pagehide", "visibilitychange"]) {
+            testFrame.contentWindow.addEventListener(event, () => {
+                eventsReceivedByFrameWindow++;
+                window.parent.testPassed(`iframe received "${event}" event`);
+                framePort.postMessage({ trigger: event });
+                window.parent.postMessage({ trigger: event });
+            });
+        }
+    });
+
+    const channel = new MessageChannel();
+    testFrame.contentWindow.postMessage({
+        port: channel.port1,
+    }, testFrame.contentWindow.origin, [channel.port1]);
+    channel.port2._onmessage_ = (e) => {
+        eventsReceivedByTopWindowMessagePort++;
+        testPassed("MessagePort in parent frame received message", e.data);
+        finishIfNecessary();
+    };
+
+    addEventListener("message", (e) => {
+        eventsReceivedByTopWindow++;
+        testPassed('Parent frame received "message" event', e.data);
+        finishIfNecessary();
+    });
+    setTimeout(() => {
+        testFrame.remove();
+        setTimeout(finishJSTest, 100);
+    }, 0);
+};
+</script>
+<iframe id="testFrame"></iframe>
+</body>
+</html>

Modified: trunk/Source/WebCore/ChangeLog (284100 => 284101)


--- trunk/Source/WebCore/ChangeLog	2021-10-13 17:03:35 UTC (rev 284100)
+++ trunk/Source/WebCore/ChangeLog	2021-10-13 17:20:20 UTC (rev 284101)
@@ -1,3 +1,21 @@
+2021-10-13  Chris Dumez  <[email protected]>
+
+        MessagePort messages sent in iframe unload event not received
+        https://bugs.webkit.org/show_bug.cgi?id=231167
+        <rdar://problem/84095357>
+
+        Reviewed by Alex Christensen.
+
+        When removing an iframe from the document, frameDetached() was stopping all ActiveDOMObjects
+        before firing the "unload" event instead of after. As a result, MessagePorts would be closed
+        before the "unload" event handler had a chance to run and any attempt to post messages on
+        MessagePorts then would fail.
+
+        Test: fast/frames/message-port-postMessage-unload-event.html
+
+        * loader/FrameLoader.cpp:
+        (WebCore::FrameLoader::frameDetached):
+
 2021-10-13  Aditya Keerthi  <[email protected]>
 
         Unprefix -webkit-appearance

Modified: trunk/Source/WebCore/loader/FrameLoader.cpp (284100 => 284101)


--- trunk/Source/WebCore/loader/FrameLoader.cpp	2021-10-13 17:03:35 UTC (rev 284100)
+++ trunk/Source/WebCore/loader/FrameLoader.cpp	2021-10-13 17:20:20 UTC (rev 284101)
@@ -2825,12 +2825,13 @@
         checkCompletenessNow();
     }
 
-    if (m_frame.document()->backForwardCacheState() != Document::InBackForwardCache) {
+    if (m_frame.document()->backForwardCacheState() != Document::InBackForwardCache)
         stopAllLoadersAndCheckCompleteness();
-        m_frame.document()->stopActiveDOMObjects();
-    }
 
     detachFromParent();
+
+    if (m_frame.document()->backForwardCacheState() != Document::InBackForwardCache)
+        m_frame.document()->stopActiveDOMObjects();
 }
 
 void FrameLoader::detachFromParent()
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to