// META: global=window,worker // META: script=resources/readable-stream-from-array.js // META: script=resources/readable-stream-to-array.js const cases = [ {encoding: 'utf-8', bytes: [0xEF, 0xBB, 0xBF, 0x61, 0x62, 0x63]}, {encoding: 'utf-16le', bytes: [0xFF, 0xFE, 0x61, 0x00, 0x62, 0x00, 0x63, 0x00]}, {encoding: 'utf-16be', bytes: [0xFE, 0xFF, 0x00, 0x61, 0x00, 0x62, 0x00, 0x63]} ]; const BOM = '\uFEFF'; // |inputChunks| is an array of chunks, each represented by an array of // integers. |ignoreBOM| is true or false. The result value is the output of the // pipe, concatenated into a single string. async function pipeAndAssemble(inputChunks, encoding, ignoreBOM) { const chunksAsUint8 = inputChunks.map(values => new Uint8Array(values)); const readable = readableStreamFromArray(chunksAsUint8); const outputArray = await readableStreamToArray(readable.pipeThrough( new TextDecoderStream(encoding, {ignoreBOM}))); return outputArray.join(''); } for (const testCase of cases) { for (let splitPoint = 0; splitPoint < 4; ++splitPoint) { promise_test(async () => { const inputChunks = [testCase.bytes.slice(0, splitPoint), testCase.bytes.slice(splitPoint)]; const withIgnoreBOM = await pipeAndAssemble(inputChunks, testCase.encoding, true); assert_equals(withIgnoreBOM, BOM + 'abc', 'BOM should be preserved'); const withoutIgnoreBOM = await pipeAndAssemble(inputChunks, testCase.encoding, false); assert_equals(withoutIgnoreBOM, 'abc', 'BOM should be stripped') }, `ignoreBOM should work for encoding ${testCase.encoding}, split at ` + `character ${splitPoint}`); } }