Merge branch 'issue/94051_navigation_delegate_typedefs' into intf_nav_update
diff --git a/packages/webview_flutter/webview_flutter_platform_interface/CHANGELOG.md b/packages/webview_flutter/webview_flutter_platform_interface/CHANGELOG.md
index 17b8652..d886c2a 100644
--- a/packages/webview_flutter/webview_flutter_platform_interface/CHANGELOG.md
+++ b/packages/webview_flutter/webview_flutter_platform_interface/CHANGELOG.md
@@ -1,3 +1,7 @@
+## 1.9.4
+
+* Exposes type definitions for commonly used function signatures in the `PlatformNavigationDelegate` class.
+
 ## 1.9.3
 
 * Updates minimum Flutter version to 2.10.
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..4b14872 100644
--- a/packages/webview_flutter/webview_flutter_platform_interface/pubspec.yaml
+++ b/packages/webview_flutter/webview_flutter_platform_interface/pubspec.yaml
@@ -4,7 +4,7 @@
 issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+webview_flutter%22
 # 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
+version: 1.9.4
 
 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(),