44
55package io .flutter .plugins .webviewflutter ;
66
7+ import android .annotation .SuppressLint ;
78import android .annotation .TargetApi ;
89import android .graphics .Bitmap ;
910import android .os .Build ;
1011import android .util .Log ;
1112import android .view .KeyEvent ;
13+ import android .webkit .WebResourceError ;
1214import android .webkit .WebResourceRequest ;
1315import android .webkit .WebView ;
1416import android .webkit .WebViewClient ;
17+ import androidx .webkit .WebResourceErrorCompat ;
1518import androidx .webkit .WebViewClientCompat ;
1619import io .flutter .plugin .common .MethodChannel ;
1720import java .util .HashMap ;
21+ import java .util .Locale ;
1822import java .util .Map ;
1923
2024// We need to use WebViewClientCompat to get
@@ -30,6 +34,47 @@ class FlutterWebViewClient {
3034 this .methodChannel = methodChannel ;
3135 }
3236
37+ private static String errorCodeToString (int errorCode ) {
38+ switch (errorCode ) {
39+ case WebViewClient .ERROR_AUTHENTICATION :
40+ return "authentication" ;
41+ case WebViewClient .ERROR_BAD_URL :
42+ return "badUrl" ;
43+ case WebViewClient .ERROR_CONNECT :
44+ return "connect" ;
45+ case WebViewClient .ERROR_FAILED_SSL_HANDSHAKE :
46+ return "failedSslHandshake" ;
47+ case WebViewClient .ERROR_FILE :
48+ return "file" ;
49+ case WebViewClient .ERROR_FILE_NOT_FOUND :
50+ return "fileNotFound" ;
51+ case WebViewClient .ERROR_HOST_LOOKUP :
52+ return "hostLookup" ;
53+ case WebViewClient .ERROR_IO :
54+ return "io" ;
55+ case WebViewClient .ERROR_PROXY_AUTHENTICATION :
56+ return "proxyAuthentication" ;
57+ case WebViewClient .ERROR_REDIRECT_LOOP :
58+ return "redirectLoop" ;
59+ case WebViewClient .ERROR_TIMEOUT :
60+ return "timeout" ;
61+ case WebViewClient .ERROR_TOO_MANY_REQUESTS :
62+ return "tooManyRequests" ;
63+ case WebViewClient .ERROR_UNKNOWN :
64+ return "unknown" ;
65+ case WebViewClient .ERROR_UNSAFE_RESOURCE :
66+ return "unsafeResource" ;
67+ case WebViewClient .ERROR_UNSUPPORTED_AUTH_SCHEME :
68+ return "unsupportedAuthScheme" ;
69+ case WebViewClient .ERROR_UNSUPPORTED_SCHEME :
70+ return "unsupportedScheme" ;
71+ }
72+
73+ final String message =
74+ String .format (Locale .getDefault (), "Could not find a string for errorCode: %d" , errorCode );
75+ throw new IllegalArgumentException (message );
76+ }
77+
3378 @ TargetApi (Build .VERSION_CODES .LOLLIPOP )
3479 private boolean shouldOverrideUrlLoading (WebView view , WebResourceRequest request ) {
3580 if (!hasNavigationDelegate ) {
@@ -79,6 +124,14 @@ private void onPageFinished(WebView view, String url) {
79124 methodChannel .invokeMethod ("onPageFinished" , args );
80125 }
81126
127+ private void onWebResourceError (final int errorCode , final String description ) {
128+ final Map <String , Object > args = new HashMap <>();
129+ args .put ("errorCode" , errorCode );
130+ args .put ("description" , description );
131+ args .put ("errorType" , FlutterWebViewClient .errorCodeToString (errorCode ));
132+ methodChannel .invokeMethod ("onWebResourceError" , args );
133+ }
134+
82135 private void notifyOnNavigationRequest (
83136 String url , Map <String , String > headers , WebView webview , boolean isMainFrame ) {
84137 HashMap <String , Object > args = new HashMap <>();
@@ -123,6 +176,20 @@ public void onPageFinished(WebView view, String url) {
123176 FlutterWebViewClient .this .onPageFinished (view , url );
124177 }
125178
179+ @ TargetApi (Build .VERSION_CODES .M )
180+ @ Override
181+ public void onReceivedError (
182+ WebView view , WebResourceRequest request , WebResourceError error ) {
183+ FlutterWebViewClient .this .onWebResourceError (
184+ error .getErrorCode (), error .getDescription ().toString ());
185+ }
186+
187+ @ Override
188+ public void onReceivedError (
189+ WebView view , int errorCode , String description , String failingUrl ) {
190+ FlutterWebViewClient .this .onWebResourceError (errorCode , description );
191+ }
192+
126193 @ Override
127194 public void onUnhandledKeyEvent (WebView view , KeyEvent event ) {
128195 // Deliberately empty. Occasionally the webview will mark events as having failed to be
@@ -154,6 +221,22 @@ public void onPageFinished(WebView view, String url) {
154221 FlutterWebViewClient .this .onPageFinished (view , url );
155222 }
156223
224+ // This method is only called when the WebViewFeature.RECEIVE_WEB_RESOURCE_ERROR feature is
225+ // enabled. The deprecated method is called when a device doesn't support this.
226+ @ SuppressLint ("RequiresFeature" )
227+ @ Override
228+ public void onReceivedError (
229+ WebView view , WebResourceRequest request , WebResourceErrorCompat error ) {
230+ FlutterWebViewClient .this .onWebResourceError (
231+ error .getErrorCode (), error .getDescription ().toString ());
232+ }
233+
234+ @ Override
235+ public void onReceivedError (
236+ WebView view , int errorCode , String description , String failingUrl ) {
237+ FlutterWebViewClient .this .onWebResourceError (errorCode , description );
238+ }
239+
157240 @ Override
158241 public void onUnhandledKeyEvent (WebView view , KeyEvent event ) {
159242 // Deliberately empty. Occasionally the webview will mark events as having failed to be
0 commit comments