FileSystemBaseHandle-postMessage-BroadcastChannel.js (3612B)
1 'use strict'; 2 3 // This script depends on the following scripts: 4 // /fs/resources/messaging-helpers.js 5 // /fs/resources/messaging-serialize-helpers.js 6 // /fs/resources/test-helpers.js 7 // /service-workers/service-worker/resources/test-helpers.sub.js 8 9 // Sets up a new broadcast channel in |target|. Posts a message instructing 10 // |target| to open the broadcast channel using |broadcast_channel_name|. 11 async function create_broadcast_channel( 12 test, broadcast_channel_name, receiver, target, target_origin) { 13 target.postMessage( 14 { type: 'create-broadcast-channel', broadcast_channel_name }, 15 { targetOrigin: target_origin }); 16 const event_watcher = new EventWatcher(test, receiver, 'message'); 17 18 // Wait until |target| is listening to the broad cast channel. 19 const message_event = await event_watcher.wait_for('message'); 20 assert_equals(message_event.data.type, 'broadcast-channel-created', 21 'The message target must receive a "broadcast-channel-created" message ' + 22 'response.'); 23 } 24 25 // This test is very similar to 'FileSystemBaseHandle-postMessage.js'. It 26 // starts by creating three message targets for the broadcast channel: 27 // an iframe, dedicated worker and a service worker. After setup, an array 28 // of FileSystemHandles is sent across the broadcast channel. The test 29 // expects three responses -- one from each message target. 30 directory_test( 31 async (t, root) => { 32 const broadcast_channel_name = 'file-system-file-handle-channel'; 33 const broadcast_channel = new BroadcastChannel(broadcast_channel_name); 34 const broadcast_channel_event_watcher = 35 new EventWatcher(t, broadcast_channel, 'message'); 36 37 const iframe = await add_iframe(t, {src: kDocumentMessageTarget}); 38 await create_broadcast_channel( 39 t, broadcast_channel_name, self, iframe.contentWindow, '*'); 40 41 const scope = `${kServiceWorkerMessageTarget}` + 42 '?post-message-to-broadcast-channel-with-file-handle'; 43 44 const registration = 45 await create_service_worker(t, kServiceWorkerMessageTarget, scope); 46 47 await create_broadcast_channel( 48 t, broadcast_channel_name, navigator.serviceWorker, 49 registration.installing); 50 51 const dedicated_worker = 52 create_dedicated_worker(t, kDedicatedWorkerMessageTarget); 53 54 await create_broadcast_channel( 55 t, broadcast_channel_name, dedicated_worker, dedicated_worker); 56 57 const handles = await create_file_system_handles(root); 58 59 broadcast_channel.postMessage( 60 {type: 'receive-file-system-handles', cloned_handles: handles}); 61 62 const expected_response_count = 3; 63 const responses = []; 64 for (let i = 0; i < expected_response_count; ++i) { 65 const message_event = 66 await broadcast_channel_event_watcher.wait_for('message'); 67 responses.push(message_event.data); 68 } 69 70 const expected_serialized_handles = await serialize_handles(handles); 71 72 for (let i = 0; i < responses.length; ++i) { 73 assert_equals( 74 responses[i].type, 'receive-serialized-file-system-handles', 75 'The test runner must receive a "serialized-file-system-handles" ' + 76 `message response. Actual response: ${responses[i]}`); 77 78 assert_equals_serialized_handles( 79 responses[i].serialized_handles, expected_serialized_handles); 80 81 await assert_equals_cloned_handles( 82 responses[i].cloned_handles, handles); 83 } 84 }, 85 'Send and receive messages using a broadcast channel in an iframe, ' + 86 'dedicated worker and service worker.');