Skip to content

Commit fd6b409

Browse files
authored
Fix recursive access to SkImage in image resurrector (flutter#23115)
1 parent eb472cc commit fd6b409

File tree

2 files changed

+24
-2
lines changed

2 files changed

+24
-2
lines changed

lib/web_ui/lib/src/engine/canvaskit/image.dart

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -179,11 +179,13 @@ class CkImage implements ui.Image, StackTraceDebugger {
179179
colorType: canvasKit.ColorType.RGBA_8888,
180180
colorSpace: SkColorSpaceSRGB,
181181
);
182+
final int originalWidth = skImage.width();
183+
final int originalHeight = skImage.height();
182184
box = SkiaObjectBox<CkImage, SkImage>.resurrectable(this, skImage, () {
183185
return canvasKit.MakeImage(
184186
originalBytes.buffer.asUint8List(),
185-
width,
186-
height,
187+
originalWidth,
188+
originalHeight,
187189
canvasKit.AlphaType.Premul,
188190
canvasKit.ColorType.RGBA_8888,
189191
SkColorSpaceSRGB,

lib/web_ui/test/canvaskit/image_test.dart

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,26 @@ void testMain() {
113113
testCollector.collectNow();
114114
});
115115

116+
// Regression test for https://github.com/flutter/flutter/issues/72469
117+
test('CkImage can be resurrected', () {
118+
browserSupportsFinalizationRegistry = false;
119+
final SkImage skImage =
120+
canvasKit.MakeAnimatedImageFromEncoded(kTransparentImage)
121+
.getCurrentFrame();
122+
final CkImage image = CkImage(skImage);
123+
expect(image.box.rawSkiaObject, isNotNull);
124+
125+
// Pretend that the image is temporarily deleted.
126+
image.box.delete();
127+
image.box.didDelete();
128+
expect(image.box.rawSkiaObject, isNull);
129+
130+
// Attempting to access the skia object here would previously throw
131+
// "Stack Overflow" in Safari.
132+
expect(image.box.skiaObject, isNotNull);
133+
testCollector.collectNow();
134+
});
135+
116136
test('skiaInstantiateWebImageCodec loads an image from the network',
117137
() async {
118138
httpRequestFactory = () {

0 commit comments

Comments
 (0)