diff options
Diffstat (limited to 'testing/web-platform/tests/compression/decompression-with-detach.tentative.window.js')
-rw-r--r-- | testing/web-platform/tests/compression/decompression-with-detach.tentative.window.js | 41 |
1 files changed, 41 insertions, 0 deletions
diff --git a/testing/web-platform/tests/compression/decompression-with-detach.tentative.window.js b/testing/web-platform/tests/compression/decompression-with-detach.tentative.window.js new file mode 100644 index 0000000000..a2f8bda091 --- /dev/null +++ b/testing/web-platform/tests/compression/decompression-with-detach.tentative.window.js @@ -0,0 +1,41 @@ +// META: global=window,worker +// META: script=resources/concatenate-stream.js + +'use strict'; + +const kInputLength = 1000000; + +async function createLargeCompressedInput() { + const cs = new CompressionStream('deflate'); + // The input has to be large enough that it won't fit in a single chunk when + // decompressed. + const writer = cs.writable.getWriter(); + writer.write(new Uint8Array(kInputLength)); + writer.close(); + return concatenateStream(cs.readable); +} + +promise_test(async () => { + const input = await createLargeCompressedInput(); + const ds = new DecompressionStream('deflate'); + const writer = ds.writable.getWriter(); + writer.write(input); + writer.close(); + // Object.prototype.then will be looked up synchronously when the promise + // returned by read() is resolved. + Object.defineProperty(Object.prototype, 'then', { + get() { + // Cause input to become detached and unreferenced. + try { + postMessage(undefined, 'nowhere', [input.buffer]); + } catch (e) { + // It's already detached. + } + } + }); + const output = await concatenateStream(ds.readable); + // If output successfully decompressed and gave the right length, we can be + // reasonably confident that no data corruption happened. + assert_equals( + output.byteLength, kInputLength, 'output should be the right length'); +}, 'data should be correctly decompressed even if input is detached partway'); |