| // META: global=window,dedicatedworker |
| |
| // Bug: An animated GIF whose first frame has delay_time=0 is incorrectly |
| // detected as non-animated by the metadata decoder. This causes ImageDecoder |
| // to report frameCount=1 and reject decode requests for subsequent frames. |
| |
| promise_test(async t => { |
| let support = await ImageDecoder.isTypeSupported('image/gif'); |
| assert_implements_optional(support, 'Optional codec image/gif not supported.'); |
| |
| let response = await fetch('animated-zero-delay.gif'); |
| let buffer = await response.arrayBuffer(); |
| let decoder = new ImageDecoder({data: buffer, type: 'image/gif'}); |
| |
| await decoder.tracks.ready; |
| assert_equals(decoder.tracks.length, 1, 'Should have one track'); |
| |
| let track = decoder.tracks.selectedTrack; |
| assert_true(track.animated, 'Track should be detected as animated'); |
| assert_equals(track.frameCount, 2, 'Should report 2 frames'); |
| |
| let result0 = await decoder.decode({frameIndex: 0}); |
| assert_true(result0.complete, 'Frame 0 should be complete'); |
| assert_equals(result0.image.codedWidth, 2); |
| assert_equals(result0.image.codedHeight, 2); |
| |
| let result1 = await decoder.decode({frameIndex: 1}); |
| assert_true(result1.complete, 'Frame 1 should be complete'); |
| assert_equals(result1.image.codedWidth, 2); |
| assert_equals(result1.image.codedHeight, 2); |
| }, 'Test animated GIF with zero first-frame delay decodes all frames'); |
| |
| promise_test(async t => { |
| let support = await ImageDecoder.isTypeSupported('image/gif'); |
| assert_implements_optional(support, 'Optional codec image/gif not supported.'); |
| |
| let response = await fetch('animated-zero-delay.gif'); |
| let buffer = await response.arrayBuffer(); |
| let decoder = new ImageDecoder({data: buffer, type: 'image/gif'}); |
| |
| await decoder.completed; |
| |
| let track = decoder.tracks.selectedTrack; |
| assert_true(track.animated, 'Track should be animated after completed'); |
| assert_equals(track.frameCount, 2, 'Should report 2 frames after completed'); |
| assert_equals(track.repetitionCount, Infinity, |
| 'Should report infinite repetitions (loop=0)'); |
| }, 'Test animated GIF with zero first-frame delay reports correct metadata'); |