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.