1// META: title=Blob Stream 2// META: script=../support/Blob.js 3// META: script=../../streams/resources/test-utils.js 4'use strict'; 5 6// Helper function that triggers garbage collection while reading a chunk 7// if perform_gc is true. 8async function read_and_gc(reader, perform_gc) { 9 const read_promise = reader.read(); 10 if (perform_gc) 11 garbageCollect(); 12 return read_promise; 13} 14 15// Takes in a ReadableStream and reads from it until it is done, returning 16// an array that contains the results of each read operation. If perform_gc 17// is true, garbage collection is triggered while reading every chunk. 18async function read_all_chunks(stream, perform_gc = false) { 19 assert_true(stream instanceof ReadableStream); 20 assert_true('getReader' in stream); 21 const reader = stream.getReader(); 22 23 assert_true('read' in reader); 24 let read_value = await read_and_gc(reader, perform_gc); 25 26 let out = []; 27 let i = 0; 28 while (!read_value.done) { 29 for (let val of read_value.value) { 30 out[i++] = val; 31 } 32 read_value = await read_and_gc(reader, perform_gc); 33 } 34 return out; 35} 36 37promise_test(async () => { 38 const blob = new Blob(["PASS"]); 39 const stream = blob.stream(); 40 const chunks = await read_all_chunks(stream); 41 for (let [index, value] of chunks.entries()) { 42 assert_equals(value, "PASS".charCodeAt(index)); 43 } 44}, "Blob.stream()") 45 46promise_test(async () => { 47 const blob = new Blob(); 48 const stream = blob.stream(); 49 const chunks = await read_all_chunks(stream); 50 assert_array_equals(chunks, []); 51}, "Blob.stream() empty Blob") 52 53promise_test(async () => { 54 const input_arr = [8, 241, 48, 123, 151]; 55 const typed_arr = new Uint8Array(input_arr); 56 const blob = new Blob([typed_arr]); 57 const stream = blob.stream(); 58 const chunks = await read_all_chunks(stream); 59 assert_array_equals(chunks, input_arr); 60}, "Blob.stream() non-unicode input") 61 62promise_test(async() => { 63 const input_arr = [8, 241, 48, 123, 151]; 64 const typed_arr = new Uint8Array(input_arr); 65 let blob = new Blob([typed_arr]); 66 const stream = blob.stream(); 67 blob = null; 68 garbageCollect(); 69 const chunks = await read_all_chunks(stream, /*perform_gc=*/true); 70 assert_array_equals(chunks, input_arr); 71}, "Blob.stream() garbage collection of blob shouldn't break stream" + 72 "consumption") 73