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