• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1// META: global=worker
2
3'use strict';
4
5// The browser is assumed to use the same implementation as for TextDecoder, so
6// this file don't replicate the exhaustive checks it has. It is just a smoke
7// test that non-UTF-8 encodings work at all.
8
9const encodings = [
10  {
11    name: 'UTF-16BE',
12    value: [108, 52],
13    expected: "\u{6c34}",
14    invalid: [0xD8, 0x00]
15  },
16  {
17    name: 'UTF-16LE',
18    value: [52, 108],
19    expected: "\u{6c34}",
20    invalid: [0x00, 0xD8]
21  },
22  {
23    name: 'Shift_JIS',
24    value: [144, 133],
25    expected: "\u{6c34}",
26    invalid: [255]
27  },
28  {
29    name: 'ISO-2022-JP',
30    value: [65, 66, 67, 0x1B, 65, 66, 67],
31    expected: "ABC\u{fffd}ABC",
32    invalid: [0x0E]
33  },
34  {
35    name: 'ISO-8859-14',
36    value: [100, 240, 114],
37    expected: "d\u{0175}r",
38    invalid: undefined  // all bytes are treated as valid
39  }
40];
41
42for (const encoding of encodings) {
43  promise_test(async () => {
44    const stream = new TextDecoderStream(encoding.name);
45    const reader = stream.readable.getReader();
46    const writer = stream.writable.getWriter();
47    const writePromise = writer.write(new Uint8Array(encoding.value));
48    const {value, done} = await reader.read();
49    assert_false(done, 'readable should not be closed');
50    assert_equals(value, encoding.expected, 'chunk should match expected');
51    await writePromise;
52  }, `TextDecoderStream should be able to decode ${encoding.name}`);
53
54  if (!encoding.invalid)
55    continue;
56
57  promise_test(async t => {
58    const stream = new TextDecoderStream(encoding.name);
59    const reader = stream.readable.getReader();
60    const writer = stream.writable.getWriter();
61    const writePromise = writer.write(new Uint8Array(encoding.invalid));
62    const closePromise = writer.close();
63    const {value, done} = await reader.read();
64    assert_false(done, 'readable should not be closed');
65    assert_equals(value, '\u{FFFD}', 'output should be replacement character');
66    await Promise.all([writePromise, closePromise]);
67  }, `TextDecoderStream should be able to decode invalid sequences in ` +
68     `${encoding.name}`);
69
70  promise_test(async t => {
71    const stream = new TextDecoderStream(encoding.name, {fatal: true});
72    const reader = stream.readable.getReader();
73    const writer = stream.writable.getWriter();
74    const writePromise = writer.write(new Uint8Array(encoding.invalid));
75    const closePromise = writer.close();
76    await promise_rejects(t, new TypeError(), reader.read(),
77                          'readable should be errored');
78    await promise_rejects(t, new TypeError(),
79                          Promise.all([writePromise, closePromise]),
80                          'writable should be errored');
81  }, `TextDecoderStream should be able to reject invalid sequences in ` +
82     `${encoding.name}`);
83}
84