Skip to content

Commit 269118d

Browse files
[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`.
1 parent 0042da7 commit 269118d

File tree

1 file changed

+32
-29
lines changed

1 file changed

+32
-29
lines changed

packages/webview_flutter/webview_flutter_wkwebview/example/integration_test/webview_flutter_test.dart

Lines changed: 32 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -69,47 +69,50 @@ Future<void> main() async {
6969
testWidgets(
7070
'WKWebView is released by garbage collection',
7171
(WidgetTester tester) async {
72-
final Completer<void> webViewGCCompleter = Completer<void>();
72+
bool aWebViewHasBeenGarbageCollected = false;
7373

7474
late final InstanceManager instanceManager;
7575
instanceManager =
7676
InstanceManager(onWeakReferenceRemoved: (int identifier) {
77-
final Copyable instance =
78-
instanceManager.getInstanceWithWeakReference(identifier)!;
79-
if (instance is WKWebView && !webViewGCCompleter.isCompleted) {
80-
webViewGCCompleter.complete();
77+
if (!aWebViewHasBeenGarbageCollected) {
78+
final Copyable instance =
79+
instanceManager.getInstanceWithWeakReference(identifier)!;
80+
if (instance is WKWebView) {
81+
aWebViewHasBeenGarbageCollected = true;
82+
}
8183
}
8284
});
8385

84-
await tester.pumpWidget(
85-
Builder(
86-
builder: (BuildContext context) {
87-
return PlatformWebViewWidget(
88-
WebKitWebViewWidgetCreationParams(
89-
instanceManager: instanceManager,
90-
controller: PlatformWebViewController(
91-
WebKitWebViewControllerCreationParams(
92-
instanceManager: instanceManager,
86+
// Wait for any WebView to be garbage collected.
87+
while (!aWebViewHasBeenGarbageCollected) {
88+
await tester.pumpWidget(
89+
Builder(
90+
builder: (BuildContext context) {
91+
return PlatformWebViewWidget(
92+
WebKitWebViewWidgetCreationParams(
93+
instanceManager: instanceManager,
94+
controller: PlatformWebViewController(
95+
WebKitWebViewControllerCreationParams(
96+
instanceManager: instanceManager,
97+
),
9398
),
9499
),
95-
),
96-
).build(context);
97-
},
98-
),
99-
);
100-
await tester.pumpAndSettle();
101-
102-
await tester.pumpWidget(Container());
103-
104-
// Force garbage collection.
105-
await IntegrationTestWidgetsFlutterBinding.instance
106-
.watchPerformance(() async {
100+
).build(context);
101+
},
102+
),
103+
);
107104
await tester.pumpAndSettle();
108-
});
109105

110-
await expectLater(webViewGCCompleter.future, completes);
106+
await tester.pumpWidget(Container());
107+
108+
// Force garbage collection.
109+
await IntegrationTestWidgetsFlutterBinding.instance
110+
.watchPerformance(() async {
111+
await tester.pumpAndSettle();
112+
});
113+
}
111114
},
112-
timeout: const Timeout(Duration(seconds: 10)),
115+
timeout: const Timeout(Duration(seconds: 30)),
113116
);
114117

115118
testWidgets('loadRequest', (WidgetTester tester) async {

0 commit comments

Comments
 (0)