OLD | NEW |
1 'use strict'; | 1 'use strict'; |
2 | 2 |
3 if (self.importScripts) { | 3 if (self.importScripts) { |
4 self.importScripts('/resources/testharness.js'); | 4 self.importScripts('/resources/testharness.js'); |
5 self.importScripts('../resources/test-utils.js'); | 5 self.importScripts('../resources/test-utils.js'); |
6 self.importScripts('../resources/recording-streams.js'); | 6 self.importScripts('../resources/recording-streams.js'); |
7 } | 7 } |
8 | 8 |
9 const error1 = new Error('error1'); | 9 const error1 = new Error('error1'); |
10 error1.name = 'error1'; | 10 error1.name = 'error1'; |
11 | 11 |
| 12 const error2 = new Error('error2'); |
| 13 error2.name = 'error2'; |
| 14 |
12 promise_test(t => { | 15 promise_test(t => { |
13 const ws = new WritableStream({ | 16 const ws = new WritableStream({ |
14 write() { | 17 write() { |
15 return new Promise(() => { }); // forever-pending, so normally .ready woul
d not fulfill. | 18 return new Promise(() => { }); // forever-pending, so normally .ready woul
d not fulfill. |
16 } | 19 } |
17 }); | 20 }); |
18 | 21 |
19 const writer = ws.getWriter(); | 22 const writer = ws.getWriter(); |
20 writer.write('a'); | 23 const writePromise = writer.write('a'); |
21 | 24 |
22 const readyPromise = writer.ready; | 25 const readyPromise = writer.ready; |
23 | 26 |
24 writer.abort(error1); | 27 writer.abort(error1); |
25 | 28 |
26 assert_equals(writer.ready, readyPromise, 'the ready promise property should n
ot change'); | 29 assert_equals(writer.ready, readyPromise, 'the ready promise property should n
ot change'); |
27 | 30 |
28 return promise_rejects(t, new TypeError(), readyPromise, 'the ready promise sh
ould reject with a TypeError'); | 31 return Promise.all([ |
| 32 promise_rejects(t, new TypeError(), readyPromise, 'the ready promise should
reject with a TypeError'), |
| 33 promise_rejects(t, new TypeError(), writePromise, 'the write() promise shoul
d reject with a TypeError') |
| 34 ]); |
29 }, 'Aborting a WritableStream should cause the writer\'s unsettled ready promise
to reject'); | 35 }, 'Aborting a WritableStream should cause the writer\'s unsettled ready promise
to reject'); |
30 | 36 |
31 promise_test(t => { | 37 promise_test(t => { |
32 const ws = new WritableStream(); | 38 const ws = new WritableStream(); |
33 | 39 |
34 const writer = ws.getWriter(); | 40 const writer = ws.getWriter(); |
35 writer.write('a'); | 41 writer.write('a'); |
36 | 42 |
37 const readyPromise = writer.ready; | 43 const readyPromise = writer.ready; |
38 | 44 |
39 return readyPromise.then(() => { | 45 return readyPromise.then(() => { |
40 writer.abort(error1); | 46 writer.abort(error1); |
41 | 47 |
42 assert_not_equals(writer.ready, readyPromise, 'the ready promise property sh
ould change'); | 48 assert_not_equals(writer.ready, readyPromise, 'the ready promise property sh
ould change'); |
43 return promise_rejects(t, new TypeError(), writer.ready, 'the ready promise
should reject with a TypeError'); | 49 return promise_rejects(t, new TypeError(), writer.ready, 'the ready promise
should reject with a TypeError'); |
44 }); | 50 }); |
45 }, 'Aborting a WritableStream should cause the writer\'s fulfilled ready promise
to reset to a rejected one'); | 51 }, 'Aborting a WritableStream should cause the writer\'s fulfilled ready promise
to reset to a rejected one'); |
46 | 52 |
47 promise_test(t => { | 53 promise_test(t => { |
48 const ws = new WritableStream(); | 54 const ws = new WritableStream(); |
49 const writer = ws.getWriter(); | 55 const writer = ws.getWriter(); |
50 | 56 |
51 writer.releaseLock(); | 57 writer.releaseLock(); |
52 | 58 |
53 return promise_rejects(t, new TypeError(), writer.abort(), 'abort() should rej
ect with a TypeError'); | 59 return promise_rejects(t, new TypeError(), writer.abort(), 'abort() should rej
ect with a TypeError'); |
54 }, 'abort() on a released writer rejects'); | 60 }, 'abort() on a released writer rejects'); |
55 | 61 |
56 promise_test(() => { | 62 promise_test(t => { |
57 const ws = recordingWritableStream(); | 63 const ws = recordingWritableStream(); |
58 | 64 |
59 return delay(0) | 65 return delay(0) |
60 .then(() => { | 66 .then(() => { |
61 const writer = ws.getWriter(); | 67 const writer = ws.getWriter(); |
62 | 68 |
63 writer.abort(); | 69 writer.abort(); |
64 writer.write(1); | 70 |
65 writer.write(2); | 71 return Promise.all([ |
| 72 promise_rejects(t, new TypeError(), writer.write(1), 'write(1) must reje
ct with a TypeError'), |
| 73 promise_rejects(t, new TypeError(), writer.write(2), 'write(2) must reje
ct with a TypeError') |
| 74 ]); |
66 }) | 75 }) |
67 .then(() => { | 76 .then(() => { |
68 assert_array_equals(ws.events, ['abort', undefined]); | 77 assert_array_equals(ws.events, ['abort', undefined]); |
69 }); | 78 }); |
70 }, 'Aborting a WritableStream immediately prevents future writes'); | 79 }, 'Aborting a WritableStream immediately prevents future writes'); |
71 | 80 |
72 promise_test(() => { | 81 promise_test(t => { |
73 const ws = recordingWritableStream(); | 82 const ws = recordingWritableStream(); |
| 83 const results = []; |
74 | 84 |
75 return delay(0) | 85 return delay(0) |
76 .then(() => { | 86 .then(() => { |
77 const writer = ws.getWriter(); | 87 const writer = ws.getWriter(); |
78 | 88 |
79 writer.write(1); | 89 results.push( |
80 writer.write(2); | 90 writer.write(1), |
81 writer.write(3); | 91 promise_rejects(t, new TypeError(), writer.write(2), 'write(2) must reje
ct with a TypeError'), |
82 writer.abort(); | 92 promise_rejects(t, new TypeError(), writer.write(3), 'write(3) must reje
ct with a TypeError') |
83 writer.write(4); | 93 ); |
84 writer.write(5); | 94 |
| 95 const abortPromise = writer.abort(); |
| 96 |
| 97 results.push( |
| 98 promise_rejects(t, new TypeError(), writer.write(4), 'write(4) must reje
ct with a TypeError'), |
| 99 promise_rejects(t, new TypeError(), writer.write(5), 'write(5) must reje
ct with a TypeError') |
| 100 ); |
| 101 |
| 102 return abortPromise; |
85 }).then(() => { | 103 }).then(() => { |
86 assert_array_equals(ws.events, ['write', 1, 'abort', undefined]); | 104 assert_array_equals(ws.events, ['write', 1, 'abort', undefined]); |
| 105 |
| 106 return Promise.all(results); |
87 }); | 107 }); |
88 }, 'Aborting a WritableStream prevents further writes after any that are in prog
ress'); | 108 }, 'Aborting a WritableStream prevents further writes after any that are in prog
ress'); |
89 | 109 |
90 promise_test(() => { | 110 promise_test(() => { |
91 const ws = new WritableStream({ | 111 const ws = new WritableStream({ |
92 abort() { | 112 abort() { |
93 return 'Hello'; | 113 return 'Hello'; |
94 } | 114 } |
95 }); | 115 }); |
96 const writer = ws.getWriter(); | 116 const writer = ws.getWriter(); |
(...skipping 19 matching lines...) Expand all Loading... |
116 const ws = new WritableStream({ | 136 const ws = new WritableStream({ |
117 abort() { | 137 abort() { |
118 throw error1; | 138 throw error1; |
119 } | 139 } |
120 }); | 140 }); |
121 | 141 |
122 return promise_rejects(t, error1, ws.abort(undefined), | 142 return promise_rejects(t, error1, ws.abort(undefined), |
123 'rejection reason of abortPromise must be the error thrown by abort'); | 143 'rejection reason of abortPromise must be the error thrown by abort'); |
124 }, 'WritableStream if sink\'s abort throws, the promise returned by ws.abort() r
ejects'); | 144 }, 'WritableStream if sink\'s abort throws, the promise returned by ws.abort() r
ejects'); |
125 | 145 |
| 146 promise_test(t => { |
| 147 let resolveWritePromise; |
| 148 const ws = new WritableStream({ |
| 149 write() { |
| 150 return new Promise(resolve => { |
| 151 resolveWritePromise = resolve; |
| 152 }); |
| 153 }, |
| 154 abort() { |
| 155 throw error1; |
| 156 } |
| 157 }); |
| 158 |
| 159 const writer = ws.getWriter(); |
| 160 |
| 161 writer.write().catch(() => {}); |
| 162 return flushAsyncEvents().then(() => { |
| 163 const abortPromise = writer.abort(undefined); |
| 164 |
| 165 resolveWritePromise(); |
| 166 return promise_rejects(t, error1, abortPromise, |
| 167 'rejection reason of abortPromise must be the error thrown by abort'); |
| 168 }); |
| 169 }, 'WritableStream if sink\'s abort throws, for an abort performed during a writ
e, the promise returned by ' + |
| 170 'ws.abort() rejects'); |
| 171 |
126 test(() => { | 172 test(() => { |
127 const ws = recordingWritableStream(); | 173 const ws = recordingWritableStream(); |
128 const writer = ws.getWriter(); | 174 const writer = ws.getWriter(); |
129 | 175 |
130 writer.abort(error1); | 176 writer.abort(error1); |
131 | 177 |
132 assert_array_equals(ws.events, ['abort', error1]); | 178 assert_array_equals(ws.events, ['abort', error1]); |
133 }, 'Aborting a WritableStream passes through the given reason'); | 179 }, 'Aborting a WritableStream passes through the given reason'); |
134 | 180 |
135 promise_test(t => { | 181 promise_test(t => { |
(...skipping 19 matching lines...) Expand all Loading... |
155 | 201 |
156 writer.abort(error1); | 202 writer.abort(error1); |
157 | 203 |
158 return writePromise; | 204 return writePromise; |
159 }, 'Aborting a WritableStream causes any outstanding write() promises to be reje
cted with a TypeError'); | 205 }, 'Aborting a WritableStream causes any outstanding write() promises to be reje
cted with a TypeError'); |
160 | 206 |
161 promise_test(t => { | 207 promise_test(t => { |
162 const ws = new WritableStream(); | 208 const ws = new WritableStream(); |
163 const writer = ws.getWriter(); | 209 const writer = ws.getWriter(); |
164 | 210 |
165 writer.close(); | 211 const closePromise = writer.close(); |
166 writer.abort(error1); | 212 writer.abort(error1); |
167 | 213 |
168 return promise_rejects(t, new TypeError(), writer.closed, 'closed should rejec
t with a TypeError'); | 214 return Promise.all([ |
| 215 promise_rejects(t, new TypeError(), writer.closed, 'closed should reject wit
h a TypeError'), |
| 216 promise_rejects(t, new TypeError(), closePromise, 'close() should reject wit
h a TypeError') |
| 217 ]); |
169 }, 'Closing but then immediately aborting a WritableStream causes the stream to
error'); | 218 }, 'Closing but then immediately aborting a WritableStream causes the stream to
error'); |
170 | 219 |
171 promise_test(t => { | 220 promise_test(t => { |
| 221 let resolveClose; |
172 const ws = new WritableStream({ | 222 const ws = new WritableStream({ |
173 close() { | 223 close() { |
174 return new Promise(() => { }); // forever-pending | 224 return new Promise(resolve => { |
| 225 resolveClose = resolve; |
| 226 }); |
175 } | 227 } |
176 }); | 228 }); |
177 const writer = ws.getWriter(); | 229 const writer = ws.getWriter(); |
178 | 230 |
179 writer.close(); | 231 const closePromise = writer.close(); |
180 | 232 |
181 return delay(0).then(() => { | 233 return delay(0).then(() => { |
182 writer.abort(error1); | 234 writer.abort(error1); |
183 }) | 235 resolveClose(); |
184 .then(() => promise_rejects(t, new TypeError(), writer.closed, 'closed should
reject with a TypeError')); | 236 return Promise.all([ |
| 237 promise_rejects(t, new TypeError(), writer.closed, 'closed should reject w
ith a TypeError'), |
| 238 closePromise |
| 239 ]); |
| 240 }); |
185 }, 'Closing a WritableStream and aborting it while it closes causes the stream t
o error'); | 241 }, 'Closing a WritableStream and aborting it while it closes causes the stream t
o error'); |
186 | 242 |
187 promise_test(() => { | 243 promise_test(() => { |
188 const ws = new WritableStream(); | 244 const ws = new WritableStream(); |
189 const writer = ws.getWriter(); | 245 const writer = ws.getWriter(); |
190 | 246 |
191 writer.close(); | 247 writer.close(); |
192 | 248 |
193 return delay(0).then(() => writer.abort()); | 249 return delay(0).then(() => writer.abort()); |
194 }, 'Aborting a WritableStream after it is closed is a no-op'); | 250 }, 'Aborting a WritableStream after it is closed is a no-op'); |
195 | 251 |
196 test(() => { | 252 promise_test(t => { |
197 const ws = recordingWritableStream(); | 253 // Cannot use recordingWritableStream since it always has an abort |
| 254 let controller; |
| 255 let closeArgs; |
| 256 const ws = new WritableStream({ |
| 257 start(c) { |
| 258 controller = c; |
| 259 }, |
| 260 close(...args) { |
| 261 closeArgs = args; |
| 262 } |
| 263 }); |
| 264 |
198 const writer = ws.getWriter(); | 265 const writer = ws.getWriter(); |
199 | 266 |
200 writer.abort(); | 267 writer.abort(); |
201 | 268 |
202 return writer.closed.then(() => { | 269 return promise_rejects(t, new TypeError(), writer.closed, 'closed should rejec
t with a TypeError').then(() => { |
203 assert_array_equals(ws.events, ['close']); | 270 assert_array_equals(closeArgs, [controller], 'close must have been called, w
ith the controller as its argument'); |
204 }); | 271 }); |
205 }, 'WritableStream should call underlying sink\'s close if no abort is supplied'
); | 272 }, 'WritableStream should call underlying sink\'s close if no abort is supplied'
); |
206 | 273 |
207 promise_test(() => { | 274 promise_test(() => { |
208 let thenCalled = false; | 275 let thenCalled = false; |
209 const ws = new WritableStream({ | 276 const ws = new WritableStream({ |
210 abort() { | 277 abort() { |
211 return { | 278 return { |
212 then(onFulfilled) { | 279 then(onFulfilled) { |
213 thenCalled = true; | 280 thenCalled = true; |
214 onFulfilled(); | 281 onFulfilled(); |
215 } | 282 } |
216 }; | 283 }; |
217 } | 284 } |
218 }); | 285 }); |
219 const writer = ws.getWriter(); | 286 const writer = ws.getWriter(); |
220 return writer.abort().then(() => assert_true(thenCalled, 'then() should be cal
led')); | 287 return writer.abort().then(() => assert_true(thenCalled, 'then() should be cal
led')); |
221 }, 'returning a thenable from abort() should work'); | 288 }, 'returning a thenable from abort() should work'); |
222 | 289 |
| 290 promise_test(t => { |
| 291 const ws = new WritableStream({ |
| 292 write() { |
| 293 return flushAsyncEvents(); |
| 294 } |
| 295 }); |
| 296 const writer = ws.getWriter(); |
| 297 return writer.ready.then(() => { |
| 298 const writePromise = writer.write('a'); |
| 299 writer.abort(error1); |
| 300 let closedResolved = false; |
| 301 return Promise.all([ |
| 302 writePromise.then(() => assert_false(closedResolved, '.closed should not r
esolve before write()')), |
| 303 promise_rejects(t, new TypeError(), writer.closed, '.closed should reject'
).then(() => { |
| 304 closedResolved = true; |
| 305 }) |
| 306 ]); |
| 307 }); |
| 308 }, '.closed should not resolve before fulfilled write()'); |
| 309 |
| 310 promise_test(t => { |
| 311 const ws = new WritableStream({ |
| 312 write() { |
| 313 return Promise.reject(error1); |
| 314 } |
| 315 }); |
| 316 const writer = ws.getWriter(); |
| 317 return writer.ready.then(() => { |
| 318 const writePromise = writer.write('a'); |
| 319 const abortPromise = writer.abort(error2); |
| 320 let closedResolved = false; |
| 321 return Promise.all([ |
| 322 promise_rejects(t, error1, writePromise, 'write() should reject') |
| 323 .then(() => assert_false(closedResolved, '.closed should not resolve b
efore write()')), |
| 324 promise_rejects(t, error1, writer.closed, '.closed should reject') |
| 325 .then(() => { |
| 326 closedResolved = true; |
| 327 }), |
| 328 promise_rejects(t, error1, abortPromise, 'abort() should reject')]); |
| 329 }); |
| 330 }, '.closed should not resolve before rejected write(); write() error should ove
rwrite abort() error'); |
| 331 |
| 332 promise_test(t => { |
| 333 const ws = new WritableStream({ |
| 334 write() { |
| 335 return flushAsyncEvents(); |
| 336 } |
| 337 }, new CountQueuingStrategy(4)); |
| 338 const writer = ws.getWriter(); |
| 339 return writer.ready.then(() => { |
| 340 const settlementOrder = []; |
| 341 return Promise.all([ |
| 342 writer.write('1').then(() => settlementOrder.push(1)), |
| 343 promise_rejects(t, new TypeError(), writer.write('2'), 'first queued write
should be rejected') |
| 344 .then(() => settlementOrder.push(2)), |
| 345 promise_rejects(t, new TypeError(), writer.write('3'), 'second queued writ
e should be rejected') |
| 346 .then(() => settlementOrder.push(3)), |
| 347 writer.abort(error1) |
| 348 ]).then(() => assert_array_equals([1, 2, 3], settlementOrder, 'writes should
be satisfied in order')); |
| 349 }); |
| 350 }, 'writes should be satisfied in order when aborting'); |
| 351 |
| 352 promise_test(t => { |
| 353 const ws = new WritableStream({ |
| 354 write() { |
| 355 return Promise.reject(error1); |
| 356 } |
| 357 }, new CountQueuingStrategy(4)); |
| 358 const writer = ws.getWriter(); |
| 359 return writer.ready.then(() => { |
| 360 const settlementOrder = []; |
| 361 return Promise.all([ |
| 362 promise_rejects(t, error1, writer.write('1'), 'pending write should be rej
ected') |
| 363 .then(() => settlementOrder.push(1)), |
| 364 promise_rejects(t, error1, writer.write('2'), 'first queued write should b
e rejected') |
| 365 .then(() => settlementOrder.push(2)), |
| 366 promise_rejects(t, error1, writer.write('3'), 'second queued write should
be rejected') |
| 367 .then(() => settlementOrder.push(3)), |
| 368 promise_rejects(t, error1, writer.abort(error1), 'abort should be rejected
') |
| 369 ]).then(() => assert_array_equals([1, 2, 3], settlementOrder, 'writes should
be satisfied in order')); |
| 370 }); |
| 371 }, 'writes should be satisfied in order after rejected write when aborting'); |
| 372 |
| 373 promise_test(t => { |
| 374 const ws = new WritableStream({ |
| 375 write() { |
| 376 return Promise.reject(error1); |
| 377 } |
| 378 }); |
| 379 const writer = ws.getWriter(); |
| 380 return writer.ready.then(() => { |
| 381 return Promise.all([ |
| 382 promise_rejects(t, error1, writer.write('a'), 'writer.write() should rejec
t with error from underlying write()'), |
| 383 promise_rejects(t, error1, writer.close(), 'writer.close() should reject w
ith error from underlying write()'), |
| 384 promise_rejects(t, error1, writer.abort(), 'writer.abort() should reject w
ith error from underlying write()') |
| 385 ]); |
| 386 }); |
| 387 }, 'close() should use error from underlying write() on abort'); |
| 388 |
| 389 promise_test(() => { |
| 390 let resolveWrite; |
| 391 let abortCalled = false; |
| 392 const ws = new WritableStream({ |
| 393 write() { |
| 394 return new Promise(resolve => { |
| 395 resolveWrite = resolve; |
| 396 }); |
| 397 }, |
| 398 abort() { |
| 399 abortCalled = true; |
| 400 } |
| 401 }); |
| 402 |
| 403 const writer = ws.getWriter(); |
| 404 return writer.ready.then(() => { |
| 405 writer.write('a'); |
| 406 const abortPromise = writer.abort(); |
| 407 return flushAsyncEvents().then(() => { |
| 408 assert_false(abortCalled, 'abort should not be called while write is pendi
ng'); |
| 409 resolveWrite(); |
| 410 return abortPromise.then(() => assert_true(abortCalled, 'abort should be c
alled')); |
| 411 }); |
| 412 }); |
| 413 }, 'underlying abort() should not be called until underlying write() completes')
; |
| 414 |
| 415 promise_test(() => { |
| 416 let resolveClose; |
| 417 let abortCalled = false; |
| 418 const ws = new WritableStream({ |
| 419 close() { |
| 420 return new Promise(resolve => { |
| 421 resolveClose = resolve; |
| 422 }); |
| 423 }, |
| 424 abort() { |
| 425 abortCalled = true; |
| 426 } |
| 427 }); |
| 428 |
| 429 const writer = ws.getWriter(); |
| 430 return writer.ready.then(() => { |
| 431 writer.close(); |
| 432 const abortPromise = writer.abort(); |
| 433 return flushAsyncEvents().then(() => { |
| 434 assert_false(abortCalled, 'underlying abort should not be called while clo
se is pending'); |
| 435 resolveClose(); |
| 436 return abortPromise.then(() => { |
| 437 assert_false(abortCalled, 'underlying abort should not be called after c
lose completes'); |
| 438 }); |
| 439 }); |
| 440 }); |
| 441 }, 'underlying abort() should not be called if underlying close() has started'); |
| 442 |
| 443 promise_test(t => { |
| 444 let rejectClose; |
| 445 let abortCalled = false; |
| 446 const ws = new WritableStream({ |
| 447 close() { |
| 448 return new Promise((resolve, reject) => { |
| 449 rejectClose = reject; |
| 450 }); |
| 451 }, |
| 452 abort() { |
| 453 abortCalled = true; |
| 454 } |
| 455 }); |
| 456 |
| 457 const writer = ws.getWriter(); |
| 458 return writer.ready.then(() => { |
| 459 const closePromise = writer.close(); |
| 460 const abortPromise = writer.abort(); |
| 461 return flushAsyncEvents().then(() => { |
| 462 assert_false(abortCalled, 'underlying abort should not be called while clo
se is pending'); |
| 463 rejectClose(error1); |
| 464 return promise_rejects(t, error1, abortPromise, 'abort should reject with
the same reason').then(() => { |
| 465 return promise_rejects(t, error1, closePromise, 'close should reject wit
h the same reason'); |
| 466 }).then(() => { |
| 467 assert_false(abortCalled, 'underlying abort should not be called after c
lose completes'); |
| 468 }); |
| 469 }); |
| 470 }); |
| 471 }, 'if underlying close() has started and then rejects, the abort() and close()
promises should reject with the ' + |
| 472 'underlying close rejection reason'); |
| 473 |
| 474 promise_test(t => { |
| 475 let resolveWrite; |
| 476 let abortCalled = false; |
| 477 const ws = new WritableStream({ |
| 478 write() { |
| 479 return new Promise(resolve => { |
| 480 resolveWrite = resolve; |
| 481 }); |
| 482 }, |
| 483 abort() { |
| 484 abortCalled = true; |
| 485 } |
| 486 }); |
| 487 |
| 488 const writer = ws.getWriter(); |
| 489 return writer.ready.then(() => { |
| 490 writer.write('a'); |
| 491 const closePromise = writer.close(); |
| 492 const abortPromise = writer.abort(); |
| 493 return flushAsyncEvents().then(() => { |
| 494 assert_false(abortCalled, 'abort should not be called while write is pendi
ng'); |
| 495 resolveWrite(); |
| 496 return abortPromise.then(() => { |
| 497 assert_true(abortCalled, 'abort should be called after write completes')
; |
| 498 return promise_rejects(t, new TypeError(), closePromise, 'promise return
ed by close() should be rejected'); |
| 499 }); |
| 500 }); |
| 501 }); |
| 502 }, 'underlying abort() should be called while closing if underlying close() has
not started yet'); |
| 503 |
| 504 promise_test(() => { |
| 505 const ws = new WritableStream(); |
| 506 const writer = ws.getWriter(); |
| 507 return writer.ready.then(() => { |
| 508 const closePromise = writer.close(); |
| 509 const abortPromise = writer.abort(); |
| 510 let closeResolved = false; |
| 511 Promise.all([ |
| 512 closePromise.then(() => { closeResolved = true; }), |
| 513 abortPromise.then(() => { assert_true(closeResolved, 'close() promise shou
ld resolve before abort() promise'); }) |
| 514 ]); |
| 515 }); |
| 516 }, 'writer close() promise should resolve before abort() promise'); |
| 517 |
| 518 promise_test(t => { |
| 519 const ws = new WritableStream({ |
| 520 write(chunk, controller) { |
| 521 controller.error(error1); |
| 522 return new Promise(() => {}); |
| 523 } |
| 524 }); |
| 525 const writer = ws.getWriter(); |
| 526 return writer.ready.then(() => { |
| 527 writer.write('a'); |
| 528 return promise_rejects(t, error1, writer.ready, 'writer.ready should reject'
); |
| 529 }); |
| 530 }, 'writer.ready should reject on controller error without waiting for underlyin
g write'); |
| 531 |
| 532 promise_test(t => { |
| 533 let resolveWrite; |
| 534 const ws = new WritableStream({ |
| 535 write() { |
| 536 return new Promise(resolve => { |
| 537 resolveWrite = resolve; |
| 538 }); |
| 539 } |
| 540 }); |
| 541 const writer = ws.getWriter(); |
| 542 return writer.ready.then(() => { |
| 543 const writePromise = writer.write('a'); |
| 544 const closed = writer.closed; |
| 545 const abortPromise = writer.abort(); |
| 546 writer.releaseLock(); |
| 547 resolveWrite(); |
| 548 return Promise.all([ |
| 549 writePromise, |
| 550 abortPromise, |
| 551 promise_rejects(t, new TypeError(), closed, 'closed should reject')]); |
| 552 }); |
| 553 }, 'releaseLock() while aborting should reject the original closed promise'); |
| 554 |
| 555 promise_test(t => { |
| 556 let resolveWrite; |
| 557 let resolveAbort; |
| 558 let resolveAbortStarted; |
| 559 const abortStarted = new Promise(resolve => { |
| 560 resolveAbortStarted = resolve; |
| 561 }); |
| 562 const ws = new WritableStream({ |
| 563 write() { |
| 564 return new Promise(resolve => { |
| 565 resolveWrite = resolve; |
| 566 }); |
| 567 }, |
| 568 abort() { |
| 569 resolveAbortStarted(); |
| 570 return new Promise(resolve => { |
| 571 resolveAbort = resolve; |
| 572 }); |
| 573 } |
| 574 }); |
| 575 const writer = ws.getWriter(); |
| 576 return writer.ready.then(() => { |
| 577 const writePromise = writer.write('a'); |
| 578 const closed = writer.closed; |
| 579 const abortPromise = writer.abort(); |
| 580 resolveWrite(); |
| 581 return abortStarted.then(() => { |
| 582 writer.releaseLock(); |
| 583 assert_not_equals(writer.closed, closed, 'closed promise should have chang
ed'); |
| 584 resolveAbort(); |
| 585 return Promise.all([ |
| 586 writePromise, |
| 587 abortPromise, |
| 588 promise_rejects(t, new TypeError(), closed, 'original closed should reje
ct'), |
| 589 promise_rejects(t, new TypeError(), writer.closed, 'new closed should re
ject')]); |
| 590 }); |
| 591 }); |
| 592 }, 'releaseLock() during delayed async abort() should create a new rejected clos
ed promise'); |
| 593 |
223 done(); | 594 done(); |
OLD | NEW |