@@ -17,6 +17,8 @@ import 'package:flutter/material.dart';
17
17
import 'package:flutter/services.dart' ;
18
18
import 'package:flutter_test/flutter_test.dart' ;
19
19
import 'package:integration_test/integration_test.dart' ;
20
+ import 'package:webview_flutter_android/src/android_webview.dart' as android;
21
+ import 'package:webview_flutter_android/src/android_webview_api_impls.dart' ;
20
22
import 'package:webview_flutter_android/src/instance_manager.dart' ;
21
23
import 'package:webview_flutter_android/src/weak_reference_utils.dart' ;
22
24
import 'package:webview_flutter_android/webview_flutter_android.dart' ;
@@ -58,15 +60,13 @@ Future<void> main() async {
58
60
)
59
61
..loadRequest (LoadRequestParams (uri: Uri .parse (primaryUrl)));
60
62
61
- await tester.pumpWidget (
62
- Builder (
63
- builder: (BuildContext context) {
64
- return PlatformWebViewWidget (
65
- PlatformWebViewWidgetCreationParams (controller: controller),
66
- ).build (context);
67
- },
68
- ),
69
- );
63
+ await tester.pumpWidget (Builder (
64
+ builder: (BuildContext context) {
65
+ return PlatformWebViewWidget (
66
+ PlatformWebViewWidgetCreationParams (controller: controller),
67
+ ).build (context);
68
+ },
69
+ ));
70
70
71
71
await pageFinished.future;
72
72
@@ -96,6 +96,79 @@ Future<void> main() async {
96
96
expect (gcIdentifier, 0 );
97
97
}, timeout: const Timeout (Duration (seconds: 10 )));
98
98
99
+ testWidgets (
100
+ 'WebView is released by garbage collection' ,
101
+ (WidgetTester tester) async {
102
+ final Completer <void > webViewGCCompleter = Completer <void >();
103
+
104
+ late final InstanceManager instanceManager;
105
+ instanceManager =
106
+ InstanceManager (onWeakReferenceRemoved: (int identifier) {
107
+ final Copyable instance =
108
+ instanceManager.getInstanceWithWeakReference (identifier)! ;
109
+ if (instance is android.WebView && ! webViewGCCompleter.isCompleted) {
110
+ webViewGCCompleter.complete ();
111
+ }
112
+ });
113
+
114
+ android.WebView .api = WebViewHostApiImpl (
115
+ instanceManager: instanceManager,
116
+ );
117
+ android.WebSettings .api = WebSettingsHostApiImpl (
118
+ instanceManager: instanceManager,
119
+ );
120
+ android.WebChromeClient .api = WebChromeClientHostApiImpl (
121
+ instanceManager: instanceManager,
122
+ );
123
+
124
+ await tester.pumpWidget (
125
+ Builder (
126
+ builder: (BuildContext context) {
127
+ return PlatformWebViewWidget (
128
+ AndroidWebViewWidgetCreationParams (
129
+ instanceManager: instanceManager,
130
+ controller: PlatformWebViewController (
131
+ const PlatformWebViewControllerCreationParams (),
132
+ ),
133
+ ),
134
+ ).build (context);
135
+ },
136
+ ),
137
+ );
138
+ await tester.pumpAndSettle ();
139
+
140
+ await tester.pumpWidget (
141
+ Builder (
142
+ builder: (BuildContext context) {
143
+ return PlatformWebViewWidget (
144
+ AndroidWebViewWidgetCreationParams (
145
+ instanceManager: instanceManager,
146
+ controller: PlatformWebViewController (
147
+ const PlatformWebViewControllerCreationParams (),
148
+ ),
149
+ ),
150
+ ).build (context);
151
+ },
152
+ ),
153
+ );
154
+ await tester.pumpAndSettle ();
155
+
156
+ // Force garbage collection.
157
+ await IntegrationTestWidgetsFlutterBinding .instance
158
+ .watchPerformance (() async {
159
+ await tester.pumpAndSettle ();
160
+ });
161
+
162
+ await tester.pumpAndSettle ();
163
+ await expectLater (webViewGCCompleter.future, completes);
164
+
165
+ android.WebView .api = WebViewHostApiImpl ();
166
+ android.WebSettings .api = WebSettingsHostApiImpl ();
167
+ android.WebChromeClient .api = WebChromeClientHostApiImpl ();
168
+ },
169
+ timeout: const Timeout (Duration (seconds: 10 )),
170
+ );
171
+
99
172
testWidgets ('runJavaScriptReturningResult' , (WidgetTester tester) async {
100
173
final Completer <void > pageFinished = Completer <void >();
101
174
@@ -110,15 +183,13 @@ Future<void> main() async {
110
183
)
111
184
..loadRequest (LoadRequestParams (uri: Uri .parse (primaryUrl)));
112
185
113
- await tester.pumpWidget (
114
- Builder (
115
- builder: (BuildContext context) {
116
- return PlatformWebViewWidget (
117
- PlatformWebViewWidgetCreationParams (controller: controller),
118
- ).build (context);
119
- },
120
- ),
121
- );
186
+ await tester.pumpWidget (Builder (
187
+ builder: (BuildContext context) {
188
+ return PlatformWebViewWidget (
189
+ PlatformWebViewWidgetCreationParams (controller: controller),
190
+ ).build (context);
191
+ },
192
+ ));
122
193
123
194
await pageFinished.future;
124
195
@@ -151,15 +222,13 @@ Future<void> main() async {
151
222
),
152
223
);
153
224
154
- await tester.pumpWidget (
155
- Builder (
156
- builder: (BuildContext context) {
157
- return PlatformWebViewWidget (
158
- PlatformWebViewWidgetCreationParams (controller: controller),
159
- ).build (context);
160
- },
161
- ),
162
- );
225
+ await tester.pumpWidget (Builder (
226
+ builder: (BuildContext context) {
227
+ return PlatformWebViewWidget (
228
+ PlatformWebViewWidgetCreationParams (controller: controller),
229
+ ).build (context);
230
+ },
231
+ ));
163
232
164
233
await pageLoads.stream.firstWhere ((String url) => url == headersUrl);
165
234
@@ -195,15 +264,13 @@ Future<void> main() async {
195
264
'data:text/html;charset=utf-8;base64,PCFET0NUWVBFIGh0bWw+' ,
196
265
);
197
266
198
- await tester.pumpWidget (
199
- Builder (
200
- builder: (BuildContext context) {
201
- return PlatformWebViewWidget (
202
- PlatformWebViewWidgetCreationParams (controller: controller),
203
- ).build (context);
204
- },
205
- ),
206
- );
267
+ await tester.pumpWidget (Builder (
268
+ builder: (BuildContext context) {
269
+ return PlatformWebViewWidget (
270
+ PlatformWebViewWidgetCreationParams (controller: controller),
271
+ ).build (context);
272
+ },
273
+ ));
207
274
208
275
await pageFinished.future;
209
276
@@ -258,15 +325,13 @@ Future<void> main() async {
258
325
..setUserAgent ('Custom_User_Agent1' )
259
326
..loadRequest (LoadRequestParams (uri: Uri .parse ('about:blank' )));
260
327
261
- await tester.pumpWidget (
262
- Builder (
263
- builder: (BuildContext context) {
264
- return PlatformWebViewWidget (
265
- PlatformWebViewWidgetCreationParams (controller: controller),
266
- ).build (context);
267
- },
268
- ),
269
- );
328
+ await tester.pumpWidget (Builder (
329
+ builder: (BuildContext context) {
330
+ return PlatformWebViewWidget (
331
+ PlatformWebViewWidgetCreationParams (controller: controller),
332
+ ).build (context);
333
+ },
334
+ ));
270
335
271
336
await pageFinished.future;
272
337
@@ -335,15 +400,13 @@ Future<void> main() async {
335
400
),
336
401
);
337
402
338
- await tester.pumpWidget (
339
- Builder (
340
- builder: (BuildContext context) {
341
- return PlatformWebViewWidget (
342
- PlatformWebViewWidgetCreationParams (controller: controller),
343
- ).build (context);
344
- },
345
- ),
346
- );
403
+ await tester.pumpWidget (Builder (
404
+ builder: (BuildContext context) {
405
+ return PlatformWebViewWidget (
406
+ PlatformWebViewWidgetCreationParams (controller: controller),
407
+ ).build (context);
408
+ },
409
+ ));
347
410
348
411
await pageLoaded.future;
349
412
@@ -369,15 +432,13 @@ Future<void> main() async {
369
432
),
370
433
);
371
434
372
- await tester.pumpWidget (
373
- Builder (
374
- builder: (BuildContext context) {
375
- return PlatformWebViewWidget (
376
- PlatformWebViewWidgetCreationParams (controller: controller),
377
- ).build (context);
378
- },
379
- ),
380
- );
435
+ await tester.pumpWidget (Builder (
436
+ builder: (BuildContext context) {
437
+ return PlatformWebViewWidget (
438
+ PlatformWebViewWidgetCreationParams (controller: controller),
439
+ ).build (context);
440
+ },
441
+ ));
381
442
382
443
await pageLoaded.future;
383
444
@@ -491,15 +552,13 @@ Future<void> main() async {
491
552
),
492
553
);
493
554
494
- await tester.pumpWidget (
495
- Builder (
496
- builder: (BuildContext context) {
497
- return PlatformWebViewWidget (
498
- PlatformWebViewWidgetCreationParams (controller: controller),
499
- ).build (context);
500
- },
501
- ),
502
- );
555
+ await tester.pumpWidget (Builder (
556
+ builder: (BuildContext context) {
557
+ return PlatformWebViewWidget (
558
+ PlatformWebViewWidgetCreationParams (controller: controller),
559
+ ).build (context);
560
+ },
561
+ ));
503
562
504
563
await pageLoaded.future;
505
564
@@ -525,15 +584,13 @@ Future<void> main() async {
525
584
),
526
585
);
527
586
528
- await tester.pumpWidget (
529
- Builder (
530
- builder: (BuildContext context) {
531
- return PlatformWebViewWidget (
532
- PlatformWebViewWidgetCreationParams (controller: controller),
533
- ).build (context);
534
- },
535
- ),
536
- );
587
+ await tester.pumpWidget (Builder (
588
+ builder: (BuildContext context) {
589
+ return PlatformWebViewWidget (
590
+ PlatformWebViewWidgetCreationParams (controller: controller),
591
+ ).build (context);
592
+ },
593
+ ));
537
594
538
595
await pageLoaded.future;
539
596
@@ -573,15 +630,13 @@ Future<void> main() async {
573
630
),
574
631
);
575
632
576
- await tester.pumpWidget (
577
- Builder (
578
- builder: (BuildContext context) {
579
- return PlatformWebViewWidget (
580
- PlatformWebViewWidgetCreationParams (controller: controller),
581
- ).build (context);
582
- },
583
- ),
584
- );
633
+ await tester.pumpWidget (Builder (
634
+ builder: (BuildContext context) {
635
+ return PlatformWebViewWidget (
636
+ PlatformWebViewWidgetCreationParams (controller: controller),
637
+ ).build (context);
638
+ },
639
+ ));
585
640
586
641
await pageLoaded.future;
587
642
0 commit comments