fetch-event-respond-with-readable-stream.https.html (3369B)
1 <!DOCTYPE html> 2 <meta charset="utf-8"> 3 <title>respondWith with a response built from a ReadableStream</title> 4 <script src="/resources/testharness.js"></script> 5 <script src="/resources/testharnessreport.js"></script> 6 <script src="resources/test-helpers.sub.js"></script> 7 <script src="/common/utils.js"></script> 8 <script> 9 'use strict'; 10 11 const WORKER = 12 'resources/fetch-event-respond-with-readable-stream-worker.js'; 13 const SCOPE = 14 'resources/blank.html'; 15 16 // Register a service worker, then create an iframe at url. 17 function iframeTest(url, callback, name) { 18 return promise_test(async t => { 19 const reg = await service_worker_unregister_and_register(t, WORKER, SCOPE); 20 add_completion_callback(() => reg.unregister()); 21 await wait_for_state(t, reg.installing, 'activated'); 22 const iframe = await with_iframe(url); 23 const iwin = iframe.contentWindow; 24 t.add_cleanup(() => iframe.remove()); 25 await callback(t, iwin); 26 }, name); 27 } 28 29 iframeTest(SCOPE, async (t, iwin) => { 30 const response = await iwin.fetch('?stream'); 31 assert_equals(await response.text(), 'PASS'); 32 }, 'Subresource built from a ReadableStream'); 33 34 iframeTest(SCOPE + '?stream', (t, iwin) => { 35 assert_equals(iwin.document.body.textContent, 'PASS'); 36 }, 'Main resource built from a ReadableStream'); 37 38 iframeTest(SCOPE, async (t, iwin) => { 39 const response = await iwin.fetch('?stream&delay'); 40 assert_equals(await response.text(), 'PASS'); 41 }, 'Subresource built from a ReadableStream - delayed'); 42 43 iframeTest(SCOPE + '?stream&delay', (t, iwin) => { 44 assert_equals(iwin.document.body.textContent, 'PASS'); 45 }, 'Main resource built from a ReadableStream - delayed'); 46 47 iframeTest(SCOPE, async (t, iwin) => { 48 const response = await iwin.fetch('?stream&use-fetch-stream'); 49 assert_equals(await response.text(), 'PASS\n'); 50 }, 'Subresource built from a ReadableStream - fetch stream'); 51 52 iframeTest(SCOPE + '?stream&use-fetch-stream', (t, iwin) => { 53 assert_equals(iwin.document.body.textContent, 'PASS\n'); 54 }, 'Main resource built from a ReadableStream - fetch stream'); 55 56 for (const enqueue of [true, false]) { 57 const withStream = enqueue ? 'with nonempty stream' : 'with empty stream'; 58 iframeTest(SCOPE, async (t, iwin) => { 59 const id = token(); 60 let response = await iwin.fetch(`?stream&observe-cancel&id=${id}&enqueue=${enqueue}`); 61 response.body.cancel(); 62 63 // Wait for a while to avoid a race between the cancel handling and the 64 // second fetch request. 65 await new Promise(r => step_timeout(r, 10)); 66 67 response = await iwin.fetch(`?stream&query-cancel&id=${id}`); 68 assert_equals(await response.text(), 'cancelled'); 69 }, `Cancellation in the page should be observable in the service worker ${withStream}`); 70 71 iframeTest(SCOPE, async (t, iwin) => { 72 const id = token(); 73 const controller = new AbortController(); 74 let response = await iwin.fetch(`?stream&observe-cancel&id=${id}&enqueue=${enqueue}`, { 75 signal: controller.signal 76 }); 77 controller.abort(); 78 79 // Wait for a while to avoid a race between the cancel handling and the 80 // second fetch request. 81 await new Promise(r => step_timeout(r, 10)); 82 83 response = await iwin.fetch(`?stream&query-cancel&id=${id}`); 84 assert_equals(await response.text(), 'cancelled'); 85 }, `Abort in the page should be observable in the service worker ${withStream}`); 86 } 87 88 </script>