2
2
// Use of this source code is governed by a BSD-style license that can be
3
3
// found in the LICENSE file.
4
4
5
+ import 'dart:async' ;
5
6
import 'dart:typed_data' ;
6
7
7
8
import 'package:flutter/widgets.dart' ;
@@ -24,6 +25,7 @@ import 'webview_android_widget_test.mocks.dart';
24
25
android_webview.WebSettings ,
25
26
android_webview.WebStorage ,
26
27
android_webview.WebView ,
28
+ android_webview.WebResourceRequest ,
27
29
WebViewAndroidDownloadListener ,
28
30
WebViewAndroidJavaScriptChannel ,
29
31
WebViewAndroidWebChromeClient ,
@@ -843,4 +845,192 @@ void main() {
843
845
verify (mockPlatformHostApi.setWebContentsDebuggingEnabled (false ));
844
846
});
845
847
});
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
+ });
846
1036
}
0 commit comments