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

Side by Side Diff: LayoutTests/http/tests/fetch/script-tests/response.js

Issue 1053503002: [Fetch] Response.clone should tee the body stream. (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Created 5 years, 8 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 if (self.importScripts) { 1 if (self.importScripts) {
2 importScripts('../resources/fetch-test-helpers.js'); 2 importScripts('../resources/fetch-test-helpers.js');
3 } 3 }
4 4
5 function size(headers) { 5 function size(headers) {
6 var count = 0; 6 var count = 0;
7 for (var header of headers) { 7 for (var header of headers) {
8 ++count; 8 ++count;
9 } 9 }
10 return count; 10 return count;
11 } 11 }
12 12
13 function consume(reader) { 13 function consume(reader) {
14 var chunks = []; 14 var chunks = [];
15 function rec(reader) { 15 function rec(reader) {
16 return reader.read().then(function(r) { 16 return reader.read().then(function(r) {
17 if (r.done) { 17 if (r.done) {
18 return chunks; 18 return chunks;
19 } 19 }
20 chunks.push(r.value); 20 chunks.push(r.value);
21 return rec(reader); 21 return rec(reader);
22 }); 22 });
23 } 23 }
24 return rec(reader); 24 return rec(reader);
25 } 25 }
26 26
27 function flatten(chunks) { 27 function decode(chunks) {
28 var size = 0; 28 var decoder = new TextDecoder();
29 var result = '';
29 for (var chunk of chunks) { 30 for (var chunk of chunks) {
30 size += chunk.byteLength; 31 result += decoder.decode(chunk, {stream: true});
31 } 32 }
32 var buffer = new Uint8Array(size); 33 result += decoder.decode(new Uint8Array(0));
33 var current = 0; 34 return result;
34 for (var chunk of chunks) {
35 buffer.set(chunk, 0);
36 }
37 return buffer;
38 } 35 }
39 36
40 test(function() { 37 test(function() {
41 var response = new Response(new Blob()); 38 var response = new Response(new Blob());
42 assert_equals(response.type, 'default', 39 assert_equals(response.type, 'default',
43 'Default Response.type should be \'default\''); 40 'Default Response.type should be \'default\'');
44 assert_equals(response.url, '', 'Response.url should be the empty string'); 41 assert_equals(response.url, '', 'Response.url should be the empty string');
45 assert_equals(response.status, 200, 42 assert_equals(response.status, 200,
46 'Default Response.status should be 200'); 43 'Default Response.status should be 200');
47 assert_true(response.ok, 'Default Response.ok must be true'); 44 assert_true(response.ok, 'Default Response.ok must be true');
(...skipping 241 matching lines...) Expand 10 before | Expand all | Expand 10 after
289 new Response(new Blob(), {statusText: text}); 286 new Response(new Blob(), {statusText: text});
290 }, 287 },
291 'new Response with invalid statusText (' + text + 288 'new Response with invalid statusText (' + text +
292 ') must throw'); 289 ') must throw');
293 }); 290 });
294 }, 'Response throw error test'); 291 }, 'Response throw error test');
295 292
296 promise_test(function(t) { 293 promise_test(function(t) {
297 var res = new Response('hello'); 294 var res = new Response('hello');
298 return consume(res.body.getReader()).then(function(chunks) { 295 return consume(res.body.getReader()).then(function(chunks) {
299 return flatten(chunks); 296 return decode(chunks);
300 }).then(function(view) { 297 }).then(function(text) {
301 assert_equals(new TextDecoder().decode(view), 'hello'); 298 assert_equals(text, 'hello');
302 return res.body.getReader().read(); 299 return res.body.getReader().read();
303 }).then(function(r) { 300 }).then(function(r) {
304 assert_true(r.done); 301 assert_true(r.done);
305 return res.text(); 302 return res.text();
306 }).then(function(r) { 303 }).then(function(r) {
307 assert_equals(r, ''); 304 assert_equals(r, '');
308 }); 305 });
309 }, 'Read Response body via stream'); 306 }, 'Read Response body via stream');
310 307
311 promise_test(function(t) { 308 promise_test(function(t) {
(...skipping 30 matching lines...) Expand all
342 }).then(function(buffer) { 339 }).then(function(buffer) {
343 assert_equals(buffer.byteLength + head.byteLength, size); 340 assert_equals(buffer.byteLength + head.byteLength, size);
344 return res.body.getReader().read(); 341 return res.body.getReader().read();
345 }).then(function(r) { 342 }).then(function(r) {
346 assert_true(r.done); 343 assert_true(r.done);
347 }); 344 });
348 }, 'Partial read on Response'); 345 }, 'Partial read on Response');
349 346
350 promise_test(function(t) { 347 promise_test(function(t) {
351 var res = new Response('hello'); 348 var res = new Response('hello');
349 var body = res.body;
352 var clone = res.clone(); 350 var clone = res.clone();
351 assert_not_equals(res.body, body);
352 assert_not_equals(res.body, clone.body);
353 assert_not_equals(body, clone.body);
354 assert_throws({name: 'TypeError'}, function() { body.getReader(); });
353 return Promise.all([res.text(), clone.text()]).then(function(r) { 355 return Promise.all([res.text(), clone.text()]).then(function(r) {
354 assert_equals(r[0], 'hello'); 356 assert_equals(r[0], 'hello');
355 assert_equals(r[1], 'hello'); 357 assert_equals(r[1], 'hello');
356 }); 358 });
357 }, 'Clone on Response'); 359 }, 'Clone on Response (text)');
358 360
359 promise_test(function(t) { 361 promise_test(function(t) {
360 var res = new Response('hello'); 362 var res = new Response('hello');
363 var body = res.body;
364 var clone = res.clone();
365 assert_not_equals(res.body, body);
366 assert_not_equals(res.body, clone.body);
367 assert_not_equals(body, clone.body);
368 assert_throws({name: 'TypeError'}, function() { body.getReader(); });
369 var reader1 = res.body.getReader();
370 var reader2 = clone.body.getReader();
371 return Promise.all([consume(reader1), consume(reader2)]).then(function(r) {
372 assert_equals(decode(r[0]), 'hello');
373 assert_equals(decode(r[1]), 'hello');
374 });
375 }, 'Clone on Response (manual read)');
376
377 promise_test(function(t) {
378 var res = new Response('hello');
361 var clone = res.clone(); 379 var clone = res.clone();
362 res.body.cancel(); 380 res.body.cancel();
363 return Promise.all([res.text(), clone.text()]).then(function(r) { 381 return Promise.all([res.text(), clone.text()]).then(function(r) {
364 assert_equals(r[0], ''); 382 assert_equals(r[0], '');
365 assert_equals(r[1], 'hello'); 383 assert_equals(r[1], 'hello');
366 }); 384 });
367 }, 'Clone and Cancel on Response'); 385 }, 'Clone and Cancel on Response');
368 386
369 promise_test(function(t) { 387 promise_test(function(t) {
370 var res = new Response('hello'); 388 var res = new Response('hello');
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after
469 res.body.cancel(); 487 res.body.cancel();
470 res = res.clone(); 488 res = res.clone();
471 return res.blob() 489 return res.blob()
472 .then(function(blob) { 490 .then(function(blob) {
473 assert_equals(blob.type, 'text/html'); 491 assert_equals(blob.type, 'text/html');
474 assert_equals(res.headers.get('Content-Type'), 'Text/Html'); 492 assert_equals(res.headers.get('Content-Type'), 'Text/Html');
475 }); 493 });
476 }, 'Extract a MIME type (3)'); 494 }, 'Extract a MIME type (3)');
477 495
478 done(); 496 done();
OLDNEW
« no previous file with comments | « LayoutTests/http/tests/fetch/script-tests/request.js ('k') | LayoutTests/http/tests/fetch/script-tests/stream-reader.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698