clients-matchall-blob-url-worker.https.html (2782B)
1 <!DOCTYPE html> 2 <title>Service Worker: Clients.matchAll with a blob URL worker client</title> 3 <script src="/resources/testharness.js"></script> 4 <script src="/resources/testharnessreport.js"></script> 5 <script src="resources/test-helpers.sub.js"></script> 6 <script> 7 const SCRIPT = 'resources/clients-matchall-worker.js'; 8 9 promise_test(async (t) => { 10 const scope = 'resources/clients-matchall-blob-url-worker.html'; 11 12 const reg = await service_worker_unregister_and_register(t, SCRIPT, scope); 13 t.add_cleanup(_ => reg.unregister()); 14 await wait_for_state(t, reg.installing, 'activated'); 15 16 const frame = await with_iframe(scope); 17 t.add_cleanup(_ => frame.remove()); 18 19 { 20 const message = await frame.contentWindow.waitForWorker(); 21 assert_equals(message.data, 'Worker is ready.', 22 'Worker should reply to the message.'); 23 } 24 25 const channel = new MessageChannel(); 26 const message = await new Promise(resolve => { 27 channel.port1.onmessage = resolve; 28 frame.contentWindow.navigator.serviceWorker.controller.postMessage( 29 {port: channel.port2, options: {type: 'worker'}}, [channel.port2]); 30 }); 31 32 checkMessageEvent(message); 33 34 }, 'Test Clients.matchAll() with a blob URL worker client.'); 35 36 promise_test(async (t) => { 37 const scope = 'resources/blank.html'; 38 39 const reg = await service_worker_unregister_and_register(t, SCRIPT, scope); 40 t.add_cleanup(_ => reg.unregister()); 41 await wait_for_state(t, reg.installing, 'activated'); 42 43 const workerScript = ` 44 self.onmessage = (e) => { 45 self.postMessage("Worker is ready."); 46 }; 47 `; 48 const blob = new Blob([workerScript], { type: 'text/javascript' }); 49 const blobUrl = URL.createObjectURL(blob); 50 const worker = new Worker(blobUrl); 51 52 { 53 const message = await new Promise(resolve => { 54 worker.onmessage = resolve; 55 worker.postMessage("Ping to worker."); 56 }); 57 assert_equals(message.data, 'Worker is ready.', 58 'Worker should reply to the message.'); 59 } 60 61 const channel = new MessageChannel(); 62 const message = await new Promise(resolve => { 63 channel.port1.onmessage = resolve; 64 reg.active.postMessage( 65 {port: channel.port2, 66 options: {includeUncontrolled: true, type: 'worker'}}, 67 [channel.port2] 68 ); 69 }); 70 71 checkMessageEvent(message); 72 73 }, 'Test Clients.matchAll() with an uncontrolled blob URL worker client.'); 74 75 function checkMessageEvent(e) { 76 assert_equals(e.data.length, 1); 77 78 const workerClient = e.data[0]; 79 assert_equals(workerClient[0], undefined); // visibilityState 80 assert_equals(workerClient[1], undefined); // focused 81 assert_true(workerClient[2].includes('blob:')); // url 82 assert_equals(workerClient[3], 'worker'); // type 83 assert_equals(workerClient[4], 'none'); // frameType 84 } 85 </script>