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