cross-partition-worker-creation.https.html (4503B)
1 <!DOCTYPE html> 2 <meta charset=utf-8> 3 <meta name="timeout" content="long"> 4 <script src="/resources/testharness.js"></script> 5 <script src="/resources/testharnessreport.js"></script> 6 <script src="/common/get-host-info.sub.js"></script> 7 <script src="/common/utils.js"></script> 8 <script src="/common/dispatcher/dispatcher.js"></script> 9 <!-- Pull in executor_path needed by newPopup / newIframe --> 10 <script src="/html/cross-origin-embedder-policy/credentialless/resources/common.js"></script> 11 <!-- Pull in importScript / newPopup / newIframe --> 12 <script src="/html/anonymous-iframe/resources/common.js"></script> 13 <script src="resources/common.js"></script> 14 <body> 15 <script> 16 17 const create_worker_unsuccessful = "Worker creation failed."; 18 const create_worker_successful = "Worker creation succeeded."; 19 20 const can_create_blob_url_shared_worker_js = (blob_url, response_queue_name) => ` 21 const worker = new SharedWorker("${blob_url}"); 22 worker.onerror = (e) => { 23 send("${response_queue_name}", "${create_worker_unsuccessful}"); 24 }; 25 worker.port.onmessage = (e) => { 26 send("${response_queue_name}", "${create_worker_successful}"); 27 }; 28 `; 29 30 // Tests cross-partition Shared Worker creation from blob URL. 31 promise_test(t => { 32 return new Promise(async (resolve, reject) => { 33 try { 34 const response_queue_uuid = token(); 35 36 const [cross_site_iframe_uuid, same_site_iframe_uuid] = 37 await create_test_iframes(t, response_queue_uuid); 38 39 const worker_js = ` 40 onconnect = function(e) { 41 e.ports[0].postMessage('ping'); 42 self.close(); 43 }; 44 `; 45 46 const blob = new Blob([worker_js], {type : "text/javascript"}); 47 const blob_url = window.URL.createObjectURL(blob); 48 t.add_cleanup(() => window.URL.revokeObjectURL(blob_url)); 49 50 // Create a shared worker in the cross-top-level-site iframe. 51 await send(cross_site_iframe_uuid, can_create_blob_url_shared_worker_js(blob_url, response_queue_uuid)); 52 const response_1 = await receive(response_queue_uuid); 53 if (response_1 !== create_worker_unsuccessful) { 54 reject(`Shared worker was created in not-same-top-level-site iframe`); 55 } 56 57 // Create a shared worker in the same-top-level-site iframe. 58 await send(same_site_iframe_uuid, can_create_blob_url_shared_worker_js(blob_url, response_queue_uuid)); 59 const response_2 = await receive(response_queue_uuid); 60 if (response_2 !== create_worker_successful) { 61 reject(`Shared worker wasn't created in same-top-level-site iframe`); 62 } 63 64 resolve(); 65 } catch (e) { 66 reject(e); 67 } 68 }); 69 }, "Cross-partition Shared worker shouldn't be created from blob URL."); 70 71 const can_create_blob_url_dedicated_worker_js = (blob_url, response_queue_name) => ` 72 const worker = new Worker("${blob_url}"); 73 worker.onerror = (e) => { 74 send("${response_queue_name}", "${create_worker_unsuccessful}"); 75 }; 76 worker.onmessage = (e) => { 77 send("${response_queue_name}", "${create_worker_successful}"); 78 worker.terminate(); 79 }; 80 `; 81 82 // Tests cross-partition Dedicated Worker creation from blob URL. 83 promise_test(t => { 84 return new Promise(async (resolve, reject) => { 85 try { 86 const response_queue_uuid = token(); 87 88 const [cross_site_iframe_uuid, same_site_iframe_uuid] = 89 await create_test_iframes(t, response_queue_uuid); 90 91 const blob = new Blob(["postMessage('ping');"], {type : "text/javascript"}); 92 const blob_url = window.URL.createObjectURL(blob); 93 t.add_cleanup(() => window.URL.revokeObjectURL(blob_url)); 94 95 // Create a dedicated worker in the cross-top-level-site iframe. 96 await send(cross_site_iframe_uuid, can_create_blob_url_dedicated_worker_js(blob_url, response_queue_uuid)); 97 const response_1 = await receive(response_queue_uuid); 98 if (response_1 !== create_worker_unsuccessful) { 99 reject(`Dedicated worker was created in not-same-top-level-site iframe`); 100 } 101 102 // Create a dedicated worker in the same-top-level-site iframe. 103 await send(same_site_iframe_uuid, can_create_blob_url_dedicated_worker_js(blob_url, response_queue_uuid)); 104 const response_2 = await receive(response_queue_uuid); 105 if (response_2 !== create_worker_successful) { 106 reject(`Dedicated worker wasn't created in same-top-level-site iframe`); 107 } 108 109 resolve(); 110 } catch (e) { 111 reject(e); 112 } 113 }); 114 }, "Cross-partition Dedicated worker shouldn't be created from blob URL."); 115 116 </script> 117 </body>