| OLD | NEW |
| 1 'use strict'; | 1 'use strict'; |
| 2 | 2 |
| 3 if (self.importScripts) { | 3 if (self.importScripts) { |
| 4 self.importScripts('../resources/rs-utils.js'); | 4 self.importScripts('../resources/rs-utils.js'); |
| 5 self.importScripts('/resources/testharness.js'); | 5 self.importScripts('/resources/testharness.js'); |
| 6 } | 6 } |
| 7 | 7 |
| 8 const error1 = new Error('error1'); | 8 const error1 = new Error('error1'); |
| 9 error1.name = 'error1'; | 9 error1.name = 'error1'; |
| 10 | 10 |
| 11 test(() => { | 11 test(() => { |
| 12 assert_throws(new TypeError(), () => new ReadableStream().getReader({ mode: 'b
yob' })); | 12 assert_throws(new TypeError(), () => new ReadableStream().getReader({ mode: 'b
yob' })); |
| 13 }, 'getReader({mode: "byob"}) throws on non-bytes streams'); | 13 }, 'getReader({mode: "byob"}) throws on non-bytes streams'); |
| 14 | 14 |
| 15 | 15 |
| 16 test(() => { | 16 test(() => { |
| 17 // Constructing ReadableStream with an empty underlying byte source object as
parameter shouldn't throw. | 17 // Constructing ReadableStream with an empty underlying byte source object as
parameter shouldn't throw. |
| 18 new ReadableStream({ type: 'bytes' }); | 18 new ReadableStream({ type: 'bytes' }); |
| 19 }, 'ReadableStream with byte source can be constructed with no errors'); | 19 }, 'ReadableStream with byte source can be constructed with no errors'); |
| 20 | 20 |
| 21 promise_test(() => { | 21 promise_test(() => { |
| 22 let startCalled = false; | 22 let startCalled = false; |
| 23 let startCalledBeforePull = false; |
| 24 let desiredSize; |
| 23 let controller; | 25 let controller; |
| 24 | 26 |
| 25 let resolveTestPromise; | 27 let resolveTestPromise; |
| 26 const testPromise = new Promise(resolve => { | 28 const testPromise = new Promise(resolve => { |
| 27 resolveTestPromise = resolve; | 29 resolveTestPromise = resolve; |
| 28 }); | 30 }); |
| 29 | 31 |
| 30 new ReadableStream({ | 32 new ReadableStream({ |
| 31 start(c) { | 33 start(c) { |
| 32 controller = c; | 34 controller = c; |
| 33 startCalled = true; | 35 startCalled = true; |
| 34 }, | 36 }, |
| 35 pull() { | 37 pull() { |
| 36 assert_true(startCalled, 'start has been called'); | 38 startCalledBeforePull = startCalled; |
| 37 assert_equals(controller.desiredSize, 256, 'desiredSize'); | 39 desiredSize = controller.desiredSize; |
| 38 resolveTestPromise(); | 40 resolveTestPromise(); |
| 39 }, | 41 }, |
| 40 type: 'bytes' | 42 type: 'bytes' |
| 41 }, { | 43 }, { |
| 42 highWaterMark: 256 | 44 highWaterMark: 256 |
| 43 }); | 45 }); |
| 44 | 46 |
| 45 return testPromise; | 47 return testPromise.then(() => { |
| 48 assert_true(startCalledBeforePull, 'start should be called before pull'); |
| 49 assert_equals(desiredSize, 256, 'desiredSize should equal highWaterMark'); |
| 50 }); |
| 46 | 51 |
| 47 }, 'ReadableStream with byte source: Construct and expect start and pull being c
alled'); | 52 }, 'ReadableStream with byte source: Construct and expect start and pull being c
alled'); |
| 48 | 53 |
| 49 promise_test(() => { | 54 promise_test(() => { |
| 50 let pullCount = 0; | 55 let pullCount = 0; |
| 51 let checkedNoPull = false; | 56 let checkedNoPull = false; |
| 52 | 57 |
| 53 let resolveTestPromise; | 58 let resolveTestPromise; |
| 54 const testPromise = new Promise(resolve => { | 59 const testPromise = new Promise(resolve => { |
| 55 resolveTestPromise = resolve; | 60 resolveTestPromise = resolve; |
| (...skipping 21 matching lines...) Expand all Loading... |
| 77 Promise.resolve().then(() => { | 82 Promise.resolve().then(() => { |
| 78 assert_equals(pullCount, 0); | 83 assert_equals(pullCount, 0); |
| 79 checkedNoPull = true; | 84 checkedNoPull = true; |
| 80 resolveStartPromise(); | 85 resolveStartPromise(); |
| 81 }); | 86 }); |
| 82 | 87 |
| 83 return testPromise; | 88 return testPromise; |
| 84 | 89 |
| 85 }, 'ReadableStream with byte source: No automatic pull call if start doesn\'t fi
nish'); | 90 }, 'ReadableStream with byte source: No automatic pull call if start doesn\'t fi
nish'); |
| 86 | 91 |
| 87 promise_test(() => { | 92 promise_test(t => { |
| 88 new ReadableStream({ | 93 new ReadableStream({ |
| 89 pull() { | 94 pull: t.unreached_func('pull() should not be called'), |
| 90 assert_unreached('pull must not be called'); | |
| 91 }, | |
| 92 type: 'bytes' | 95 type: 'bytes' |
| 93 }, { | 96 }, { |
| 94 highWaterMark: 0 | 97 highWaterMark: 0 |
| 95 }); | 98 }); |
| 96 | 99 |
| 97 return Promise.resolve().then(() => {}); | 100 return Promise.resolve(); |
| 98 }, 'ReadableStream with byte source: Construct with highWaterMark of 0'); | 101 }, 'ReadableStream with byte source: Construct with highWaterMark of 0'); |
| 99 | 102 |
| 100 promise_test(t => { | 103 promise_test(t => { |
| 101 const stream = new ReadableStream({ | 104 const stream = new ReadableStream({ |
| 102 type: 'bytes' | 105 type: 'bytes' |
| 103 }); | 106 }); |
| 104 | 107 |
| 105 const reader = stream.getReader(); | 108 const reader = stream.getReader(); |
| 106 reader.releaseLock(); | 109 reader.releaseLock(); |
| 107 | 110 |
| 108 return promise_rejects(t, new TypeError(), reader.closed, 'closed must reject'
); | 111 return promise_rejects(t, new TypeError(), reader.closed, 'closed must reject'
); |
| 109 }, 'ReadableStream with byte source: getReader(), then releaseLock()'); | 112 }, 'ReadableStream with byte source: getReader(), then releaseLock()'); |
| 110 | 113 |
| 111 promise_test(t => { | 114 promise_test(t => { |
| 112 const stream = new ReadableStream({ | 115 const stream = new ReadableStream({ |
| 113 type: 'bytes' | 116 type: 'bytes' |
| 114 }); | 117 }); |
| 115 | 118 |
| 116 const reader = stream.getReader({ mode: 'byob' }); | 119 const reader = stream.getReader({ mode: 'byob' }); |
| 117 reader.releaseLock(); | 120 reader.releaseLock(); |
| 118 | 121 |
| 119 return promise_rejects(t, new TypeError(), reader.closed, 'closed must reject'
); | 122 return promise_rejects(t, new TypeError(), reader.closed, 'closed must reject'
); |
| 120 }, 'ReadableStream with byte source: getReader() with mode set to byob, then rel
easeLock()'); | 123 }, 'ReadableStream with byte source: getReader() with mode set to byob, then rel
easeLock()'); |
| 121 | 124 |
| 122 promise_test(() => { | 125 promise_test(t => { |
| 123 const stream = new ReadableStream({ | 126 const stream = new ReadableStream({ |
| 124 start(c) { | 127 start(c) { |
| 125 c.close(); | 128 c.close(); |
| 126 }, | 129 }, |
| 127 pull() { | 130 pull: t.unreached_func('pull() should not be called'), |
| 128 assert_unreached('pull must not be called'); | |
| 129 }, | |
| 130 type: 'bytes' | 131 type: 'bytes' |
| 131 }); | 132 }); |
| 132 | 133 |
| 133 const reader = stream.getReader(); | 134 const reader = stream.getReader(); |
| 134 | 135 |
| 135 return reader.closed.then(() => { | 136 return reader.closed.then(() => { |
| 136 assert_throws(new TypeError(), () => stream.getReader(), 'getReader() must t
hrow'); | 137 assert_throws(new TypeError(), () => stream.getReader(), 'getReader() must t
hrow'); |
| 137 }); | 138 }); |
| 138 }, 'ReadableStream with byte source: Test that closing a stream does not release
a reader automatically'); | 139 }, 'ReadableStream with byte source: Test that closing a stream does not release
a reader automatically'); |
| 139 | 140 |
| 140 promise_test(() => { | 141 promise_test(t => { |
| 141 const stream = new ReadableStream({ | 142 const stream = new ReadableStream({ |
| 142 start(c) { | 143 start(c) { |
| 143 c.close(); | 144 c.close(); |
| 144 }, | 145 }, |
| 145 pull() { | 146 pull: t.unreached_func('pull() should not be called'), |
| 146 assert_unreached('pull must not be called'); | |
| 147 }, | |
| 148 type: 'bytes' | 147 type: 'bytes' |
| 149 }); | 148 }); |
| 150 | 149 |
| 151 const reader = stream.getReader({ mode: 'byob' }); | 150 const reader = stream.getReader({ mode: 'byob' }); |
| 152 | 151 |
| 153 return reader.closed.then(() => { | 152 return reader.closed.then(() => { |
| 154 assert_throws(new TypeError(), () => stream.getReader({ mode: 'byob' }), 'ge
tReader() must throw'); | 153 assert_throws(new TypeError(), () => stream.getReader({ mode: 'byob' }), 'ge
tReader() must throw'); |
| 155 }); | 154 }); |
| 156 }, 'ReadableStream with byte source: Test that closing a stream does not release
a BYOB reader automatically'); | 155 }, 'ReadableStream with byte source: Test that closing a stream does not release
a BYOB reader automatically'); |
| 157 | 156 |
| 158 promise_test(t => { | 157 promise_test(t => { |
| 159 const stream = new ReadableStream({ | 158 const stream = new ReadableStream({ |
| 160 start(c) { | 159 start(c) { |
| 161 c.error(error1); | 160 c.error(error1); |
| 162 }, | 161 }, |
| 163 pull() { | 162 pull: t.unreached_func('pull() should not be called'), |
| 164 assert_unreached('pull must not be called'); | |
| 165 }, | |
| 166 type: 'bytes' | 163 type: 'bytes' |
| 167 }); | 164 }); |
| 168 | 165 |
| 169 const reader = stream.getReader(); | 166 const reader = stream.getReader(); |
| 170 | 167 |
| 171 return promise_rejects(t, error1, reader.closed, 'closed must reject').then(()
=> { | 168 return promise_rejects(t, error1, reader.closed, 'closed must reject').then(()
=> { |
| 172 assert_throws(new TypeError(), () => stream.getReader(), 'getReader() must t
hrow'); | 169 assert_throws(new TypeError(), () => stream.getReader(), 'getReader() must t
hrow'); |
| 173 }); | 170 }); |
| 174 }, 'ReadableStream with byte source: Test that erroring a stream does not releas
e a reader automatically'); | 171 }, 'ReadableStream with byte source: Test that erroring a stream does not releas
e a reader automatically'); |
| 175 | 172 |
| 176 promise_test(t => { | 173 promise_test(t => { |
| 177 const stream = new ReadableStream({ | 174 const stream = new ReadableStream({ |
| 178 start(c) { | 175 start(c) { |
| 179 c.error(error1); | 176 c.error(error1); |
| 180 }, | 177 }, |
| 181 pull() { | 178 pull: t.unreached_func('pull() should not be called'), |
| 182 assert_unreached('pull must not be called'); | |
| 183 }, | |
| 184 type: 'bytes' | 179 type: 'bytes' |
| 185 }); | 180 }); |
| 186 | 181 |
| 187 const reader = stream.getReader({ mode: 'byob' }); | 182 const reader = stream.getReader({ mode: 'byob' }); |
| 188 | 183 |
| 189 return promise_rejects(t, error1, reader.closed, 'closed must reject').then(()
=> { | 184 return promise_rejects(t, error1, reader.closed, 'closed must reject').then(()
=> { |
| 190 assert_throws(new TypeError(), () => stream.getReader({ mode: 'byob' }), 'ge
tReader() must throw'); | 185 assert_throws(new TypeError(), () => stream.getReader({ mode: 'byob' }), 'ge
tReader() must throw'); |
| 191 }); | 186 }); |
| 192 }, 'ReadableStream with byte source: Test that erroring a stream does not releas
e a BYOB reader automatically'); | 187 }, 'ReadableStream with byte source: Test that erroring a stream does not releas
e a BYOB reader automatically'); |
| 193 | 188 |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 237 const reader = stream.getReader(); | 232 const reader = stream.getReader(); |
| 238 reader.read(); | 233 reader.read(); |
| 239 | 234 |
| 240 assert_equals(pullCount, 0, 'No pull as start() just finished and is not yet r
eflected to the state of the stream'); | 235 assert_equals(pullCount, 0, 'No pull as start() just finished and is not yet r
eflected to the state of the stream'); |
| 241 | 236 |
| 242 return Promise.resolve().then(() => { | 237 return Promise.resolve().then(() => { |
| 243 assert_equals(pullCount, 1, 'pull must be invoked'); | 238 assert_equals(pullCount, 1, 'pull must be invoked'); |
| 244 }); | 239 }); |
| 245 }, 'ReadableStream with byte source: Automatic pull() after start() and read()')
; | 240 }, 'ReadableStream with byte source: Automatic pull() after start() and read()')
; |
| 246 | 241 |
| 242 // View buffers are detached after pull() returns, so record the information at
the time that pull() was called. |
| 243 function extractViewInfo(view) { |
| 244 return { |
| 245 constructor: view.constructor, |
| 246 bufferByteLength: view.buffer.byteLength, |
| 247 byteOffset: view.byteOffset, |
| 248 byteLength: view.byteLength |
| 249 }; |
| 250 } |
| 251 |
| 247 promise_test(() => { | 252 promise_test(() => { |
| 248 let pullCount = 0; | 253 let pullCount = 0; |
| 249 let controller; | 254 let controller; |
| 255 let byobRequest; |
| 256 let viewDefined = false; |
| 257 let viewInfo; |
| 250 | 258 |
| 251 const stream = new ReadableStream({ | 259 const stream = new ReadableStream({ |
| 252 start(c) { | 260 start(c) { |
| 253 controller = c; | 261 controller = c; |
| 254 }, | 262 }, |
| 255 pull() { | 263 pull() { |
| 256 if (pullCount === 0) { | 264 byobRequest = controller.byobRequest; |
| 257 const byobRequest = controller.byobRequest; | 265 const view = byobRequest.view; |
| 258 assert_not_equals(byobRequest, undefined, 'byobRequest must not be undef
ined'); | 266 viewDefined = view !== undefined; |
| 267 viewInfo = extractViewInfo(view); |
| 259 | 268 |
| 260 const view = byobRequest.view; | 269 view[0] = 0x01; |
| 261 assert_not_equals(view, undefined, 'byobRequest.view must no be undefine
d'); | 270 byobRequest.respond(1); |
| 262 assert_equals(view.constructor, Uint8Array); | |
| 263 assert_equals(view.buffer.byteLength, 16); | |
| 264 assert_equals(view.byteOffset, 0); | |
| 265 assert_equals(view.byteLength, 16); | |
| 266 | |
| 267 view[0] = 0x01; | |
| 268 byobRequest.respond(1); | |
| 269 } else { | |
| 270 assert_unreached('Too many pull() calls'); | |
| 271 } | |
| 272 | 271 |
| 273 ++pullCount; | 272 ++pullCount; |
| 274 }, | 273 }, |
| 275 type: 'bytes', | 274 type: 'bytes', |
| 276 autoAllocateChunkSize: 16 | 275 autoAllocateChunkSize: 16 |
| 277 }, { | 276 }, { |
| 278 highWaterMark: 0 | 277 highWaterMark: 0 |
| 279 }); | 278 }); |
| 280 | 279 |
| 281 const reader = stream.getReader(); | 280 const reader = stream.getReader(); |
| 282 const readPromise = reader.read(); | 281 const readPromise = reader.read(); |
| 283 const ignoredReadPromise = reader.read(); | 282 const ignoredReadPromise = reader.read(); |
| 284 | 283 |
| 285 assert_equals(pullCount, 0, 'No pull() as start() just finished and is not yet
reflected to the state of the stream'); | 284 assert_equals(pullCount, 0, 'No pull() as start() just finished and is not yet
reflected to the state of the stream'); |
| 286 | 285 |
| 287 return Promise.resolve().then(() => { | 286 return Promise.resolve().then(() => { |
| 288 assert_equals(pullCount, 1, 'pull() must have been invoked once'); | 287 assert_equals(pullCount, 1, 'pull() must have been invoked once'); |
| 288 assert_not_equals(byobRequest, undefined, 'byobRequest must not be undefined
'); |
| 289 assert_true(viewDefined, 'byobRequest.view must not be undefined'); |
| 290 assert_equals(viewInfo.constructor, Uint8Array, 'view.constructor should be
Uint8Array'); |
| 291 assert_equals(viewInfo.bufferByteLength, 16, 'view.buffer.byteLength should
be 16'); |
| 292 assert_equals(viewInfo.byteOffset, 0, 'view.byteOffset should be 0'); |
| 293 assert_equals(viewInfo.byteLength, 16, 'view.byteLength should be 16'); |
| 289 return readPromise; | 294 return readPromise; |
| 290 }).then(result => { | 295 }).then(result => { |
| 291 assert_not_equals(result.value, undefined); | 296 assert_not_equals(result.value, undefined); |
| 292 assert_equals(result.value.constructor, Uint8Array); | 297 assert_equals(result.value.constructor, Uint8Array); |
| 293 assert_equals(result.value.buffer.byteLength, 16); | 298 assert_equals(result.value.buffer.byteLength, 16); |
| 294 assert_equals(result.value.byteOffset, 0); | 299 assert_equals(result.value.byteOffset, 0); |
| 295 assert_equals(result.value.byteLength, 1); | 300 assert_equals(result.value.byteLength, 1); |
| 296 assert_equals(result.value[0], 0x01); | 301 assert_equals(result.value[0], 0x01); |
| 302 assert_equals(pullCount, 1, 'pull() should only be invoked once'); |
| 297 }); | 303 }); |
| 298 }, 'ReadableStream with byte source: autoAllocateChunkSize'); | 304 }, 'ReadableStream with byte source: autoAllocateChunkSize'); |
| 299 | 305 |
| 300 promise_test(() => { | 306 promise_test(() => { |
| 301 let pullCount = 0; | 307 let pullCount = 0; |
| 302 let controller; | 308 let controller; |
| 309 const byobRequests = []; |
| 303 | 310 |
| 304 const stream = new ReadableStream({ | 311 const stream = new ReadableStream({ |
| 305 start(c) { | 312 start(c) { |
| 306 controller = c; | 313 controller = c; |
| 307 }, | 314 }, |
| 308 pull() { | 315 pull() { |
| 316 const byobRequest = controller.byobRequest; |
| 317 const view = byobRequest.view; |
| 318 byobRequests[pullCount] = { |
| 319 defined: byobRequest !== undefined, |
| 320 viewDefined: view !== undefined, |
| 321 viewInfo: extractViewInfo(view) |
| 322 }; |
| 309 if (pullCount === 0) { | 323 if (pullCount === 0) { |
| 310 const byobRequest = controller.byobRequest; | |
| 311 assert_not_equals(byobRequest, undefined, 'byobRequest must not be undef
ined'); | |
| 312 | |
| 313 const view = byobRequest.view; | |
| 314 assert_not_equals(view, undefined, 'byobRequest.view must no be undefine
d'); | |
| 315 assert_equals(view.constructor, Uint8Array); | |
| 316 assert_equals(view.buffer.byteLength, 16); | |
| 317 assert_equals(view.byteOffset, 0); | |
| 318 assert_equals(view.byteLength, 16); | |
| 319 | |
| 320 view[0] = 0x01; | 324 view[0] = 0x01; |
| 321 byobRequest.respond(1); | 325 byobRequest.respond(1); |
| 322 } else if (pullCount === 1) { | 326 } else if (pullCount === 1) { |
| 323 const byobRequest = controller.byobRequest; | |
| 324 assert_not_equals(byobRequest, undefined, 'byobRequest must not be undef
ined'); | |
| 325 | |
| 326 const view = byobRequest.view; | |
| 327 assert_not_equals(view, undefined, 'byobRequest.view must no be undefine
d'); | |
| 328 assert_equals(view.constructor, Uint8Array); | |
| 329 assert_equals(view.buffer.byteLength, 32); | |
| 330 assert_equals(view.byteOffset, 0); | |
| 331 assert_equals(view.byteLength, 32); | |
| 332 | |
| 333 view[0] = 0x02; | 327 view[0] = 0x02; |
| 334 view[1] = 0x03; | 328 view[1] = 0x03; |
| 335 byobRequest.respond(2); | 329 byobRequest.respond(2); |
| 336 } else { | |
| 337 assert_unreached('Too many pull() calls'); | |
| 338 } | 330 } |
| 339 | 331 |
| 340 ++pullCount; | 332 ++pullCount; |
| 341 }, | 333 }, |
| 342 type: 'bytes', | 334 type: 'bytes', |
| 343 autoAllocateChunkSize: 16 | 335 autoAllocateChunkSize: 16 |
| 344 }, { | 336 }, { |
| 345 highWaterMark: 0 | 337 highWaterMark: 0 |
| 346 }); | 338 }); |
| 347 | 339 |
| 348 const reader = stream.getReader(); | 340 const reader = stream.getReader(); |
| 349 return reader.read().then(result => { | 341 return reader.read().then(result => { |
| 350 assert_not_equals(result.value, undefined); | 342 assert_not_equals(result.value, undefined); |
| 351 assert_equals(result.value.constructor, Uint8Array); | 343 assert_equals(result.value.constructor, Uint8Array); |
| 352 assert_equals(result.value.buffer.byteLength, 16); | 344 assert_equals(result.value.buffer.byteLength, 16); |
| 353 assert_equals(result.value.byteOffset, 0); | 345 assert_equals(result.value.byteOffset, 0); |
| 354 assert_equals(result.value.byteLength, 1); | 346 assert_equals(result.value.byteLength, 1); |
| 355 assert_equals(result.value[0], 0x01); | 347 assert_equals(result.value[0], 0x01); |
| 348 const byobRequest = byobRequests[0]; |
| 349 assert_true(byobRequest.defined, 'first byobRequest must not be undefined'); |
| 350 assert_true(byobRequest.viewDefined, 'first byobRequest.view must not be und
efined'); |
| 351 const viewInfo = byobRequest.viewInfo; |
| 352 assert_equals(viewInfo.constructor, Uint8Array, 'first view.constructor shou
ld be Uint8Array'); |
| 353 assert_equals(viewInfo.bufferByteLength, 16, 'first view.buffer.byteLength s
hould be 16'); |
| 354 assert_equals(viewInfo.byteOffset, 0, 'first view.byteOffset should be 0'); |
| 355 assert_equals(viewInfo.byteLength, 16, 'first view.byteLength should be 16')
; |
| 356 | 356 |
| 357 reader.releaseLock(); | 357 reader.releaseLock(); |
| 358 const byobReader = stream.getReader({ mode: 'byob' }); | 358 const byobReader = stream.getReader({ mode: 'byob' }); |
| 359 return byobReader.read(new Uint8Array(32)); | 359 return byobReader.read(new Uint8Array(32)); |
| 360 }).then(result => { | 360 }).then(result => { |
| 361 assert_not_equals(result.value, undefined); | 361 assert_not_equals(result.value, undefined); |
| 362 assert_equals(result.value.constructor, Uint8Array); | 362 assert_equals(result.value.constructor, Uint8Array); |
| 363 assert_equals(result.value.buffer.byteLength, 32); | 363 assert_equals(result.value.buffer.byteLength, 32); |
| 364 assert_equals(result.value.byteOffset, 0); | 364 assert_equals(result.value.byteOffset, 0); |
| 365 assert_equals(result.value.byteLength, 2); | 365 assert_equals(result.value.byteLength, 2); |
| 366 assert_equals(result.value[0], 0x02); | 366 assert_equals(result.value[0], 0x02); |
| 367 assert_equals(result.value[1], 0x03); | 367 assert_equals(result.value[1], 0x03); |
| 368 const byobRequest = byobRequests[1]; |
| 369 assert_true(byobRequest.defined, 'second byobRequest must not be undefined')
; |
| 370 assert_true(byobRequest.viewDefined, 'second byobRequest.view must not be un
defined'); |
| 371 const viewInfo = byobRequest.viewInfo; |
| 372 assert_equals(viewInfo.constructor, Uint8Array, 'second view.constructor sho
uld be Uint8Array'); |
| 373 assert_equals(viewInfo.bufferByteLength, 32, 'second view.buffer.byteLength
should be 32'); |
| 374 assert_equals(viewInfo.byteOffset, 0, 'second view.byteOffset should be 0'); |
| 375 assert_equals(viewInfo.byteLength, 32, 'second view.byteLength should be 32'
); |
| 376 assert_equals(pullCount, 2, 'pullCount should be 2'); |
| 368 }); | 377 }); |
| 369 }, 'ReadableStream with byte source: Mix of auto allocate and BYOB'); | 378 }, 'ReadableStream with byte source: Mix of auto allocate and BYOB'); |
| 370 | 379 |
| 371 promise_test(() => { | 380 promise_test(() => { |
| 372 let pullCount = 0; | 381 let pullCount = 0; |
| 373 | 382 |
| 374 const stream = new ReadableStream({ | 383 const stream = new ReadableStream({ |
| 375 pull() { | 384 pull() { |
| 376 ++pullCount; | 385 ++pullCount; |
| 377 }, | 386 }, |
| 378 type: 'bytes' | 387 type: 'bytes' |
| 379 }, { | 388 }, { |
| 380 highWaterMark: 0 | 389 highWaterMark: 0 |
| 381 }); | 390 }); |
| 382 | 391 |
| 383 const reader = stream.getReader(); | 392 const reader = stream.getReader(); |
| 384 reader.read(new Uint8Array(8)); | 393 reader.read(new Uint8Array(8)); |
| 385 | 394 |
| 386 assert_equals(pullCount, 0, 'No pull as start() just finished and is not yet r
eflected to the state of the stream'); | 395 assert_equals(pullCount, 0, 'No pull as start() just finished and is not yet r
eflected to the state of the stream'); |
| 387 | 396 |
| 388 return Promise.resolve().then(() => { | 397 return Promise.resolve().then(() => { |
| 389 assert_equals(pullCount, 1, 'pull must be invoked'); | 398 assert_equals(pullCount, 1, 'pull must be invoked'); |
| 390 }); | 399 }); |
| 391 }, 'ReadableStream with byte source: Automatic pull() after start() and read(vie
w)'); | 400 }, 'ReadableStream with byte source: Automatic pull() after start() and read(vie
w)'); |
| 392 | 401 |
| 393 promise_test(() => { | 402 promise_test(() => { |
| 394 let pullCount = 0; | 403 let pullCount = 0; |
| 395 | 404 |
| 396 let controller; | 405 let controller; |
| 406 let desiredSizeInStart; |
| 407 let desiredSizeInPull; |
| 397 | 408 |
| 398 const stream = new ReadableStream({ | 409 const stream = new ReadableStream({ |
| 399 start(c) { | 410 start(c) { |
| 400 c.enqueue(new Uint8Array(16)); | 411 c.enqueue(new Uint8Array(16)); |
| 401 assert_equals(c.desiredSize, -8, 'desiredSize after enqueue() in start()')
; | 412 desiredSizeInStart = c.desiredSize; |
| 402 | |
| 403 controller = c; | 413 controller = c; |
| 404 }, | 414 }, |
| 405 pull() { | 415 pull() { |
| 406 ++pullCount; | 416 ++pullCount; |
| 407 | 417 |
| 408 if (pullCount === 1) { | 418 if (pullCount === 1) { |
| 409 assert_equals(controller.desiredSize, 8, 'desiredSize in pull()'); | 419 desiredSizeInPull = controller.desiredSize; |
| 410 } | 420 } |
| 411 }, | 421 }, |
| 412 type: 'bytes' | 422 type: 'bytes' |
| 413 }, { | 423 }, { |
| 414 highWaterMark: 8 | 424 highWaterMark: 8 |
| 415 }); | 425 }); |
| 416 | 426 |
| 417 return Promise.resolve().then(() => { | 427 return Promise.resolve().then(() => { |
| 418 assert_equals(pullCount, 0, 'No pull as the queue was filled by start()'); | 428 assert_equals(pullCount, 0, 'No pull as the queue was filled by start()'); |
| 429 assert_equals(desiredSizeInStart, -8, 'desiredSize after enqueue() in start(
)'); |
| 419 | 430 |
| 420 const reader = stream.getReader(); | 431 const reader = stream.getReader(); |
| 421 | 432 |
| 422 const promise = reader.read(); | 433 const promise = reader.read(); |
| 423 assert_equals(pullCount, 1, 'The first pull() should be made on read()'); | 434 assert_equals(pullCount, 1, 'The first pull() should be made on read()'); |
| 435 assert_equals(desiredSizeInPull, 8, 'desiredSize in pull()'); |
| 424 | 436 |
| 425 return promise.then(result => { | 437 return promise.then(result => { |
| 426 assert_equals(result.done, false, 'result.done'); | 438 assert_equals(result.done, false, 'result.done'); |
| 427 | 439 |
| 428 const view = result.value; | 440 const view = result.value; |
| 429 assert_equals(view.constructor, Uint8Array, 'view.constructor'); | 441 assert_equals(view.constructor, Uint8Array, 'view.constructor'); |
| 430 assert_equals(view.buffer.byteLength, 16, 'view.buffer'); | 442 assert_equals(view.buffer.byteLength, 16, 'view.buffer'); |
| 431 assert_equals(view.byteOffset, 0, 'view.byteOffset'); | 443 assert_equals(view.byteOffset, 0, 'view.byteOffset'); |
| 432 assert_equals(view.byteLength, 16, 'view.byteLength'); | 444 assert_equals(view.byteLength, 16, 'view.byteLength'); |
| 433 }); | 445 }); |
| (...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 497 assert_equals(result.done, false); | 509 assert_equals(result.done, false); |
| 498 | 510 |
| 499 const view = result.value; | 511 const view = result.value; |
| 500 assert_equals(view.constructor, Uint8Array); | 512 assert_equals(view.constructor, Uint8Array); |
| 501 assert_equals(view.buffer.byteLength, 32); | 513 assert_equals(view.buffer.byteLength, 32); |
| 502 assert_equals(view.byteOffset, 0); | 514 assert_equals(view.byteOffset, 0); |
| 503 assert_equals(view.byteLength, 32); | 515 assert_equals(view.byteLength, 32); |
| 504 }); | 516 }); |
| 505 }, 'ReadableStream with byte source: enqueue() with Uint16Array, getReader(), th
en read()'); | 517 }, 'ReadableStream with byte source: enqueue() with Uint16Array, getReader(), th
en read()'); |
| 506 | 518 |
| 507 promise_test(() => { | 519 promise_test(t => { |
| 508 const stream = new ReadableStream({ | 520 const stream = new ReadableStream({ |
| 509 start(c) { | 521 start(c) { |
| 510 const view = new Uint8Array(16); | 522 const view = new Uint8Array(16); |
| 511 view[0] = 0x01; | 523 view[0] = 0x01; |
| 512 view[8] = 0x02; | 524 view[8] = 0x02; |
| 513 c.enqueue(view); | 525 c.enqueue(view); |
| 514 }, | 526 }, |
| 515 pull() { | 527 pull: t.unreached_func('pull() should not be called'), |
| 516 assert_unreached('pull must not be called'); | |
| 517 }, | |
| 518 type: 'bytes' | 528 type: 'bytes' |
| 519 }); | 529 }); |
| 520 | 530 |
| 521 const byobReader = stream.getReader({ mode: 'byob' }); | 531 const byobReader = stream.getReader({ mode: 'byob' }); |
| 522 | 532 |
| 523 return byobReader.read(new Uint8Array(8)).then(result => { | 533 return byobReader.read(new Uint8Array(8)).then(result => { |
| 524 assert_equals(result.done, false, 'done'); | 534 assert_equals(result.done, false, 'done'); |
| 525 | 535 |
| 526 const view = result.value; | 536 const view = result.value; |
| 527 assert_equals(view.constructor, Uint8Array, 'value.constructor'); | 537 assert_equals(view.constructor, Uint8Array, 'value.constructor'); |
| (...skipping 12 matching lines...) Expand all Loading... |
| 540 | 550 |
| 541 const view = result.value; | 551 const view = result.value; |
| 542 assert_equals(view.constructor, Uint8Array, 'value.constructor'); | 552 assert_equals(view.constructor, Uint8Array, 'value.constructor'); |
| 543 assert_equals(view.buffer.byteLength, 16, 'value.buffer.byteLength'); | 553 assert_equals(view.buffer.byteLength, 16, 'value.buffer.byteLength'); |
| 544 assert_equals(view.byteOffset, 8, 'value.byteOffset'); | 554 assert_equals(view.byteOffset, 8, 'value.byteOffset'); |
| 545 assert_equals(view.byteLength, 8, 'value.byteLength'); | 555 assert_equals(view.byteLength, 8, 'value.byteLength'); |
| 546 assert_equals(view[0], 0x02); | 556 assert_equals(view[0], 0x02); |
| 547 }); | 557 }); |
| 548 }, 'ReadableStream with byte source: enqueue(), read(view) partially, then read(
)'); | 558 }, 'ReadableStream with byte source: enqueue(), read(view) partially, then read(
)'); |
| 549 | 559 |
| 550 promise_test(() => { | 560 promise_test(t => { |
| 551 let controller; | 561 let controller; |
| 552 | 562 |
| 553 const stream = new ReadableStream({ | 563 const stream = new ReadableStream({ |
| 554 start(c) { | 564 start(c) { |
| 555 controller = c; | 565 controller = c; |
| 556 }, | 566 }, |
| 557 pull() { | 567 pull: t.unreached_func('pull() should not be called'), |
| 558 assert_unreached('pull must not be called'); | |
| 559 }, | |
| 560 type: 'bytes' | 568 type: 'bytes' |
| 561 }); | 569 }); |
| 562 | 570 |
| 563 const reader = stream.getReader(); | 571 const reader = stream.getReader(); |
| 564 | 572 |
| 565 controller.enqueue(new Uint8Array(16)); | 573 controller.enqueue(new Uint8Array(16)); |
| 566 controller.close(); | 574 controller.close(); |
| 567 | 575 |
| 568 return reader.read().then(result => { | 576 return reader.read().then(result => { |
| 569 assert_equals(result.done, false, 'done'); | 577 assert_equals(result.done, false, 'done'); |
| 570 | 578 |
| 571 const view = result.value; | 579 const view = result.value; |
| 572 assert_equals(view.byteOffset, 0, 'byteOffset'); | 580 assert_equals(view.byteOffset, 0, 'byteOffset'); |
| 573 assert_equals(view.byteLength, 16, 'byteLength'); | 581 assert_equals(view.byteLength, 16, 'byteLength'); |
| 574 | 582 |
| 575 return reader.read(); | 583 return reader.read(); |
| 576 }).then(result => { | 584 }).then(result => { |
| 577 assert_equals(result.done, true, 'done'); | 585 assert_equals(result.done, true, 'done'); |
| 578 assert_equals(result.value, undefined, 'value'); | 586 assert_equals(result.value, undefined, 'value'); |
| 579 }); | 587 }); |
| 580 }, 'ReadableStream with byte source: getReader(), enqueue(), close(), then read(
)'); | 588 }, 'ReadableStream with byte source: getReader(), enqueue(), close(), then read(
)'); |
| 581 | 589 |
| 582 promise_test(() => { | 590 promise_test(t => { |
| 583 const stream = new ReadableStream({ | 591 const stream = new ReadableStream({ |
| 584 start(c) { | 592 start(c) { |
| 585 c.enqueue(new Uint8Array(16)); | 593 c.enqueue(new Uint8Array(16)); |
| 586 c.close(); | 594 c.close(); |
| 587 }, | 595 }, |
| 588 pull() { | 596 pull: t.unreached_func('pull() should not be called'), |
| 589 assert_unreached('pull must not be called'); | |
| 590 }, | |
| 591 type: 'bytes' | 597 type: 'bytes' |
| 592 }); | 598 }); |
| 593 | 599 |
| 594 const reader = stream.getReader(); | 600 const reader = stream.getReader(); |
| 595 | 601 |
| 596 return reader.read().then(result => { | 602 return reader.read().then(result => { |
| 597 assert_equals(result.done, false, 'done'); | 603 assert_equals(result.done, false, 'done'); |
| 598 | 604 |
| 599 const view = result.value; | 605 const view = result.value; |
| 600 assert_equals(view.byteOffset, 0, 'byteOffset'); | 606 assert_equals(view.byteOffset, 0, 'byteOffset'); |
| 601 assert_equals(view.byteLength, 16, 'byteLength'); | 607 assert_equals(view.byteLength, 16, 'byteLength'); |
| 602 | 608 |
| 603 return reader.read(); | 609 return reader.read(); |
| 604 }).then(result => { | 610 }).then(result => { |
| 605 assert_equals(result.done, true, 'done'); | 611 assert_equals(result.done, true, 'done'); |
| 606 assert_equals(result.value, undefined, 'value'); | 612 assert_equals(result.value, undefined, 'value'); |
| 607 }); | 613 }); |
| 608 }, 'ReadableStream with byte source: enqueue(), close(), getReader(), then read(
)'); | 614 }, 'ReadableStream with byte source: enqueue(), close(), getReader(), then read(
)'); |
| 609 | 615 |
| 610 promise_test(() => { | 616 promise_test(() => { |
| 611 let controller; | 617 let controller; |
| 618 let byobRequest; |
| 612 | 619 |
| 613 const stream = new ReadableStream({ | 620 const stream = new ReadableStream({ |
| 614 start(c) { | 621 start(c) { |
| 615 controller = c; | 622 controller = c; |
| 616 }, | 623 }, |
| 617 pull() { | 624 pull() { |
| 618 controller.enqueue(new Uint8Array(16)); | 625 controller.enqueue(new Uint8Array(16)); |
| 619 assert_equals(controller.byobRequest, undefined, 'byobRequest must be unde
fined'); | 626 byobRequest = controller.byobRequest; |
| 620 }, | 627 }, |
| 621 type: 'bytes' | 628 type: 'bytes' |
| 622 }); | 629 }); |
| 623 | 630 |
| 624 const reader = stream.getReader(); | 631 const reader = stream.getReader(); |
| 625 | 632 |
| 626 return reader.read().then(result => { | 633 return reader.read().then(result => { |
| 627 assert_equals(result.done, false, 'done'); | 634 assert_equals(result.done, false, 'done'); |
| 628 assert_equals(result.value.byteLength, 16, 'byteLength'); | 635 assert_equals(result.value.byteLength, 16, 'byteLength'); |
| 636 assert_equals(byobRequest, undefined, 'byobRequest must be undefined'); |
| 629 }); | 637 }); |
| 630 }, 'ReadableStream with byte source: Respond to pull() by enqueue()'); | 638 }, 'ReadableStream with byte source: Respond to pull() by enqueue()'); |
| 631 | 639 |
| 632 promise_test(() => { | 640 promise_test(() => { |
| 633 let pullCount = 0; | 641 let pullCount = 0; |
| 634 | 642 |
| 635 let controller; | 643 let controller; |
| 644 let byobRequest; |
| 645 const desiredSizes = []; |
| 636 | 646 |
| 637 const stream = new ReadableStream({ | 647 const stream = new ReadableStream({ |
| 638 start(c) { | 648 start(c) { |
| 639 controller = c; | 649 controller = c; |
| 640 }, | 650 }, |
| 641 pull() { | 651 pull() { |
| 642 assert_equals(controller.byobRequest, undefined, 'byobRequest is undefined
'); | 652 byobRequest = controller.byobRequest; |
| 643 | 653 desiredSizes.push(controller.desiredSize); |
| 644 if (pullCount === 0) { | 654 controller.enqueue(new Uint8Array(1)); |
| 645 assert_equals(controller.desiredSize, 256, 'desiredSize on pull'); | 655 desiredSizes.push(controller.desiredSize); |
| 646 | 656 controller.enqueue(new Uint8Array(1)); |
| 647 controller.enqueue(new Uint8Array(1)); | 657 desiredSizes.push(controller.desiredSize); |
| 648 assert_equals(controller.desiredSize, 256, 'desiredSize after 1st enqueu
e()'); | |
| 649 | |
| 650 controller.enqueue(new Uint8Array(1)); | |
| 651 assert_equals(controller.desiredSize, 256, 'desiredSize after 2nd enqueu
e()'); | |
| 652 } else { | |
| 653 assert_unreached('Too many pull() calls'); | |
| 654 } | |
| 655 | 658 |
| 656 ++pullCount; | 659 ++pullCount; |
| 657 }, | 660 }, |
| 658 type: 'bytes' | 661 type: 'bytes' |
| 659 }, { | 662 }, { |
| 660 highWaterMark: 256 | 663 highWaterMark: 256 |
| 661 }); | 664 }); |
| 662 | 665 |
| 663 const reader = stream.getReader(); | 666 const reader = stream.getReader(); |
| 664 | 667 |
| 665 const p0 = reader.read(); | 668 const p0 = reader.read(); |
| 666 const p1 = reader.read(); | 669 const p1 = reader.read(); |
| 667 const p2 = reader.read(); | 670 const p2 = reader.read(); |
| 668 | 671 |
| 669 // Respond to the first pull call. | 672 // Respond to the first pull call. |
| 670 controller.enqueue(new Uint8Array(1)); | 673 controller.enqueue(new Uint8Array(1)); |
| 671 | 674 |
| 672 assert_equals(pullCount, 0, 'pullCount after the enqueue() outside pull'); | 675 assert_equals(pullCount, 0, 'pullCount after the enqueue() outside pull'); |
| 673 | 676 |
| 674 return Promise.all([p0, p1, p2]).then(result => { | 677 return Promise.all([p0, p1, p2]).then(result => { |
| 675 assert_equals(pullCount, 1, 'pullCount after completion of all read()s'); | 678 assert_equals(pullCount, 1, 'pullCount after completion of all read()s'); |
| 676 | 679 |
| 677 assert_equals(result[0].done, false, 'result[0].done'); | 680 assert_equals(result[0].done, false, 'result[0].done'); |
| 678 assert_equals(result[0].value.byteLength, 1, 'result[0].value.byteLength'); | 681 assert_equals(result[0].value.byteLength, 1, 'result[0].value.byteLength'); |
| 679 assert_equals(result[1].done, false, 'result[1].done'); | 682 assert_equals(result[1].done, false, 'result[1].done'); |
| 680 assert_equals(result[1].value.byteLength, 1, 'result[1].value.byteLength'); | 683 assert_equals(result[1].value.byteLength, 1, 'result[1].value.byteLength'); |
| 681 assert_equals(result[2].done, false, 'result[2].done'); | 684 assert_equals(result[2].done, false, 'result[2].done'); |
| 682 assert_equals(result[2].value.byteLength, 1, 'result[2].value.byteLength'); | 685 assert_equals(result[2].value.byteLength, 1, 'result[2].value.byteLength'); |
| 686 assert_equals(byobRequest, undefined, 'byobRequest should be undefined'); |
| 687 assert_equals(desiredSizes[0], 256, 'desiredSize on pull should be 256'); |
| 688 assert_equals(desiredSizes[1], 256, 'desiredSize after 1st enqueue() should
be 256'); |
| 689 assert_equals(desiredSizes[2], 256, 'desiredSize after 2nd enqueue() should
be 256'); |
| 690 assert_equals(pullCount, 1, 'pull() should only be called once'); |
| 683 }); | 691 }); |
| 684 }, 'ReadableStream with byte source: Respond to pull() by enqueue() asynchronous
ly'); | 692 }, 'ReadableStream with byte source: Respond to pull() by enqueue() asynchronous
ly'); |
| 685 | 693 |
| 686 promise_test(() => { | 694 promise_test(() => { |
| 687 let controller; | 695 let controller; |
| 688 | 696 |
| 689 let pullCount = 0; | 697 let pullCount = 0; |
| 698 const byobRequestDefined = []; |
| 690 | 699 |
| 691 const stream = new ReadableStream({ | 700 const stream = new ReadableStream({ |
| 692 start(c) { | 701 start(c) { |
| 693 controller = c; | 702 controller = c; |
| 694 }, | 703 }, |
| 695 pull() { | 704 pull() { |
| 696 if (pullCount === 0) { | 705 byobRequestDefined.push(controller.byobRequest !== undefined); |
| 697 assert_not_equals(controller.byobRequest, undefined, 'byobRequest must n
ot be undefined before respond()'); | |
| 698 | 706 |
| 699 const view = controller.byobRequest.view; | 707 const view = controller.byobRequest.view; |
| 700 view[0] = 0x01; | 708 view[0] = 0x01; |
| 701 controller.byobRequest.respond(1); | 709 controller.byobRequest.respond(1); |
| 702 | 710 |
| 703 assert_equals(controller.byobRequest, undefined, 'byobRequest must be un
defined after respond()'); | 711 byobRequestDefined.push(controller.byobRequest !== undefined); |
| 704 } else { | |
| 705 assert_unreached('Too many pull() calls'); | |
| 706 } | |
| 707 | 712 |
| 708 ++pullCount; | 713 ++pullCount; |
| 709 }, | 714 }, |
| 710 type: 'bytes' | 715 type: 'bytes' |
| 711 }); | 716 }); |
| 712 | 717 |
| 713 const reader = stream.getReader({ mode: 'byob' }); | 718 const reader = stream.getReader({ mode: 'byob' }); |
| 714 | 719 |
| 715 return reader.read(new Uint8Array(1)).then(result => { | 720 return reader.read(new Uint8Array(1)).then(result => { |
| 716 assert_equals(result.done, false, 'result.done'); | 721 assert_equals(result.done, false, 'result.done'); |
| 717 assert_equals(result.value.byteLength, 1, 'result.value.byteLength'); | 722 assert_equals(result.value.byteLength, 1, 'result.value.byteLength'); |
| 718 assert_equals(result.value[0], 0x01, 'result.value[0]'); | 723 assert_equals(result.value[0], 0x01, 'result.value[0]'); |
| 724 assert_equals(pullCount, 1, 'pull() should be called only once'); |
| 725 assert_true(byobRequestDefined[0], 'byobRequest must not be undefined before
respond()'); |
| 726 assert_false(byobRequestDefined[1], 'byobRequest must be undefined after res
pond()'); |
| 719 }); | 727 }); |
| 720 }, 'ReadableStream with byte source: read(view), then respond()'); | 728 }, 'ReadableStream with byte source: read(view), then respond()'); |
| 721 | 729 |
| 722 promise_test(() => { | 730 promise_test(() => { |
| 723 let controller; | 731 let controller; |
| 724 | 732 |
| 725 let pullCount = 0; | 733 let pullCount = 0; |
| 734 const byobRequestDefined = []; |
| 726 | 735 |
| 727 const stream = new ReadableStream({ | 736 const stream = new ReadableStream({ |
| 728 start(c) { | 737 start(c) { |
| 729 controller = c; | 738 controller = c; |
| 730 }, | 739 }, |
| 731 pull() { | 740 pull() { |
| 732 if (pullCount === 0) { | 741 byobRequestDefined.push(controller.byobRequest !== undefined); |
| 733 assert_not_equals(controller.byobRequest, undefined, 'byobRequest must n
ot be undefined before respond()'); | |
| 734 | 742 |
| 735 // Emulate ArrayBuffer transfer by just creating a new ArrayBuffer and p
ass it. By checking the result of | 743 // Emulate ArrayBuffer transfer by just creating a new ArrayBuffer and pas
s it. By checking the result of |
| 736 // read(view), we test that the respond()'s buffer argument is working c
orrectly. | 744 // read(view), we test that the respond()'s buffer argument is working cor
rectly. |
| 737 // | 745 // |
| 738 // A real implementation of the underlying byte source would transfer co
ntroller.byobRequest.view.buffer into | 746 // A real implementation of the underlying byte source would transfer cont
roller.byobRequest.view.buffer into |
| 739 // a new ArrayBuffer, then construct a view around it and write to it. | 747 // a new ArrayBuffer, then construct a view around it and write to it. |
| 740 const transferredView = new Uint8Array(1); | 748 const transferredView = new Uint8Array(1); |
| 741 transferredView[0] = 0x01; | 749 transferredView[0] = 0x01; |
| 742 controller.byobRequest.respondWithNewView(transferredView); | 750 controller.byobRequest.respondWithNewView(transferredView); |
| 743 | 751 |
| 744 assert_equals(controller.byobRequest, undefined, 'byobRequest must be un
defined after respond()'); | 752 byobRequestDefined.push(controller.byobRequest !== undefined); |
| 745 } else { | |
| 746 assert_unreached('Too many pull() calls'); | |
| 747 } | |
| 748 | 753 |
| 749 ++pullCount; | 754 ++pullCount; |
| 750 }, | 755 }, |
| 751 type: 'bytes' | 756 type: 'bytes' |
| 752 }); | 757 }); |
| 753 | 758 |
| 754 const reader = stream.getReader({ mode: 'byob' }); | 759 const reader = stream.getReader({ mode: 'byob' }); |
| 755 | 760 |
| 756 return reader.read(new Uint8Array(1)).then(result => { | 761 return reader.read(new Uint8Array(1)).then(result => { |
| 757 assert_equals(result.done, false, 'result.done'); | 762 assert_equals(result.done, false, 'result.done'); |
| 758 assert_equals(result.value.byteLength, 1, 'result.value.byteLength'); | 763 assert_equals(result.value.byteLength, 1, 'result.value.byteLength'); |
| 759 assert_equals(result.value[0], 0x01, 'result.value[0]'); | 764 assert_equals(result.value[0], 0x01, 'result.value[0]'); |
| 765 assert_equals(pullCount, 1, 'pull() should be called only once'); |
| 766 assert_true(byobRequestDefined[0], 'byobRequest must not be undefined before
respond()'); |
| 767 assert_false(byobRequestDefined[1], 'byobRequest must be undefined after res
pond()'); |
| 760 }); | 768 }); |
| 761 }, 'ReadableStream with byte source: read(view), then respond() with a transferr
ed ArrayBuffer'); | 769 }, 'ReadableStream with byte source: read(view), then respond() with a transferr
ed ArrayBuffer'); |
| 762 | 770 |
| 763 promise_test(t => { | 771 promise_test(() => { |
| 764 let controller; | 772 let controller; |
| 773 let byobRequestWasDefined; |
| 774 let incorrectRespondException; |
| 765 | 775 |
| 766 const stream = new ReadableStream({ | 776 const stream = new ReadableStream({ |
| 767 start(c) { | 777 start(c) { |
| 768 controller = c; | 778 controller = c; |
| 769 }, | 779 }, |
| 770 pull() { | 780 pull() { |
| 771 assert_not_equals(controller.byobRequest, undefined, 'byobRequest is not u
ndefined'); | 781 byobRequestWasDefined = controller.byobRequest !== undefined; |
| 772 | 782 |
| 773 assert_throws(new RangeError(), () => controller.byobRequest.respond(2), '
respond() must throw'); | 783 try { |
| 784 controller.byobRequest.respond(2); |
| 785 } catch (e) { |
| 786 incorrectRespondException = e; |
| 787 } |
| 788 |
| 774 controller.byobRequest.respond(1); | 789 controller.byobRequest.respond(1); |
| 775 }, | 790 }, |
| 776 type: 'bytes' | 791 type: 'bytes' |
| 777 }); | 792 }); |
| 778 | 793 |
| 779 const reader = stream.getReader({ mode: 'byob' }); | 794 const reader = stream.getReader({ mode: 'byob' }); |
| 780 | 795 |
| 781 return reader.read(new Uint8Array(1)).catch(e => { | 796 return reader.read(new Uint8Array(1)).then(() => { |
| 782 assert_unreached(e); | 797 assert_true(byobRequestWasDefined, 'byobRequest should be defined'); |
| 783 t.done(); | 798 assert_not_equals(incorrectRespondException, undefined, 'respond() must thro
w'); |
| 799 assert_equals(incorrectRespondException.name, 'RangeError', 'respond() must
throw a RangeError'); |
| 784 }); | 800 }); |
| 785 }, 'ReadableStream with byte source: read(view), then respond() with too big val
ue'); | 801 }, 'ReadableStream with byte source: read(view), then respond() with too big val
ue'); |
| 786 | 802 |
| 787 promise_test(() => { | 803 promise_test(() => { |
| 788 let pullCount = 0; | 804 let pullCount = 0; |
| 789 | 805 |
| 790 let controller; | 806 let controller; |
| 807 let byobRequest; |
| 808 let viewInfo; |
| 791 | 809 |
| 792 const stream = new ReadableStream({ | 810 const stream = new ReadableStream({ |
| 793 start(c) { | 811 start(c) { |
| 794 controller = c; | 812 controller = c; |
| 795 }, | 813 }, |
| 796 pull() { | 814 pull() { |
| 797 if (pullCount > 1) { | |
| 798 assert_unreached('Too many pull calls'); | |
| 799 } | |
| 800 | |
| 801 ++pullCount; | 815 ++pullCount; |
| 802 | 816 |
| 803 assert_not_equals(controller.byobRequest, undefined, 'byobRequest must not
be undefined'); | 817 byobRequest = controller.byobRequest; |
| 804 const view = controller.byobRequest.view; | 818 const view = byobRequest.view; |
| 805 | 819 viewInfo = extractViewInfo(view); |
| 806 assert_equals(view.constructor, Uint8Array); | |
| 807 assert_equals(view.buffer.byteLength, 4); | |
| 808 | |
| 809 assert_equals(view.byteOffset, 0); | |
| 810 assert_equals(view.byteLength, 4); | |
| 811 | 820 |
| 812 view[0] = 0x01; | 821 view[0] = 0x01; |
| 813 view[1] = 0x02; | 822 view[1] = 0x02; |
| 814 view[2] = 0x03; | 823 view[2] = 0x03; |
| 815 | 824 |
| 816 controller.byobRequest.respond(3); | 825 controller.byobRequest.respond(3); |
| 817 }, | 826 }, |
| 818 type: 'bytes' | 827 type: 'bytes' |
| 819 }); | 828 }); |
| 820 | 829 |
| 821 const reader = stream.getReader({ mode: 'byob' }); | 830 const reader = stream.getReader({ mode: 'byob' }); |
| 822 | 831 |
| 823 return reader.read(new Uint16Array(2)).then(result => { | 832 return reader.read(new Uint16Array(2)).then(result => { |
| 824 assert_equals(pullCount, 1); | 833 assert_equals(pullCount, 1); |
| 825 | 834 |
| 826 assert_equals(result.done, false, 'done'); | 835 assert_equals(result.done, false, 'done'); |
| 827 | 836 |
| 828 const view = result.value; | 837 const view = result.value; |
| 829 assert_equals(view.byteOffset, 0, 'byteOffset'); | 838 assert_equals(view.byteOffset, 0, 'byteOffset'); |
| 830 assert_equals(view.byteLength, 2, 'byteLength'); | 839 assert_equals(view.byteLength, 2, 'byteLength'); |
| 831 | 840 |
| 832 assert_equals(view[0], 0x0201); | 841 assert_equals(view[0], 0x0201); |
| 833 | 842 |
| 834 return reader.read(new Uint8Array(1)); | 843 return reader.read(new Uint8Array(1)); |
| 835 }).then(result => { | 844 }).then(result => { |
| 836 assert_equals(pullCount, 1); | 845 assert_equals(pullCount, 1); |
| 846 assert_not_equals(byobRequest, undefined, 'byobRequest must not be undefined
'); |
| 847 assert_equals(viewInfo.constructor, Uint8Array, 'view.constructor should be
Uint8Array'); |
| 848 assert_equals(viewInfo.bufferByteLength, 4, 'view.buffer.byteLength should b
e 4'); |
| 849 assert_equals(viewInfo.byteOffset, 0, 'view.byteOffset should be 0'); |
| 850 assert_equals(viewInfo.byteLength, 4, 'view.byteLength should be 4'); |
| 837 | 851 |
| 838 assert_equals(result.done, false, 'done'); | 852 assert_equals(result.done, false, 'done'); |
| 839 | 853 |
| 840 const view = result.value; | 854 const view = result.value; |
| 841 assert_equals(view.byteOffset, 0, 'byteOffset'); | 855 assert_equals(view.byteOffset, 0, 'byteOffset'); |
| 842 assert_equals(view.byteLength, 1, 'byteLength'); | 856 assert_equals(view.byteLength, 1, 'byteLength'); |
| 843 | 857 |
| 844 assert_equals(view[0], 0x03); | 858 assert_equals(view[0], 0x03); |
| 845 }); | 859 }); |
| 846 }, 'ReadableStream with byte source: respond(3) to read(view) with 2 element Uin
t16Array enqueues the 1 byte ' + | 860 }, 'ReadableStream with byte source: respond(3) to read(view) with 2 element Uin
t16Array enqueues the 1 byte ' + |
| 847 'remainder'); | 861 'remainder'); |
| 848 | 862 |
| 849 promise_test(() => { | 863 promise_test(t => { |
| 850 let controller; | |
| 851 | |
| 852 const stream = new ReadableStream({ | 864 const stream = new ReadableStream({ |
| 853 start(c) { | 865 start(controller) { |
| 854 const view = new Uint8Array(16); | 866 const view = new Uint8Array(16); |
| 855 view[15] = 0x01; | 867 view[15] = 0x01; |
| 856 c.enqueue(view); | 868 controller.enqueue(view); |
| 857 | |
| 858 controller = c; | |
| 859 }, | 869 }, |
| 860 pull() { | 870 pull: t.unreached_func('pull() should not be called'), |
| 861 assert_equals(controller.byobRequest, undefined, 'byobRequest is undefined
'); | |
| 862 }, | |
| 863 type: 'bytes' | 871 type: 'bytes' |
| 864 }); | 872 }); |
| 865 | 873 |
| 866 const reader = stream.getReader({ mode: 'byob' }); | 874 const reader = stream.getReader({ mode: 'byob' }); |
| 867 | 875 |
| 868 return reader.read(new Uint8Array(16)).then(result => { | 876 return reader.read(new Uint8Array(16)).then(result => { |
| 869 assert_equals(result.done, false); | 877 assert_equals(result.done, false); |
| 870 | 878 |
| 871 const view = result.value; | 879 const view = result.value; |
| 872 assert_equals(view.byteOffset, 0); | 880 assert_equals(view.byteOffset, 0); |
| 873 assert_equals(view.byteLength, 16); | 881 assert_equals(view.byteLength, 16); |
| 874 assert_equals(view[15], 0x01); | 882 assert_equals(view[15], 0x01); |
| 875 }); | 883 }); |
| 876 }, 'ReadableStream with byte source: enqueue(), getReader(), then read(view)'); | 884 }, 'ReadableStream with byte source: enqueue(), getReader(), then read(view)'); |
| 877 | 885 |
| 878 promise_test(() => { | 886 promise_test(t => { |
| 879 let cancelCount = 0; | 887 let cancelCount = 0; |
| 888 let reason; |
| 880 | 889 |
| 881 const passedReason = new TypeError('foo'); | 890 const passedReason = new TypeError('foo'); |
| 882 | 891 |
| 883 const stream = new ReadableStream({ | 892 const stream = new ReadableStream({ |
| 884 start(c) { | 893 start(c) { |
| 885 c.enqueue(new Uint8Array(16)); | 894 c.enqueue(new Uint8Array(16)); |
| 886 }, | 895 }, |
| 887 pull() { | 896 pull: t.unreached_func('pull() should not be called'), |
| 888 assert_unreached('pull must not be called'); | 897 cancel(r) { |
| 889 }, | |
| 890 cancel(reason) { | |
| 891 if (cancelCount === 0) { | 898 if (cancelCount === 0) { |
| 892 assert_equals(reason, passedReason); | 899 reason = r; |
| 893 } else { | |
| 894 assert_unreached('Too many cancel calls'); | |
| 895 } | 900 } |
| 896 | 901 |
| 897 ++cancelCount; | 902 ++cancelCount; |
| 898 }, | 903 }, |
| 899 type: 'bytes' | 904 type: 'bytes' |
| 900 }); | 905 }); |
| 901 | 906 |
| 902 const reader = stream.getReader(); | 907 const reader = stream.getReader(); |
| 903 | 908 |
| 904 return reader.cancel(passedReason).then(result => { | 909 return reader.cancel(passedReason).then(result => { |
| 905 assert_equals(result, undefined); | 910 assert_equals(result, undefined); |
| 906 assert_equals(cancelCount, 1); | 911 assert_equals(cancelCount, 1); |
| 912 assert_equals(reason, passedReason, 'reason should equal the passed reason')
; |
| 907 }); | 913 }); |
| 908 }, 'ReadableStream with byte source: enqueue(), getReader(), then cancel() (mode
= not BYOB)'); | 914 }, 'ReadableStream with byte source: enqueue(), getReader(), then cancel() (mode
= not BYOB)'); |
| 909 | 915 |
| 910 promise_test(() => { | 916 promise_test(t => { |
| 911 let cancelCount = 0; | 917 let cancelCount = 0; |
| 918 let reason; |
| 912 | 919 |
| 913 const passedReason = new TypeError('foo'); | 920 const passedReason = new TypeError('foo'); |
| 914 | 921 |
| 915 const stream = new ReadableStream({ | 922 const stream = new ReadableStream({ |
| 916 start(c) { | 923 start(c) { |
| 917 c.enqueue(new Uint8Array(16)); | 924 c.enqueue(new Uint8Array(16)); |
| 918 }, | 925 }, |
| 919 pull() { | 926 pull: t.unreached_func('pull() should not be called'), |
| 920 assert_unreached('pull must not be called'); | 927 cancel(r) { |
| 921 }, | |
| 922 cancel(reason) { | |
| 923 if (cancelCount === 0) { | 928 if (cancelCount === 0) { |
| 924 assert_equals(reason, passedReason); | 929 reason = r; |
| 925 } else { | |
| 926 assert_unreached('Too many cancel calls'); | |
| 927 } | 930 } |
| 928 | 931 |
| 929 ++cancelCount; | 932 ++cancelCount; |
| 930 }, | 933 }, |
| 931 type: 'bytes' | 934 type: 'bytes' |
| 932 }); | 935 }); |
| 933 | 936 |
| 934 const reader = stream.getReader({ mode: 'byob' }); | 937 const reader = stream.getReader({ mode: 'byob' }); |
| 935 | 938 |
| 936 return reader.cancel(passedReason).then(result => { | 939 return reader.cancel(passedReason).then(result => { |
| 937 assert_equals(result, undefined); | 940 assert_equals(result, undefined); |
| 938 assert_equals(cancelCount, 1); | 941 assert_equals(cancelCount, 1); |
| 942 assert_equals(reason, passedReason, 'reason should equal the passed reason')
; |
| 939 }); | 943 }); |
| 940 }, 'ReadableStream with byte source: enqueue(), getReader(), then cancel() (mode
= BYOB)'); | 944 }, 'ReadableStream with byte source: enqueue(), getReader(), then cancel() (mode
= BYOB)'); |
| 941 | 945 |
| 942 promise_test(() => { | 946 promise_test(t => { |
| 943 let cancelCount = 0; | 947 let cancelCount = 0; |
| 948 let reason; |
| 944 | 949 |
| 945 const passedReason = new TypeError('foo'); | 950 const passedReason = new TypeError('foo'); |
| 946 | 951 |
| 947 let controller; | 952 let controller; |
| 948 | 953 |
| 949 const stream = new ReadableStream({ | 954 const stream = new ReadableStream({ |
| 950 start(c) { | 955 start(c) { |
| 951 controller = c; | 956 controller = c; |
| 952 }, | 957 }, |
| 953 pull() { | 958 pull: t.unreached_func('pull() should not be called'), |
| 954 assert_unreached('pull must not be called'); | 959 cancel(r) { |
| 955 }, | |
| 956 cancel(reason) { | |
| 957 if (cancelCount === 0) { | 960 if (cancelCount === 0) { |
| 958 assert_equals(reason, passedReason); | 961 reason = r; |
| 959 | |
| 960 controller.byobRequest.respond(0); | 962 controller.byobRequest.respond(0); |
| 961 } else { | |
| 962 assert_unreached('Too many cancel calls'); | |
| 963 } | 963 } |
| 964 | 964 |
| 965 ++cancelCount; | 965 ++cancelCount; |
| 966 | 966 |
| 967 return 'bar'; | 967 return 'bar'; |
| 968 }, | 968 }, |
| 969 type: 'bytes' | 969 type: 'bytes' |
| 970 }); | 970 }); |
| 971 | 971 |
| 972 const reader = stream.getReader({ mode: 'byob' }); | 972 const reader = stream.getReader({ mode: 'byob' }); |
| 973 | 973 |
| 974 const readPromise0 = reader.read(new Uint8Array(1)).then(result => { | 974 const readPromise = reader.read(new Uint8Array(1)).then(result => { |
| 975 assert_equals(result.done, true); | 975 assert_equals(result.done, true); |
| 976 }); | 976 }); |
| 977 | 977 |
| 978 const readPromise1 = reader.cancel(passedReason).then(result => { | 978 const cancelPromise = reader.cancel(passedReason).then(result => { |
| 979 assert_equals(result, undefined); | 979 assert_equals(result, undefined); |
| 980 assert_equals(cancelCount, 1); | 980 assert_equals(cancelCount, 1); |
| 981 assert_equals(reason, passedReason, 'reason should equal the passed reason')
; |
| 981 }); | 982 }); |
| 982 | 983 |
| 983 return Promise.all([readPromise0, readPromise1]); | 984 return Promise.all([readPromise, cancelPromise]); |
| 984 }, 'ReadableStream with byte source: getReader(), read(view), then cancel()'); | 985 }, 'ReadableStream with byte source: getReader(), read(view), then cancel()'); |
| 985 | 986 |
| 986 promise_test(() => { | 987 promise_test(() => { |
| 987 let pullCount = 0; | 988 let pullCount = 0; |
| 988 | 989 |
| 989 let controller; | 990 let controller; |
| 991 let byobRequest; |
| 992 const viewInfos = []; |
| 990 | 993 |
| 991 const stream = new ReadableStream({ | 994 const stream = new ReadableStream({ |
| 992 start(c) { | 995 start(c) { |
| 993 controller = c; | 996 controller = c; |
| 994 }, | 997 }, |
| 995 pull() { | 998 pull() { |
| 996 assert_not_equals(controller.byobRequest, undefined, 'byobRequest is undef
ined'); | 999 byobRequest = controller.byobRequest; |
| 997 | 1000 |
| 998 if (pullCount === 0) { | 1001 viewInfos.push(extractViewInfo(controller.byobRequest.view)); |
| 999 assert_equals(controller.byobRequest.view.byteLength, 2, 'byteLength bef
ore enqueue()'); | 1002 controller.enqueue(new Uint8Array(1)); |
| 1000 controller.enqueue(new Uint8Array(1)); | 1003 viewInfos.push(extractViewInfo(controller.byobRequest.view)); |
| 1001 assert_equals(controller.byobRequest.view.byteLength, 1, 'byteLength aft
er enqueue()'); | |
| 1002 } else { | |
| 1003 assert_unreached('Too many pull calls'); | |
| 1004 } | |
| 1005 | 1004 |
| 1006 ++pullCount; | 1005 ++pullCount; |
| 1007 }, | 1006 }, |
| 1008 type: 'bytes' | 1007 type: 'bytes' |
| 1009 }); | 1008 }); |
| 1010 | 1009 |
| 1011 return Promise.resolve().then(() => { | 1010 return Promise.resolve().then(() => { |
| 1012 assert_equals(pullCount, 0, 'No pull() as no read(view) yet'); | 1011 assert_equals(pullCount, 0, 'No pull() as no read(view) yet'); |
| 1013 | 1012 |
| 1014 const reader = stream.getReader({ mode: 'byob' }); | 1013 const reader = stream.getReader({ mode: 'byob' }); |
| 1015 | 1014 |
| 1016 const promise = reader.read(new Uint16Array(1)).then(result => { | 1015 const promise = reader.read(new Uint16Array(1)).then(result => { |
| 1017 assert_equals(result.done, true, 'result.done'); | 1016 assert_equals(result.done, true, 'result.done'); |
| 1018 assert_equals(result.value.constructor, Uint16Array, 'result.value'); | 1017 assert_equals(result.value.constructor, Uint16Array, 'result.value'); |
| 1019 }); | 1018 }); |
| 1020 | 1019 |
| 1021 assert_equals(pullCount, 1, '1 pull() should have been made in response to p
artial fill by enqueue()'); | 1020 assert_equals(pullCount, 1, '1 pull() should have been made in response to p
artial fill by enqueue()'); |
| 1021 assert_not_equals(byobRequest, undefined, 'byobRequest should not be undefin
ed'); |
| 1022 assert_equals(viewInfos[0].byteLength, 2, 'byteLength before enqueue() shoui
ld be 2'); |
| 1023 assert_equals(viewInfos[1].byteLength, 1, 'byteLength after enqueue() should
be 1'); |
| 1024 |
| 1022 | 1025 |
| 1023 reader.cancel(); | 1026 reader.cancel(); |
| 1024 | 1027 |
| 1025 // Tell that the buffer given via pull() is returned. | 1028 // Tell that the buffer given via pull() is returned. |
| 1026 controller.byobRequest.respond(0); | 1029 controller.byobRequest.respond(0); |
| 1027 | 1030 |
| 1031 assert_equals(pullCount, 1, 'pull() should only be called once'); |
| 1028 return promise; | 1032 return promise; |
| 1029 }); | 1033 }); |
| 1030 }, 'ReadableStream with byte source: cancel() with partially filled pending pull
() request'); | 1034 }, 'ReadableStream with byte source: cancel() with partially filled pending pull
() request'); |
| 1031 | 1035 |
| 1032 promise_test(() => { | 1036 promise_test(() => { |
| 1033 let controller; | 1037 let controller; |
| 1038 let byobRequest; |
| 1034 | 1039 |
| 1035 const stream = new ReadableStream({ | 1040 const stream = new ReadableStream({ |
| 1036 start(c) { | 1041 start(c) { |
| 1037 const view = new Uint8Array(8); | 1042 const view = new Uint8Array(8); |
| 1038 view[7] = 0x01; | 1043 view[7] = 0x01; |
| 1039 c.enqueue(view); | 1044 c.enqueue(view); |
| 1040 | 1045 |
| 1041 controller = c; | 1046 controller = c; |
| 1042 }, | 1047 }, |
| 1043 pull() { | 1048 pull() { |
| 1044 assert_equals(controller.byobRequest, undefined, 'byobRequest must be unde
fined'); | 1049 byobRequest = controller.byobRequest; |
| 1045 }, | 1050 }, |
| 1046 type: 'bytes' | 1051 type: 'bytes' |
| 1047 }); | 1052 }); |
| 1048 | 1053 |
| 1049 const reader = stream.getReader({ mode: 'byob' }); | 1054 const reader = stream.getReader({ mode: 'byob' }); |
| 1050 | 1055 |
| 1051 const buffer = new ArrayBuffer(16); | 1056 const buffer = new ArrayBuffer(16); |
| 1052 | 1057 |
| 1053 return reader.read(new Uint8Array(buffer, 8, 8)).then(result => { | 1058 return reader.read(new Uint8Array(buffer, 8, 8)).then(result => { |
| 1054 assert_equals(result.done, false); | 1059 assert_equals(result.done, false); |
| 1055 | 1060 |
| 1061 assert_equals(byobRequest, undefined, 'byobRequest must be undefined'); |
| 1062 |
| 1056 const view = result.value; | 1063 const view = result.value; |
| 1057 assert_equals(view.constructor, Uint8Array); | 1064 assert_equals(view.constructor, Uint8Array); |
| 1058 assert_equals(view.buffer.byteLength, 16); | 1065 assert_equals(view.buffer.byteLength, 16); |
| 1059 assert_equals(view.byteOffset, 8); | 1066 assert_equals(view.byteOffset, 8); |
| 1060 assert_equals(view.byteLength, 8); | 1067 assert_equals(view.byteLength, 8); |
| 1061 assert_equals(view[7], 0x01); | 1068 assert_equals(view[7], 0x01); |
| 1062 }); | 1069 }); |
| 1063 }, 'ReadableStream with byte source: enqueue(), getReader(), then read(view) whe
re view.buffer is not fully ' + | 1070 }, 'ReadableStream with byte source: enqueue(), getReader(), then read(view) whe
re view.buffer is not fully ' + |
| 1064 'covered by view'); | 1071 'covered by view'); |
| 1065 | 1072 |
| 1066 promise_test(() => { | 1073 promise_test(() => { |
| 1067 let controller; | 1074 let controller; |
| 1075 let byobRequest; |
| 1068 | 1076 |
| 1069 const stream = new ReadableStream({ | 1077 const stream = new ReadableStream({ |
| 1070 start(c) { | 1078 start(c) { |
| 1071 let view; | 1079 let view; |
| 1072 | 1080 |
| 1073 view = new Uint8Array(16); | 1081 view = new Uint8Array(16); |
| 1074 view[15] = 123; | 1082 view[15] = 123; |
| 1075 c.enqueue(view); | 1083 c.enqueue(view); |
| 1076 | 1084 |
| 1077 view = new Uint8Array(8); | 1085 view = new Uint8Array(8); |
| 1078 view[7] = 111; | 1086 view[7] = 111; |
| 1079 c.enqueue(view); | 1087 c.enqueue(view); |
| 1080 | 1088 |
| 1081 controller = c; | 1089 controller = c; |
| 1082 }, | 1090 }, |
| 1083 pull() { | 1091 pull() { |
| 1084 assert_equals(controller.byobRequest, undefined, 'byobRequest must be unde
fined'); | 1092 byobRequest = controller.byobRequest; |
| 1085 }, | 1093 }, |
| 1086 type: 'bytes' | 1094 type: 'bytes' |
| 1087 }); | 1095 }); |
| 1088 | 1096 |
| 1089 const reader = stream.getReader({ mode: 'byob' }); | 1097 const reader = stream.getReader({ mode: 'byob' }); |
| 1090 | 1098 |
| 1091 return reader.read(new Uint8Array(24)).then(result => { | 1099 return reader.read(new Uint8Array(24)).then(result => { |
| 1092 assert_equals(result.done, false, 'done'); | 1100 assert_equals(result.done, false, 'done'); |
| 1093 | 1101 |
| 1102 assert_equals(byobRequest, undefined, 'byobRequest must be undefined'); |
| 1103 |
| 1094 const view = result.value; | 1104 const view = result.value; |
| 1095 assert_equals(view.byteOffset, 0, 'byteOffset'); | 1105 assert_equals(view.byteOffset, 0, 'byteOffset'); |
| 1096 assert_equals(view.byteLength, 24, 'byteLength'); | 1106 assert_equals(view.byteLength, 24, 'byteLength'); |
| 1097 assert_equals(view[15], 123, 'Contents are set from the first chunk'); | 1107 assert_equals(view[15], 123, 'Contents are set from the first chunk'); |
| 1098 assert_equals(view[23], 111, 'Contents are set from the second chunk'); | 1108 assert_equals(view[23], 111, 'Contents are set from the second chunk'); |
| 1099 }); | 1109 }); |
| 1100 }, 'ReadableStream with byte source: Multiple enqueue(), getReader(), then read(
view)'); | 1110 }, 'ReadableStream with byte source: Multiple enqueue(), getReader(), then read(
view)'); |
| 1101 | 1111 |
| 1102 promise_test(() => { | 1112 promise_test(() => { |
| 1113 let byobRequest; |
| 1114 |
| 1103 const stream = new ReadableStream({ | 1115 const stream = new ReadableStream({ |
| 1104 start(c) { | 1116 start(c) { |
| 1105 const view = new Uint8Array(16); | 1117 const view = new Uint8Array(16); |
| 1106 view[15] = 0x01; | 1118 view[15] = 0x01; |
| 1107 c.enqueue(view); | 1119 c.enqueue(view); |
| 1108 }, | 1120 }, |
| 1109 pull(controller) { | 1121 pull(controller) { |
| 1110 assert_equals(controller.byobRequest, undefined, 'byobRequest must be unde
fined'); | 1122 byobRequest = controller.byobRequest; |
| 1111 }, | 1123 }, |
| 1112 type: 'bytes' | 1124 type: 'bytes' |
| 1113 }); | 1125 }); |
| 1114 | 1126 |
| 1115 const reader = stream.getReader({ mode: 'byob' }); | 1127 const reader = stream.getReader({ mode: 'byob' }); |
| 1116 | 1128 |
| 1117 return reader.read(new Uint8Array(24)).then(result => { | 1129 return reader.read(new Uint8Array(24)).then(result => { |
| 1118 assert_equals(result.done, false); | 1130 assert_equals(result.done, false); |
| 1119 | 1131 |
| 1132 assert_equals(byobRequest, undefined, 'byobRequest must be undefined'); |
| 1133 |
| 1120 const view = result.value; | 1134 const view = result.value; |
| 1121 assert_equals(view.byteOffset, 0); | 1135 assert_equals(view.byteOffset, 0); |
| 1122 assert_equals(view.byteLength, 16); | 1136 assert_equals(view.byteLength, 16); |
| 1123 assert_equals(view[15], 0x01); | 1137 assert_equals(view[15], 0x01); |
| 1124 }); | 1138 }); |
| 1125 }, 'ReadableStream with byte source: enqueue(), getReader(), then read(view) wit
h a bigger view'); | 1139 }, 'ReadableStream with byte source: enqueue(), getReader(), then read(view) wit
h a bigger view'); |
| 1126 | 1140 |
| 1127 promise_test(() => { | 1141 promise_test(() => { |
| 1142 let byobRequest; |
| 1143 |
| 1128 const stream = new ReadableStream({ | 1144 const stream = new ReadableStream({ |
| 1129 start(c) { | 1145 start(c) { |
| 1130 const view = new Uint8Array(16); | 1146 const view = new Uint8Array(16); |
| 1131 view[7] = 0x01; | 1147 view[7] = 0x01; |
| 1132 view[15] = 0x02; | 1148 view[15] = 0x02; |
| 1133 c.enqueue(view); | 1149 c.enqueue(view); |
| 1134 }, | 1150 }, |
| 1135 pull(controller) { | 1151 pull(controller) { |
| 1136 assert_equals(controller.byobRequest, undefined, 'byobRequest must be unde
fined'); | 1152 byobRequest = controller.byobRequest; |
| 1137 }, | 1153 }, |
| 1138 type: 'bytes' | 1154 type: 'bytes' |
| 1139 }); | 1155 }); |
| 1140 | 1156 |
| 1141 const reader = stream.getReader({ mode: 'byob' }); | 1157 const reader = stream.getReader({ mode: 'byob' }); |
| 1142 | 1158 |
| 1143 return reader.read(new Uint8Array(8)).then(result => { | 1159 return reader.read(new Uint8Array(8)).then(result => { |
| 1144 assert_equals(result.done, false, 'done'); | 1160 assert_equals(result.done, false, 'done'); |
| 1145 | 1161 |
| 1146 const view = result.value; | 1162 const view = result.value; |
| 1147 assert_equals(view.byteOffset, 0); | 1163 assert_equals(view.byteOffset, 0); |
| 1148 assert_equals(view.byteLength, 8); | 1164 assert_equals(view.byteLength, 8); |
| 1149 assert_equals(view[7], 0x01); | 1165 assert_equals(view[7], 0x01); |
| 1150 | 1166 |
| 1151 return reader.read(new Uint8Array(8)); | 1167 return reader.read(new Uint8Array(8)); |
| 1152 }).then(result => { | 1168 }).then(result => { |
| 1153 assert_equals(result.done, false, 'done'); | 1169 assert_equals(result.done, false, 'done'); |
| 1154 | 1170 |
| 1171 assert_equals(byobRequest, undefined, 'byobRequest must be undefined'); |
| 1172 |
| 1155 const view = result.value; | 1173 const view = result.value; |
| 1156 assert_equals(view.byteOffset, 0); | 1174 assert_equals(view.byteOffset, 0); |
| 1157 assert_equals(view.byteLength, 8); | 1175 assert_equals(view.byteLength, 8); |
| 1158 assert_equals(view[7], 0x02); | 1176 assert_equals(view[7], 0x02); |
| 1159 }); | 1177 }); |
| 1160 }, 'ReadableStream with byte source: enqueue(), getReader(), then read(view) wit
h a smaller views'); | 1178 }, 'ReadableStream with byte source: enqueue(), getReader(), then read(view) wit
h a smaller views'); |
| 1161 | 1179 |
| 1162 promise_test(() => { | 1180 promise_test(() => { |
| 1163 let controller; | 1181 let controller; |
| 1182 let viewInfo; |
| 1164 | 1183 |
| 1165 const stream = new ReadableStream({ | 1184 const stream = new ReadableStream({ |
| 1166 start(c) { | 1185 start(c) { |
| 1167 const view = new Uint8Array(1); | 1186 const view = new Uint8Array(1); |
| 1168 view[0] = 0xff; | 1187 view[0] = 0xff; |
| 1169 c.enqueue(view); | 1188 c.enqueue(view); |
| 1170 | 1189 |
| 1171 controller = c; | 1190 controller = c; |
| 1172 }, | 1191 }, |
| 1173 pull() { | 1192 pull() { |
| 1174 if (controller.byobRequest === undefined) { | 1193 if (controller.byobRequest === undefined) { |
| 1175 return; | 1194 return; |
| 1176 } | 1195 } |
| 1177 | 1196 |
| 1178 const view = controller.byobRequest.view; | 1197 const view = controller.byobRequest.view; |
| 1179 | 1198 viewInfo = extractViewInfo(view); |
| 1180 assert_equals(view.constructor, Uint8Array); | |
| 1181 assert_equals(view.buffer.byteLength, 2); | |
| 1182 | |
| 1183 assert_equals(view.byteOffset, 1); | |
| 1184 assert_equals(view.byteLength, 1); | |
| 1185 | 1199 |
| 1186 view[0] = 0xaa; | 1200 view[0] = 0xaa; |
| 1187 controller.byobRequest.respond(1); | 1201 controller.byobRequest.respond(1); |
| 1188 }, | 1202 }, |
| 1189 type: 'bytes' | 1203 type: 'bytes' |
| 1190 }); | 1204 }); |
| 1191 | 1205 |
| 1192 const reader = stream.getReader({ mode: 'byob' }); | 1206 const reader = stream.getReader({ mode: 'byob' }); |
| 1193 | 1207 |
| 1194 return reader.read(new Uint16Array(1)).then(result => { | 1208 return reader.read(new Uint16Array(1)).then(result => { |
| 1195 assert_equals(result.done, false); | 1209 assert_equals(result.done, false); |
| 1196 | 1210 |
| 1197 const view = result.value; | 1211 const view = result.value; |
| 1198 assert_equals(view.byteOffset, 0); | 1212 assert_equals(view.byteOffset, 0); |
| 1199 assert_equals(view.byteLength, 2); | 1213 assert_equals(view.byteLength, 2); |
| 1200 assert_equals(view[0], 0xaaff); | 1214 assert_equals(view[0], 0xaaff); |
| 1215 |
| 1216 assert_equals(viewInfo.constructor, Uint8Array, 'view.constructor should be
Uint8Array'); |
| 1217 assert_equals(viewInfo.bufferByteLength, 2, 'view.buffer.byteLength should b
e 2'); |
| 1218 assert_equals(viewInfo.byteOffset, 1, 'view.byteOffset should be 1'); |
| 1219 assert_equals(viewInfo.byteLength, 1, 'view.byteLength should be 1'); |
| 1201 }); | 1220 }); |
| 1202 }, 'ReadableStream with byte source: enqueue() 1 byte, getReader(), then read(vi
ew) with Uint16Array'); | 1221 }, 'ReadableStream with byte source: enqueue() 1 byte, getReader(), then read(vi
ew) with Uint16Array'); |
| 1203 | 1222 |
| 1204 promise_test(() => { | 1223 promise_test(() => { |
| 1205 let pullCount = 0; | 1224 let pullCount = 0; |
| 1206 | 1225 |
| 1207 let controller; | 1226 let controller; |
| 1227 let byobRequest; |
| 1228 let viewInfo; |
| 1229 let desiredSize; |
| 1208 | 1230 |
| 1209 const stream = new ReadableStream({ | 1231 const stream = new ReadableStream({ |
| 1210 start(c) { | 1232 start(c) { |
| 1211 const view = new Uint8Array(3); | 1233 const view = new Uint8Array(3); |
| 1212 view[0] = 0x01; | 1234 view[0] = 0x01; |
| 1213 view[2] = 0x02; | 1235 view[2] = 0x02; |
| 1214 c.enqueue(view); | 1236 c.enqueue(view); |
| 1215 | 1237 |
| 1216 controller = c; | 1238 controller = c; |
| 1217 }, | 1239 }, |
| 1218 pull() { | 1240 pull() { |
| 1219 assert_not_equals(controller.byobRequest, undefined, 'byobRequest must not
be undefined'); | 1241 byobRequest = controller.byobRequest; |
| 1220 | 1242 |
| 1221 if (pullCount === 0) { | 1243 const view = controller.byobRequest.view; |
| 1222 const view = controller.byobRequest.view; | |
| 1223 | 1244 |
| 1224 assert_equals(view.constructor, Uint8Array); | 1245 viewInfo = extractViewInfo(view); |
| 1225 assert_equals(view.buffer.byteLength, 2); | |
| 1226 assert_equals(view.byteOffset, 1); | |
| 1227 assert_equals(view.byteLength, 1); | |
| 1228 | 1246 |
| 1229 view[0] = 0x03; | 1247 view[0] = 0x03; |
| 1230 controller.byobRequest.respond(1); | 1248 controller.byobRequest.respond(1); |
| 1231 | 1249 |
| 1232 assert_equals(controller.desiredSize, 0, 'desiredSize'); | 1250 desiredSize = controller.desiredSize; |
| 1233 } else { | |
| 1234 assert_unreached('Too many pull calls'); | |
| 1235 } | |
| 1236 | 1251 |
| 1237 ++pullCount; | 1252 ++pullCount; |
| 1238 }, | 1253 }, |
| 1239 type: 'bytes' | 1254 type: 'bytes' |
| 1240 }); | 1255 }); |
| 1241 | 1256 |
| 1242 // Wait for completion of the start method to be reflected. | 1257 // Wait for completion of the start method to be reflected. |
| 1243 return Promise.resolve().then(() => { | 1258 return Promise.resolve().then(() => { |
| 1244 const reader = stream.getReader({ mode: 'byob' }); | 1259 const reader = stream.getReader({ mode: 'byob' }); |
| 1245 | 1260 |
| (...skipping 13 matching lines...) Expand all Loading... |
| 1259 | 1274 |
| 1260 return p; | 1275 return p; |
| 1261 }).then(result => { | 1276 }).then(result => { |
| 1262 assert_equals(result.done, false, 'done'); | 1277 assert_equals(result.done, false, 'done'); |
| 1263 | 1278 |
| 1264 const view = result.value; | 1279 const view = result.value; |
| 1265 assert_equals(view.buffer.byteLength, 2, 'buffer.byteLength'); | 1280 assert_equals(view.buffer.byteLength, 2, 'buffer.byteLength'); |
| 1266 assert_equals(view.byteOffset, 0, 'byteOffset'); | 1281 assert_equals(view.byteOffset, 0, 'byteOffset'); |
| 1267 assert_equals(view.byteLength, 2, 'byteLength'); | 1282 assert_equals(view.byteLength, 2, 'byteLength'); |
| 1268 assert_equals(view[0], 0x0302, 'Contents are set'); | 1283 assert_equals(view[0], 0x0302, 'Contents are set'); |
| 1284 |
| 1285 assert_not_equals(byobRequest, undefined, 'byobRequest must not be undefin
ed'); |
| 1286 assert_equals(viewInfo.constructor, Uint8Array, 'view.constructor should b
e Uint8Array'); |
| 1287 assert_equals(viewInfo.bufferByteLength, 2, 'view.buffer.byteLength should
be 2'); |
| 1288 assert_equals(viewInfo.byteOffset, 1, 'view.byteOffset should be 1'); |
| 1289 assert_equals(viewInfo.byteLength, 1, 'view.byteLength should be 1'); |
| 1290 assert_equals(desiredSize, 0, 'desiredSize should be zero'); |
| 1269 }); | 1291 }); |
| 1270 | 1292 |
| 1271 assert_equals(pullCount, 0); | 1293 assert_equals(pullCount, 0); |
| 1272 | 1294 |
| 1273 return promise; | 1295 return promise; |
| 1274 }); | 1296 }); |
| 1275 }, 'ReadableStream with byte source: enqueue() 3 byte, getReader(), then read(vi
ew) with 2-element Uint16Array'); | 1297 }, 'ReadableStream with byte source: enqueue() 3 byte, getReader(), then read(vi
ew) with 2-element Uint16Array'); |
| 1276 | 1298 |
| 1277 promise_test(t => { | 1299 promise_test(t => { |
| 1278 const stream = new ReadableStream({ | 1300 const stream = new ReadableStream({ |
| 1279 start(c) { | 1301 start(c) { |
| 1280 const view = new Uint8Array(1); | 1302 const view = new Uint8Array(1); |
| 1281 view[0] = 0xff; | 1303 view[0] = 0xff; |
| 1282 c.enqueue(view); | 1304 c.enqueue(view); |
| 1283 c.close(); | 1305 c.close(); |
| 1284 }, | 1306 }, |
| 1285 pull() { | 1307 pull: t.unreached_func('pull() should not be called'), |
| 1286 assert_unreached('pull must not be called'); | |
| 1287 }, | |
| 1288 type: 'bytes' | 1308 type: 'bytes' |
| 1289 }); | 1309 }); |
| 1290 | 1310 |
| 1291 const reader = stream.getReader({ mode: 'byob' }); | 1311 const reader = stream.getReader({ mode: 'byob' }); |
| 1292 | 1312 |
| 1293 | 1313 |
| 1294 const promise = promise_rejects(t, new TypeError(), reader.read(new Uint16Arra
y(1)), 'read(view) must fail'); | 1314 return promise_rejects(t, new TypeError(), reader.read(new Uint16Array(1)), 'r
ead(view) must fail') |
| 1295 return promise_rejects(t, new TypeError(), promise.then(() => reader.closed)); | 1315 .then(() => promise_rejects(t, new TypeError(), reader.closed, 'reader.clo
sed should reject')); |
| 1296 }, 'ReadableStream with byte source: read(view) with Uint16Array on close()-d st
ream with 1 byte enqueue()-d must ' + | 1316 }, 'ReadableStream with byte source: read(view) with Uint16Array on close()-d st
ream with 1 byte enqueue()-d must ' + |
| 1297 'fail'); | 1317 'fail'); |
| 1298 | 1318 |
| 1299 promise_test(t => { | 1319 promise_test(t => { |
| 1300 let pullCount = 0; | |
| 1301 | |
| 1302 let controller; | 1320 let controller; |
| 1303 | 1321 |
| 1304 const stream = new ReadableStream({ | 1322 const stream = new ReadableStream({ |
| 1305 start(c) { | 1323 start(c) { |
| 1306 const view = new Uint8Array(1); | 1324 const view = new Uint8Array(1); |
| 1307 view[0] = 0xff; | 1325 view[0] = 0xff; |
| 1308 c.enqueue(view); | 1326 c.enqueue(view); |
| 1309 | 1327 |
| 1310 controller = c; | 1328 controller = c; |
| 1311 }, | 1329 }, |
| 1312 pull() { | 1330 pull: t.unreached_func('pull() should not be called'), |
| 1313 assert_not_equals(controller.byobRequest, undefined, 'byobRequest must not
be undefined'); | |
| 1314 | |
| 1315 if (pullCount === 0) { | |
| 1316 const view = controller.byobRequest.view; | |
| 1317 | |
| 1318 assert_equals(view.constructor, Uint8Array); | |
| 1319 assert_equals(view.buffer.byteLength, 2); | |
| 1320 | |
| 1321 assert_equals(view.byteOffset, 1); | |
| 1322 assert_equals(view.byteLength, 1); | |
| 1323 } else { | |
| 1324 assert_unreached('Too many pull calls'); | |
| 1325 } | |
| 1326 | |
| 1327 ++pullCount; | |
| 1328 }, | |
| 1329 type: 'bytes' | 1331 type: 'bytes' |
| 1330 }); | 1332 }); |
| 1331 | 1333 |
| 1332 const reader = stream.getReader({ mode: 'byob' }); | 1334 const reader = stream.getReader({ mode: 'byob' }); |
| 1333 | 1335 |
| 1334 let promise = promise_rejects(t, new TypeError(), reader.read(new Uint16Array(
1)), 'read(view) must fail'); | 1336 const readPromise = reader.read(new Uint16Array(1)); |
| 1335 promise = promise_rejects(t, new TypeError(), promise.then(() => reader.closed
)); | |
| 1336 promise = promise.then(() => { | |
| 1337 assert_equals(pullCount, 0); | |
| 1338 }); | |
| 1339 | 1337 |
| 1340 assert_throws(new TypeError(), () => controller.close(), 'controller.close() m
ust throw'); | 1338 assert_throws(new TypeError(), () => controller.close(), 'controller.close() m
ust throw'); |
| 1341 | 1339 |
| 1342 return promise; | 1340 return promise_rejects(t, new TypeError(), readPromise, 'read(view) must fail'
) |
| 1341 .then(() => promise_rejects(t, new TypeError(), reader.closed, 'reader.clo
sed must reject')); |
| 1343 }, 'ReadableStream with byte source: A stream must be errored if close()-d befor
e fulfilling read(view) with ' + | 1342 }, 'ReadableStream with byte source: A stream must be errored if close()-d befor
e fulfilling read(view) with ' + |
| 1344 'Uint16Array'); | 1343 'Uint16Array'); |
| 1345 | 1344 |
| 1346 test(() => { | 1345 test(() => { |
| 1347 let controller; | 1346 let controller; |
| 1348 | 1347 |
| 1349 new ReadableStream({ | 1348 new ReadableStream({ |
| 1350 start(c) { | 1349 start(c) { |
| 1351 controller = c; | 1350 controller = c; |
| 1352 }, | 1351 }, |
| (...skipping 23 matching lines...) Expand all Loading... |
| 1376 // even if the stream has not yet entered the closed state. | 1375 // even if the stream has not yet entered the closed state. |
| 1377 const view = new Uint8Array(1); | 1376 const view = new Uint8Array(1); |
| 1378 controller.enqueue(view); | 1377 controller.enqueue(view); |
| 1379 controller.close(); | 1378 controller.close(); |
| 1380 | 1379 |
| 1381 assert_throws(new TypeError(), () => controller.enqueue(view), 'controller.clo
se() must throw'); | 1380 assert_throws(new TypeError(), () => controller.enqueue(view), 'controller.clo
se() must throw'); |
| 1382 }, 'ReadableStream with byte source: Throw on enqueue() after close()'); | 1381 }, 'ReadableStream with byte source: Throw on enqueue() after close()'); |
| 1383 | 1382 |
| 1384 promise_test(() => { | 1383 promise_test(() => { |
| 1385 let controller; | 1384 let controller; |
| 1385 let byobRequest; |
| 1386 let viewInfo; |
| 1386 | 1387 |
| 1387 const stream = new ReadableStream({ | 1388 const stream = new ReadableStream({ |
| 1388 start(c) { | 1389 start(c) { |
| 1389 controller = c; | 1390 controller = c; |
| 1390 }, | 1391 }, |
| 1391 pull() { | 1392 pull() { |
| 1392 assert_not_equals(controller.byobRequest, undefined, 'byobRequest must not
be undefined'); | 1393 byobRequest = controller.byobRequest; |
| 1393 const view = controller.byobRequest.view; | 1394 const view = controller.byobRequest.view; |
| 1394 | 1395 viewInfo = extractViewInfo(view); |
| 1395 assert_equals(view.constructor, Uint8Array); | |
| 1396 assert_equals(view.buffer.byteLength, 16); | |
| 1397 | |
| 1398 assert_equals(view.byteOffset, 0); | |
| 1399 assert_equals(view.byteLength, 16); | |
| 1400 | 1396 |
| 1401 view[15] = 0x01; | 1397 view[15] = 0x01; |
| 1402 controller.byobRequest.respond(16); | 1398 controller.byobRequest.respond(16); |
| 1403 controller.close(); | 1399 controller.close(); |
| 1404 }, | 1400 }, |
| 1405 type: 'bytes' | 1401 type: 'bytes' |
| 1406 }); | 1402 }); |
| 1407 | 1403 |
| 1408 const reader = stream.getReader({ mode: 'byob' }); | 1404 const reader = stream.getReader({ mode: 'byob' }); |
| 1409 | 1405 |
| 1410 return reader.read(new Uint8Array(16)).then(result => { | 1406 return reader.read(new Uint8Array(16)).then(result => { |
| 1411 assert_equals(result.done, false); | 1407 assert_equals(result.done, false); |
| 1412 | 1408 |
| 1413 const view = result.value; | 1409 const view = result.value; |
| 1414 assert_equals(view.byteOffset, 0); | 1410 assert_equals(view.byteOffset, 0); |
| 1415 assert_equals(view.byteLength, 16); | 1411 assert_equals(view.byteLength, 16); |
| 1416 assert_equals(view[15], 0x01); | 1412 assert_equals(view[15], 0x01); |
| 1417 | 1413 |
| 1418 return reader.read(new Uint8Array(16)); | 1414 return reader.read(new Uint8Array(16)); |
| 1419 }).then(result => { | 1415 }).then(result => { |
| 1420 assert_equals(result.done, true); | 1416 assert_equals(result.done, true); |
| 1421 | 1417 |
| 1422 const view = result.value; | 1418 const view = result.value; |
| 1423 assert_equals(view.byteOffset, 0); | 1419 assert_equals(view.byteOffset, 0); |
| 1424 assert_equals(view.byteLength, 0); | 1420 assert_equals(view.byteLength, 0); |
| 1421 |
| 1422 assert_not_equals(byobRequest, undefined, 'byobRequest must not be undefined
'); |
| 1423 assert_equals(viewInfo.constructor, Uint8Array, 'view.constructor should be
Uint8Array'); |
| 1424 assert_equals(viewInfo.bufferByteLength, 16, 'view.buffer.byteLength should
be 16'); |
| 1425 assert_equals(viewInfo.byteOffset, 0, 'view.byteOffset should be 0'); |
| 1426 assert_equals(viewInfo.byteLength, 16, 'view.byteLength should be 16'); |
| 1425 }); | 1427 }); |
| 1426 }, 'ReadableStream with byte source: read(view), then respond() and close() in p
ull()'); | 1428 }, 'ReadableStream with byte source: read(view), then respond() and close() in p
ull()'); |
| 1427 | 1429 |
| 1428 promise_test(() => { | 1430 promise_test(() => { |
| 1429 let pullCount = 0; | 1431 let pullCount = 0; |
| 1430 | 1432 |
| 1431 let controller; | 1433 let controller; |
| 1434 const viewInfos = []; |
| 1432 | 1435 |
| 1433 const stream = new ReadableStream({ | 1436 const stream = new ReadableStream({ |
| 1434 start(c) { | 1437 start(c) { |
| 1435 controller = c; | 1438 controller = c; |
| 1436 }, | 1439 }, |
| 1437 pull() { | 1440 pull() { |
| 1438 if (controller.byobRequest === undefined) { | 1441 if (controller.byobRequest === undefined) { |
| 1439 return; | 1442 return; |
| 1440 } | 1443 } |
| 1441 | 1444 |
| 1442 if (pullCount < 1) { | 1445 for (let i = 0; i < 4; ++i) { |
| 1443 for (let i = 0; i < 4; ++i) { | 1446 const view = controller.byobRequest.view; |
| 1444 const view = controller.byobRequest.view; | 1447 viewInfos.push(extractViewInfo(view)); |
| 1445 | 1448 |
| 1446 assert_equals(view.constructor, Uint8Array); | 1449 view[0] = 0x01; |
| 1447 assert_equals(view.buffer.byteLength, 4); | 1450 controller.byobRequest.respond(1); |
| 1448 | |
| 1449 assert_equals(view.byteOffset, i); | |
| 1450 assert_equals(view.byteLength, 4 - i); | |
| 1451 | |
| 1452 view[0] = 0x01; | |
| 1453 controller.byobRequest.respond(1); | |
| 1454 } | |
| 1455 } else { | |
| 1456 assert_unreached('Too many pull() calls'); | |
| 1457 } | 1451 } |
| 1458 | 1452 |
| 1459 ++pullCount; | 1453 ++pullCount; |
| 1460 }, | 1454 }, |
| 1461 type: 'bytes' | 1455 type: 'bytes' |
| 1462 }); | 1456 }); |
| 1463 | 1457 |
| 1464 const reader = stream.getReader({ mode: 'byob' }); | 1458 const reader = stream.getReader({ mode: 'byob' }); |
| 1465 | 1459 |
| 1466 return reader.read(new Uint32Array(1)).then(result => { | 1460 return reader.read(new Uint32Array(1)).then(result => { |
| 1467 assert_equals(result.done, false); | 1461 assert_equals(result.done, false); |
| 1468 | 1462 |
| 1469 const view = result.value; | 1463 const view = result.value; |
| 1470 assert_equals(view.byteOffset, 0); | 1464 assert_equals(view.byteOffset, 0); |
| 1471 assert_equals(view.byteLength, 4); | 1465 assert_equals(view.byteLength, 4); |
| 1472 assert_equals(view[0], 0x01010101); | 1466 assert_equals(view[0], 0x01010101); |
| 1467 |
| 1468 assert_equals(pullCount, 1, 'pull() should only be called once'); |
| 1469 |
| 1470 for (let i = 0; i < 4; ++i) { |
| 1471 assert_equals(viewInfos[i].constructor, Uint8Array, 'view.constructor shou
ld be Uint8Array'); |
| 1472 assert_equals(viewInfos[i].bufferByteLength, 4, 'view.buffer.byteLength sh
ould be 4'); |
| 1473 |
| 1474 assert_equals(viewInfos[i].byteOffset, i, 'view.byteOffset should be i'); |
| 1475 assert_equals(viewInfos[i].byteLength, 4 - i, 'view.byteLength should be 4
- i'); |
| 1476 } |
| 1473 }); | 1477 }); |
| 1474 }, 'ReadableStream with byte source: read(view) with Uint32Array, then fill it b
y multiple respond() calls'); | 1478 }, 'ReadableStream with byte source: read(view) with Uint32Array, then fill it b
y multiple respond() calls'); |
| 1475 | 1479 |
| 1476 promise_test(() => { | 1480 promise_test(() => { |
| 1477 let pullCount = 0; | 1481 let pullCount = 0; |
| 1478 | 1482 |
| 1479 let controller; | 1483 let controller; |
| 1484 let byobRequest; |
| 1480 | 1485 |
| 1481 const stream = new ReadableStream({ | 1486 const stream = new ReadableStream({ |
| 1482 start(c) { | 1487 start(c) { |
| 1483 controller = c; | 1488 controller = c; |
| 1484 }, | 1489 }, |
| 1485 pull() { | 1490 pull() { |
| 1486 assert_equals(controller.byobRequest, undefined, 'byobRequest must be unde
fined'); | 1491 byobRequest = controller.byobRequest; |
| 1487 | |
| 1488 if (pullCount > 1) { | |
| 1489 assert_unreached('Too many pull calls'); | |
| 1490 } | |
| 1491 | 1492 |
| 1492 ++pullCount; | 1493 ++pullCount; |
| 1493 }, | 1494 }, |
| 1494 type: 'bytes' | 1495 type: 'bytes' |
| 1495 }); | 1496 }); |
| 1496 | 1497 |
| 1497 const reader = stream.getReader(); | 1498 const reader = stream.getReader(); |
| 1498 | 1499 |
| 1499 const p0 = reader.read().then(result => { | 1500 const p0 = reader.read().then(result => { |
| 1500 assert_equals(pullCount, 1); | 1501 assert_equals(pullCount, 1); |
| (...skipping 17 matching lines...) Expand all Loading... |
| 1518 const p1 = reader.read().then(result => { | 1519 const p1 = reader.read().then(result => { |
| 1519 assert_equals(pullCount, 1); | 1520 assert_equals(pullCount, 1); |
| 1520 | 1521 |
| 1521 assert_equals(result.done, false); | 1522 assert_equals(result.done, false); |
| 1522 | 1523 |
| 1523 const view = result.value; | 1524 const view = result.value; |
| 1524 assert_equals(view.constructor, Uint8Array); | 1525 assert_equals(view.constructor, Uint8Array); |
| 1525 assert_equals(view.buffer.byteLength, 2); | 1526 assert_equals(view.buffer.byteLength, 2); |
| 1526 assert_equals(view.byteOffset, 0); | 1527 assert_equals(view.byteOffset, 0); |
| 1527 assert_equals(view.byteLength, 2); | 1528 assert_equals(view.byteLength, 2); |
| 1529 |
| 1530 assert_equals(byobRequest, undefined, 'byobRequest must be undefined'); |
| 1528 }); | 1531 }); |
| 1529 | 1532 |
| 1530 assert_equals(pullCount, 0, 'No pull should have been made since the startProm
ise has not yet been handled'); | 1533 assert_equals(pullCount, 0, 'No pull should have been made since the startProm
ise has not yet been handled'); |
| 1531 | 1534 |
| 1532 controller.enqueue(new Uint8Array(1)); | 1535 controller.enqueue(new Uint8Array(1)); |
| 1533 | 1536 |
| 1534 assert_equals(pullCount, 0, 'No pull should have been made since the startProm
ise has not yet been handled'); | 1537 assert_equals(pullCount, 0, 'No pull should have been made since the startProm
ise has not yet been handled'); |
| 1535 | 1538 |
| 1536 return Promise.all([p0, p1]); | 1539 return Promise.all([p0, p1]); |
| 1537 }, 'ReadableStream with byte source: read() twice, then enqueue() twice'); | 1540 }, 'ReadableStream with byte source: read() twice, then enqueue() twice'); |
| 1538 | 1541 |
| 1539 promise_test(() => { | 1542 promise_test(t => { |
| 1540 let pullCount = 0; | |
| 1541 | |
| 1542 let controller; | 1543 let controller; |
| 1543 | 1544 |
| 1544 const stream = new ReadableStream({ | 1545 const stream = new ReadableStream({ |
| 1545 start(c) { | 1546 start(c) { |
| 1546 controller = c; | 1547 controller = c; |
| 1547 }, | 1548 }, |
| 1548 pull() { | 1549 pull: t.unreached_func('pull() should not be called'), |
| 1549 assert_not_equals(controller.byobRequest, undefined, 'byobRequest must not
be undefined'); | |
| 1550 | |
| 1551 if (pullCount === 0) { | |
| 1552 const view = controller.byobRequest.view; | |
| 1553 | |
| 1554 assert_equals(view.constructor, Uint8Array); | |
| 1555 assert_equals(view.buffer.byteLength, 16); | |
| 1556 | |
| 1557 assert_equals(view.byteOffset, 0); | |
| 1558 assert_equals(view.byteLength, 16); | |
| 1559 } else { | |
| 1560 assert_unreached('Too many pull calls'); | |
| 1561 } | |
| 1562 | |
| 1563 ++pullCount; | |
| 1564 }, | |
| 1565 type: 'bytes' | 1550 type: 'bytes' |
| 1566 }); | 1551 }); |
| 1567 | 1552 |
| 1568 const reader = stream.getReader({ mode: 'byob' }); | 1553 const reader = stream.getReader({ mode: 'byob' }); |
| 1569 | 1554 |
| 1570 const p0 = reader.read(new Uint8Array(16)).then(result => { | 1555 const p0 = reader.read(new Uint8Array(16)).then(result => { |
| 1571 assert_equals(result.done, true, '1st read: done'); | 1556 assert_equals(result.done, true, '1st read: done'); |
| 1572 | 1557 |
| 1573 const view = result.value; | 1558 const view = result.value; |
| 1574 assert_equals(view.buffer.byteLength, 16, '1st read: buffer.byteLength'); | 1559 assert_equals(view.buffer.byteLength, 16, '1st read: buffer.byteLength'); |
| 1575 assert_equals(view.byteOffset, 0, '1st read: byteOffset'); | 1560 assert_equals(view.byteOffset, 0, '1st read: byteOffset'); |
| 1576 assert_equals(view.byteLength, 0, '1st read: byteLength'); | 1561 assert_equals(view.byteLength, 0, '1st read: byteLength'); |
| 1577 }); | 1562 }); |
| 1578 | 1563 |
| 1579 const p1 = reader.read(new Uint8Array(32)).then(result => { | 1564 const p1 = reader.read(new Uint8Array(32)).then(result => { |
| 1580 assert_equals(result.done, true, '2nd read: done'); | 1565 assert_equals(result.done, true, '2nd read: done'); |
| 1581 | 1566 |
| 1582 const view = result.value; | 1567 const view = result.value; |
| 1583 assert_equals(view.buffer.byteLength, 32, '2nd read: buffer.byteLength'); | 1568 assert_equals(view.buffer.byteLength, 32, '2nd read: buffer.byteLength'); |
| 1584 assert_equals(view.byteOffset, 0, '2nd read: byteOffset'); | 1569 assert_equals(view.byteOffset, 0, '2nd read: byteOffset'); |
| 1585 assert_equals(view.byteLength, 0, '2nd read: byteLength'); | 1570 assert_equals(view.byteLength, 0, '2nd read: byteLength'); |
| 1586 }); | 1571 }); |
| 1587 | 1572 |
| 1588 controller.close(); | 1573 controller.close(); |
| 1589 controller.byobRequest.respond(0); | 1574 controller.byobRequest.respond(0); |
| 1590 | 1575 |
| 1591 return Promise.all([p0, p1]); | 1576 return Promise.all([p0, p1]); |
| 1592 }, 'ReadableStream with byte source: Multiple read(view), close() and respond()'
); | 1577 }, 'ReadableStream with byte source: Multiple read(view), close() and respond()'
); |
| 1593 | 1578 |
| 1594 promise_test(() => { | 1579 promise_test(t => { |
| 1595 let pullCount = 0; | |
| 1596 | |
| 1597 let controller; | 1580 let controller; |
| 1598 | 1581 |
| 1599 const stream = new ReadableStream({ | 1582 const stream = new ReadableStream({ |
| 1600 start(c) { | 1583 start(c) { |
| 1601 controller = c; | 1584 controller = c; |
| 1602 }, | 1585 }, |
| 1603 pull() { | 1586 pull: t.unreached_func('pull() should not be called'), |
| 1604 if (pullCount === 0) { | |
| 1605 assert_not_equals(controller.byobRequest, undefined, 'byobRequest must n
ot be undefined'); | |
| 1606 const view = controller.byobRequest.view; | |
| 1607 | |
| 1608 assert_equals(view.constructor, Uint8Array); | |
| 1609 assert_equals(view.buffer.byteLength, 16); | |
| 1610 | |
| 1611 assert_equals(view.byteOffset, 0); | |
| 1612 assert_equals(view.byteLength, 16); | |
| 1613 } else { | |
| 1614 assert_unreached(); | |
| 1615 } | |
| 1616 | |
| 1617 ++pullCount; | |
| 1618 }, | |
| 1619 type: 'bytes' | 1587 type: 'bytes' |
| 1620 }); | 1588 }); |
| 1621 | 1589 |
| 1622 const reader = stream.getReader({ mode: 'byob' }); | 1590 const reader = stream.getReader({ mode: 'byob' }); |
| 1623 | 1591 |
| 1624 const p0 = reader.read(new Uint8Array(16)).then(result => { | 1592 const p0 = reader.read(new Uint8Array(16)).then(result => { |
| 1625 assert_equals(result.done, false, '1st read: done'); | 1593 assert_equals(result.done, false, '1st read: done'); |
| 1626 | 1594 |
| 1627 const view = result.value; | 1595 const view = result.value; |
| 1628 assert_equals(view.buffer.byteLength, 16, '1st read: buffer.byteLength'); | 1596 assert_equals(view.buffer.byteLength, 16, '1st read: buffer.byteLength'); |
| 1629 assert_equals(view.byteOffset, 0, '1st read: byteOffset'); | 1597 assert_equals(view.byteOffset, 0, '1st read: byteOffset'); |
| 1630 assert_equals(view.byteLength, 16, '1st read: byteLength'); | 1598 assert_equals(view.byteLength, 16, '1st read: byteLength'); |
| 1631 }); | 1599 }); |
| 1632 | 1600 |
| 1633 const p1 = reader.read(new Uint8Array(16)).then(result => { | 1601 const p1 = reader.read(new Uint8Array(16)).then(result => { |
| 1634 assert_equals(result.done, false, '2nd read: done'); | 1602 assert_equals(result.done, false, '2nd read: done'); |
| 1635 | 1603 |
| 1636 const view = result.value; | 1604 const view = result.value; |
| 1637 assert_equals(view.buffer.byteLength, 16, '2nd read: buffer.byteLength'); | 1605 assert_equals(view.buffer.byteLength, 16, '2nd read: buffer.byteLength'); |
| 1638 assert_equals(view.byteOffset, 0, '2nd read: byteOffset'); | 1606 assert_equals(view.byteOffset, 0, '2nd read: byteOffset'); |
| 1639 assert_equals(view.byteLength, 8, '2nd read: byteLength'); | 1607 assert_equals(view.byteLength, 8, '2nd read: byteLength'); |
| 1640 }); | 1608 }); |
| 1641 | 1609 |
| 1642 controller.enqueue(new Uint8Array(24)); | 1610 controller.enqueue(new Uint8Array(24)); |
| 1643 | 1611 |
| 1644 return Promise.all([p0, p1]); | 1612 return Promise.all([p0, p1]); |
| 1645 }, 'ReadableStream with byte source: Multiple read(view), big enqueue()'); | 1613 }, 'ReadableStream with byte source: Multiple read(view), big enqueue()'); |
| 1646 | 1614 |
| 1647 promise_test(() => { | 1615 promise_test(t => { |
| 1648 let controller; | 1616 let controller; |
| 1649 | 1617 |
| 1650 const stream = new ReadableStream({ | 1618 const stream = new ReadableStream({ |
| 1651 start(c) { | 1619 start(c) { |
| 1652 controller = c; | 1620 controller = c; |
| 1653 }, | 1621 }, |
| 1654 pull() { | 1622 pull: t.unreached_func('pull() should not be called'), |
| 1655 assert_unreached('pull must not be called'); | |
| 1656 }, | |
| 1657 type: 'bytes' | 1623 type: 'bytes' |
| 1658 }); | 1624 }); |
| 1659 | 1625 |
| 1660 const reader = stream.getReader({ mode: 'byob' }); | 1626 const reader = stream.getReader({ mode: 'byob' }); |
| 1661 | 1627 |
| 1662 let bytesRead = 0; | 1628 let bytesRead = 0; |
| 1663 | 1629 |
| 1664 function pump() { | 1630 function pump() { |
| 1665 return reader.read(new Uint8Array(7)).then(result => { | 1631 return reader.read(new Uint8Array(7)).then(result => { |
| 1666 if (result.done) { | 1632 if (result.done) { |
| 1667 assert_equals(bytesRead, 1024); | 1633 assert_equals(bytesRead, 1024); |
| 1668 | 1634 return undefined; |
| 1669 return null; | |
| 1670 } | 1635 } |
| 1671 | 1636 |
| 1672 bytesRead += result.value.byteLength; | 1637 bytesRead += result.value.byteLength; |
| 1673 | 1638 |
| 1674 return pump(); | 1639 return pump(); |
| 1675 }).catch(e => { | |
| 1676 assert_unreached(e); | |
| 1677 }); | 1640 }); |
| 1678 } | 1641 } |
| 1679 const promise = pump(); | 1642 const promise = pump(); |
| 1680 | 1643 |
| 1681 controller.enqueue(new Uint8Array(512)); | 1644 controller.enqueue(new Uint8Array(512)); |
| 1682 controller.enqueue(new Uint8Array(512)); | 1645 controller.enqueue(new Uint8Array(512)); |
| 1683 controller.close(); | 1646 controller.close(); |
| 1684 | 1647 |
| 1685 return promise; | 1648 return promise; |
| 1686 }, 'ReadableStream with byte source: Multiple read(view) and multiple enqueue()'
); | 1649 }, 'ReadableStream with byte source: Multiple read(view) and multiple enqueue()'
); |
| 1687 | 1650 |
| 1688 promise_test(t => { | 1651 promise_test(t => { |
| 1652 let byobRequest; |
| 1689 const stream = new ReadableStream({ | 1653 const stream = new ReadableStream({ |
| 1690 pull(controller) { | 1654 pull(controller) { |
| 1691 assert_equals(controller.byobRequest, undefined, 'byobRequest must be unde
fined'); | 1655 byobRequest = controller.byobRequest; |
| 1692 }, | 1656 }, |
| 1693 type: 'bytes' | 1657 type: 'bytes' |
| 1694 }); | 1658 }); |
| 1695 | 1659 |
| 1696 const reader = stream.getReader({ mode: 'byob' }); | 1660 const reader = stream.getReader({ mode: 'byob' }); |
| 1697 | 1661 |
| 1698 return promise_rejects(t, new TypeError(), reader.read(), 'read() must fail'); | 1662 return promise_rejects(t, new TypeError(), reader.read(), 'read() must fail') |
| 1663 .then(() => assert_equals(byobRequest, undefined, 'byobRequest must be und
efined')); |
| 1699 }, 'ReadableStream with byte source: read(view) with passing undefined as view m
ust fail'); | 1664 }, 'ReadableStream with byte source: read(view) with passing undefined as view m
ust fail'); |
| 1700 | 1665 |
| 1701 promise_test(t => { | 1666 promise_test(t => { |
| 1667 let byobRequest; |
| 1702 const stream = new ReadableStream({ | 1668 const stream = new ReadableStream({ |
| 1703 pull(controller) { | 1669 pull(controller) { |
| 1704 assert_equals(controller.byobRequest, undefined, 'byobRequest must be unde
fined'); | 1670 byobRequest = controller.byobRequest; |
| 1705 }, | 1671 }, |
| 1706 type: 'bytes' | 1672 type: 'bytes' |
| 1707 }); | 1673 }); |
| 1708 | 1674 |
| 1709 const reader = stream.getReader({ mode: 'byob' }); | 1675 const reader = stream.getReader({ mode: 'byob' }); |
| 1710 | 1676 |
| 1711 return promise_rejects(t, new TypeError(), reader.read(new Uint8Array(0)), 're
ad(view) must fail'); | 1677 return promise_rejects(t, new TypeError(), reader.read(new Uint8Array(0)), 're
ad(view) must fail') |
| 1678 .then(() => assert_equals(byobRequest, undefined, 'byobRequest must be und
efined')); |
| 1712 }, 'ReadableStream with byte source: read(view) with zero-length view must fail'
); | 1679 }, 'ReadableStream with byte source: read(view) with zero-length view must fail'
); |
| 1713 | 1680 |
| 1714 promise_test(t => { | 1681 promise_test(t => { |
| 1715 const stream = new ReadableStream({ | 1682 const stream = new ReadableStream({ |
| 1716 type: 'bytes' | 1683 type: 'bytes' |
| 1717 }); | 1684 }); |
| 1718 | 1685 |
| 1719 const reader = stream.getReader({ mode: 'byob' }); | 1686 const reader = stream.getReader({ mode: 'byob' }); |
| 1720 | 1687 |
| 1721 return promise_rejects(t, new TypeError(), reader.read({}), 'read(view) must f
ail'); | 1688 return promise_rejects(t, new TypeError(), reader.read({}), 'read(view) must f
ail'); |
| 1722 }, 'ReadableStream with byte source: read(view) with passing an empty object as
view must fail'); | 1689 }, 'ReadableStream with byte source: read(view) with passing an empty object as
view must fail'); |
| 1723 | 1690 |
| 1724 promise_test(t => { | 1691 promise_test(t => { |
| 1725 const stream = new ReadableStream({ | 1692 const stream = new ReadableStream({ |
| 1726 type: 'bytes' | 1693 type: 'bytes' |
| 1727 }); | 1694 }); |
| 1728 | 1695 |
| 1729 const reader = stream.getReader({ mode: 'byob' }); | 1696 const reader = stream.getReader({ mode: 'byob' }); |
| 1730 | 1697 |
| 1731 return promise_rejects(t, new TypeError(), | 1698 return promise_rejects(t, new TypeError(), |
| 1732 reader.read({ buffer: new ArrayBuffer(10), byteOffset:
0, byteLength: 10 }), | 1699 reader.read({ buffer: new ArrayBuffer(10), byteOffset:
0, byteLength: 10 }), |
| 1733 'read(view) must fail'); | 1700 'read(view) must fail'); |
| 1734 }, 'ReadableStream with byte source: Even read(view) with passing ArrayBufferVie
w like object as view must fail'); | 1701 }, 'ReadableStream with byte source: Even read(view) with passing ArrayBufferVie
w like object as view must fail'); |
| 1735 | 1702 |
| 1736 promise_test(t => { | 1703 promise_test(t => { |
| 1737 const stream = new ReadableStream({ | 1704 const stream = new ReadableStream({ |
| 1738 start(c) { | 1705 start(c) { |
| 1739 c.error(error1); | 1706 c.error(error1); |
| 1740 }, | 1707 }, |
| 1741 pull() { | 1708 pull: t.unreached_func('pull() should not be called'), |
| 1742 assert_unreached('pull must not be called'); | |
| 1743 }, | |
| 1744 type: 'bytes' | 1709 type: 'bytes' |
| 1745 }); | 1710 }); |
| 1746 | 1711 |
| 1747 const reader = stream.getReader(); | 1712 const reader = stream.getReader(); |
| 1748 | 1713 |
| 1749 return promise_rejects(t, error1, reader.read(), 'read() must fail'); | 1714 return promise_rejects(t, error1, reader.read(), 'read() must fail'); |
| 1750 }, 'ReadableStream with byte source: read() on an errored stream'); | 1715 }, 'ReadableStream with byte source: read() on an errored stream'); |
| 1751 | 1716 |
| 1752 promise_test(t => { | 1717 promise_test(t => { |
| 1753 let controller; | 1718 let controller; |
| (...skipping 12 matching lines...) Expand all Loading... |
| 1766 controller.error(error1); | 1731 controller.error(error1); |
| 1767 | 1732 |
| 1768 return promise; | 1733 return promise; |
| 1769 }, 'ReadableStream with byte source: read(), then error()'); | 1734 }, 'ReadableStream with byte source: read(), then error()'); |
| 1770 | 1735 |
| 1771 promise_test(t => { | 1736 promise_test(t => { |
| 1772 const stream = new ReadableStream({ | 1737 const stream = new ReadableStream({ |
| 1773 start(c) { | 1738 start(c) { |
| 1774 c.error(error1); | 1739 c.error(error1); |
| 1775 }, | 1740 }, |
| 1776 pull() { | 1741 pull: t.unreached_func('pull() should not be called'), |
| 1777 assert_unreached('pull must not be called'); | |
| 1778 }, | |
| 1779 type: 'bytes' | 1742 type: 'bytes' |
| 1780 }); | 1743 }); |
| 1781 | 1744 |
| 1782 const reader = stream.getReader({ mode: 'byob' }); | 1745 const reader = stream.getReader({ mode: 'byob' }); |
| 1783 | 1746 |
| 1784 return promise_rejects(t, error1, reader.read(new Uint8Array(1)), 'read() must
fail'); | 1747 return promise_rejects(t, error1, reader.read(new Uint8Array(1)), 'read() must
fail'); |
| 1785 }, 'ReadableStream with byte source: read(view) on an errored stream'); | 1748 }, 'ReadableStream with byte source: read(view) on an errored stream'); |
| 1786 | 1749 |
| 1787 promise_test(t => { | 1750 promise_test(t => { |
| 1788 let controller; | 1751 let controller; |
| 1789 | 1752 |
| 1790 const stream = new ReadableStream({ | 1753 const stream = new ReadableStream({ |
| 1791 start(c) { | 1754 start(c) { |
| 1792 controller = c; | 1755 controller = c; |
| 1793 }, | 1756 }, |
| 1794 type: 'bytes' | 1757 type: 'bytes' |
| 1795 }); | 1758 }); |
| 1796 | 1759 |
| 1797 const reader = stream.getReader({ mode: 'byob' }); | 1760 const reader = stream.getReader({ mode: 'byob' }); |
| 1798 | 1761 |
| 1799 const promise = promise_rejects(t, error1, reader.read(new Uint8Array(1)), 're
ad() must fail'); | 1762 const promise = promise_rejects(t, error1, reader.read(new Uint8Array(1)), 're
ad() must fail'); |
| 1800 | 1763 |
| 1801 controller.error(error1); | 1764 controller.error(error1); |
| 1802 | 1765 |
| 1803 return promise; | 1766 return promise; |
| 1804 }, 'ReadableStream with byte source: read(view), then error()'); | 1767 }, 'ReadableStream with byte source: read(view), then error()'); |
| 1805 | 1768 |
| 1806 promise_test(t => { | 1769 promise_test(t => { |
| 1807 let controller; | 1770 let controller; |
| 1771 let byobRequest; |
| 1808 | 1772 |
| 1809 const testError = new TypeError('foo'); | 1773 const testError = new TypeError('foo'); |
| 1810 | 1774 |
| 1811 const stream = new ReadableStream({ | 1775 const stream = new ReadableStream({ |
| 1812 start(c) { | 1776 start(c) { |
| 1813 controller = c; | 1777 controller = c; |
| 1814 }, | 1778 }, |
| 1815 pull() { | 1779 pull() { |
| 1816 assert_equals(controller.byobRequest, undefined, 'byobRequest must be unde
fined'); | 1780 byobRequest = controller.byobRequest; |
| 1817 throw testError; | 1781 throw testError; |
| 1818 }, | 1782 }, |
| 1819 type: 'bytes' | 1783 type: 'bytes' |
| 1820 }); | 1784 }); |
| 1821 | 1785 |
| 1822 const reader = stream.getReader(); | 1786 const reader = stream.getReader(); |
| 1823 | 1787 |
| 1824 const promise = promise_rejects(t, testError, reader.read(), 'read() must fail
'); | 1788 const promise = promise_rejects(t, testError, reader.read(), 'read() must fail
'); |
| 1825 return promise_rejects(t, testError, promise.then(() => reader.closed)); | 1789 return promise_rejects(t, testError, promise.then(() => reader.closed)) |
| 1790 .then(() => assert_equals(byobRequest, undefined, 'byobRequest must be und
efined')); |
| 1826 }, 'ReadableStream with byte source: Throwing in pull function must error the st
ream'); | 1791 }, 'ReadableStream with byte source: Throwing in pull function must error the st
ream'); |
| 1827 | 1792 |
| 1828 promise_test(t => { | 1793 promise_test(t => { |
| 1829 let controller; | 1794 let byobRequest; |
| 1830 | 1795 |
| 1831 const stream = new ReadableStream({ | 1796 const stream = new ReadableStream({ |
| 1832 start(c) { | 1797 pull(controller) { |
| 1833 controller = c; | 1798 byobRequest = controller.byobRequest; |
| 1834 }, | |
| 1835 pull() { | |
| 1836 assert_equals(controller.byobRequest, undefined, 'byobRequest must be unde
fined'); | |
| 1837 controller.error(error1); | 1799 controller.error(error1); |
| 1838 throw new TypeError('foo'); | 1800 throw new TypeError('foo'); |
| 1839 }, | 1801 }, |
| 1840 type: 'bytes' | 1802 type: 'bytes' |
| 1841 }); | 1803 }); |
| 1842 | 1804 |
| 1843 const reader = stream.getReader(); | 1805 const reader = stream.getReader(); |
| 1844 | 1806 |
| 1845 return promise_rejects(t, error1, reader.read(), 'read() must fail').then(() =
> { | 1807 return promise_rejects(t, error1, reader.read(), 'read() must fail') |
| 1846 return promise_rejects(t, error1, reader.closed, 'closed must fail'); | 1808 .then(() => promise_rejects(t, error1, reader.closed, 'closed must fail')) |
| 1847 }); | 1809 .then(() => assert_equals(byobRequest, undefined, 'byobRequest must be und
efined')); |
| 1848 }, 'ReadableStream with byte source: Throwing in pull in response to read() must
be ignored if the stream is ' + | 1810 }, 'ReadableStream with byte source: Throwing in pull in response to read() must
be ignored if the stream is ' + |
| 1849 'errored in it'); | 1811 'errored in it'); |
| 1850 | 1812 |
| 1851 promise_test(t => { | 1813 promise_test(t => { |
| 1852 let controller; | 1814 let byobRequest; |
| 1853 | 1815 |
| 1854 const testError = new TypeError('foo'); | 1816 const testError = new TypeError('foo'); |
| 1855 | 1817 |
| 1856 const stream = new ReadableStream({ | 1818 const stream = new ReadableStream({ |
| 1857 start(c) { | 1819 pull(controller) { |
| 1858 controller = c; | 1820 byobRequest = controller.byobRequest; |
| 1859 }, | |
| 1860 pull() { | |
| 1861 assert_not_equals(controller.byobRequest, undefined, 'byobRequest must not
be undefined'); | |
| 1862 throw testError; | 1821 throw testError; |
| 1863 }, | 1822 }, |
| 1864 type: 'bytes' | 1823 type: 'bytes' |
| 1865 }); | 1824 }); |
| 1866 | 1825 |
| 1867 const reader = stream.getReader({ mode: 'byob' }); | 1826 const reader = stream.getReader({ mode: 'byob' }); |
| 1868 | 1827 |
| 1869 const promise = promise_rejects(t, testError, reader.read(new Uint8Array(1)),
'read(view) must fail'); | 1828 return promise_rejects(t, testError, reader.read(new Uint8Array(1)), 'read(vie
w) must fail') |
| 1870 return promise_rejects(t, testError, promise.then(() => reader.closed)); | 1829 .then(() => promise_rejects(t, testError, reader.closed, 'reader.closed mu
st reject')) |
| 1830 .then(() => assert_not_equals(byobRequest, undefined, 'byobRequest must no
t be undefined')); |
| 1871 }, 'ReadableStream with byte source: Throwing in pull in response to read(view)
function must error the stream'); | 1831 }, 'ReadableStream with byte source: Throwing in pull in response to read(view)
function must error the stream'); |
| 1872 | 1832 |
| 1873 promise_test(t => { | 1833 promise_test(t => { |
| 1874 let controller; | 1834 let byobRequest; |
| 1875 | 1835 |
| 1876 const stream = new ReadableStream({ | 1836 const stream = new ReadableStream({ |
| 1877 start(c) { | 1837 pull(controller) { |
| 1878 controller = c; | 1838 byobRequest = controller.byobRequest; |
| 1879 }, | |
| 1880 pull() { | |
| 1881 assert_not_equals(controller.byobRequest, undefined, 'byobRequest must not
be undefined'); | |
| 1882 controller.error(error1); | 1839 controller.error(error1); |
| 1883 throw new TypeError('foo'); | 1840 throw new TypeError('foo'); |
| 1884 }, | 1841 }, |
| 1885 type: 'bytes' | 1842 type: 'bytes' |
| 1886 }); | 1843 }); |
| 1887 | 1844 |
| 1888 const reader = stream.getReader({ mode: 'byob' }); | 1845 const reader = stream.getReader({ mode: 'byob' }); |
| 1889 | 1846 |
| 1890 return promise_rejects(t, error1, reader.read(new Uint8Array(1)), 'read(view)
must fail').then(() => { | 1847 return promise_rejects(t, error1, reader.read(new Uint8Array(1)), 'read(view)
must fail') |
| 1891 return promise_rejects(t, error1, reader.closed, 'closed must fail'); | 1848 .then(() => promise_rejects(t, error1, reader.closed, 'closed must fail')) |
| 1892 }); | 1849 .then(() => assert_not_equals(byobRequest, undefined, 'byobRequest must no
t be undefined')); |
| 1893 }, 'ReadableStream with byte source: Throwing in pull in response to read(view)
must be ignored if the stream is ' + | 1850 }, 'ReadableStream with byte source: Throwing in pull in response to read(view)
must be ignored if the stream is ' + |
| 1894 'errored in it'); | 1851 'errored in it'); |
| 1895 | 1852 |
| 1896 | |
| 1897 test(() => { | 1853 test(() => { |
| 1898 const ReadableStreamBYOBReader = new ReadableStream({ type: 'bytes' }).getRead
er({ mode: 'byob' }).constructor; | 1854 const ReadableStreamBYOBReader = new ReadableStream({ type: 'bytes' }).getRead
er({ mode: 'byob' }).constructor; |
| 1899 const stream = new ReadableStream({ type: 'bytes' }); | 1855 const stream = new ReadableStream({ type: 'bytes' }); |
| 1900 new ReadableStreamBYOBReader(stream); | 1856 new ReadableStreamBYOBReader(stream); |
| 1901 }, 'ReadableStreamBYOBReader can be constructed directly'); | 1857 }, 'ReadableStreamBYOBReader can be constructed directly'); |
| 1902 | 1858 |
| 1903 test(() => { | 1859 test(() => { |
| 1904 const ReadableStreamBYOBReader = new ReadableStream({ type: 'bytes' }).getRead
er({ mode: 'byob' }).constructor; | 1860 const ReadableStreamBYOBReader = new ReadableStream({ type: 'bytes' }).getRead
er({ mode: 'byob' }).constructor; |
| 1905 assert_throws(new TypeError(), () => new ReadableStreamBYOBReader({}), 'constr
uctor must throw'); | 1861 assert_throws(new TypeError(), () => new ReadableStreamBYOBReader({}), 'constr
uctor must throw'); |
| 1906 }, 'ReadableStreamBYOBReader constructor requires a ReadableStream argument'); | 1862 }, 'ReadableStreamBYOBReader constructor requires a ReadableStream argument'); |
| 1907 | 1863 |
| 1908 test(() => { | 1864 test(() => { |
| 1909 const ReadableStreamBYOBReader = new ReadableStream({ type: 'bytes' }).getRead
er({ mode: 'byob' }).constructor; | 1865 const ReadableStreamBYOBReader = new ReadableStream({ type: 'bytes' }).getRead
er({ mode: 'byob' }).constructor; |
| 1910 const stream = new ReadableStream({ type: 'bytes' }); | 1866 const stream = new ReadableStream({ type: 'bytes' }); |
| 1911 stream.getReader(); | 1867 stream.getReader(); |
| 1912 assert_throws(new TypeError(), () => new ReadableStreamBYOBReader(stream), 'co
nstructor must throw'); | 1868 assert_throws(new TypeError(), () => new ReadableStreamBYOBReader(stream), 'co
nstructor must throw'); |
| 1913 }, 'ReadableStreamBYOBReader constructor requires an unlocked ReadableStream'); | 1869 }, 'ReadableStreamBYOBReader constructor requires an unlocked ReadableStream'); |
| 1914 | 1870 |
| 1915 test(() => { | 1871 test(() => { |
| 1916 const ReadableStreamBYOBReader = new ReadableStream({ type: 'bytes' }).getRead
er({ mode: 'byob' }).constructor; | 1872 const ReadableStreamBYOBReader = new ReadableStream({ type: 'bytes' }).getRead
er({ mode: 'byob' }).constructor; |
| 1917 const stream = new ReadableStream(); | 1873 const stream = new ReadableStream(); |
| 1918 assert_throws(new TypeError(), () => new ReadableStreamBYOBReader(stream), 'co
nstructor must throw'); | 1874 assert_throws(new TypeError(), () => new ReadableStreamBYOBReader(stream), 'co
nstructor must throw'); |
| 1919 }, 'ReadableStreamBYOBReader constructor requires a ReadableStream with type "by
tes"'); | 1875 }, 'ReadableStreamBYOBReader constructor requires a ReadableStream with type "by
tes"'); |
| 1920 | 1876 |
| 1921 done(); | 1877 done(); |
| OLD | NEW |