Skip to content

Commit 39f2974

Browse files
authored
Instrument ImageStreamCompleterHandle for LeakTracking (#137482)
1 parent e2d5e8f commit 39f2974

File tree

2 files changed

+33
-0
lines changed

2 files changed

+33
-0
lines changed

packages/flutter/lib/src/painting/image_stream.dart

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@ import 'dart:ui' as ui show Codec, FrameInfo, Image;
88
import 'package:flutter/foundation.dart';
99
import 'package:flutter/scheduler.dart';
1010

11+
const String _flutterWidgetsLibrary = 'package:flutter/widgets.dart';
12+
1113
/// A [dart:ui.Image] object with its corresponding scale.
1214
///
1315
/// ImageInfo objects are used by [ImageStream] objects to represent the
@@ -437,6 +439,15 @@ class ImageStream with Diagnosticable {
437439
class ImageStreamCompleterHandle {
438440
ImageStreamCompleterHandle._(ImageStreamCompleter this._completer) {
439441
_completer!._keepAliveHandles += 1;
442+
// TODO(polina-c): stop duplicating code across disposables
443+
// https://github.com/flutter/flutter/issues/137435
444+
if (kFlutterMemoryAllocationsEnabled) {
445+
MemoryAllocations.instance.dispatchObjectCreated(
446+
library: _flutterWidgetsLibrary,
447+
className: '$ImageStreamCompleterHandle',
448+
object: this,
449+
);
450+
}
440451
}
441452

442453
ImageStreamCompleter? _completer;
@@ -453,6 +464,11 @@ class ImageStreamCompleterHandle {
453464
_completer!._keepAliveHandles -= 1;
454465
_completer!._maybeDispose();
455466
_completer = null;
467+
// TODO(polina-c): stop duplicating code across disposables
468+
// https://github.com/flutter/flutter/issues/137435
469+
if (kFlutterMemoryAllocationsEnabled) {
470+
MemoryAllocations.instance.dispatchObjectDisposed(object: this);
471+
}
456472
}
457473
}
458474

packages/flutter/test/painting/image_stream_test.dart

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -871,4 +871,21 @@ void main() {
871871

872872
expect(synchronouslyCalled, false);
873873
});
874+
875+
test('ImageStreamCompleterHandle dispatches memory events', () async {
876+
await expectLater(
877+
await memoryEvents(
878+
() {
879+
final StreamController<ImageChunkEvent> streamController = StreamController<ImageChunkEvent>();
880+
addTearDown(streamController.close);
881+
final ImageStreamCompleterHandle imageStreamCompleterHandle = FakeEventReportingImageStreamCompleter(
882+
chunkEvents: streamController.stream,
883+
).keepAlive();
884+
imageStreamCompleterHandle.dispose();
885+
},
886+
ImageStreamCompleterHandle,
887+
),
888+
areCreateAndDispose,
889+
);
890+
});
874891
}

0 commit comments

Comments
 (0)