| <!DOCTYPE html> |
| <html class="test-wait"> |
| <meta charset="utf-8"> |
| <title>ImageDecoder: transferring a non-detachable ArrayBuffer must not crash</title> |
| <link rel="help" href="https://www.w3.org/TR/webcodecs/#dom-imagedecoder-imagedecoder"> |
| <body> |
| <script> |
| // A buffer that cannot be detached (e.g. one backed by WebAssembly.Memory) |
| // should fail cleanly when passed in the transfer list to ImageDecoder |
| // constructor. |
| |
| function nonDetachableBuffer() { |
| const buf = new WebAssembly.Memory({initial: 1}).buffer; |
| new Uint8Array(buf).set([0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a]); |
| return buf; |
| } |
| |
| function construct(init, alsoClose) { |
| let decoder = null; |
| try { |
| decoder = new ImageDecoder(init); |
| } catch (e) { |
| // Expected on a fixed build. |
| } |
| if (decoder && alsoClose) { |
| try { decoder.close(); } catch (e) {} |
| } |
| } |
| |
| { |
| const buf = nonDetachableBuffer(); |
| construct({type: "image/png", data: buf, transfer: [buf]}, true); |
| } |
| |
| { |
| const buf = nonDetachableBuffer(); |
| construct({type: "image/png", data: new Uint8Array(buf), transfer: [buf]}, true); |
| } |
| |
| { |
| const buf = nonDetachableBuffer(); |
| construct({type: "image/png", data: buf, transfer: [buf]}, false); |
| } |
| |
| let frames = 0; |
| function tick() { |
| if (++frames < 10) { |
| requestAnimationFrame(tick); |
| } else { |
| document.documentElement.classList.remove("test-wait"); |
| } |
| } |
| requestAnimationFrame(tick); |
| </script> |
| </body> |
| </html> |