• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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