blob: 7f22d8bb330d3cf5dbb66c4342b868025f4d4e30 [file] [edit]
// META: title=Blob textStream
// META: global=window,worker
// META: script=../support/Blob.js
'use strict';
async function readAllChunks(stream) {
const reader = stream.getReader();
const chunks = [];
while (true) {
const {done, value} = await reader.read();
if (done) {
break;
}
chunks.push(value);
}
return chunks;
}
test(() => {
assert_true('textStream' in Blob.prototype, "textStream exists on Blob.prototype");
assert_equals(typeof Blob.prototype.textStream, "function", "Blob.prototype.textStream is a function");
}, "textStream method existence");
promise_test(async () => {
const blob = new Blob(["hello world"]);
const stream = blob.textStream();
assert_true(stream instanceof ReadableStream, "textStream() returns a ReadableStream");
const chunks = await readAllChunks(stream);
assert_greater_than(chunks.length, 0);
for (const chunk of chunks) {
assert_equals(typeof chunk, "string", "each chunk should be a string");
}
assert_equals(chunks.join(""), "hello world", "concatenated chunks match the blob content");
}, "Blob.textStream() basic functionality");
promise_test(async () => {
const blob = new Blob();
const stream = blob.textStream();
assert_true(stream instanceof ReadableStream);
const chunks = await readAllChunks(stream);
assert_equals(chunks.length, 0, "no chunks should be read from empty blob textStream");
}, "Blob.textStream() with empty blob");
promise_test(async () => {
const blob = new Blob(["hello ", "world"]);
const stream = blob.textStream();
const chunks = await readAllChunks(stream);
assert_equals(chunks.join(""), "hello world");
}, "Blob.textStream() with multi-part blob");
promise_test(async () => {
const buffer = new Uint8Array([0x68, 0x00, 0x65, 0x00, 0x6c, 0x00, 0x6c, 0x00, 0x6f, 0x00]); // "hello" in UTF-16LE
const blob = new Blob([buffer], {
type: "text/plain; charset=utf-16le"
});
const stream = blob.textStream();
const chunks = await readAllChunks(stream);
assert_equals(chunks.join(""), "h\0e\0l\0l\0o\0", "ignores charset=utf-16le type parameter");
}, "Blob.textStream() ignores type charset (UTF-16LE)");
promise_test(async () => {
const blob = new Blob([new TextEncoder().encode("hello")], {
type: "text/plain; charset=invalid-charset"
});
const stream = blob.textStream();
const chunks = await readAllChunks(stream);
assert_equals(chunks.join(""), "hello", "ignores invalid-charset type parameter and decodes as UTF-8");
}, "Blob.textStream() ignores invalid type charset (invalid-charset)");
promise_test(async () => {
const blob = new Blob([new TextEncoder().encode("é")], {
type: "text/plain; charset=iso-8859-1"
});
const stream = blob.textStream();
const chunks = await readAllChunks(stream);
assert_equals(chunks.join(""), "é", "ignores charset=iso-8859-1 type parameter and decodes as UTF-8");
}, "Blob.textStream() ignores type charset (iso-8859-1)");
promise_test(async () => {
const blob = new Blob(["hello"]);
const stream1 = blob.textStream();
const stream2 = blob.textStream();
assert_not_equals(stream1, stream2, "multiple calls return new streams");
const chunks1 = await readAllChunks(stream1);
const chunks2 = await readAllChunks(stream2);
assert_equals(chunks1.join(""), "hello");
assert_equals(chunks2.join(""), "hello");
}, "Blob.textStream() can be called multiple times");