%PDF- <> %âãÏÓ endobj 2 0 obj <> endobj 3 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/Annots[ 28 0 R 29 0 R] /MediaBox[ 0 0 595.5 842.25] /Contents 4 0 R/Group<>/Tabs/S>> endobj ºaâÚÎΞ-ÌE1ÍØÄ÷{òò2ÿ ÛÖ^ÔÀá TÎ{¦?§®¥kuµùÕ5sLOšuY>endobj 2 0 obj<>endobj 2 0 obj<>endobj 2 0 obj<>endobj 2 0 obj<> endobj 2 0 obj<>endobj 2 0 obj<>es 3 0 R>> endobj 2 0 obj<> ox[ 0.000000 0.000000 609.600000 935.600000]/Fi endobj 3 0 obj<> endobj 7 1 obj<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI]>>/Subtype/Form>> stream
<!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>