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 |