@@ -70,6 +70,28 @@ void main() {
70
70
expect (currentUrl, secondaryUrl);
71
71
}, skip: _skipDueToIssue86757);
72
72
73
+ testWidgets ('evaluateJavascript' , (WidgetTester tester) async {
74
+ final Completer <WebViewController > controllerCompleter =
75
+ Completer <WebViewController >();
76
+ await tester.pumpWidget (
77
+ Directionality (
78
+ textDirection: TextDirection .ltr,
79
+ child: WebView (
80
+ key: GlobalKey (),
81
+ initialUrl: primaryUrl,
82
+ onWebViewCreated: (WebViewController controller) {
83
+ controllerCompleter.complete (controller);
84
+ },
85
+ javascriptMode: JavascriptMode .unrestricted,
86
+ ),
87
+ ),
88
+ );
89
+ final WebViewController controller = await controllerCompleter.future;
90
+ // ignore: deprecated_member_use
91
+ final String result = await controller.evaluateJavascript ('1 + 1' );
92
+ expect (result, equals ('2' ));
93
+ });
94
+
73
95
// TODO(bparrishMines): skipped due to https://github.com/flutter/flutter/issues/86757.
74
96
testWidgets ('loadUrl with headers' , (WidgetTester tester) async {
75
97
final Completer <WebViewController > controllerCompleter =
@@ -108,12 +130,12 @@ void main() {
108
130
await pageLoads.stream.firstWhere ((String url) => url == currentUrl);
109
131
110
132
final String content = await controller
111
- .evaluateJavascript ('document.documentElement.innerText' );
133
+ .runJavascriptReturningResult ('document.documentElement.innerText' );
112
134
expect (content.contains ('flutter_test_header' ), isTrue);
113
135
}, skip: Platform .isAndroid && _skipDueToIssue86757);
114
136
115
137
// TODO(bparrishMines): skipped due to https://github.com/flutter/flutter/issues/86757.
116
- testWidgets ('JavaScriptChannel ' , (WidgetTester tester) async {
138
+ testWidgets ('JavascriptChannel ' , (WidgetTester tester) async {
117
139
final Completer <WebViewController > controllerCompleter =
118
140
Completer <WebViewController >();
119
141
final Completer <void > pageStarted = Completer <void >();
@@ -153,11 +175,7 @@ void main() {
153
175
await pageLoaded.future;
154
176
155
177
expect (messagesReceived, isEmpty);
156
- // Append a return value "1" in the end will prevent an iOS platform exception.
157
- // See: https://github.com/flutter/flutter/issues/66318#issuecomment-701105380
158
- // TODO(cyanglaz): remove the workaround "1" in the end when the below issue is fixed.
159
- // https://github.com/flutter/flutter/issues/66318
160
- await controller.evaluateJavascript ('Echo.postMessage("hello");1;' );
178
+ await controller.runJavascript ('Echo.postMessage("hello");' );
161
179
expect (messagesReceived, equals (< String > ['hello' ]));
162
180
}, skip: Platform .isAndroid && _skipDueToIssue86757);
163
181
@@ -404,7 +422,8 @@ void main() {
404
422
WebViewController controller = await controllerCompleter.future;
405
423
await pageLoaded.future;
406
424
407
- String isPaused = await controller.evaluateJavascript ('isPaused();' );
425
+ String isPaused =
426
+ await controller.runJavascriptReturningResult ('isPaused();' );
408
427
expect (isPaused, _webviewBool (false ));
409
428
410
429
controllerCompleter = Completer <WebViewController >();
@@ -433,7 +452,7 @@ void main() {
433
452
controller = await controllerCompleter.future;
434
453
await pageLoaded.future;
435
454
436
- isPaused = await controller.evaluateJavascript ('isPaused();' );
455
+ isPaused = await controller.runJavascriptReturningResult ('isPaused();' );
437
456
expect (isPaused, _webviewBool (true ));
438
457
});
439
458
@@ -464,7 +483,8 @@ void main() {
464
483
final WebViewController controller = await controllerCompleter.future;
465
484
await pageLoaded.future;
466
485
467
- String isPaused = await controller.evaluateJavascript ('isPaused();' );
486
+ String isPaused =
487
+ await controller.runJavascriptReturningResult ('isPaused();' );
468
488
expect (isPaused, _webviewBool (false ));
469
489
470
490
pageLoaded = Completer <void >();
@@ -492,7 +512,7 @@ void main() {
492
512
493
513
await pageLoaded.future;
494
514
495
- isPaused = await controller.evaluateJavascript ('isPaused();' );
515
+ isPaused = await controller.runJavascriptReturningResult ('isPaused();' );
496
516
expect (isPaused, _webviewBool (false ));
497
517
});
498
518
@@ -542,7 +562,7 @@ void main() {
542
562
await videoPlaying.future;
543
563
544
564
String fullScreen =
545
- await controller.evaluateJavascript ('isFullScreen();' );
565
+ await controller.runJavascriptReturningResult ('isFullScreen();' );
546
566
expect (fullScreen, _webviewBool (false ));
547
567
});
548
568
@@ -594,7 +614,7 @@ void main() {
594
614
await videoPlaying.future;
595
615
596
616
String fullScreen =
597
- await controller.evaluateJavascript ('isFullScreen();' );
617
+ await controller.runJavascriptReturningResult ('isFullScreen();' );
598
618
expect (fullScreen, _webviewBool (true ));
599
619
}, skip: Platform .isAndroid);
600
620
});
@@ -660,7 +680,8 @@ void main() {
660
680
await pageStarted.future;
661
681
await pageLoaded.future;
662
682
663
- String isPaused = await controller.evaluateJavascript ('isPaused();' );
683
+ String isPaused =
684
+ await controller.runJavascriptReturningResult ('isPaused();' );
664
685
expect (isPaused, _webviewBool (false ));
665
686
666
687
controllerCompleter = Completer <WebViewController >();
@@ -694,7 +715,7 @@ void main() {
694
715
await pageStarted.future;
695
716
await pageLoaded.future;
696
717
697
- isPaused = await controller.evaluateJavascript ('isPaused();' );
718
+ isPaused = await controller.runJavascriptReturningResult ('isPaused();' );
698
719
expect (isPaused, _webviewBool (true ));
699
720
});
700
721
@@ -730,7 +751,8 @@ void main() {
730
751
await pageStarted.future;
731
752
await pageLoaded.future;
732
753
733
- String isPaused = await controller.evaluateJavascript ('isPaused();' );
754
+ String isPaused =
755
+ await controller.runJavascriptReturningResult ('isPaused();' );
734
756
expect (isPaused, _webviewBool (false ));
735
757
736
758
pageStarted = Completer <void >();
@@ -763,7 +785,7 @@ void main() {
763
785
await pageStarted.future;
764
786
await pageLoaded.future;
765
787
766
- isPaused = await controller.evaluateJavascript ('isPaused();' );
788
+ isPaused = await controller.runJavascriptReturningResult ('isPaused();' );
767
789
expect (isPaused, _webviewBool (false ));
768
790
});
769
791
});
@@ -1028,15 +1050,16 @@ void main() {
1028
1050
1029
1051
final WebViewController controller = await controllerCompleter.future;
1030
1052
await pageLoaded.future;
1031
- final String viewportRectJSON = await _evaluateJavascript (
1053
+ final String viewportRectJSON = await _runJavascriptReturningResult (
1032
1054
controller, 'JSON.stringify(viewport.getBoundingClientRect())' );
1033
1055
final Map <String , dynamic > viewportRectRelativeToViewport =
1034
1056
jsonDecode (viewportRectJSON);
1035
1057
1036
1058
// Check that the input is originally outside of the viewport.
1037
1059
1038
- final String initialInputClientRectJSON = await _evaluateJavascript (
1039
- controller, 'JSON.stringify(inputEl.getBoundingClientRect())' );
1060
+ final String initialInputClientRectJSON =
1061
+ await _runJavascriptReturningResult (
1062
+ controller, 'JSON.stringify(inputEl.getBoundingClientRect())' );
1040
1063
final Map <String , dynamic > initialInputClientRectRelativeToViewport =
1041
1064
jsonDecode (initialInputClientRectJSON);
1042
1065
@@ -1045,12 +1068,13 @@ void main() {
1045
1068
viewportRectRelativeToViewport['bottom' ],
1046
1069
isFalse);
1047
1070
1048
- await controller.evaluateJavascript ('inputEl.focus()' );
1071
+ await controller.runJavascript ('inputEl.focus()' );
1049
1072
1050
1073
// Check that focusing the input brought it into view.
1051
1074
1052
- final String lastInputClientRectJSON = await _evaluateJavascript (
1053
- controller, 'JSON.stringify(inputEl.getBoundingClientRect())' );
1075
+ final String lastInputClientRectJSON =
1076
+ await _runJavascriptReturningResult (
1077
+ controller, 'JSON.stringify(inputEl.getBoundingClientRect())' );
1054
1078
final Map <String , dynamic > lastInputClientRectRelativeToViewport =
1055
1079
jsonDecode (lastInputClientRectJSON);
1056
1080
@@ -1106,7 +1130,7 @@ void main() {
1106
1130
1107
1131
await pageLoads.stream.first; // Wait for initial page load.
1108
1132
final WebViewController controller = await controllerCompleter.future;
1109
- await controller.evaluateJavascript ('location.href = "$secondaryUrl "' );
1133
+ await controller.runJavascript ('location.href = "$secondaryUrl "' );
1110
1134
1111
1135
await pageLoads.stream.first; // Wait for the next page load.
1112
1136
final String ? currentUrl = await controller.currentUrl ();
@@ -1237,7 +1261,7 @@ void main() {
1237
1261
await pageLoads.stream.first; // Wait for initial page load.
1238
1262
final WebViewController controller = await controllerCompleter.future;
1239
1263
await controller
1240
- .evaluateJavascript ('location.href = "https://www.youtube.com/"' );
1264
+ .runJavascript ('location.href = "https://www.youtube.com/"' );
1241
1265
1242
1266
// There should never be any second page load, since our new URL is
1243
1267
// blocked. Still wait for a potential page change for some time in order
@@ -1277,7 +1301,7 @@ void main() {
1277
1301
1278
1302
await pageLoads.stream.first; // Wait for initial page load.
1279
1303
final WebViewController controller = await controllerCompleter.future;
1280
- await controller.evaluateJavascript ('location.href = "$secondaryUrl "' );
1304
+ await controller.runJavascript ('location.href = "$secondaryUrl "' );
1281
1305
1282
1306
await pageLoads.stream.first; // Wait for second page to load.
1283
1307
final String ? currentUrl = await controller.currentUrl ();
@@ -1332,7 +1356,7 @@ void main() {
1332
1356
),
1333
1357
);
1334
1358
final WebViewController controller = await controllerCompleter.future;
1335
- await controller.evaluateJavascript ('window.open("$primaryUrl ", "_blank")' );
1359
+ await controller.runJavascript ('window.open("$primaryUrl ", "_blank")' );
1336
1360
await pageLoaded.future;
1337
1361
final String ? currentUrl = await controller.currentUrl ();
1338
1362
expect (currentUrl, primaryUrl);
@@ -1368,7 +1392,7 @@ void main() {
1368
1392
await pageLoaded.future;
1369
1393
pageLoaded = Completer <void >();
1370
1394
1371
- await controller.evaluateJavascript ('window.open("$secondaryUrl ")' );
1395
+ await controller.runJavascript ('window.open("$secondaryUrl ")' );
1372
1396
await pageLoaded.future;
1373
1397
pageLoaded = Completer <void >();
1374
1398
expect (controller.currentUrl (), completion (secondaryUrl));
@@ -1382,7 +1406,7 @@ void main() {
1382
1406
);
1383
1407
1384
1408
testWidgets (
1385
- 'javascript does not run in parent window' ,
1409
+ 'JavaScript does not run in parent window' ,
1386
1410
(WidgetTester tester) async {
1387
1411
final String iframe = '''
1388
1412
<!DOCTYPE html>
@@ -1439,9 +1463,10 @@ void main() {
1439
1463
final WebViewController controller = await controllerCompleter.future;
1440
1464
await pageLoadCompleter.future;
1441
1465
1442
- expect (controller.evaluateJavascript ('iframeLoaded' ), completion ('true' ));
1466
+ expect (controller.runJavascriptReturningResult ('iframeLoaded' ),
1467
+ completion ('true' ));
1443
1468
expect (
1444
- controller.evaluateJavascript (
1469
+ controller.runJavascriptReturningResult (
1445
1470
'document.querySelector("p") && document.querySelector("p").textContent' ),
1446
1471
completion ('null' ),
1447
1472
);
@@ -1461,13 +1486,13 @@ String _webviewBool(bool value) {
1461
1486
1462
1487
/// Returns the value used for the HTTP User-Agent: request header in subsequent HTTP requests.
1463
1488
Future <String > _getUserAgent (WebViewController controller) async {
1464
- return _evaluateJavascript (controller, 'navigator.userAgent;' );
1489
+ return _runJavascriptReturningResult (controller, 'navigator.userAgent;' );
1465
1490
}
1466
1491
1467
- Future <String > _evaluateJavascript (
1492
+ Future <String > _runJavascriptReturningResult (
1468
1493
WebViewController controller, String js) async {
1469
1494
if (defaultTargetPlatform == TargetPlatform .iOS) {
1470
- return await controller.evaluateJavascript (js);
1495
+ return await controller.runJavascriptReturningResult (js);
1471
1496
}
1472
- return jsonDecode (await controller.evaluateJavascript (js));
1497
+ return jsonDecode (await controller.runJavascriptReturningResult (js));
1473
1498
}
0 commit comments