mirror of
https://github.com/flutter/packages.git
synced 2025-06-28 13:47:29 +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,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 {
|
||||||
|
Reference in New Issue
Block a user