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