116 lines
3.9 KiB
HTML
116 lines
3.9 KiB
HTML
<!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>
|