[web] Dispose a temporary image that may be created by instantiateImageCodecWithSize (flutter/engine#54096)

Fixes https://github.com/flutter/flutter/issues/147066
This commit is contained in:
Jason Simmons 2024-07-31 15:40:51 -07:00 committed by GitHub
parent 9a844d0d61
commit d103053ca2
2 changed files with 30 additions and 4 deletions

View File

@ -130,6 +130,7 @@ class CkResizingCodec extends ResizingCodec {
return image;
}
image.dispose();
return CkImage(skImage, imageSource: ImageBitmapImageSource(bitmap));
}
}

View File

@ -21,6 +21,11 @@ void main() {
void testMain() {
setUpCanvasKitTest();
tearDown(() {
ui.Image.onCreate = null;
ui.Image.onDispose = null;
});
test('toImage succeeds', () async {
final ui.Image image = await _createImage();
expect(image.runtimeType.toString(), equals('CkImage'));
@ -44,8 +49,6 @@ void testMain() {
expect(onCreateInvokedCount, 2);
expect(createdImage, image2);
ui.Image.onCreate = null;
});
test('dispose() invokes onDispose once', () async {
@ -65,8 +68,6 @@ void testMain() {
expect(onDisposeInvokedCount, 2);
expect(disposedImage, image2);
ui.Image.onDispose = null;
});
test('fetchImage fetches image in chunks', () async {
@ -106,6 +107,30 @@ void testMain() {
expect(size?.width, 600);
expect(size?.height, 300);
});
test('instantiateImageCodecWithSize disposes temporary image', () async {
final Set<ui.Image> activeImages = <ui.Image>{};
ui.Image.onCreate = activeImages.add;
ui.Image.onDispose = activeImages.remove;
final ui.Image image = await _createImage();
final ByteData? imageData = await image.toByteData(format: ui.ImageByteFormat.png);
final ui.ImmutableBuffer imageBuffer = await ui.ImmutableBuffer.fromUint8List(imageData!.buffer.asUint8List());
image.dispose();
final ui.Codec codec = await ui.instantiateImageCodecWithSize(
imageBuffer,
getTargetSize: (w, h) => ui.TargetImageSize(width: w ~/ 2, height: h ~/ 2)
);
final ui.FrameInfo frameInfo = await codec.getNextFrame();
expect(activeImages.length, 1);
frameInfo.image.dispose();
codec.dispose();
expect(activeImages.length, 0);
});
}
Future<ui.Image> _createImage() => _createPicture().toImage(10, 10);