sandboxed-tests.html (2246B)
1 <!DOCTYPE html> 2 <meta charset=utf-8> 3 <script> 4 const channel = new BroadcastChannel('echochannel'); 5 channel.onmessage = e => channel.postMessage(e.data); 6 </script> 7 <div id='workersrc' style='display:none'> 8 importScripts("http://{{host}}:{{ports[http][0]}}/resources/testharness.js"); 9 onmessage = e => { 10 const external_blob = e.data.blob; 11 const external_blob_url = e.data.url; 12 13 test(t => { 14 assert_equals('null', self.location.origin); 15 }, 'Worker has an opaque origin.'); 16 17 async_test(t => { 18 const r = new FileReader(); 19 r.onloadend = t.step_func_done(e => assert_equals(r.result, 'from worker')); 20 r.readAsText(new Blob(['from worker'])); 21 }, 'Worker can read its own blobs.'); 22 23 async_test(t => { 24 const r = new FileReader(); 25 r.onloadend = t.step_func_done(e => assert_equals(r.result, 'from page')); 26 r.readAsText(external_blob); 27 }, 'Worker can read its owners blobs.'); 28 29 async_test(t => { 30 const request = new XMLHttpRequest(); 31 request.open('GET', external_blob_url); 32 request.onreadystatechange = t.step_func(() => { 33 if (request.readyState == 4) { 34 assert_equals(request.responseText, 'from page'); 35 t.done(); 36 } 37 }); 38 request.send(); 39 }, 'Worker can XHR fetch a blob.'); 40 41 promise_test(t => 42 fetch(external_blob_url).then(r => r.text()).then(text => assert_equals(text, 'from page')) 43 , 'Worker can fetch a blob.'); 44 45 async_test(t => { 46 const channel = new BroadcastChannel('echochannel'); 47 channel.onmessage = t.step_func_done(e => assert_equals('ping', e.data)); 48 channel.postMessage('ping'); 49 }, 'Worker can access BroadcastChannel'); 50 done(); 51 }; 52 </div> 53 <script> 54 // Create a worker with a blob URL to get a same opaque origin worker. 55 const b = new Blob([document.getElementById('workersrc').textContent]); 56 const url = URL.createObjectURL(b); 57 const worker = new Worker(url); 58 // Pass back any messages from the worker to our parent to collect test results. 59 worker.onmessage = e => { 60 parent.postMessage(e.data, '*'); 61 }; 62 63 // Send test data to the worker. 64 const b2 = new Blob(['from page']); 65 const url2 = URL.createObjectURL(b2); 66 worker.postMessage({url: url2, blob: b2}); 67 </script>