From 0f98055f2bd68f1fc63e4fc3b118199297786180 Mon Sep 17 00:00:00 2001 From: Maurice Parrish Date: Wed, 23 Sep 2020 20:53:38 -0700 Subject: [PATCH 1/6] Only call onWebResourceError for main frame --- .../webviewflutter/FlutterWebViewClient.java | 17 +++++--- .../webview_flutter_test.dart | 39 +++++++++++++++++++ 2 files changed, 51 insertions(+), 5 deletions(-) diff --git a/packages/webview_flutter/android/src/main/java/io/flutter/plugins/webviewflutter/FlutterWebViewClient.java b/packages/webview_flutter/android/src/main/java/io/flutter/plugins/webviewflutter/FlutterWebViewClient.java index 24926bfc4117..5cad8c9bb939 100644 --- a/packages/webview_flutter/android/src/main/java/io/flutter/plugins/webviewflutter/FlutterWebViewClient.java +++ b/packages/webview_flutter/android/src/main/java/io/flutter/plugins/webviewflutter/FlutterWebViewClient.java @@ -14,6 +14,7 @@ import android.webkit.WebResourceRequest; import android.webkit.WebView; import android.webkit.WebViewClient; +import androidx.annotation.NonNull; import androidx.annotation.RequiresApi; import androidx.webkit.WebResourceErrorCompat; import androidx.webkit.WebViewClientCompat; @@ -183,8 +184,10 @@ public void onPageFinished(WebView view, String url) { @Override public void onReceivedError( WebView view, WebResourceRequest request, WebResourceError error) { - FlutterWebViewClient.this.onWebResourceError( - error.getErrorCode(), error.getDescription().toString(), request.getUrl().toString()); + if (request.isForMainFrame()) { + FlutterWebViewClient.this.onWebResourceError( + error.getErrorCode(), error.getDescription().toString(), request.getUrl().toString()); + } } @Override @@ -230,9 +233,13 @@ public void onPageFinished(WebView view, String url) { @SuppressLint("RequiresFeature") @Override public void onReceivedError( - WebView view, WebResourceRequest request, WebResourceErrorCompat error) { - FlutterWebViewClient.this.onWebResourceError( - error.getErrorCode(), error.getDescription().toString(), request.getUrl().toString()); + @NonNull WebView view, + @NonNull WebResourceRequest request, + @NonNull WebResourceErrorCompat error) { + if (request.isForMainFrame()) { + FlutterWebViewClient.this.onWebResourceError( + error.getErrorCode(), error.getDescription().toString(), request.getUrl().toString()); + } } @Override diff --git a/packages/webview_flutter/example/integration_test/webview_flutter_test.dart b/packages/webview_flutter/example/integration_test/webview_flutter_test.dart index 53fc991c48f2..a498246e758d 100644 --- a/packages/webview_flutter/example/integration_test/webview_flutter_test.dart +++ b/packages/webview_flutter/example/integration_test/webview_flutter_test.dart @@ -699,6 +699,45 @@ void main() { expect(errorCompleter.future, doesNotComplete); }); + testWidgets( + 'onWebResourceError only called for main frame', + (WidgetTester tester) async { + final String iframeTest = ''' + + + + WebResourceError test + + + + + + '''; + final String iframeTestBase64 = + base64Encode(const Utf8Encoder().convert(iframeTest)); + + final Completer errorCompleter = + Completer(); + + await tester.pumpWidget( + Directionality( + textDirection: TextDirection.ltr, + child: WebView( + key: GlobalKey(), + initialUrl: + 'data:text/html;charset=utf-8;base64,$iframeTestBase64', + onWebResourceError: (WebResourceError error) { + errorCompleter.complete(error); + }, + ), + ), + ); + + expect(errorCompleter.future, doesNotComplete); + await Future.delayed(Duration(seconds: 5)); + }, + ); + testWidgets('can block requests', (WidgetTester tester) async { final Completer controllerCompleter = Completer(); From 1989ef53b0c792df4d5301988e7f43420145bba3 Mon Sep 17 00:00:00 2001 From: Maurice Parrish Date: Thu, 24 Sep 2020 07:51:17 -0700 Subject: [PATCH 2/6] add wait to doesNotComplete --- .../example/integration_test/webview_flutter_test.dart | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/webview_flutter/example/integration_test/webview_flutter_test.dart b/packages/webview_flutter/example/integration_test/webview_flutter_test.dart index a498246e758d..766865ea2665 100644 --- a/packages/webview_flutter/example/integration_test/webview_flutter_test.dart +++ b/packages/webview_flutter/example/integration_test/webview_flutter_test.dart @@ -697,6 +697,7 @@ void main() { ); expect(errorCompleter.future, doesNotComplete); + await Future.delayed(Duration(seconds: 5)); }); testWidgets( From 98caa90f38e5722ad9660eaa26140eb25727bba3 Mon Sep 17 00:00:00 2001 From: Maurice Parrish Date: Thu, 24 Sep 2020 07:53:51 -0700 Subject: [PATCH 3/6] Update docs --- packages/webview_flutter/lib/webview_flutter.dart | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/packages/webview_flutter/lib/webview_flutter.dart b/packages/webview_flutter/lib/webview_flutter.dart index 2635b0446fa2..11a5e42fa3df 100644 --- a/packages/webview_flutter/lib/webview_flutter.dart +++ b/packages/webview_flutter/lib/webview_flutter.dart @@ -283,8 +283,7 @@ class WebView extends StatefulWidget { /// Invoked when a web resource has failed to load. /// - /// This can be called for any resource (iframe, image, etc.), not just for - /// the main page. + /// This callback is only called for the main page. final WebResourceErrorCallback onWebResourceError; /// Controls whether WebView debugging is enabled. From d6fd3f39534081cf5c33cefb887b0ce64ef8cbbf Mon Sep 17 00:00:00 2001 From: Maurice Parrish Date: Thu, 5 Aug 2021 09:33:48 -0700 Subject: [PATCH 4/6] add comment for wait --- .../example/integration_test/webview_flutter_test.dart | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/webview_flutter/webview_flutter/example/integration_test/webview_flutter_test.dart b/packages/webview_flutter/webview_flutter/example/integration_test/webview_flutter_test.dart index f154b3dc45da..63324ef736fa 100644 --- a/packages/webview_flutter/webview_flutter/example/integration_test/webview_flutter_test.dart +++ b/packages/webview_flutter/webview_flutter/example/integration_test/webview_flutter_test.dart @@ -1155,7 +1155,9 @@ void main() { ); expect(errorCompleter.future, doesNotComplete); - await Future.delayed(Duration(seconds: 5)); + // Since an error can occur after the main page is finish loading, this + // waits to guarantee that an error never occurs. + await Future.delayed(Duration(seconds: 2)); }); testWidgets( @@ -1193,7 +1195,9 @@ void main() { ); expect(errorCompleter.future, doesNotComplete); - await Future.delayed(Duration(seconds: 5)); + // Since an error can occur after the main page is finish loading, this + // waits to guarantee that an error never occurs. + await Future.delayed(Duration(seconds: 2)); }, ); From 6b2f10ef8ec3f554de1b87a68a55526fe8541c20 Mon Sep 17 00:00:00 2001 From: Maurice Parrish Date: Thu, 5 Aug 2021 09:48:39 -0700 Subject: [PATCH 5/6] wait for page to finish --- .../integration_test/webview_flutter_test.dart | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/webview_flutter/webview_flutter/example/integration_test/webview_flutter_test.dart b/packages/webview_flutter/webview_flutter/example/integration_test/webview_flutter_test.dart index 63324ef736fa..f3eeee156421 100644 --- a/packages/webview_flutter/webview_flutter/example/integration_test/webview_flutter_test.dart +++ b/packages/webview_flutter/webview_flutter/example/integration_test/webview_flutter_test.dart @@ -1139,6 +1139,7 @@ void main() { (WidgetTester tester) async { final Completer errorCompleter = Completer(); + final Completer pageFinishCompleter = Completer(); await tester.pumpWidget( Directionality( @@ -1150,14 +1151,13 @@ void main() { onWebResourceError: (WebResourceError error) { errorCompleter.complete(error); }, + onPageFinished: (_) => pageFinishCompleter.complete(), ), ), ); expect(errorCompleter.future, doesNotComplete); - // Since an error can occur after the main page is finish loading, this - // waits to guarantee that an error never occurs. - await Future.delayed(Duration(seconds: 2)); + await pageFinishCompleter.future; }); testWidgets( @@ -1179,6 +1179,7 @@ void main() { final Completer errorCompleter = Completer(); + final Completer pageFinishCompleter = Completer(); await tester.pumpWidget( Directionality( @@ -1190,14 +1191,13 @@ void main() { onWebResourceError: (WebResourceError error) { errorCompleter.complete(error); }, + onPageFinished: (_) => pageFinishCompleter.complete(), ), ), ); expect(errorCompleter.future, doesNotComplete); - // Since an error can occur after the main page is finish loading, this - // waits to guarantee that an error never occurs. - await Future.delayed(Duration(seconds: 2)); + await pageFinishCompleter.future; }, ); From a5fd63453073ec8e67a6a17bdfaa91614f77bb30 Mon Sep 17 00:00:00 2001 From: Maurice Parrish Date: Thu, 5 Aug 2021 09:54:54 -0700 Subject: [PATCH 6/6] version bump --- packages/webview_flutter/webview_flutter/CHANGELOG.md | 4 +++- packages/webview_flutter/webview_flutter/pubspec.yaml | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/packages/webview_flutter/webview_flutter/CHANGELOG.md b/packages/webview_flutter/webview_flutter/CHANGELOG.md index fcfaf4e5720d..df7d9cb87457 100644 --- a/packages/webview_flutter/webview_flutter/CHANGELOG.md +++ b/packages/webview_flutter/webview_flutter/CHANGELOG.md @@ -1,6 +1,8 @@ -## NEXT +## 2.0.12 * Improved the documentation on using the different Android Platform View modes. +* So that Android and iOS behave the same, `onWebResourceError` is now only called for the main + page. ## 2.0.11 diff --git a/packages/webview_flutter/webview_flutter/pubspec.yaml b/packages/webview_flutter/webview_flutter/pubspec.yaml index 2f00071e772e..cc5d9cdc8b96 100644 --- a/packages/webview_flutter/webview_flutter/pubspec.yaml +++ b/packages/webview_flutter/webview_flutter/pubspec.yaml @@ -2,7 +2,7 @@ name: webview_flutter description: A Flutter plugin that provides a WebView widget on Android and iOS. repository: https://github.com/flutter/plugins/tree/master/packages/webview_flutter/webview_flutter issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+webview%22 -version: 2.0.11 +version: 2.0.12 environment: sdk: ">=2.12.0 <3.0.0"