1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
|
// META: global=window,worker
'use strict';
const badChunks = [
{
name: 'undefined',
value: undefined
},
{
name: 'null',
value: null
},
{
name: 'numeric',
value: 3.14
},
{
name: 'object, not BufferSource',
value: {}
},
{
name: 'array',
value: [65]
},
{
name: 'SharedArrayBuffer',
// Use a getter to postpone construction so that all tests don't fail where
// SharedArrayBuffer is not yet implemented.
get value() {
// See https://github.com/whatwg/html/issues/5380 for why not `new SharedArrayBuffer()`
return new WebAssembly.Memory({ shared:true, initial:1, maximum:1 }).buffer;
}
},
{
name: 'shared Uint8Array',
get value() {
// See https://github.com/whatwg/html/issues/5380 for why not `new SharedArrayBuffer()`
return new Uint8Array(new WebAssembly.Memory({ shared:true, initial:1, maximum:1 }).buffer)
}
},
{
name: 'invalid deflate bytes',
value: new Uint8Array([0, 156, 75, 173, 40, 72, 77, 46, 73, 77, 81, 200, 47, 45, 41, 40, 45, 1, 0, 48, 173, 6, 36])
},
{
name: 'invalid gzip bytes',
value: new Uint8Array([0, 139, 8, 0, 0, 0, 0, 0, 0, 3, 75, 173, 40, 72, 77, 46, 73, 77, 81, 200, 47, 45, 41, 40, 45, 1, 0, 176, 1, 57, 179, 15, 0, 0, 0])
},
];
// Test Case Design
// We need to wait until after we close the writable stream to check if the decoded stream is valid.
// We can end up in a state where all reads/writes are valid, but upon closing the writable stream an error is detected.
// (Example: A zlib encoded chunk w/o the checksum).
async function decompress(chunk, format, t)
{
const ds = new DecompressionStream(format);
const reader = ds.readable.getReader();
const writer = ds.writable.getWriter();
writer.write(chunk.value).then(() => {}, () => {});
reader.read().then(() => {}, () => {});
await promise_rejects_js(t, TypeError, writer.close(), 'writer.close() should reject');
await promise_rejects_js(t, TypeError, writer.closed, 'write.closed should reject');
await promise_rejects_js(t, TypeError, reader.read(), 'reader.read() should reject');
await promise_rejects_js(t, TypeError, reader.closed, 'read.closed should reject');
}
for (const chunk of badChunks) {
promise_test(async t => {
await decompress(chunk, 'gzip', t);
}, `chunk of type ${chunk.name} should error the stream for gzip`);
promise_test(async t => {
await decompress(chunk, 'deflate', t);
}, `chunk of type ${chunk.name} should error the stream for deflate`);
promise_test(async t => {
await decompress(chunk, 'deflate-raw', t);
}, `chunk of type ${chunk.name} should error the stream for deflate-raw`);
}
|