| OLD | NEW |
| (Empty) | |
| 1 'use strict'; |
| 2 |
| 3 if (self.importScripts) { |
| 4 self.importScripts('/resources/testharness.js'); |
| 5 self.importScripts('../resources/test-utils.js'); |
| 6 self.importScripts('../resources/recording-streams.js'); |
| 7 } |
| 8 |
| 9 promise_test(() => { |
| 10 const ws = new WritableStream({ |
| 11 close() { |
| 12 return 'Hello'; |
| 13 } |
| 14 }); |
| 15 |
| 16 const writer = ws.getWriter(); |
| 17 |
| 18 const closePromise = writer.close(); |
| 19 return closePromise.then(value => assert_equals(value, undefined, 'fulfillment
value must be undefined')); |
| 20 }, 'fulfillment value of ws.close() call must be undefined even if the underlyin
g sink returns a non-undefined ' + |
| 21 'value'); |
| 22 |
| 23 promise_test(t => { |
| 24 const passedError = new Error('error me'); |
| 25 let controller; |
| 26 const ws = new WritableStream({ |
| 27 close(c) { |
| 28 controller = c; |
| 29 return delay(50); |
| 30 } |
| 31 }); |
| 32 |
| 33 const writer = ws.getWriter(); |
| 34 |
| 35 writer.close(); |
| 36 |
| 37 return Promise.all([ |
| 38 delay(10).then(() => controller.error(passedError)), |
| 39 promise_rejects(t, passedError, writer.closed, |
| 40 'closed promise should be rejected with the passed error'), |
| 41 delay(70).then(() => promise_rejects(t, passedError, writer.closed, 'closed
should stay rejected')) |
| 42 ]); |
| 43 }, 'when sink calls error asynchronously while closing, the stream should become
errored'); |
| 44 |
| 45 promise_test(t => { |
| 46 const passedError = new Error('error me'); |
| 47 const ws = new WritableStream({ |
| 48 close(controller) { |
| 49 controller.error(passedError); |
| 50 } |
| 51 }); |
| 52 |
| 53 const writer = ws.getWriter(); |
| 54 |
| 55 return promise_rejects(t, passedError, writer.close(), 'close promise should b
e rejected with the passed error') |
| 56 .then(() => promise_rejects(t, passedError, writer.closed, 'closed should
stay rejected')); |
| 57 }, 'when sink calls error synchronously while closing, the stream should become
errored'); |
| 58 |
| 59 promise_test(() => { |
| 60 const ws = recordingWritableStream(); |
| 61 |
| 62 const writer = ws.getWriter(); |
| 63 |
| 64 return writer.ready.then(() => { |
| 65 assert_equals(writer.desiredSize, 1, 'desiredSize should be 1'); |
| 66 |
| 67 writer.close(); |
| 68 assert_equals(writer.desiredSize, 1, 'desiredSize should be still 1'); |
| 69 |
| 70 return writer.ready.then(v => { |
| 71 assert_equals(v, undefined, 'ready promise should be fulfilled with undefi
ned'); |
| 72 assert_array_equals(ws.events, ['close'], 'write and abort should not be c
alled'); |
| 73 }); |
| 74 }); |
| 75 }, 'when close is called on a WritableStream in writable state, ready should ret
urn a fulfilled promise'); |
| 76 |
| 77 promise_test(() => { |
| 78 const ws = recordingWritableStream({ |
| 79 write() { |
| 80 return new Promise(() => {}); |
| 81 } |
| 82 }); |
| 83 |
| 84 const writer = ws.getWriter(); |
| 85 |
| 86 return writer.ready.then(() => { |
| 87 writer.write('a'); |
| 88 |
| 89 assert_equals(writer.desiredSize, 0, 'desiredSize should be 0'); |
| 90 |
| 91 let calledClose = false; |
| 92 return Promise.all([ |
| 93 writer.ready.then(v => { |
| 94 assert_equals(v, undefined, 'ready promise should be fulfilled with unde
fined'); |
| 95 assert_true(calledClose, 'ready should not be fulfilled before writer.cl
ose() is called'); |
| 96 assert_array_equals(ws.events, ['write', 'a'], 'sink abort() should not
be called'); |
| 97 }), |
| 98 delay(100).then(() => { |
| 99 writer.close(); |
| 100 calledClose = true; |
| 101 }) |
| 102 ]); |
| 103 }); |
| 104 }, 'when close is called on a WritableStream in waiting state, ready promise sho
uld be fulfilled'); |
| 105 |
| 106 promise_test(() => { |
| 107 let asyncCloseFinished = false; |
| 108 const ws = recordingWritableStream({ |
| 109 close() { |
| 110 return delay(50).then(() => { |
| 111 asyncCloseFinished = true; |
| 112 }); |
| 113 } |
| 114 }); |
| 115 |
| 116 const writer = ws.getWriter(); |
| 117 return writer.ready.then(() => { |
| 118 writer.write('a'); |
| 119 |
| 120 writer.close(); |
| 121 |
| 122 return writer.ready.then(v => { |
| 123 assert_false(asyncCloseFinished, 'ready promise should be fulfilled before
async close completes'); |
| 124 assert_equals(v, undefined, 'ready promise should be fulfilled with undefi
ned'); |
| 125 assert_array_equals(ws.events, ['write', 'a', 'close'], 'sink abort() shou
ld not be called'); |
| 126 }); |
| 127 }); |
| 128 }, 'when close is called on a WritableStream in waiting state, ready should be f
ulfilled immediately even if close ' + |
| 129 'takes a long time'); |
| 130 |
| 131 promise_test(t => { |
| 132 const rejection = { name: 'letter' }; |
| 133 const ws = new WritableStream({ |
| 134 close() { |
| 135 return { |
| 136 then(onFulfilled, onRejected) { onRejected(rejection); } |
| 137 }; |
| 138 } |
| 139 }); |
| 140 return promise_rejects(t, rejection, ws.getWriter().close(), 'close() should r
eturn a rejection'); |
| 141 }, 'returning a thenable from close() should work'); |
| 142 |
| 143 done(); |
| OLD | NEW |