[webview_flutter_wkwebview] Repeatedly pump WebViews until one is garbage collected (#4662)

This should improve the chance that a `WKWebView` is garbage collected by repeatedly pumping `WebViewWidgets`.
This commit is contained in:
Maurice Parrish
2023-08-07 22:35:16 -04:00
committed by GitHub
parent 0042da7e63
commit 269118d228

View File

@ -69,18 +69,22 @@ Future<void> main() async {
testWidgets( testWidgets(
'WKWebView is released by garbage collection', 'WKWebView is released by garbage collection',
(WidgetTester tester) async { (WidgetTester tester) async {
final Completer<void> webViewGCCompleter = Completer<void>(); bool aWebViewHasBeenGarbageCollected = false;
late final InstanceManager instanceManager; late final InstanceManager instanceManager;
instanceManager = instanceManager =
InstanceManager(onWeakReferenceRemoved: (int identifier) { InstanceManager(onWeakReferenceRemoved: (int identifier) {
if (!aWebViewHasBeenGarbageCollected) {
final Copyable instance = final Copyable instance =
instanceManager.getInstanceWithWeakReference(identifier)!; instanceManager.getInstanceWithWeakReference(identifier)!;
if (instance is WKWebView && !webViewGCCompleter.isCompleted) { if (instance is WKWebView) {
webViewGCCompleter.complete(); aWebViewHasBeenGarbageCollected = true;
}
} }
}); });
// Wait for any WebView to be garbage collected.
while (!aWebViewHasBeenGarbageCollected) {
await tester.pumpWidget( await tester.pumpWidget(
Builder( Builder(
builder: (BuildContext context) { builder: (BuildContext context) {
@ -106,10 +110,9 @@ Future<void> main() async {
.watchPerformance(() async { .watchPerformance(() async {
await tester.pumpAndSettle(); await tester.pumpAndSettle();
}); });
}
await expectLater(webViewGCCompleter.future, completes);
}, },
timeout: const Timeout(Duration(seconds: 10)), timeout: const Timeout(Duration(seconds: 30)),
); );
testWidgets('loadRequest', (WidgetTester tester) async { testWidgets('loadRequest', (WidgetTester tester) async {