mirror of
https://github.com/flutter/packages.git
synced 2025-06-29 06:06:59 +08:00
[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:
@ -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 {
|
||||||
|
Reference in New Issue
Block a user