Source code
Revision control
Copy as Markdown
Other Tools
Test Info:
- This WPT test may be referenced by the following Test IDs:
- /compression/decompression-bad-chunks.tentative.any.html - WPT Dashboard Interop Dashboard
- /compression/decompression-bad-chunks.tentative.any.serviceworker.html - WPT Dashboard Interop Dashboard
- /compression/decompression-bad-chunks.tentative.any.shadowrealm-in-dedicatedworker.html - WPT Dashboard Interop Dashboard
- /compression/decompression-bad-chunks.tentative.any.shadowrealm-in-shadowrealm.html - WPT Dashboard Interop Dashboard
- /compression/decompression-bad-chunks.tentative.any.shadowrealm-in-sharedworker.html - WPT Dashboard Interop Dashboard
- /compression/decompression-bad-chunks.tentative.any.shadowrealm-in-window.html - WPT Dashboard Interop Dashboard
- /compression/decompression-bad-chunks.tentative.any.sharedworker.html - WPT Dashboard Interop Dashboard
- /compression/decompression-bad-chunks.tentative.any.worker.html - WPT Dashboard Interop Dashboard
- /compression/decompression-bad-chunks.tentative.https.any.shadowrealm-in-audioworklet.html - WPT Dashboard Interop Dashboard
- /compression/decompression-bad-chunks.tentative.https.any.shadowrealm-in-serviceworker.html - WPT Dashboard Interop Dashboard
// META: global=window,worker,shadowrealm
'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() {
return new WebAssembly.Memory({ shared:true, initial:1, maximum:1 }).buffer;
}
},
{
name: 'shared Uint8Array',
get value() {
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`);
}