• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1// META: global=window,worker
2// META: script=../resources/test-utils.js
3// META: script=../resources/recording-streams.js
4'use strict';
5
6function interceptThen() {
7  const intercepted = [];
8  let callCount = 0;
9  Object.prototype.then = function(resolver) {
10    if (!this.done) {
11      intercepted.push(this.value);
12    }
13    const retval = Object.create(null);
14    retval.done = ++callCount === 3;
15    retval.value = callCount;
16    resolver(retval);
17    if (retval.done) {
18      delete Object.prototype.then;
19    }
20  }
21  return intercepted;
22}
23
24promise_test(async t => {
25  const rs = new ReadableStream({
26    start(controller) {
27      controller.enqueue('a');
28      controller.close();
29    }
30  });
31  const ws = recordingWritableStream();
32
33  const intercepted = interceptThen();
34  t.add_cleanup(() => {
35    delete Object.prototype.then;
36  });
37
38  await rs.pipeTo(ws);
39  delete Object.prototype.then;
40
41
42  assert_array_equals(intercepted, [], 'nothing should have been intercepted');
43  assert_array_equals(ws.events, ['write', 'a', 'close'], 'written chunk should be "a"');
44}, 'piping should not be observable');
45
46promise_test(async t => {
47  const rs = new ReadableStream({
48    start(controller) {
49      controller.enqueue('a');
50      controller.close();
51    }
52  });
53  const ws = recordingWritableStream();
54
55  const [ branch1, branch2 ] = rs.tee();
56
57  const intercepted = interceptThen();
58  t.add_cleanup(() => {
59    delete Object.prototype.then;
60  });
61
62  await branch1.pipeTo(ws);
63  delete Object.prototype.then;
64  branch2.cancel();
65
66  assert_array_equals(intercepted, [], 'nothing should have been intercepted');
67  assert_array_equals(ws.events, ['write', 'a', 'close'], 'written chunk should be "a"');
68}, 'tee should not be observable');
69