22// Use of this source code is governed by a BSD-style license that can be
33// found in the LICENSE file.
44
5+ import 'dart:async' ;
56import 'dart:typed_data' ;
67
78import 'package:flutter/widgets.dart' ;
@@ -24,6 +25,7 @@ import 'webview_android_widget_test.mocks.dart';
2425 android_webview.WebSettings ,
2526 android_webview.WebStorage ,
2627 android_webview.WebView ,
28+ android_webview.WebResourceRequest ,
2729 WebViewAndroidDownloadListener ,
2830 WebViewAndroidJavaScriptChannel ,
2931 WebViewAndroidWebChromeClient ,
@@ -843,4 +845,192 @@ void main() {
843845 verify (mockPlatformHostApi.setWebContentsDebuggingEnabled (false ));
844846 });
845847 });
848+
849+ group ('WebViewAndroidWebViewClient' , () {
850+ test (
851+ 'urlLoading should call loadUrl when onNavigationRequestCallback returns true' ,
852+ () {
853+ final Completer <void > completer = Completer <void >();
854+ final WebViewAndroidWebViewClient webViewClient =
855+ WebViewAndroidWebViewClient .handlesNavigation (
856+ onPageStartedCallback: (_) {},
857+ onPageFinishedCallback: (_) {},
858+ onWebResourceErrorCallback: (_) {},
859+ onNavigationRequestCallback: ({
860+ required bool isForMainFrame,
861+ required String url,
862+ }) =>
863+ true ,
864+ loadUrl: (String url, Map <String , String >? headers) async {
865+ completer.complete ();
866+ });
867+
868+ webViewClient.urlLoading (MockWebView (), 'https://flutter.dev' );
869+ expect (completer.isCompleted, isTrue);
870+ });
871+
872+ test (
873+ 'urlLoading should call loadUrl when onNavigationRequestCallback returns a Future true' ,
874+ () async {
875+ final Completer <void > completer = Completer <void >();
876+ final WebViewAndroidWebViewClient webViewClient =
877+ WebViewAndroidWebViewClient .handlesNavigation (
878+ onPageStartedCallback: (_) {},
879+ onPageFinishedCallback: (_) {},
880+ onWebResourceErrorCallback: (_) {},
881+ onNavigationRequestCallback: ({
882+ required bool isForMainFrame,
883+ required String url,
884+ }) =>
885+ Future <bool >.value (true ),
886+ loadUrl: (String url, Map <String , String >? headers) async {
887+ completer.complete ();
888+ });
889+
890+ webViewClient.urlLoading (MockWebView (), 'https://flutter.dev' );
891+ expect (completer.future, completes);
892+ });
893+
894+ test (
895+ 'urlLoading should not call laodUrl when onNavigationRequestCallback returns false' ,
896+ () async {
897+ final WebViewAndroidWebViewClient webViewClient =
898+ WebViewAndroidWebViewClient .handlesNavigation (
899+ onPageStartedCallback: (_) {},
900+ onPageFinishedCallback: (_) {},
901+ onWebResourceErrorCallback: (_) {},
902+ onNavigationRequestCallback: ({
903+ required bool isForMainFrame,
904+ required String url,
905+ }) =>
906+ false ,
907+ loadUrl: (String url, Map <String , String >? headers) async {
908+ fail (
909+ 'loadUrl should not be called if onNavigationRequestCallback returns false.' );
910+ });
911+
912+ webViewClient.urlLoading (MockWebView (), 'https://flutter.dev' );
913+ });
914+
915+ test (
916+ 'urlLoading should not call loadUrl when onNavigationRequestCallback returns a Future false' ,
917+ () {
918+ final WebViewAndroidWebViewClient webViewClient =
919+ WebViewAndroidWebViewClient .handlesNavigation (
920+ onPageStartedCallback: (_) {},
921+ onPageFinishedCallback: (_) {},
922+ onWebResourceErrorCallback: (_) {},
923+ onNavigationRequestCallback: ({
924+ required bool isForMainFrame,
925+ required String url,
926+ }) =>
927+ Future <bool >.value (false ),
928+ loadUrl: (String url, Map <String , String >? headers) async {
929+ fail (
930+ 'loadUrl should not be called if onNavigationRequestCallback returns false.' );
931+ });
932+
933+ webViewClient.urlLoading (MockWebView (), 'https://flutter.dev' );
934+ });
935+
936+ test (
937+ 'requestLoading should call loadUrl when onNavigationRequestCallback returns true' ,
938+ () {
939+ final Completer <void > completer = Completer <void >();
940+ final MockWebResourceRequest mockRequest = MockWebResourceRequest ();
941+ when (mockRequest.isForMainFrame).thenReturn (true );
942+ when (mockRequest.url).thenReturn ('https://flutter.dev' );
943+ final WebViewAndroidWebViewClient webViewClient =
944+ WebViewAndroidWebViewClient .handlesNavigation (
945+ onPageStartedCallback: (_) {},
946+ onPageFinishedCallback: (_) {},
947+ onWebResourceErrorCallback: (_) {},
948+ onNavigationRequestCallback: ({
949+ required bool isForMainFrame,
950+ required String url,
951+ }) =>
952+ true ,
953+ loadUrl: (String url, Map <String , String >? headers) async {
954+ expect (url, 'https://flutter.dev' );
955+ completer.complete ();
956+ });
957+
958+ webViewClient.requestLoading (MockWebView (), mockRequest);
959+ expect (completer.isCompleted, isTrue);
960+ });
961+
962+ test (
963+ 'requestLoading should call loadUrl when onNavigationRequestCallback returns a Future true' ,
964+ () async {
965+ final Completer <void > completer = Completer <void >();
966+ final MockWebResourceRequest mockRequest = MockWebResourceRequest ();
967+ when (mockRequest.isForMainFrame).thenReturn (true );
968+ when (mockRequest.url).thenReturn ('https://flutter.dev' );
969+ final WebViewAndroidWebViewClient webViewClient =
970+ WebViewAndroidWebViewClient .handlesNavigation (
971+ onPageStartedCallback: (_) {},
972+ onPageFinishedCallback: (_) {},
973+ onWebResourceErrorCallback: (_) {},
974+ onNavigationRequestCallback: ({
975+ required bool isForMainFrame,
976+ required String url,
977+ }) =>
978+ Future <bool >.value (true ),
979+ loadUrl: (String url, Map <String , String >? headers) async {
980+ expect (url, 'https://flutter.dev' );
981+ completer.complete ();
982+ });
983+
984+ webViewClient.requestLoading (MockWebView (), mockRequest);
985+ expect (completer.future, completes);
986+ });
987+
988+ test (
989+ 'requestLoading should not call loadUrl when onNavigationRequestCallback returns false' ,
990+ () {
991+ final MockWebResourceRequest mockRequest = MockWebResourceRequest ();
992+ when (mockRequest.isForMainFrame).thenReturn (true );
993+ when (mockRequest.url).thenReturn ('https://flutter.dev' );
994+ final WebViewAndroidWebViewClient webViewClient =
995+ WebViewAndroidWebViewClient .handlesNavigation (
996+ onPageStartedCallback: (_) {},
997+ onPageFinishedCallback: (_) {},
998+ onWebResourceErrorCallback: (_) {},
999+ onNavigationRequestCallback: ({
1000+ required bool isForMainFrame,
1001+ required String url,
1002+ }) =>
1003+ false ,
1004+ loadUrl: (String url, Map <String , String >? headers) {
1005+ fail (
1006+ 'loadUrl should not be called if onNavigationRequestCallback returns false.' );
1007+ });
1008+
1009+ webViewClient.requestLoading (MockWebView (), mockRequest);
1010+ });
1011+
1012+ test (
1013+ 'requestLoading should not call loadUrl when onNavigationRequestCallback returns a Future false' ,
1014+ () {
1015+ final MockWebResourceRequest mockRequest = MockWebResourceRequest ();
1016+ when (mockRequest.isForMainFrame).thenReturn (true );
1017+ when (mockRequest.url).thenReturn ('https://flutter.dev' );
1018+ final WebViewAndroidWebViewClient webViewClient =
1019+ WebViewAndroidWebViewClient .handlesNavigation (
1020+ onPageStartedCallback: (_) {},
1021+ onPageFinishedCallback: (_) {},
1022+ onWebResourceErrorCallback: (_) {},
1023+ onNavigationRequestCallback: ({
1024+ required bool isForMainFrame,
1025+ required String url,
1026+ }) =>
1027+ Future <bool >.value (false ),
1028+ loadUrl: (String url, Map <String , String >? headers) {
1029+ fail (
1030+ 'loadUrl should not be called if onNavigationRequestCallback returns false.' );
1031+ });
1032+
1033+ webViewClient.requestLoading (MockWebView (), mockRequest);
1034+ });
1035+ });
8461036}
0 commit comments