1// META: global=window,worker 2// META: script=../resources/test-utils.js 3'use strict'; 4 5promise_test(async () => { 6 7 let controller; 8 new ReadableStream({ 9 start(c) { 10 controller = c; 11 } 12 }); 13 14 await garbageCollect(); 15 16 return delay(50).then(() => { 17 controller.close(); 18 assert_throws_js(TypeError, () => controller.close(), 'close should throw a TypeError the second time'); 19 controller.error(); 20 }); 21 22}, 'ReadableStreamController methods should continue working properly when scripts lose their reference to the ' + 23 'readable stream'); 24 25promise_test(async () => { 26 27 let controller; 28 29 const closedPromise = new ReadableStream({ 30 start(c) { 31 controller = c; 32 } 33 }).getReader().closed; 34 35 await garbageCollect(); 36 37 return delay(50).then(() => controller.close()).then(() => closedPromise); 38 39}, 'ReadableStream closed promise should fulfill even if the stream and reader JS references are lost'); 40 41promise_test(async t => { 42 43 const theError = new Error('boo'); 44 let controller; 45 46 const closedPromise = new ReadableStream({ 47 start(c) { 48 controller = c; 49 } 50 }).getReader().closed; 51 52 await garbageCollect(); 53 54 return delay(50).then(() => controller.error(theError)) 55 .then(() => promise_rejects_exactly(t, theError, closedPromise)); 56 57}, 'ReadableStream closed promise should reject even if stream and reader JS references are lost'); 58 59promise_test(async () => { 60 61 const rs = new ReadableStream({}); 62 63 rs.getReader(); 64 65 await garbageCollect(); 66 67 return delay(50).then(() => assert_throws_js(TypeError, () => rs.getReader(), 68 'old reader should still be locking the stream even after garbage collection')); 69 70}, 'Garbage-collecting a ReadableStreamDefaultReader should not unlock its stream'); 71