[webview_flutter] Adds type definitions for common callback signatures in the navigation delegate (#6457)
diff --git a/packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/platform_navigation_delegate.dart b/packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/platform_navigation_delegate.dart index a66f1de..2df6cff 100644 --- a/packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/platform_navigation_delegate.dart +++ b/packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/platform_navigation_delegate.dart
@@ -9,6 +9,19 @@ import 'webview_platform.dart'; +/// Signature for callbacks that report a pending navigation request. +typedef NavigationRequestCallback = FutureOr<NavigationDecision> Function( + NavigationRequest navigationRequest); + +/// Signature for callbacks that report page events triggered by the native web view. +typedef PageEventCallback = void Function(String url); + +/// Signature for callbacks that report loading progress of a page. +typedef ProgressCallback = void Function(int progress); + +/// Signature for callbacks that report a resource loading error. +typedef WebResourceErrorCallback = void Function(WebResourceError error); + /// An interface defining navigation events that occur on the native platform. /// /// The [PlatformWebViewController] is notifying this delegate on events that @@ -40,8 +53,7 @@ /// /// See [PlatformWebViewController.setPlatformNavigationDelegate]. Future<void> setOnNavigationRequest( - FutureOr<bool> Function({required String url, required bool isForMainFrame}) - onNavigationRequest, + NavigationRequestCallback onNavigationRequest, ) { throw UnimplementedError( 'setOnNavigationRequest is not implemented on the current platform.'); @@ -51,7 +63,7 @@ /// /// See [PlatformWebViewController.setPlatformNavigationDelegate]. Future<void> setOnPageStarted( - void Function(String url) onPageStarted, + PageEventCallback onPageStarted, ) { throw UnimplementedError( 'setOnPageStarted is not implemented on the current platform.'); @@ -61,7 +73,7 @@ /// /// See [PlatformWebViewController.setPlatformNavigationDelegate]. Future<void> setOnPageFinished( - void Function(String url) onPageFinished, + PageEventCallback onPageFinished, ) { throw UnimplementedError( 'setOnPageFinished is not implemented on the current platform.'); @@ -71,7 +83,7 @@ /// /// See [PlatformWebViewController.setPlatformNavigationDelegate]. Future<void> setOnProgress( - void Function(int progress) onProgress, + ProgressCallback onProgress, ) { throw UnimplementedError( 'setOnProgress is not implemented on the current platform.'); @@ -81,7 +93,7 @@ /// /// See [PlatformWebViewController.setPlatformNavigationDelegate]. Future<void> setOnWebResourceError( - void Function(WebResourceError error) onWebResourceError, + WebResourceErrorCallback onWebResourceError, ) { throw UnimplementedError( 'setOnWebResourceError is not implemented on the current platform.');
diff --git a/packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/types/navigation_decision.dart b/packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/types/navigation_decision.dart new file mode 100644 index 0000000..d8178ac --- /dev/null +++ b/packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/types/navigation_decision.dart
@@ -0,0 +1,12 @@ +// Copyright 2013 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +/// A decision on how to handle a navigation request. +enum NavigationDecision { + /// Prevent the navigation from taking place. + prevent, + + /// Allow the navigation to take place. + navigate, +}
diff --git a/packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/types/navigation_request.dart b/packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/types/navigation_request.dart new file mode 100644 index 0000000..ee3f1f9 --- /dev/null +++ b/packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/types/navigation_request.dart
@@ -0,0 +1,18 @@ +// Copyright 2013 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +/// Defines the parameters of the pending navigation callback. +class NavigationRequest { + /// Creates a [NavigationRequest]. + const NavigationRequest({ + required this.url, + required this.isMainFrame, + }); + + /// The URL of the pending navigation request. + final String url; + + /// Indicates whether the request was made in the web site's main frame or a subframe. + final bool isMainFrame; +}
diff --git a/packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/types/types.dart b/packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/types/types.dart index 05504ff..4df8800 100644 --- a/packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/types/types.dart +++ b/packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/types/types.dart
@@ -5,6 +5,8 @@ export 'javascript_message.dart'; export 'javascript_mode.dart'; export 'load_request_params.dart'; +export 'navigation_decision.dart'; +export 'navigation_request.dart'; export 'platform_navigation_delegate_creation_params.dart'; export 'platform_webview_controller_creation_params.dart'; export 'platform_webview_cookie_manager_creation_params.dart';
diff --git a/packages/webview_flutter/webview_flutter_platform_interface/pubspec.yaml b/packages/webview_flutter/webview_flutter_platform_interface/pubspec.yaml index 5b98154..ac84b33 100644 --- a/packages/webview_flutter/webview_flutter_platform_interface/pubspec.yaml +++ b/packages/webview_flutter/webview_flutter_platform_interface/pubspec.yaml
@@ -5,6 +5,7 @@ # NOTE: We strongly prefer non-breaking changes, even at the expense of a # less-clean API. See https://flutter.dev/go/platform-interface-breaking-changes version: 1.9.3 +publish_to: none environment: sdk: ">=2.12.0 <3.0.0"
diff --git a/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/platform_navigation_delegate_test.dart b/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/platform_navigation_delegate_test.dart index dd4a26c..a9f6151 100644 --- a/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/platform_navigation_delegate_test.dart +++ b/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/platform_navigation_delegate_test.dart
@@ -61,7 +61,7 @@ expect( () => callbackDelegate.setOnNavigationRequest( - ({required bool isForMainFrame, required String url}) => true), + (NavigationRequest navigationRequest) => NavigationDecision.navigate), throwsUnimplementedError, ); });
diff --git a/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/platform_webview_controller_test.mocks.dart b/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/platform_webview_controller_test.mocks.dart index 47e6737..79e5365 100644 --- a/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/platform_webview_controller_test.mocks.dart +++ b/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/platform_webview_controller_test.mocks.dart
@@ -38,31 +38,30 @@ as _i2.PlatformNavigationDelegateCreationParams); @override _i4.Future<void> setOnNavigationRequest( - _i4.FutureOr<bool> Function({bool isForMainFrame, String url})? - onNavigationRequest) => + _i3.NavigationRequestCallback? onNavigationRequest) => (super.noSuchMethod( Invocation.method(#setOnNavigationRequest, [onNavigationRequest]), returnValue: Future<void>.value(), returnValueForMissingStub: Future<void>.value()) as _i4.Future<void>); @override - _i4.Future<void> setOnPageStarted(void Function(String)? onPageStarted) => + _i4.Future<void> setOnPageStarted(_i3.PageEventCallback? onPageStarted) => (super.noSuchMethod(Invocation.method(#setOnPageStarted, [onPageStarted]), returnValue: Future<void>.value(), returnValueForMissingStub: Future<void>.value()) as _i4.Future<void>); @override - _i4.Future<void> setOnPageFinished(void Function(String)? onPageFinished) => + _i4.Future<void> setOnPageFinished(_i3.PageEventCallback? onPageFinished) => (super.noSuchMethod( Invocation.method(#setOnPageFinished, [onPageFinished]), returnValue: Future<void>.value(), returnValueForMissingStub: Future<void>.value()) as _i4.Future<void>); @override - _i4.Future<void> setOnProgress(void Function(int)? onProgress) => + _i4.Future<void> setOnProgress(_i3.ProgressCallback? onProgress) => (super.noSuchMethod(Invocation.method(#setOnProgress, [onProgress]), returnValue: Future<void>.value(), returnValueForMissingStub: Future<void>.value()) as _i4.Future<void>); @override _i4.Future<void> setOnWebResourceError( - void Function(_i2.WebResourceError)? onWebResourceError) => + _i3.WebResourceErrorCallback? onWebResourceError) => (super.noSuchMethod( Invocation.method(#setOnWebResourceError, [onWebResourceError]), returnValue: Future<void>.value(),
diff --git a/packages/webview_flutter/webview_flutter_wkwebview/lib/src/v4/src/webkit_webview_controller.dart b/packages/webview_flutter/webview_flutter_wkwebview/lib/src/v4/src/webkit_webview_controller.dart index 117aa78..ee984dd 100644 --- a/packages/webview_flutter/webview_flutter_wkwebview/lib/src/v4/src/webkit_webview_controller.dart +++ b/packages/webview_flutter/webview_flutter_wkwebview/lib/src/v4/src/webkit_webview_controller.dart
@@ -536,13 +536,17 @@ WKNavigationAction action, ) async { if (weakThis.target?._onNavigationRequest != null) { - final bool allow = await weakThis.target!._onNavigationRequest!( + final NavigationDecision decision = + await weakThis.target!._onNavigationRequest!(NavigationRequest( url: action.request.url, - isForMainFrame: action.targetFrame.isMainFrame, - ); - return allow - ? WKNavigationActionPolicy.allow - : WKNavigationActionPolicy.cancel; + isMainFrame: action.targetFrame.isMainFrame, + )); + switch (decision) { + case NavigationDecision.prevent: + return WKNavigationActionPolicy.cancel; + case NavigationDecision.navigate: + return WKNavigationActionPolicy.allow; + } } return WKNavigationActionPolicy.allow; }, @@ -580,41 +584,37 @@ // Used to set `WKWebView.setNavigationDelegate` in `WebKitWebViewController`. late final WKNavigationDelegate _navigationDelegate; - void Function(String url)? _onPageFinished; - void Function(String url)? _onPageStarted; - void Function(int progress)? _onProgress; - void Function(WebResourceError error)? _onWebResourceError; - FutureOr<bool> Function({required String url, required bool isForMainFrame})? - _onNavigationRequest; + PageEventCallback? _onPageFinished; + PageEventCallback? _onPageStarted; + ProgressCallback? _onProgress; + WebResourceErrorCallback? _onWebResourceError; + NavigationRequestCallback? _onNavigationRequest; @override - Future<void> setOnPageFinished( - void Function(String url) onPageFinished, - ) async { + Future<void> setOnPageFinished(PageEventCallback onPageFinished) async { _onPageFinished = onPageFinished; } @override - Future<void> setOnPageStarted(void Function(String url) onPageStarted) async { + Future<void> setOnPageStarted(PageEventCallback onPageStarted) async { _onPageStarted = onPageStarted; } @override - Future<void> setOnProgress(void Function(int progress) onProgress) async { + Future<void> setOnProgress(ProgressCallback onProgress) async { _onProgress = onProgress; } @override Future<void> setOnWebResourceError( - void Function(WebResourceError error) onWebResourceError, + WebResourceErrorCallback onWebResourceError, ) async { _onWebResourceError = onWebResourceError; } @override Future<void> setOnNavigationRequest( - FutureOr<bool> Function({required String url, required bool isForMainFrame}) - onNavigationRequest, + NavigationRequestCallback onNavigationRequest, ) async { _onNavigationRequest = onNavigationRequest; }
diff --git a/packages/webview_flutter/webview_flutter_wkwebview/pubspec.yaml b/packages/webview_flutter/webview_flutter_wkwebview/pubspec.yaml index 40b7bf8..f990dad 100644 --- a/packages/webview_flutter/webview_flutter_wkwebview/pubspec.yaml +++ b/packages/webview_flutter/webview_flutter_wkwebview/pubspec.yaml
@@ -3,6 +3,7 @@ repository: https://github.com/flutter/plugins/tree/main/packages/webview_flutter/webview_flutter_wkwebview issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+webview%22 version: 2.9.4 +publish_to: none environment: sdk: ">=2.17.0 <3.0.0" @@ -19,7 +20,8 @@ flutter: sdk: flutter path: ^1.8.0 - webview_flutter_platform_interface: ^1.9.3 + webview_flutter_platform_interface: + path: ../webview_flutter_platform_interface dev_dependencies: build_runner: ^2.1.5
diff --git a/packages/webview_flutter/webview_flutter_wkwebview/test/v4/webkit_navigation_delegate_test.dart b/packages/webview_flutter/webview_flutter_wkwebview/test/v4/webkit_navigation_delegate_test.dart index fe57e94..664f66a 100644 --- a/packages/webview_flutter/webview_flutter_wkwebview/test/v4/webkit_navigation_delegate_test.dart +++ b/packages/webview_flutter/webview_flutter_wkwebview/test/v4/webkit_navigation_delegate_test.dart
@@ -159,15 +159,11 @@ ), ); - late final String callbackUrl; - late final bool callbackIsMainFrame; - FutureOr<bool> onNavigationRequest({ - required String url, - required bool isForMainFrame, - }) { - callbackUrl = url; - callbackIsMainFrame = isForMainFrame; - return true; + late final NavigationRequest callbackRequest; + FutureOr<NavigationDecision> onNavigationRequest( + NavigationRequest request) { + callbackRequest = request; + return NavigationDecision.navigate; } webKitDelgate.setOnNavigationRequest(onNavigationRequest); @@ -184,8 +180,8 @@ completion(WKNavigationActionPolicy.allow), ); - expect(callbackUrl, 'https://www.google.com'); - expect(callbackIsMainFrame, isFalse); + expect(callbackRequest.url, 'https://www.google.com'); + expect(callbackRequest.isMainFrame, isFalse); }); }); }