[webview_flutter] Only call onWebResourceError for main frame (#3078)
diff --git a/packages/webview_flutter/webview_flutter/CHANGELOG.md b/packages/webview_flutter/webview_flutter/CHANGELOG.md
index fcfaf4e..df7d9cb 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/android/src/main/java/io/flutter/plugins/webviewflutter/FlutterWebViewClient.java b/packages/webview_flutter/webview_flutter/android/src/main/java/io/flutter/plugins/webviewflutter/FlutterWebViewClient.java
index 4e7056f..adc8467 100644
--- a/packages/webview_flutter/webview_flutter/android/src/main/java/io/flutter/plugins/webviewflutter/FlutterWebViewClient.java
+++ b/packages/webview_flutter/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;
@@ -192,8 +193,10 @@
@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
@@ -239,9 +242,13 @@
@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/webview_flutter/example/integration_test/webview_flutter_test.dart b/packages/webview_flutter/webview_flutter/example/integration_test/webview_flutter_test.dart
index 876f961..f3eeee1 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 @@
(WidgetTester tester) async {
final Completer<WebResourceError> errorCompleter =
Completer<WebResourceError>();
+ final Completer<void> pageFinishCompleter = Completer<void>();
await tester.pumpWidget(
Directionality(
@@ -1150,13 +1151,56 @@
onWebResourceError: (WebResourceError error) {
errorCompleter.complete(error);
},
+ onPageFinished: (_) => pageFinishCompleter.complete(),
),
),
);
expect(errorCompleter.future, doesNotComplete);
+ await pageFinishCompleter.future;
});
+ testWidgets(
+ 'onWebResourceError only called for main frame',
+ (WidgetTester tester) async {
+ final String iframeTest = '''
+ <!DOCTYPE html>
+ <html>
+ <head>
+ <title>WebResourceError test</title>
+ </head>
+ <body>
+ <iframe src="https://notawebsite..com"></iframe>
+ </body>
+ </html>
+ ''';
+ final String iframeTestBase64 =
+ base64Encode(const Utf8Encoder().convert(iframeTest));
+
+ final Completer<WebResourceError> errorCompleter =
+ Completer<WebResourceError>();
+ final Completer<void> pageFinishCompleter = Completer<void>();
+
+ 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);
+ },
+ onPageFinished: (_) => pageFinishCompleter.complete(),
+ ),
+ ),
+ );
+
+ expect(errorCompleter.future, doesNotComplete);
+ await pageFinishCompleter.future;
+ },
+ );
+
testWidgets('can block requests', (WidgetTester tester) async {
final Completer<WebViewController> controllerCompleter =
Completer<WebViewController>();
diff --git a/packages/webview_flutter/webview_flutter/lib/webview_flutter.dart b/packages/webview_flutter/webview_flutter/lib/webview_flutter.dart
index 74d8af8..398ac87 100644
--- a/packages/webview_flutter/webview_flutter/lib/webview_flutter.dart
+++ b/packages/webview_flutter/webview_flutter/lib/webview_flutter.dart
@@ -369,8 +369,7 @@
/// 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.
diff --git a/packages/webview_flutter/webview_flutter/pubspec.yaml b/packages/webview_flutter/webview_flutter/pubspec.yaml
index 2f00071..cc5d9cd 100644
--- a/packages/webview_flutter/webview_flutter/pubspec.yaml
+++ b/packages/webview_flutter/webview_flutter/pubspec.yaml
@@ -2,7 +2,7 @@
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"