Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(229)

Side by Side Diff: third_party/WebKit/LayoutTests/external/wpt/streams/readable-byte-streams/general.js

Issue 2697453005: Import wpt@758b3b4cfa805067f36121333ba031e583d3a62c (Closed)
Patch Set: Add -expected.txt files. Created 3 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
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
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
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
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
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
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();
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698