[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,47 +69,50 @@ 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) {
final Copyable instance = if (!aWebViewHasBeenGarbageCollected) {
instanceManager.getInstanceWithWeakReference(identifier)!; final Copyable instance =
if (instance is WKWebView && !webViewGCCompleter.isCompleted) { instanceManager.getInstanceWithWeakReference(identifier)!;
webViewGCCompleter.complete(); if (instance is WKWebView) {
aWebViewHasBeenGarbageCollected = true;
}
} }
}); });
await tester.pumpWidget( // Wait for any WebView to be garbage collected.
Builder( while (!aWebViewHasBeenGarbageCollected) {
builder: (BuildContext context) { await tester.pumpWidget(
return PlatformWebViewWidget( Builder(
WebKitWebViewWidgetCreationParams( builder: (BuildContext context) {
instanceManager: instanceManager, return PlatformWebViewWidget(
controller: PlatformWebViewController( WebKitWebViewWidgetCreationParams(
WebKitWebViewControllerCreationParams( instanceManager: instanceManager,
instanceManager: instanceManager, controller: PlatformWebViewController(
WebKitWebViewControllerCreationParams(
instanceManager: instanceManager,
),
), ),
), ),
), ).build(context);
).build(context); },
}, ),
), );
);
await tester.pumpAndSettle();
await tester.pumpWidget(Container());
// Force garbage collection.
await IntegrationTestWidgetsFlutterBinding.instance
.watchPerformance(() async {
await tester.pumpAndSettle(); await tester.pumpAndSettle();
});
await expectLater(webViewGCCompleter.future, completes); await tester.pumpWidget(Container());
// Force garbage collection.
await IntegrationTestWidgetsFlutterBinding.instance
.watchPerformance(() async {
await tester.pumpAndSettle();
});
}
}, },
timeout: const Timeout(Duration(seconds: 10)), timeout: const Timeout(Duration(seconds: 30)),
); );
testWidgets('loadRequest', (WidgetTester tester) async { testWidgets('loadRequest', (WidgetTester tester) async {