summaryrefslogtreecommitdiffstats
path: root/testing/web-platform/tests/webmessaging/broadcastchannel/ordering.html
diff options
context:
space:
mode:
Diffstat (limited to 'testing/web-platform/tests/webmessaging/broadcastchannel/ordering.html')
-rw-r--r--testing/web-platform/tests/webmessaging/broadcastchannel/ordering.html116
1 files changed, 116 insertions, 0 deletions
diff --git a/testing/web-platform/tests/webmessaging/broadcastchannel/ordering.html b/testing/web-platform/tests/webmessaging/broadcastchannel/ordering.html
new file mode 100644
index 0000000000..2d521b9e0c
--- /dev/null
+++ b/testing/web-platform/tests/webmessaging/broadcastchannel/ordering.html
@@ -0,0 +1,116 @@
+<!DOCTYPE html>
+<meta charset=utf-8>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<!-- Pull in the with_iframe helper function from the service worker tests -->
+<script src="/service-workers/service-worker/resources/test-helpers.sub.js"></script>
+<body>
+<script>
+
+const BC0_FIRST_MSG = 'from BC0 - first';
+const BC1_FIRST_MSG = 'from BC1 - first';
+const BC2_FIRST_MSG = 'from BC2 - first';
+const BC3_FIRST_MSG = 'from BC3 - first';
+const BC0_SECOND_MSG = 'from BC0 - second';
+const BC1_SECOND_MSG = 'from BC1 - second';
+const BC2_SECOND_MSG = 'from BC2 - second';
+const BC3_SECOND_MSG = 'done';
+const BC0_TARGET_NAME = 'BC1';
+const BC1_TARGET_NAME = 'BC1';
+const BC2_TARGET_NAME = 'BC2';
+const BC3_TARGET_NAME = 'BC3';
+const MULTI_FRAME_ORDERING_TEST_CHANNEL_NAME = 'multi-frame-order';
+
+const bc0 = new BroadcastChannel(MULTI_FRAME_ORDERING_TEST_CHANNEL_NAME);
+const messages = [];
+
+function logReceivedMessage(targetname, e) {
+ messages.push({'target': targetname, 'data': e.data});
+}
+
+function postMessagesToChannel() {
+ return new Promise((resolve) => {
+ bc0.postMessage(BC0_FIRST_MSG);
+ bc0.postMessage(BC0_SECOND_MSG);
+ resolve();
+ });
+}
+
+// Expected flow of messages between the BroadcastChannel objects (based on
+// the requirement that messages get delivered to BroadcastChannel objects
+// "in creation order, oldest first") and comments describing the actions
+// taken in response to each event
+const EXPECTED_RESULTS = [
+ // -> BC0 sends two messages, BC1 and BC2 are connected to the channel
+
+ {'data': BC0_FIRST_MSG, 'target': BC1_TARGET_NAME},
+ // -> BC1 Creates BC3 and sends first message
+
+ {'data': BC0_FIRST_MSG, 'target': BC2_TARGET_NAME},
+ // -> BC2 sends two messages
+
+ // BC3 isn't expected to receive the messages sent before it was created, so
+ // no corresponding entries here for messages from BC0.
+
+ {'data': BC0_SECOND_MSG, 'target': BC1_TARGET_NAME},
+ // -> BC1 sends second message
+
+ {'data': BC0_SECOND_MSG, 'target': BC2_TARGET_NAME},
+ // -> BC2 closes
+
+ {'data': BC1_FIRST_MSG, 'target': BC0_TARGET_NAME},
+
+ {'data': BC1_FIRST_MSG, 'target': BC3_TARGET_NAME},
+ // -> BC3 sends first message
+
+ {'data': BC2_FIRST_MSG, 'target': BC0_TARGET_NAME},
+
+ {'data': BC2_FIRST_MSG, 'target': BC1_TARGET_NAME},
+ // -> BC1 closes
+
+ {'data': BC2_FIRST_MSG, 'target': BC3_TARGET_NAME},
+ // -> BC3 sends second message
+
+ {'data': BC2_SECOND_MSG, 'target': BC0_TARGET_NAME},
+
+ {'data': BC2_SECOND_MSG, 'target': BC3_TARGET_NAME},
+ // -> BC3 closes
+
+ {'data': BC1_SECOND_MSG, 'target': BC0_TARGET_NAME},
+
+ {'data': BC3_FIRST_MSG, 'target': BC0_TARGET_NAME},
+
+ {'data': BC3_SECOND_MSG, 'target': BC0_TARGET_NAME},
+];
+
+function testCompletion(t) {
+ return new Promise((resolve) => {
+ bc0.onmessage = t.step_func(e => {
+ logReceivedMessage(BC0_TARGET_NAME, e);
+ if (e.data == BC3_SECOND_MSG) {
+ assert_equals(messages.length, EXPECTED_RESULTS.length);
+ for(var i = 0; i < messages.length; i++) {
+ assert_equals(messages[i].target, EXPECTED_RESULTS[i].target, `Message ${i+1} has unexpected target`);
+ assert_equals(messages[i].data, EXPECTED_RESULTS[i].data, `Message ${i+1} has unexpected message contents`);
+ }
+ resolve();
+ }
+ });
+ });
+}
+
+promise_test(async t => {
+
+ const testResults = testCompletion(t);
+ // Await them sequentially because we need the BroadcastChannel object in
+ // iframe1 to be created first, we need the BroadcastChannel object in
+ // iframe2 to be created second, and then we only want to call
+ // postMessagesToChannel once both BroadcastChannels have been created.
+ await with_iframe('resources/ordering.html?id=iframe1');
+ await with_iframe('resources/ordering.html?id=iframe2');
+ await postMessagesToChannel();
+ return testResults;
+}, "Messages are delivered in port creation order across multiple frames");
+
+</script>
+</body>