1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
|
// META: global=window,worker
'use strict';
class ThrowingOptions {
constructor(whatShouldThrow) {
this.whatShouldThrow = whatShouldThrow;
this.touched = [];
}
get preventClose() {
this.maybeThrow('preventClose');
return false;
}
get preventAbort() {
this.maybeThrow('preventAbort');
return false;
}
get preventCancel() {
this.maybeThrow('preventCancel');
return false;
}
get signal() {
this.maybeThrow('signal');
return undefined;
}
maybeThrow(forWhat) {
this.touched.push(forWhat);
if (this.whatShouldThrow === forWhat) {
throw new Error(this.whatShouldThrow);
}
}
}
const checkOrder = ['preventAbort', 'preventCancel', 'preventClose', 'signal'];
for (let i = 0; i < checkOrder.length; ++i) {
const whatShouldThrow = checkOrder[i];
const whatShouldBeTouched = checkOrder.slice(0, i + 1);
promise_test(t => {
const options = new ThrowingOptions(whatShouldThrow);
return promise_rejects_js(
t, Error,
new ReadableStream().pipeTo(new WritableStream(), options),
'pipeTo should reject')
.then(() => assert_array_equals(
options.touched, whatShouldBeTouched,
'options should be touched in the right order'));
}, `pipeTo should stop after getting ${whatShouldThrow} throws`);
test(() => {
const options = new ThrowingOptions(whatShouldThrow);
assert_throws_js(
Error,
() => new ReadableStream().pipeThrough(new TransformStream(), options),
'pipeThrough should throw');
assert_array_equals(
options.touched, whatShouldBeTouched,
'options should be touched in the right order');
}, `pipeThrough should stop after getting ${whatShouldThrow} throws`);
}
|