url-lifetime.html (1887B)
1 <!doctype html> 2 <meta charset="utf-8"> 3 <script src="/resources/testharness.js"></script> 4 <script src="/resources/testharnessreport.js"></script> 5 <body> 6 <script> 7 promise_test(t => { 8 const blob_contents = 'test blob contents'; 9 const blob = new Blob([blob_contents]); 10 const worker = new Worker('resources/create-helper.js'); 11 let url; 12 return new Promise(resolve => { 13 worker.onmessage = e => resolve(e.data); 14 worker.postMessage({blob: blob}); 15 }).then(data => { 16 url = data.url; 17 let result = fetch(url); 18 worker.terminate(); 19 return result; 20 }).then(response => response.text()).then(text => { 21 assert_equals(text, blob_contents); 22 return new Promise(resolve => t.step_timeout(resolve, 100)); 23 }).then(() => promise_rejects_js(t, TypeError, fetch(url))); 24 }, 'Terminating worker revokes its URLs'); 25 26 promise_test(t => { 27 const blob_contents = 'test blob contents'; 28 const blob = new Blob([blob_contents]); 29 const frame = document.createElement('iframe'); 30 frame.setAttribute('style', 'display:none;'); 31 frame.src = 'resources/create-helper.html'; 32 document.body.appendChild(frame); 33 34 let url; 35 return new Promise(resolve => { 36 frame.onload = t.step_func(e => { 37 resolve(e); 38 }); 39 }).then(e => { 40 frame.contentWindow.postMessage({blob: blob}, '*'); 41 return new Promise(resolve => { 42 self.addEventListener('message', t.step_func(e => { 43 if (e.source === frame.contentWindow) resolve(e); 44 })); 45 }); 46 }).then(e => { 47 url = e.data.url; 48 let fetch_result = fetch(url); 49 document.body.removeChild(frame); 50 return fetch_result; 51 }).then(response => response.text()).then(text => { 52 assert_equals(text, blob_contents); 53 return new Promise(resolve => t.step_timeout(resolve, 100)); 54 }).then(() => promise_rejects_js(t, TypeError, fetch(url))); 55 }, 'Removing an iframe revokes its URLs'); 56 </script>