Implement support for transfer lists in ImageDecoder

As was done for other WebCodecs classes, add support for transfer
lists to avoid copying image data when provided to the constructor.

R=eugene

Bug: 1446808
Change-Id: Id2e02f3dde135f426309529a0998b85357662fa8
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/4943161
Reviewed-by: Eugene Zemtsov <eugene@chromium.org>
Commit-Queue: Dale Curtis <dalecurtis@chromium.org>
Cr-Commit-Position: refs/heads/main@{#1210592}
diff --git a/webcodecs/transfering.https.any.js b/webcodecs/transfering.https.any.js
index 67614bf..acd2738 100644
--- a/webcodecs/transfering.https.any.js
+++ b/webcodecs/transfering.https.any.js
@@ -215,3 +215,22 @@
     assert_equals(expected_data[i], readback_data[i], `expected_data[${i}]`);
   }
 }, 'Test transfering ArrayBuffer to AudioData');
+
+promise_test(async t => {
+  let unused_buffer = new ArrayBuffer(123);
+  let support = await ImageDecoder.isTypeSupported('image/png');
+  assert_implements_optional(
+      support, 'Optional codec image/png not supported.');
+  let buffer = await fetch('four-colors.png').then(response => {
+    return response.arrayBuffer();
+  });
+
+  let decoder = new ImageDecoder(
+      {data: buffer, type: 'image/png', transfer: [buffer, unused_buffer]});
+  assert_equals(buffer.byteLength, 0, 'buffer.byteLength after detach');
+  assert_equals(unused_buffer.byteLength, 0, 'unused_buffer after detach');
+
+  let result = await decoder.decode();
+  assert_equals(result.image.displayWidth, 320);
+  assert_equals(result.image.displayHeight, 240);
+}, 'Test transfering ArrayBuffer to ImageDecoder.');