[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);
     });
   });
 }