Added PR feedback
diff --git a/packages/webview_flutter/webview_flutter_android/lib/src/v4/src/android_navigation_delegate.dart b/packages/webview_flutter/webview_flutter_android/lib/src/v4/src/android_navigation_delegate.dart
index 0d2630f..b40b5d8 100644
--- a/packages/webview_flutter/webview_flutter_android/lib/src/v4/src/android_navigation_delegate.dart
+++ b/packages/webview_flutter/webview_flutter_android/lib/src/v4/src/android_navigation_delegate.dart
@@ -81,7 +81,6 @@
extends PlatformNavigationDelegateCreationParams {
/// Creates a new [AndroidNavigationDelegateCreationParams] instance.
const AndroidNavigationDelegateCreationParams._({
- this.loadUrl,
@visibleForTesting this.androidWebViewProxy = const AndroidWebViewProxy(),
}) : super();
@@ -90,19 +89,14 @@
// Recommended placeholder to prevent being broken by platform interface.
// ignore: avoid_unused_constructor_parameters
PlatformNavigationDelegateCreationParams params, {
- LoadUrlCallback? loadUrl,
@visibleForTesting
AndroidWebViewProxy androidWebViewProxy = const AndroidWebViewProxy(),
}) {
return AndroidNavigationDelegateCreationParams._(
- loadUrl: loadUrl,
androidWebViewProxy: androidWebViewProxy,
);
}
- /// Callback responsible for loading the [url] after a navigation request is approved.
- final LoadUrlCallback? loadUrl;
-
/// Handles constructing objects and calling static methods for the Android WebView
/// native library.
@visibleForTesting
@@ -211,19 +205,17 @@
ProgressCallback? _onProgress;
WebResourceErrorCallback? _onWebResourceError;
NavigationRequestCallback? _onNavigationRequest;
-
- AndroidNavigationDelegateCreationParams get _androidParams =>
- params as AndroidNavigationDelegateCreationParams;
-
- bool get _handlesNavigation =>
- _onNavigationRequest != null && _androidParams.loadUrl != null;
+ LoadUrlCallback? _onLoadUrl;
void _handleNavigation(String url, Map<String, String> headers) {
- if (!_handlesNavigation) {
+ final LoadUrlCallback? onLoadUrl = _onLoadUrl;
+ final NavigationRequestCallback? onNavigationRequest = _onNavigationRequest;
+
+ if (onNavigationRequest == null || onLoadUrl == null) {
return;
}
- final FutureOr<NavigationDecision> returnValue = _onNavigationRequest!(
+ final FutureOr<NavigationDecision> returnValue = onNavigationRequest(
NavigationRequest(
isMainFrame: true,
url: url,
@@ -232,21 +224,29 @@
if (returnValue is NavigationDecision &&
returnValue == NavigationDecision.navigate) {
- _androidParams.loadUrl!(url, headers);
+ onLoadUrl(url, headers);
} else if (returnValue is Future<NavigationDecision>) {
returnValue.then((NavigationDecision shouldLoadUrl) {
if (shouldLoadUrl == NavigationDecision.navigate) {
- _androidParams.loadUrl!(url, headers);
+ onLoadUrl(url, headers);
}
});
}
}
+ /// Invoked when loading the [url] after a navigation request is approved.
+ Future<void> setOnLoadUrl(
+ LoadUrlCallback onLoadUrl,
+ ) async {
+ _onLoadUrl = onLoadUrl;
+ }
+
@override
Future<void> setOnNavigationRequest(
NavigationRequestCallback onNavigationRequest,
) async {
_onNavigationRequest = onNavigationRequest;
+ _webViewClient.setSynchronousReturnValueForShouldOverrideUrlLoading(true);
}
@override
diff --git a/packages/webview_flutter/webview_flutter_android/lib/src/v4/src/android_proxy.dart b/packages/webview_flutter/webview_flutter_android/lib/src/v4/src/android_proxy.dart
index 757397a..4a9ce19 100644
--- a/packages/webview_flutter/webview_flutter_android/lib/src/v4/src/android_proxy.dart
+++ b/packages/webview_flutter/webview_flutter_android/lib/src/v4/src/android_proxy.dart
@@ -28,7 +28,6 @@
/// Constructs a [android_webview.WebViewClient].
final android_webview.WebViewClient Function({
- bool shouldOverrideUrlLoading,
void Function(android_webview.WebView webView, String url)? onPageStarted,
void Function(android_webview.WebView webView, String url)? onPageFinished,
void Function(
diff --git a/packages/webview_flutter/webview_flutter_android/test/v4/android_navigation_delegate_test.dart b/packages/webview_flutter/webview_flutter_android/test/v4/android_navigation_delegate_test.dart
index dfde021..03b7abc 100644
--- a/packages/webview_flutter/webview_flutter_android/test/v4/android_navigation_delegate_test.dart
+++ b/packages/webview_flutter/webview_flutter_android/test/v4/android_navigation_delegate_test.dart
@@ -14,11 +14,11 @@
void main() {
group('AndroidNavigationDelegate', () {
test('onPageFinished', () {
- final AndroidNavigationDelegate webKitDelegate =
+ final AndroidNavigationDelegate androidNavigationDelegate =
AndroidNavigationDelegate(_buildCreationParams());
late final String callbackUrl;
- webKitDelegate.setOnPageFinished((String url) => callbackUrl = url);
+ androidNavigationDelegate.setOnPageFinished((String url) => callbackUrl = url);
CapturingWebViewClient.lastCreatedDelegate.onPageFinished!(
android_webview.WebView.detached(),
@@ -29,11 +29,11 @@
});
test('onPageStarted', () {
- final AndroidNavigationDelegate webKitDelegate =
+ final AndroidNavigationDelegate androidNavigationDelegate =
AndroidNavigationDelegate(_buildCreationParams());
late final String callbackUrl;
- webKitDelegate.setOnPageStarted((String url) => callbackUrl = url);
+ androidNavigationDelegate.setOnPageStarted((String url) => callbackUrl = url);
CapturingWebViewClient.lastCreatedDelegate.onPageStarted!(
android_webview.WebView.detached(),
@@ -44,11 +44,11 @@
});
test('onWebResourceError from onReceivedRequestError', () {
- final AndroidNavigationDelegate webKitDelegate =
+ final AndroidNavigationDelegate androidNavigationDelegate =
AndroidNavigationDelegate(_buildCreationParams());
late final WebResourceError callbackError;
- webKitDelegate.setOnWebResourceError(
+ androidNavigationDelegate.setOnWebResourceError(
(WebResourceError error) => callbackError = error);
CapturingWebViewClient.lastCreatedDelegate.onReceivedRequestError!(
@@ -74,11 +74,11 @@
});
test('onWebResourceError from onRequestError', () {
- final AndroidNavigationDelegate webKitDelegate =
+ final AndroidNavigationDelegate androidNavigationDelegate =
AndroidNavigationDelegate(_buildCreationParams());
late final WebResourceError callbackError;
- webKitDelegate.setOnWebResourceError(
+ androidNavigationDelegate.setOnWebResourceError(
(WebResourceError error) => callbackError = error);
CapturingWebViewClient.lastCreatedDelegate.onReceivedError!(
@@ -97,11 +97,11 @@
test(
'onNavigationRequest from requestLoading should not be called when loadUrlCallback is not specified',
() {
- final AndroidNavigationDelegate webKitDelegate =
+ final AndroidNavigationDelegate androidNavigationDelegate =
AndroidNavigationDelegate(_buildCreationParams());
NavigationRequest? callbackNavigationRequest;
- webKitDelegate
+ androidNavigationDelegate
.setOnNavigationRequest((NavigationRequest navigationRequest) {
callbackNavigationRequest = navigationRequest;
return NavigationDecision.prevent;
@@ -126,13 +126,16 @@
'onLoadUrl from requestLoading should not be called when navigationRequestCallback is not specified',
() {
final Completer<void> completer = Completer<void>();
- AndroidNavigationDelegate(_buildCreationParams(loadUrlCallback: (
+ final AndroidNavigationDelegate androidNavigationDelegate = AndroidNavigationDelegate(_buildCreationParams());
+
+ androidNavigationDelegate.setOnLoadUrl((
String url,
Map<String, String>? headers,
) {
completer.complete();
return completer.future;
- }));
+ });
+
CapturingWebViewClient.lastCreatedDelegate.requestLoading!(
android_webview.WebView.detached(),
@@ -153,17 +156,19 @@
'onLoadUrl from requestLoading should not be called when onNavigationRequestCallback returns NavigationDecision.prevent',
() {
final Completer<void> completer = Completer<void>();
- final AndroidNavigationDelegate webKitDelegate =
- AndroidNavigationDelegate(_buildCreationParams(loadUrlCallback: (
+ final AndroidNavigationDelegate androidNavigationDelegate =
+ AndroidNavigationDelegate(_buildCreationParams());
+
+ androidNavigationDelegate.setOnLoadUrl((
String url,
Map<String, String>? headers,
) {
completer.complete();
return completer.future;
- }));
+ });
late final NavigationRequest callbackNavigationRequest;
- webKitDelegate
+ androidNavigationDelegate
.setOnNavigationRequest((NavigationRequest navigationRequest) {
callbackNavigationRequest = navigationRequest;
return NavigationDecision.prevent;
@@ -192,8 +197,10 @@
final Completer<void> completer = Completer<void>();
late final String loadUrlCallbackUrl;
late final Map<String, String>? loadUrlCallbackHeaders;
- final AndroidNavigationDelegate webKitDelegate =
- AndroidNavigationDelegate(_buildCreationParams(loadUrlCallback: (
+ final AndroidNavigationDelegate androidNavigationDelegate =
+ AndroidNavigationDelegate(_buildCreationParams());
+
+ androidNavigationDelegate.setOnLoadUrl((
String url,
Map<String, String>? headers,
) {
@@ -201,10 +208,10 @@
loadUrlCallbackHeaders = headers;
completer.complete();
return completer.future;
- }));
+ });
late final NavigationRequest callbackNavigationRequest;
- webKitDelegate
+ androidNavigationDelegate
.setOnNavigationRequest((NavigationRequest navigationRequest) {
callbackNavigationRequest = navigationRequest;
return NavigationDecision.navigate;
@@ -232,11 +239,11 @@
test(
'onNavigationRequest from urlLoading should not be called when loadUrlCallback is not specified',
() {
- final AndroidNavigationDelegate webKitDelegate =
+ final AndroidNavigationDelegate androidNavigationDelegate =
AndroidNavigationDelegate(_buildCreationParams());
NavigationRequest? callbackNavigationRequest;
- webKitDelegate
+ androidNavigationDelegate
.setOnNavigationRequest((NavigationRequest navigationRequest) {
callbackNavigationRequest = navigationRequest;
return NavigationDecision.prevent;
@@ -254,13 +261,15 @@
'onLoadUrl from urlLoading should not be called when navigationRequestCallback is not specified',
() {
final Completer<void> completer = Completer<void>();
- AndroidNavigationDelegate(_buildCreationParams(loadUrlCallback: (
+ final AndroidNavigationDelegate androidNavigationDelegate = AndroidNavigationDelegate(_buildCreationParams());
+
+ androidNavigationDelegate.setOnLoadUrl((
String url,
Map<String, String>? headers,
) {
completer.complete();
return completer.future;
- }));
+ });
CapturingWebViewClient.lastCreatedDelegate.urlLoading!(
android_webview.WebView.detached(),
@@ -274,17 +283,19 @@
'onLoadUrl from urlLoading should not be called when onNavigationRequestCallback returns NavigationDecision.prevent',
() {
final Completer<void> completer = Completer<void>();
- final AndroidNavigationDelegate webKitDelegate =
- AndroidNavigationDelegate(_buildCreationParams(loadUrlCallback: (
+ final AndroidNavigationDelegate androidNavigationDelegate =
+ AndroidNavigationDelegate(_buildCreationParams());
+
+ androidNavigationDelegate.setOnLoadUrl((
String url,
Map<String, String>? headers,
) {
completer.complete();
return completer.future;
- }));
+ });
late final NavigationRequest callbackNavigationRequest;
- webKitDelegate
+ androidNavigationDelegate
.setOnNavigationRequest((NavigationRequest navigationRequest) {
callbackNavigationRequest = navigationRequest;
return NavigationDecision.prevent;
@@ -306,8 +317,10 @@
final Completer<void> completer = Completer<void>();
late final String loadUrlCallbackUrl;
late final Map<String, String>? loadUrlCallbackHeaders;
- final AndroidNavigationDelegate webKitDelegate =
- AndroidNavigationDelegate(_buildCreationParams(loadUrlCallback: (
+ final AndroidNavigationDelegate androidNavigationDelegate =
+ AndroidNavigationDelegate(_buildCreationParams());
+
+ androidNavigationDelegate.setOnLoadUrl((
String url,
Map<String, String>? headers,
) {
@@ -315,10 +328,10 @@
loadUrlCallbackHeaders = headers;
completer.complete();
return completer.future;
- }));
+ });
late final NavigationRequest callbackNavigationRequest;
- webKitDelegate
+ androidNavigationDelegate
.setOnNavigationRequest((NavigationRequest navigationRequest) {
callbackNavigationRequest = navigationRequest;
return NavigationDecision.navigate;
@@ -336,12 +349,23 @@
expect(completer.isCompleted, true);
});
- test('setOnProgress', () {
- final AndroidNavigationDelegate webKitDelegate =
+ test('setOnNavigationRequest should override URL loading', () {
+ final AndroidNavigationDelegate androidNavigationDelegate =
+ AndroidNavigationDelegate(_buildCreationParams());
+
+ androidNavigationDelegate.setOnNavigationRequest(
+ (NavigationRequest request) => NavigationDecision.navigate,
+ );
+
+ expect(CapturingWebViewClient.lastCreatedDelegate.synchronousReturnValueForShouldOverrideUrlLoading, isTrue);
+ });
+
+ test('onProgress', () {
+ final AndroidNavigationDelegate androidNavigationDelegate =
AndroidNavigationDelegate(_buildCreationParams());
late final int callbackProgress;
- webKitDelegate
+ androidNavigationDelegate
.setOnProgress((int progress) => callbackProgress = progress);
CapturingWebChromeClient.lastCreatedDelegate.onProgressChanged!(
@@ -354,13 +378,10 @@
});
}
-AndroidNavigationDelegateCreationParams _buildCreationParams({
- LoadUrlCallback? loadUrlCallback,
-}) {
+AndroidNavigationDelegateCreationParams _buildCreationParams() {
return AndroidNavigationDelegateCreationParams
.fromPlatformNavigationDelegateCreationParams(
const PlatformNavigationDelegateCreationParams(),
- loadUrl: loadUrlCallback,
androidWebViewProxy: const AndroidWebViewProxy(
createAndroidWebChromeClient: CapturingWebChromeClient.new,
createAndroidWebViewClient: CapturingWebViewClient.new,
@@ -376,12 +397,19 @@
super.onReceivedError,
super.onReceivedRequestError,
super.requestLoading,
- super.shouldOverrideUrlLoading,
super.urlLoading,
}) : super.detached() {
lastCreatedDelegate = this;
}
+
static CapturingWebViewClient lastCreatedDelegate = CapturingWebViewClient();
+
+ bool synchronousReturnValueForShouldOverrideUrlLoading = false;
+
+ @override
+ Future<void> setSynchronousReturnValueForShouldOverrideUrlLoading(bool value) async {
+ synchronousReturnValueForShouldOverrideUrlLoading = value;
+ }
}
// Records the last created instance of itself.