[webview_flutter_platform_interface] Updates platform interface to new interface (#6846)

* Set new interface in main

* update pubspec changelog and readme

* exclude from all plugins app test

* delete all of platform interface

* add all back to platform interface
diff --git a/packages/webview_flutter/webview_flutter_platform_interface/CHANGELOG.md b/packages/webview_flutter/webview_flutter_platform_interface/CHANGELOG.md
index b7050e4..a4be504 100644
--- a/packages/webview_flutter/webview_flutter_platform_interface/CHANGELOG.md
+++ b/packages/webview_flutter/webview_flutter_platform_interface/CHANGELOG.md
@@ -1,3 +1,10 @@
+## 2.0.0
+
+* **Breaking Change**: Releases new interface. See [documentation](https://pub.dev/documentation/webview_flutter_platform_interface/2.0.0/) and [design doc](https://flutter.dev/go/webview_flutter_4_interface)
+  for more details.
+* **Breaking Change**: Removes MethodChannel implementation of interface. All platform
+  implementations will now need to create their own by implementing `WebViewPlatform`.
+
 ## 1.9.5
 
 * Updates code for `no_leading_underscores_for_local_identifiers` lint.
diff --git a/packages/webview_flutter/webview_flutter_platform_interface/README.md b/packages/webview_flutter/webview_flutter_platform_interface/README.md
index 31e57ab..10160b3 100644
--- a/packages/webview_flutter/webview_flutter_platform_interface/README.md
+++ b/packages/webview_flutter/webview_flutter_platform_interface/README.md
@@ -9,10 +9,10 @@
 # Usage
 
 To implement a new platform-specific implementation of `webview_flutter`, extend
-[`WebviewPlatform`](lib/src/platform_interface/webview_platform.dart) with an implementation that performs the
+[`WebviewPlatform`](lib/src/webview_platform.dart) with an implementation that performs the
 platform-specific behavior, and when you register your plugin, set the default
 `WebviewPlatform` by calling
-`WebviewPlatform.setInstance(MyPlatformWebview())`.
+`WebviewPlatform.instance = MyPlatformWebview()`.
 
 # Note on breaking changes
 
diff --git a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/platform_interface/javascript_channel_registry.dart b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/legacy/platform_interface/javascript_channel_registry.dart
similarity index 100%
rename from packages/webview_flutter/webview_flutter_platform_interface/lib/src/platform_interface/javascript_channel_registry.dart
rename to packages/webview_flutter/webview_flutter_platform_interface/lib/src/legacy/platform_interface/javascript_channel_registry.dart
diff --git a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/platform_interface/platform_interface.dart b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/legacy/platform_interface/platform_interface.dart
similarity index 100%
rename from packages/webview_flutter/webview_flutter_platform_interface/lib/src/platform_interface/platform_interface.dart
rename to packages/webview_flutter/webview_flutter_platform_interface/lib/src/legacy/platform_interface/platform_interface.dart
diff --git a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/platform_interface/webview_cookie_manager.dart b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/legacy/platform_interface/webview_cookie_manager.dart
similarity index 100%
rename from packages/webview_flutter/webview_flutter_platform_interface/lib/src/platform_interface/webview_cookie_manager.dart
rename to packages/webview_flutter/webview_flutter_platform_interface/lib/src/legacy/platform_interface/webview_cookie_manager.dart
diff --git a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/platform_interface/webview_platform.dart b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/legacy/platform_interface/webview_platform.dart
similarity index 100%
rename from packages/webview_flutter/webview_flutter_platform_interface/lib/src/platform_interface/webview_platform.dart
rename to packages/webview_flutter/webview_flutter_platform_interface/lib/src/legacy/platform_interface/webview_platform.dart
diff --git a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/platform_interface/webview_platform_callbacks_handler.dart b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/legacy/platform_interface/webview_platform_callbacks_handler.dart
similarity index 100%
rename from packages/webview_flutter/webview_flutter_platform_interface/lib/src/platform_interface/webview_platform_callbacks_handler.dart
rename to packages/webview_flutter/webview_flutter_platform_interface/lib/src/legacy/platform_interface/webview_platform_callbacks_handler.dart
diff --git a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/platform_interface/webview_platform_controller.dart b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/legacy/platform_interface/webview_platform_controller.dart
similarity index 100%
rename from packages/webview_flutter/webview_flutter_platform_interface/lib/src/platform_interface/webview_platform_controller.dart
rename to packages/webview_flutter/webview_flutter_platform_interface/lib/src/legacy/platform_interface/webview_platform_controller.dart
diff --git a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/types/auto_media_playback_policy.dart b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/legacy/types/auto_media_playback_policy.dart
similarity index 100%
rename from packages/webview_flutter/webview_flutter_platform_interface/lib/src/types/auto_media_playback_policy.dart
rename to packages/webview_flutter/webview_flutter_platform_interface/lib/src/legacy/types/auto_media_playback_policy.dart
diff --git a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/types/creation_params.dart b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/legacy/types/creation_params.dart
similarity index 100%
rename from packages/webview_flutter/webview_flutter_platform_interface/lib/src/types/creation_params.dart
rename to packages/webview_flutter/webview_flutter_platform_interface/lib/src/legacy/types/creation_params.dart
diff --git a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/types/javascript_channel.dart b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/legacy/types/javascript_channel.dart
similarity index 100%
rename from packages/webview_flutter/webview_flutter_platform_interface/lib/src/types/javascript_channel.dart
rename to packages/webview_flutter/webview_flutter_platform_interface/lib/src/legacy/types/javascript_channel.dart
diff --git a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/legacy/types/javascript_message.dart b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/legacy/types/javascript_message.dart
new file mode 100644
index 0000000..8d08045
--- /dev/null
+++ b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/legacy/types/javascript_message.dart
@@ -0,0 +1,14 @@
+// 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 message that was sent by JavaScript code running in a [WebView].
+class JavascriptMessage {
+  /// Constructs a JavaScript message object.
+  ///
+  /// The `message` parameter must not be null.
+  const JavascriptMessage(this.message) : assert(message != null);
+
+  /// The contents of the message that was sent by the JavaScript code.
+  final String message;
+}
diff --git a/packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/types/javascript_mode.dart b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/legacy/types/javascript_mode.dart
similarity index 93%
rename from packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/types/javascript_mode.dart
rename to packages/webview_flutter/webview_flutter_platform_interface/lib/src/legacy/types/javascript_mode.dart
index bcbebff..53d0491 100644
--- a/packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/types/javascript_mode.dart
+++ b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/legacy/types/javascript_mode.dart
@@ -3,7 +3,7 @@
 // found in the LICENSE file.
 
 /// Describes the state of JavaScript support in a given web view.
-enum JavaScriptMode {
+enum JavascriptMode {
   /// JavaScript execution is disabled.
   disabled,
 
diff --git a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/legacy/types/types.dart b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/legacy/types/types.dart
new file mode 100644
index 0000000..f2bcf19
--- /dev/null
+++ b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/legacy/types/types.dart
@@ -0,0 +1,14 @@
+// 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.
+
+export 'auto_media_playback_policy.dart';
+export 'creation_params.dart';
+export 'javascript_channel.dart';
+export 'javascript_message.dart';
+export 'javascript_mode.dart';
+export 'web_resource_error.dart';
+export 'web_resource_error_type.dart';
+export 'web_settings.dart';
+export 'webview_cookie.dart';
+export 'webview_request.dart';
diff --git a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/legacy/types/web_resource_error.dart b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/legacy/types/web_resource_error.dart
new file mode 100644
index 0000000..b61671f
--- /dev/null
+++ b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/legacy/types/web_resource_error.dart
@@ -0,0 +1,57 @@
+// 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.
+
+import 'web_resource_error_type.dart';
+
+/// Error returned in `WebView.onWebResourceError` when a web resource loading error has occurred.
+class WebResourceError {
+  /// Creates a new [WebResourceError]
+  ///
+  /// A user should not need to instantiate this class, but will receive one in
+  /// [WebResourceErrorCallback].
+  WebResourceError({
+    required this.errorCode,
+    required this.description,
+    this.domain,
+    this.errorType,
+    this.failingUrl,
+  })  : assert(errorCode != null),
+        assert(description != null);
+
+  /// Raw code of the error from the respective platform.
+  ///
+  /// On Android, the error code will be a constant from a
+  /// [WebViewClient](https://developer.android.com/reference/android/webkit/WebViewClient#summary) and
+  /// will have a corresponding [errorType].
+  ///
+  /// On iOS, the error code will be a constant from `NSError.code` in
+  /// Objective-C. See
+  /// https://developer.apple.com/library/archive/documentation/Cocoa/Conceptual/ErrorHandlingCocoa/ErrorObjectsDomains/ErrorObjectsDomains.html
+  /// for more information on error handling on iOS. Some possible error codes
+  /// can be found at https://developer.apple.com/documentation/webkit/wkerrorcode?language=objc.
+  final int errorCode;
+
+  /// The domain of where to find the error code.
+  ///
+  /// This field is only available on iOS and represents a "domain" from where
+  /// the [errorCode] is from. This value is taken directly from an `NSError`
+  /// in Objective-C. See
+  /// https://developer.apple.com/library/archive/documentation/Cocoa/Conceptual/ErrorHandlingCocoa/ErrorObjectsDomains/ErrorObjectsDomains.html
+  /// for more information on error handling on iOS.
+  final String? domain;
+
+  /// Description of the error that can be used to communicate the problem to the user.
+  final String description;
+
+  /// The type this error can be categorized as.
+  ///
+  /// This will never be `null` on Android, but can be `null` on iOS.
+  final WebResourceErrorType? errorType;
+
+  /// Gets the URL for which the resource request was made.
+  ///
+  /// This value is not provided on iOS. Alternatively, you can keep track of
+  /// the last values provided to [WebViewPlatformController.loadUrl].
+  final String? failingUrl;
+}
diff --git a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/types/web_resource_error_type.dart b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/legacy/types/web_resource_error_type.dart
similarity index 100%
rename from packages/webview_flutter/webview_flutter_platform_interface/lib/src/types/web_resource_error_type.dart
rename to packages/webview_flutter/webview_flutter_platform_interface/lib/src/legacy/types/web_resource_error_type.dart
diff --git a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/types/web_settings.dart b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/legacy/types/web_settings.dart
similarity index 100%
rename from packages/webview_flutter/webview_flutter_platform_interface/lib/src/types/web_settings.dart
rename to packages/webview_flutter/webview_flutter_platform_interface/lib/src/legacy/types/web_settings.dart
diff --git a/packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/types/webview_cookie.dart b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/legacy/types/webview_cookie.dart
similarity index 63%
rename from packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/types/webview_cookie.dart
rename to packages/webview_flutter/webview_flutter_platform_interface/lib/src/legacy/types/webview_cookie.dart
index 7f56a31..406c510 100644
--- a/packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/types/webview_cookie.dart
+++ b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/legacy/types/webview_cookie.dart
@@ -2,18 +2,15 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-import 'package:flutter/foundation.dart';
-
-/// A cookie that can be set globally for all web views using [WebViewCookieManagerPlatform].
-@immutable
+/// A cookie that can be set globally for all web views
+/// using [WebViewCookieManagerPlatform].
 class WebViewCookie {
-  /// Creates a new [WebViewCookieDelegate]
-  const WebViewCookie({
-    required this.name,
-    required this.value,
-    required this.domain,
-    this.path = '/',
-  });
+  /// Constructs a new [WebViewCookie].
+  const WebViewCookie(
+      {required this.name,
+      required this.value,
+      required this.domain,
+      this.path = '/'});
 
   /// The cookie-name of the cookie.
   ///
@@ -33,9 +30,20 @@
   /// https://datatracker.ietf.org/doc/html/draft-ietf-httpbis-rfc6265bis-02#section-4.1.1
   final String domain;
 
-  /// The path-value of the cookie, set to `/` by default.
+  /// The path-value of the cookie.
+  /// Is set to `/` in the constructor by default.
   ///
   /// Its value should match "path-value" in RFC6265bis:
   /// https://datatracker.ietf.org/doc/html/draft-ietf-httpbis-rfc6265bis-02#section-4.1.1
   final String path;
+
+  /// Serializes the [WebViewCookie] to a Map<String, String>.
+  Map<String, String> toJson() {
+    return <String, String>{
+      'name': name,
+      'value': value,
+      'domain': domain,
+      'path': path
+    };
+  }
 }
diff --git a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/types/webview_request.dart b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/legacy/types/webview_request.dart
similarity index 100%
rename from packages/webview_flutter/webview_flutter_platform_interface/lib/src/types/webview_request.dart
rename to packages/webview_flutter/webview_flutter_platform_interface/lib/src/legacy/types/webview_request.dart
diff --git a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/method_channel/webview_method_channel.dart b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/method_channel/webview_method_channel.dart
deleted file mode 100644
index 0e98ea0..0000000
--- a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/method_channel/webview_method_channel.dart
+++ /dev/null
@@ -1,297 +0,0 @@
-// 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.
-
-import 'dart:async';
-
-import 'package:flutter/services.dart';
-
-import '../platform_interface/platform_interface.dart';
-import '../types/types.dart';
-
-/// A [WebViewPlatformController] that uses a method channel to control the webview.
-class MethodChannelWebViewPlatform implements WebViewPlatformController {
-  /// Constructs an instance that will listen for webviews broadcasting to the
-  /// given [id], using the given [WebViewPlatformCallbacksHandler].
-  MethodChannelWebViewPlatform(
-    int id,
-    this._platformCallbacksHandler,
-    this._javascriptChannelRegistry,
-  )   : assert(_platformCallbacksHandler != null),
-        _channel = MethodChannel('plugins.flutter.io/webview_$id') {
-    _channel.setMethodCallHandler(_onMethodCall);
-  }
-
-  final JavascriptChannelRegistry _javascriptChannelRegistry;
-
-  final WebViewPlatformCallbacksHandler _platformCallbacksHandler;
-
-  final MethodChannel _channel;
-
-  static const MethodChannel _cookieManagerChannel =
-      MethodChannel('plugins.flutter.io/cookie_manager');
-
-  Future<bool?> _onMethodCall(MethodCall call) async {
-    switch (call.method) {
-      case 'javascriptChannelMessage':
-        final String channel = call.arguments['channel']! as String;
-        final String message = call.arguments['message']! as String;
-        _javascriptChannelRegistry.onJavascriptChannelMessage(channel, message);
-        return true;
-      case 'navigationRequest':
-        return await _platformCallbacksHandler.onNavigationRequest(
-          url: call.arguments['url']! as String,
-          isForMainFrame: call.arguments['isForMainFrame']! as bool,
-        );
-      case 'onPageFinished':
-        _platformCallbacksHandler
-            .onPageFinished(call.arguments['url']! as String);
-        return null;
-      case 'onProgress':
-        _platformCallbacksHandler.onProgress(call.arguments['progress'] as int);
-        return null;
-      case 'onPageStarted':
-        _platformCallbacksHandler
-            .onPageStarted(call.arguments['url']! as String);
-        return null;
-      case 'onWebResourceError':
-        _platformCallbacksHandler.onWebResourceError(
-          WebResourceError(
-            errorCode: call.arguments['errorCode']! as int,
-            description: call.arguments['description']! as String,
-            // iOS doesn't support `failingUrl`.
-            failingUrl: call.arguments['failingUrl'] as String?,
-            domain: call.arguments['domain'] as String?,
-            errorType: call.arguments['errorType'] == null
-                ? null
-                : WebResourceErrorType.values.firstWhere(
-                    (WebResourceErrorType type) {
-                      return type.toString() ==
-                          '$WebResourceErrorType.${call.arguments['errorType']}';
-                    },
-                  ),
-          ),
-        );
-        return null;
-    }
-
-    throw MissingPluginException(
-      '${call.method} was invoked but has no handler',
-    );
-  }
-
-  @override
-  Future<void> loadFile(String absoluteFilePath) async {
-    assert(absoluteFilePath != null);
-
-    try {
-      return await _channel.invokeMethod<void>('loadFile', absoluteFilePath);
-    } on PlatformException catch (ex) {
-      if (ex.code == 'loadFile_failed') {
-        throw ArgumentError(ex.message);
-      }
-
-      rethrow;
-    }
-  }
-
-  @override
-  Future<void> loadFlutterAsset(String key) async {
-    assert(key.isNotEmpty);
-
-    try {
-      return await _channel.invokeMethod<void>('loadFlutterAsset', key);
-    } on PlatformException catch (ex) {
-      if (ex.code == 'loadFlutterAsset_invalidKey') {
-        throw ArgumentError(ex.message);
-      }
-
-      rethrow;
-    }
-  }
-
-  @override
-  Future<void> loadHtmlString(
-    String html, {
-    String? baseUrl,
-  }) async {
-    assert(html != null);
-    return _channel.invokeMethod<void>('loadHtmlString', <String, dynamic>{
-      'html': html,
-      'baseUrl': baseUrl,
-    });
-  }
-
-  @override
-  Future<void> loadUrl(
-    String url,
-    Map<String, String>? headers,
-  ) async {
-    assert(url != null);
-    return _channel.invokeMethod<void>('loadUrl', <String, dynamic>{
-      'url': url,
-      'headers': headers,
-    });
-  }
-
-  @override
-  Future<void> loadRequest(WebViewRequest request) async {
-    assert(request != null);
-    return _channel.invokeMethod<void>('loadRequest', <String, dynamic>{
-      'request': request.toJson(),
-    });
-  }
-
-  @override
-  Future<String?> currentUrl() => _channel.invokeMethod<String>('currentUrl');
-
-  @override
-  Future<bool> canGoBack() =>
-      _channel.invokeMethod<bool>('canGoBack').then((bool? result) => result!);
-
-  @override
-  Future<bool> canGoForward() => _channel
-      .invokeMethod<bool>('canGoForward')
-      .then((bool? result) => result!);
-
-  @override
-  Future<void> goBack() => _channel.invokeMethod<void>('goBack');
-
-  @override
-  Future<void> goForward() => _channel.invokeMethod<void>('goForward');
-
-  @override
-  Future<void> reload() => _channel.invokeMethod<void>('reload');
-
-  @override
-  Future<void> clearCache() => _channel.invokeMethod<void>('clearCache');
-
-  @override
-  Future<void> updateSettings(WebSettings settings) async {
-    final Map<String, dynamic> updatesMap = _webSettingsToMap(settings);
-    if (updatesMap.isNotEmpty) {
-      await _channel.invokeMethod<void>('updateSettings', updatesMap);
-    }
-  }
-
-  @override
-  Future<String> evaluateJavascript(String javascript) {
-    return _channel
-        .invokeMethod<String>('evaluateJavascript', javascript)
-        .then((String? result) => result!);
-  }
-
-  @override
-  Future<void> runJavascript(String javascript) async {
-    await _channel.invokeMethod<String>('runJavascript', javascript);
-  }
-
-  @override
-  Future<String> runJavascriptReturningResult(String javascript) {
-    return _channel
-        .invokeMethod<String>('runJavascriptReturningResult', javascript)
-        .then((String? result) => result!);
-  }
-
-  @override
-  Future<void> addJavascriptChannels(Set<String> javascriptChannelNames) {
-    return _channel.invokeMethod<void>(
-        'addJavascriptChannels', javascriptChannelNames.toList());
-  }
-
-  @override
-  Future<void> removeJavascriptChannels(Set<String> javascriptChannelNames) {
-    return _channel.invokeMethod<void>(
-        'removeJavascriptChannels', javascriptChannelNames.toList());
-  }
-
-  @override
-  Future<String?> getTitle() => _channel.invokeMethod<String>('getTitle');
-
-  @override
-  Future<void> scrollTo(int x, int y) {
-    return _channel.invokeMethod<void>('scrollTo', <String, int>{
-      'x': x,
-      'y': y,
-    });
-  }
-
-  @override
-  Future<void> scrollBy(int x, int y) {
-    return _channel.invokeMethod<void>('scrollBy', <String, int>{
-      'x': x,
-      'y': y,
-    });
-  }
-
-  @override
-  Future<int> getScrollX() =>
-      _channel.invokeMethod<int>('getScrollX').then((int? result) => result!);
-
-  @override
-  Future<int> getScrollY() =>
-      _channel.invokeMethod<int>('getScrollY').then((int? result) => result!);
-
-  /// Method channel implementation for [WebViewPlatform.clearCookies].
-  static Future<bool> clearCookies() {
-    return _cookieManagerChannel
-        .invokeMethod<bool>('clearCookies')
-        .then<bool>((dynamic result) => result! as bool);
-  }
-
-  /// Method channel implementation for [WebViewPlatform.setCookie].
-  static Future<void> setCookie(WebViewCookie cookie) {
-    return _cookieManagerChannel.invokeMethod<void>(
-        'setCookie', cookie.toJson());
-  }
-
-  static Map<String, dynamic> _webSettingsToMap(WebSettings? settings) {
-    final Map<String, dynamic> map = <String, dynamic>{};
-    void addIfNonNull(String key, dynamic value) {
-      if (value == null) {
-        return;
-      }
-      map[key] = value;
-    }
-
-    void addSettingIfPresent<T>(String key, WebSetting<T> setting) {
-      if (!setting.isPresent) {
-        return;
-      }
-      map[key] = setting.value;
-    }
-
-    addIfNonNull('jsMode', settings!.javascriptMode?.index);
-    addIfNonNull('hasNavigationDelegate', settings.hasNavigationDelegate);
-    addIfNonNull('hasProgressTracking', settings.hasProgressTracking);
-    addIfNonNull('debuggingEnabled', settings.debuggingEnabled);
-    addIfNonNull('gestureNavigationEnabled', settings.gestureNavigationEnabled);
-    addIfNonNull(
-        'allowsInlineMediaPlayback', settings.allowsInlineMediaPlayback);
-    addSettingIfPresent('userAgent', settings.userAgent);
-    addIfNonNull('zoomEnabled', settings.zoomEnabled);
-    return map;
-  }
-
-  /// Converts a [CreationParams] object to a map as expected by `platform_views` channel.
-  ///
-  /// This is used for the `creationParams` argument of the platform views created by
-  /// [AndroidWebViewBuilder] and [CupertinoWebViewBuilder].
-  static Map<String, dynamic> creationParamsToMap(
-    CreationParams creationParams, {
-    bool usesHybridComposition = false,
-  }) {
-    return <String, dynamic>{
-      'initialUrl': creationParams.initialUrl,
-      'settings': _webSettingsToMap(creationParams.webSettings),
-      'javascriptChannelNames': creationParams.javascriptChannelNames.toList(),
-      'userAgent': creationParams.userAgent,
-      'autoMediaPlaybackPolicy': creationParams.autoMediaPlaybackPolicy.index,
-      'usesHybridComposition': usesHybridComposition,
-      'backgroundColor': creationParams.backgroundColor?.value,
-      'cookies': creationParams.cookies
-          .map((WebViewCookie cookie) => cookie.toJson())
-          .toList()
-    };
-  }
-}
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/src/platform_navigation_delegate.dart
similarity index 78%
rename from packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/platform_navigation_delegate.dart
rename to packages/webview_flutter/webview_flutter_platform_interface/lib/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/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/platform_webview_controller.dart b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/platform_webview_controller.dart
similarity index 92%
rename from packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/platform_webview_controller.dart
rename to packages/webview_flutter/webview_flutter_platform_interface/lib/src/platform_webview_controller.dart
index 3585ec8..7bb259c 100644
--- a/packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/platform_webview_controller.dart
+++ b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/platform_webview_controller.dart
@@ -2,13 +2,11 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-import 'dart:math';
-import 'dart:ui';
-
 import 'package:flutter/foundation.dart';
+import 'package:flutter/painting.dart';
 import 'package:plugin_platform_interface/plugin_platform_interface.dart';
 
-import 'platform_navigation_delegate.dart';
+import '../../src/platform_navigation_delegate.dart';
 import 'webview_platform.dart';
 
 /// Interface for a platform implementation of a web view controller.
@@ -178,7 +176,7 @@
   /// The Future completes with an error if a JavaScript error occurred, or if the
   /// type the given expression evaluates to is unsupported. Unsupported values include
   /// certain non-primitive types on iOS, as well as `undefined` or `null` on iOS 14+.
-  Future<String> runJavaScriptReturningResult(String javaScript) {
+  Future<Object> runJavaScriptReturningResult(String javaScript) {
     throw UnimplementedError(
         'runJavaScriptReturningResult is not implemented on the current platform');
   }
@@ -226,24 +224,12 @@
   /// Return the current scroll position of this view.
   ///
   /// Scroll position is measured from the top left.
-  Future<Point<int>> getScrollPosition() {
+  Future<Offset> getScrollPosition() {
     throw UnimplementedError(
         'getScrollPosition is not implemented on the current platform');
   }
 
-  /// Whether to enable the platform's webview content debugging tools.
-  Future<void> enableDebugging(bool enabled) {
-    throw UnimplementedError(
-        'enableDebugging is not implemented on the current platform');
-  }
-
-  /// Whether to allow swipe based navigation on supported platforms.
-  Future<void> enableGestureNavigation(bool enabled) {
-    throw UnimplementedError(
-        'enableGestureNavigation is not implemented on the current platform');
-  }
-
-  /// Whhether to support zooming using its on-screen zoom controls and gestures.
+  /// Whether to support zooming using its on-screen zoom controls and gestures.
   Future<void> enableZoom(bool enabled) {
     throw UnimplementedError(
         'enableZoom is not implemented on the current platform');
@@ -269,9 +255,10 @@
 }
 
 /// Describes the parameters necessary for registering a JavaScript channel.
+@immutable
 class JavaScriptChannelParams {
   /// Creates a new [JavaScriptChannelParams] object.
-  JavaScriptChannelParams({
+  const JavaScriptChannelParams({
     required this.name,
     required this.onMessageReceived,
   });
diff --git a/packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/platform_webview_cookie_manager.dart b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/platform_webview_cookie_manager.dart
similarity index 100%
rename from packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/platform_webview_cookie_manager.dart
rename to packages/webview_flutter/webview_flutter_platform_interface/lib/src/platform_webview_cookie_manager.dart
diff --git a/packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/platform_webview_widget.dart b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/platform_webview_widget.dart
similarity index 100%
rename from packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/platform_webview_widget.dart
rename to packages/webview_flutter/webview_flutter_platform_interface/lib/src/platform_webview_widget.dart
diff --git a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/types/javascript_message.dart b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/types/javascript_message.dart
index 8d08045..b37661a 100644
--- a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/types/javascript_message.dart
+++ b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/types/javascript_message.dart
@@ -2,12 +2,49 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
+import 'package:flutter/foundation.dart';
+
 /// A message that was sent by JavaScript code running in a [WebView].
-class JavascriptMessage {
-  /// Constructs a JavaScript message object.
-  ///
-  /// The `message` parameter must not be null.
-  const JavascriptMessage(this.message) : assert(message != null);
+///
+/// Platform specific implementations can add additional fields by extending
+/// this class and providing a factory method that takes the
+/// [JavaScriptMessage] as a parameter.
+///
+/// {@tool sample}
+/// This example demonstrates how to extend the [JavaScriptMessage] to
+/// provide additional platform specific parameters.
+///
+/// When extending [JavaScriptMessage] additional parameters should always
+/// accept `null` or have a default value to prevent breaking changes.
+///
+/// ```dart
+/// @immutable
+/// class WKWebViewScriptMessage extends JavaScriptMessage {
+///   WKWebViewScriptMessage._(
+///     JavaScriptMessage javaScriptMessage,
+///     this.extraData,
+///   ) : super(javaScriptMessage.message);
+///
+///   factory WKWebViewScriptMessage.fromJavaScripMessage(
+///     JavaScriptMessage javaScripMessage, {
+///     String? extraData,
+///   }) {
+///     return WKWebViewScriptMessage._(
+///       javaScriptMessage,
+///       extraData: extraData,
+///     );
+///   }
+///
+///   final String? extraData;
+/// }
+/// ```
+/// {@end-tool}
+@immutable
+class JavaScriptMessage {
+  /// Creates a new JavaScript message object.
+  const JavaScriptMessage({
+    required this.message,
+  });
 
   /// The contents of the message that was sent by the JavaScript code.
   final String message;
diff --git a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/types/javascript_mode.dart b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/types/javascript_mode.dart
index 53d0491..bcbebff 100644
--- a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/types/javascript_mode.dart
+++ b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/types/javascript_mode.dart
@@ -3,7 +3,7 @@
 // found in the LICENSE file.
 
 /// Describes the state of JavaScript support in a given web view.
-enum JavascriptMode {
+enum JavaScriptMode {
   /// JavaScript execution is disabled.
   disabled,
 
diff --git a/packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/types/load_request_params.dart b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/types/load_request_params.dart
similarity index 94%
rename from packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/types/load_request_params.dart
rename to packages/webview_flutter/webview_flutter_platform_interface/lib/src/types/load_request_params.dart
index a0d1c88..ad934d6 100644
--- a/packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/types/load_request_params.dart
+++ b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/types/load_request_params.dart
@@ -72,8 +72,8 @@
   /// Used by the platform implementation to create a new [LoadRequestParams].
   const LoadRequestParams({
     required this.uri,
-    required this.method,
-    required this.headers,
+    this.method = LoadRequestMethod.get,
+    this.headers = const <String, String>{},
     this.body,
   });
 
@@ -81,6 +81,8 @@
   final Uri uri;
 
   /// HTTP method used to make the request.
+  ///
+  /// Defaults to [LoadRequestMethod.get].
   final LoadRequestMethod method;
 
   /// Headers for the request.
diff --git a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/types/navigation_decision.dart b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/types/navigation_decision.dart
new file mode 100644
index 0000000..d8178ac
--- /dev/null
+++ b/packages/webview_flutter/webview_flutter_platform_interface/lib/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/src/types/navigation_request.dart b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/types/navigation_request.dart
new file mode 100644
index 0000000..ee3f1f9
--- /dev/null
+++ b/packages/webview_flutter/webview_flutter_platform_interface/lib/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/platform_navigation_delegate_creation_params.dart b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/types/platform_navigation_delegate_creation_params.dart
similarity index 100%
rename from packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/types/platform_navigation_delegate_creation_params.dart
rename to packages/webview_flutter/webview_flutter_platform_interface/lib/src/types/platform_navigation_delegate_creation_params.dart
diff --git a/packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/types/platform_webview_controller_creation_params.dart b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/types/platform_webview_controller_creation_params.dart
similarity index 100%
rename from packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/types/platform_webview_controller_creation_params.dart
rename to packages/webview_flutter/webview_flutter_platform_interface/lib/src/types/platform_webview_controller_creation_params.dart
diff --git a/packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/types/platform_webview_cookie_manager_creation_params.dart b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/types/platform_webview_cookie_manager_creation_params.dart
similarity index 100%
rename from packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/types/platform_webview_cookie_manager_creation_params.dart
rename to packages/webview_flutter/webview_flutter_platform_interface/lib/src/types/platform_webview_cookie_manager_creation_params.dart
diff --git a/packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/types/platform_webview_widget_creation_params.dart b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/types/platform_webview_widget_creation_params.dart
similarity index 100%
rename from packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/types/platform_webview_widget_creation_params.dart
rename to packages/webview_flutter/webview_flutter_platform_interface/lib/src/types/platform_webview_widget_creation_params.dart
diff --git a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/types/types.dart b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/types/types.dart
index f2bcf19..4df8800 100644
--- a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/types/types.dart
+++ b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/types/types.dart
@@ -2,13 +2,14 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-export 'auto_media_playback_policy.dart';
-export 'creation_params.dart';
-export 'javascript_channel.dart';
 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';
+export 'platform_webview_widget_creation_params.dart';
 export 'web_resource_error.dart';
-export 'web_resource_error_type.dart';
-export 'web_settings.dart';
 export 'webview_cookie.dart';
-export 'webview_request.dart';
diff --git a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/types/web_resource_error.dart b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/types/web_resource_error.dart
index b61671f..e2522da 100644
--- a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/types/web_resource_error.dart
+++ b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/types/web_resource_error.dart
@@ -2,56 +2,122 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-import 'web_resource_error_type.dart';
+import 'package:flutter/foundation.dart';
+
+/// Possible error type categorizations used by [WebResourceError].
+enum WebResourceErrorType {
+  /// User authentication failed on server.
+  authentication,
+
+  /// Malformed URL.
+  badUrl,
+
+  /// Failed to connect to the server.
+  connect,
+
+  /// Failed to perform SSL handshake.
+  failedSslHandshake,
+
+  /// Generic file error.
+  file,
+
+  /// File not found.
+  fileNotFound,
+
+  /// Server or proxy hostname lookup failed.
+  hostLookup,
+
+  /// Failed to read or write to the server.
+  io,
+
+  /// User authentication failed on proxy.
+  proxyAuthentication,
+
+  /// Too many redirects.
+  redirectLoop,
+
+  /// Connection timed out.
+  timeout,
+
+  /// Too many requests during this load.
+  tooManyRequests,
+
+  /// Generic error.
+  unknown,
+
+  /// Resource load was canceled by Safe Browsing.
+  unsafeResource,
+
+  /// Unsupported authentication scheme (not basic or digest).
+  unsupportedAuthScheme,
+
+  /// Unsupported URI scheme.
+  unsupportedScheme,
+
+  /// The web content process was terminated.
+  webContentProcessTerminated,
+
+  /// The web view was invalidated.
+  webViewInvalidated,
+
+  /// A JavaScript exception occurred.
+  javaScriptExceptionOccurred,
+
+  /// The result of JavaScript execution could not be returned.
+  javaScriptResultTypeIsUnsupported,
+}
 
 /// Error returned in `WebView.onWebResourceError` when a web resource loading error has occurred.
+///
+/// Platform specific implementations can add additional fields by extending
+/// this class.
+///
+/// {@tool sample}
+/// This example demonstrates how to extend the [WebResourceError] to
+/// provide additional platform specific parameters.
+///
+/// When extending [WebResourceError] additional parameters should always
+/// accept `null` or have a default value to prevent breaking changes.
+///
+/// ```dart
+/// class IOSWebResourceError extends WebResourceError {
+///   IOSWebResourceError._(WebResourceError error, {required this.domain})
+///       : super(
+///           errorCode: error.errorCode,
+///           description: error.description,
+///           errorType: error.errorType,
+///         );
+///
+///   factory IOSWebResourceError.fromWebResourceError(
+///     WebResourceError error, {
+///     required String? domain,
+///   }) {
+///     return IOSWebResourceError._(error, domain: domain);
+///   }
+///
+///   final String? domain;
+/// }
+/// ```
+/// {@end-tool}
+@immutable
 class WebResourceError {
-  /// Creates a new [WebResourceError]
-  ///
-  /// A user should not need to instantiate this class, but will receive one in
-  /// [WebResourceErrorCallback].
-  WebResourceError({
+  /// Used by the platform implementation to create a new [WebResourceError].
+  const WebResourceError({
     required this.errorCode,
     required this.description,
-    this.domain,
     this.errorType,
-    this.failingUrl,
-  })  : assert(errorCode != null),
-        assert(description != null);
+    this.isForMainFrame,
+  });
 
   /// Raw code of the error from the respective platform.
-  ///
-  /// On Android, the error code will be a constant from a
-  /// [WebViewClient](https://developer.android.com/reference/android/webkit/WebViewClient#summary) and
-  /// will have a corresponding [errorType].
-  ///
-  /// On iOS, the error code will be a constant from `NSError.code` in
-  /// Objective-C. See
-  /// https://developer.apple.com/library/archive/documentation/Cocoa/Conceptual/ErrorHandlingCocoa/ErrorObjectsDomains/ErrorObjectsDomains.html
-  /// for more information on error handling on iOS. Some possible error codes
-  /// can be found at https://developer.apple.com/documentation/webkit/wkerrorcode?language=objc.
   final int errorCode;
 
-  /// The domain of where to find the error code.
-  ///
-  /// This field is only available on iOS and represents a "domain" from where
-  /// the [errorCode] is from. This value is taken directly from an `NSError`
-  /// in Objective-C. See
-  /// https://developer.apple.com/library/archive/documentation/Cocoa/Conceptual/ErrorHandlingCocoa/ErrorObjectsDomains/ErrorObjectsDomains.html
-  /// for more information on error handling on iOS.
-  final String? domain;
-
   /// Description of the error that can be used to communicate the problem to the user.
   final String description;
 
   /// The type this error can be categorized as.
-  ///
-  /// This will never be `null` on Android, but can be `null` on iOS.
   final WebResourceErrorType? errorType;
 
-  /// Gets the URL for which the resource request was made.
-  ///
-  /// This value is not provided on iOS. Alternatively, you can keep track of
-  /// the last values provided to [WebViewPlatformController.loadUrl].
-  final String? failingUrl;
+  /// Whether the error originated from the main frame.
+  final bool? isForMainFrame;
 }
diff --git a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/types/webview_cookie.dart b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/types/webview_cookie.dart
index 406c510..7f56a31 100644
--- a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/types/webview_cookie.dart
+++ b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/types/webview_cookie.dart
@@ -2,15 +2,18 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-/// A cookie that can be set globally for all web views
-/// using [WebViewCookieManagerPlatform].
+import 'package:flutter/foundation.dart';
+
+/// A cookie that can be set globally for all web views using [WebViewCookieManagerPlatform].
+@immutable
 class WebViewCookie {
-  /// Constructs a new [WebViewCookie].
-  const WebViewCookie(
-      {required this.name,
-      required this.value,
-      required this.domain,
-      this.path = '/'});
+  /// Creates a new [WebViewCookieDelegate]
+  const WebViewCookie({
+    required this.name,
+    required this.value,
+    required this.domain,
+    this.path = '/',
+  });
 
   /// The cookie-name of the cookie.
   ///
@@ -30,20 +33,9 @@
   /// https://datatracker.ietf.org/doc/html/draft-ietf-httpbis-rfc6265bis-02#section-4.1.1
   final String domain;
 
-  /// The path-value of the cookie.
-  /// Is set to `/` in the constructor by default.
+  /// The path-value of the cookie, set to `/` by default.
   ///
   /// Its value should match "path-value" in RFC6265bis:
   /// https://datatracker.ietf.org/doc/html/draft-ietf-httpbis-rfc6265bis-02#section-4.1.1
   final String path;
-
-  /// Serializes the [WebViewCookie] to a Map<String, String>.
-  Map<String, String> toJson() {
-    return <String, String>{
-      'name': name,
-      'value': value,
-      'domain': domain,
-      'path': path
-    };
-  }
 }
diff --git a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/webview_flutter_platform_interface_legacy.dart b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/webview_flutter_platform_interface_legacy.dart
new file mode 100644
index 0000000..1964e70
--- /dev/null
+++ b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/webview_flutter_platform_interface_legacy.dart
@@ -0,0 +1,6 @@
+// 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.
+
+export 'legacy/platform_interface/platform_interface.dart';
+export 'legacy/types/types.dart';
diff --git a/packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/webview_platform.dart b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/webview_platform.dart
similarity index 97%
rename from packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/webview_platform.dart
rename to packages/webview_flutter/webview_flutter_platform_interface/lib/src/webview_platform.dart
index c5c5dff..e913962 100644
--- a/packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/webview_platform.dart
+++ b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/webview_platform.dart
@@ -4,7 +4,7 @@
 
 import 'package:plugin_platform_interface/plugin_platform_interface.dart';
 
-import 'platform_navigation_delegate.dart';
+import '../../src/platform_navigation_delegate.dart';
 import 'platform_webview_controller.dart';
 import 'platform_webview_cookie_manager.dart';
 import 'platform_webview_widget.dart';
diff --git a/packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/types/javascript_message.dart b/packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/types/javascript_message.dart
deleted file mode 100644
index b37661a..0000000
--- a/packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/types/javascript_message.dart
+++ /dev/null
@@ -1,51 +0,0 @@
-// 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.
-
-import 'package:flutter/foundation.dart';
-
-/// A message that was sent by JavaScript code running in a [WebView].
-///
-/// Platform specific implementations can add additional fields by extending
-/// this class and providing a factory method that takes the
-/// [JavaScriptMessage] as a parameter.
-///
-/// {@tool sample}
-/// This example demonstrates how to extend the [JavaScriptMessage] to
-/// provide additional platform specific parameters.
-///
-/// When extending [JavaScriptMessage] additional parameters should always
-/// accept `null` or have a default value to prevent breaking changes.
-///
-/// ```dart
-/// @immutable
-/// class WKWebViewScriptMessage extends JavaScriptMessage {
-///   WKWebViewScriptMessage._(
-///     JavaScriptMessage javaScriptMessage,
-///     this.extraData,
-///   ) : super(javaScriptMessage.message);
-///
-///   factory WKWebViewScriptMessage.fromJavaScripMessage(
-///     JavaScriptMessage javaScripMessage, {
-///     String? extraData,
-///   }) {
-///     return WKWebViewScriptMessage._(
-///       javaScriptMessage,
-///       extraData: extraData,
-///     );
-///   }
-///
-///   final String? extraData;
-/// }
-/// ```
-/// {@end-tool}
-@immutable
-class JavaScriptMessage {
-  /// Creates a new JavaScript message object.
-  const JavaScriptMessage({
-    required this.message,
-  });
-
-  /// The contents of the message that was sent by the JavaScript code.
-  final String message;
-}
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
deleted file mode 100644
index 05504ff..0000000
--- a/packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/types/types.dart
+++ /dev/null
@@ -1,13 +0,0 @@
-// 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.
-
-export 'javascript_message.dart';
-export 'javascript_mode.dart';
-export 'load_request_params.dart';
-export 'platform_navigation_delegate_creation_params.dart';
-export 'platform_webview_controller_creation_params.dart';
-export 'platform_webview_cookie_manager_creation_params.dart';
-export 'platform_webview_widget_creation_params.dart';
-export 'web_resource_error.dart';
-export 'webview_cookie.dart';
diff --git a/packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/types/web_resource_error.dart b/packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/types/web_resource_error.dart
deleted file mode 100644
index 4657994..0000000
--- a/packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/types/web_resource_error.dart
+++ /dev/null
@@ -1,119 +0,0 @@
-// 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.
-
-import 'package:flutter/foundation.dart';
-
-/// Possible error type categorizations used by [WebResourceError].
-enum WebResourceErrorType {
-  /// User authentication failed on server.
-  authentication,
-
-  /// Malformed URL.
-  badUrl,
-
-  /// Failed to connect to the server.
-  connect,
-
-  /// Failed to perform SSL handshake.
-  failedSslHandshake,
-
-  /// Generic file error.
-  file,
-
-  /// File not found.
-  fileNotFound,
-
-  /// Server or proxy hostname lookup failed.
-  hostLookup,
-
-  /// Failed to read or write to the server.
-  io,
-
-  /// User authentication failed on proxy.
-  proxyAuthentication,
-
-  /// Too many redirects.
-  redirectLoop,
-
-  /// Connection timed out.
-  timeout,
-
-  /// Too many requests during this load.
-  tooManyRequests,
-
-  /// Generic error.
-  unknown,
-
-  /// Resource load was canceled by Safe Browsing.
-  unsafeResource,
-
-  /// Unsupported authentication scheme (not basic or digest).
-  unsupportedAuthScheme,
-
-  /// Unsupported URI scheme.
-  unsupportedScheme,
-
-  /// The web content process was terminated.
-  webContentProcessTerminated,
-
-  /// The web view was invalidated.
-  webViewInvalidated,
-
-  /// A JavaScript exception occurred.
-  javaScriptExceptionOccurred,
-
-  /// The result of JavaScript execution could not be returned.
-  javaScriptResultTypeIsUnsupported,
-}
-
-/// Error returned in `WebView.onWebResourceError` when a web resource loading error has occurred.
-///
-/// Platform specific implementations can add additional fields by extending
-/// this class.
-///
-/// {@tool sample}
-/// This example demonstrates how to extend the [WebResourceError] to
-/// provide additional platform specific parameters.
-///
-/// When extending [WebResourceError] additional parameters should always
-/// accept `null` or have a default value to prevent breaking changes.
-///
-/// ```dart
-/// class IOSWebResourceError extends WebResourceError {
-///   IOSWebResourceError._(WebResourceError error, {required this.domain})
-///       : super(
-///           errorCode: error.errorCode,
-///           description: error.description,
-///           errorType: error.errorType,
-///         );
-///
-///   factory IOSWebResourceError.fromWebResourceError(
-///     WebResourceError error, {
-///     required String? domain,
-///   }) {
-///     return IOSWebResourceError._(error, domain: domain);
-///   }
-///
-///   final String? domain;
-/// }
-/// ```
-/// {@end-tool}
-@immutable
-class WebResourceError {
-  /// Used by the platform implementation to create a new [WebResourceError].
-  const WebResourceError({
-    required this.errorCode,
-    required this.description,
-    this.errorType,
-  });
-
-  /// Raw code of the error from the respective platform.
-  final int errorCode;
-
-  /// Description of the error that can be used to communicate the problem to the user.
-  final String description;
-
-  /// The type this error can be categorized as.
-  final WebResourceErrorType? errorType;
-}
diff --git a/packages/webview_flutter/webview_flutter_platform_interface/lib/v4/webview_flutter_platform_interface.dart b/packages/webview_flutter/webview_flutter_platform_interface/lib/v4/webview_flutter_platform_interface.dart
deleted file mode 100644
index d14fec1..0000000
--- a/packages/webview_flutter/webview_flutter_platform_interface/lib/v4/webview_flutter_platform_interface.dart
+++ /dev/null
@@ -1,10 +0,0 @@
-// 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.
-
-export 'src/platform_navigation_delegate.dart';
-export 'src/platform_webview_controller.dart';
-export 'src/platform_webview_cookie_manager.dart';
-export 'src/platform_webview_widget.dart';
-export 'src/types/types.dart';
-export 'src/webview_platform.dart';
diff --git a/packages/webview_flutter/webview_flutter_platform_interface/lib/webview_flutter_platform_interface.dart b/packages/webview_flutter/webview_flutter_platform_interface/lib/webview_flutter_platform_interface.dart
index aa41c82..d14fec1 100644
--- a/packages/webview_flutter/webview_flutter_platform_interface/lib/webview_flutter_platform_interface.dart
+++ b/packages/webview_flutter/webview_flutter_platform_interface/lib/webview_flutter_platform_interface.dart
@@ -2,6 +2,9 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-export 'src/method_channel/webview_method_channel.dart';
-export 'src/platform_interface/platform_interface.dart';
+export 'src/platform_navigation_delegate.dart';
+export 'src/platform_webview_controller.dart';
+export 'src/platform_webview_cookie_manager.dart';
+export 'src/platform_webview_widget.dart';
 export 'src/types/types.dart';
+export 'src/webview_platform.dart';
diff --git a/packages/webview_flutter/webview_flutter_platform_interface/pubspec.yaml b/packages/webview_flutter/webview_flutter_platform_interface/pubspec.yaml
index 8f60592..3ba7a56 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.5
+version: 2.0.0
 
 environment:
   sdk: ">=2.12.0 <3.0.0"
diff --git a/packages/webview_flutter/webview_flutter_platform_interface/test/src/platform_interface/javascript_channel_registry_test.dart b/packages/webview_flutter/webview_flutter_platform_interface/test/legacy/platform_interface/javascript_channel_registry_test.dart
similarity index 94%
rename from packages/webview_flutter/webview_flutter_platform_interface/test/src/platform_interface/javascript_channel_registry_test.dart
rename to packages/webview_flutter/webview_flutter_platform_interface/test/legacy/platform_interface/javascript_channel_registry_test.dart
index aec568e..c9d27c6 100644
--- a/packages/webview_flutter/webview_flutter_platform_interface/test/src/platform_interface/javascript_channel_registry_test.dart
+++ b/packages/webview_flutter/webview_flutter_platform_interface/test/legacy/platform_interface/javascript_channel_registry_test.dart
@@ -3,8 +3,7 @@
 // found in the LICENSE file.
 
 import 'package:flutter_test/flutter_test.dart';
-import 'package:webview_flutter_platform_interface/src/platform_interface/javascript_channel_registry.dart';
-import 'package:webview_flutter_platform_interface/src/types/types.dart';
+import 'package:webview_flutter_platform_interface/src/webview_flutter_platform_interface_legacy.dart';
 
 void main() {
   final Map<String, String> log = <String, String>{};
diff --git a/packages/webview_flutter/webview_flutter_platform_interface/test/src/platform_interface/webview_cookie_manager_test.dart b/packages/webview_flutter/webview_flutter_platform_interface/test/legacy/platform_interface/webview_cookie_manager_test.dart
similarity index 81%
rename from packages/webview_flutter/webview_flutter_platform_interface/test/src/platform_interface/webview_cookie_manager_test.dart
rename to packages/webview_flutter/webview_flutter_platform_interface/test/legacy/platform_interface/webview_cookie_manager_test.dart
index e0aae21..a9faea5 100644
--- a/packages/webview_flutter/webview_flutter_platform_interface/test/src/platform_interface/webview_cookie_manager_test.dart
+++ b/packages/webview_flutter/webview_flutter_platform_interface/test/legacy/platform_interface/webview_cookie_manager_test.dart
@@ -3,8 +3,7 @@
 // found in the LICENSE file.
 
 import 'package:flutter_test/flutter_test.dart';
-import 'package:webview_flutter_platform_interface/src/platform_interface/platform_interface.dart';
-import 'package:webview_flutter_platform_interface/src/types/webview_cookie.dart';
+import 'package:webview_flutter_platform_interface/src/webview_flutter_platform_interface_legacy.dart';
 
 void main() {
   WebViewCookieManagerPlatform? cookieManager;
diff --git a/packages/webview_flutter/webview_flutter_platform_interface/test/src/types/javascript_channel_test.dart b/packages/webview_flutter/webview_flutter_platform_interface/test/legacy/types/javascript_channel_test.dart
similarity index 93%
rename from packages/webview_flutter/webview_flutter_platform_interface/test/src/types/javascript_channel_test.dart
rename to packages/webview_flutter/webview_flutter_platform_interface/test/legacy/types/javascript_channel_test.dart
index 8d71771..ecb9c3f 100644
--- a/packages/webview_flutter/webview_flutter_platform_interface/test/src/types/javascript_channel_test.dart
+++ b/packages/webview_flutter/webview_flutter_platform_interface/test/legacy/types/javascript_channel_test.dart
@@ -3,7 +3,7 @@
 // found in the LICENSE file.
 
 import 'package:flutter_test/flutter_test.dart';
-import 'package:webview_flutter_platform_interface/src/types/javascript_channel.dart';
+import 'package:webview_flutter_platform_interface/src/webview_flutter_platform_interface_legacy.dart';
 
 void main() {
   final List<String> validChars =
diff --git a/packages/webview_flutter/webview_flutter_platform_interface/test/src/types/webview_cookie_test.dart b/packages/webview_flutter/webview_flutter_platform_interface/test/legacy/types/webview_cookie_test.dart
similarity index 87%
rename from packages/webview_flutter/webview_flutter_platform_interface/test/src/types/webview_cookie_test.dart
rename to packages/webview_flutter/webview_flutter_platform_interface/test/legacy/types/webview_cookie_test.dart
index f058b86..f1702f4 100644
--- a/packages/webview_flutter/webview_flutter_platform_interface/test/src/types/webview_cookie_test.dart
+++ b/packages/webview_flutter/webview_flutter_platform_interface/test/legacy/types/webview_cookie_test.dart
@@ -3,7 +3,7 @@
 // found in the LICENSE file.
 
 import 'package:flutter_test/flutter_test.dart';
-import 'package:webview_flutter_platform_interface/src/types/types.dart';
+import 'package:webview_flutter_platform_interface/src/webview_flutter_platform_interface_legacy.dart';
 
 void main() {
   test('WebViewCookie should serialize correctly', () {
diff --git a/packages/webview_flutter/webview_flutter_platform_interface/test/src/types/webview_request_test.dart b/packages/webview_flutter/webview_flutter_platform_interface/test/legacy/types/webview_request_test.dart
similarity index 93%
rename from packages/webview_flutter/webview_flutter_platform_interface/test/src/types/webview_request_test.dart
rename to packages/webview_flutter/webview_flutter_platform_interface/test/legacy/types/webview_request_test.dart
index 6e1a4d7..fff1a9b 100644
--- a/packages/webview_flutter/webview_flutter_platform_interface/test/src/types/webview_request_test.dart
+++ b/packages/webview_flutter/webview_flutter_platform_interface/test/legacy/types/webview_request_test.dart
@@ -4,7 +4,7 @@
 
 import 'dart:typed_data';
 import 'package:flutter_test/flutter_test.dart';
-import 'package:webview_flutter_platform_interface/src/types/types.dart';
+import 'package:webview_flutter_platform_interface/src/webview_flutter_platform_interface_legacy.dart';
 
 void main() {
   test('WebViewRequestMethod should serialize correctly', () {
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/platform_navigation_delegate_test.dart
similarity index 94%
rename from packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/platform_navigation_delegate_test.dart
rename to packages/webview_flutter/webview_flutter_platform_interface/test/platform_navigation_delegate_test.dart
index dd4a26c..5e9aa2e 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/platform_navigation_delegate_test.dart
@@ -5,8 +5,7 @@
 import 'package:flutter_test/flutter_test.dart';
 import 'package:mockito/mockito.dart';
 import 'package:plugin_platform_interface/plugin_platform_interface.dart';
-import 'package:webview_flutter_platform_interface/v4/src/platform_navigation_delegate.dart';
-import 'package:webview_flutter_platform_interface/v4/src/webview_platform.dart';
+import 'package:webview_flutter_platform_interface/webview_flutter_platform_interface.dart';
 
 import 'webview_platform_test.mocks.dart';
 
@@ -61,7 +60,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.dart b/packages/webview_flutter/webview_flutter_platform_interface/test/platform_webview_controller_test.dart
similarity index 92%
rename from packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/platform_webview_controller_test.dart
rename to packages/webview_flutter/webview_flutter_platform_interface/test/platform_webview_controller_test.dart
index 32374fb..6710f34 100644
--- a/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/platform_webview_controller_test.dart
+++ b/packages/webview_flutter/webview_flutter_platform_interface/test/platform_webview_controller_test.dart
@@ -7,9 +7,7 @@
 import 'package:mockito/annotations.dart';
 import 'package:mockito/mockito.dart';
 import 'package:plugin_platform_interface/plugin_platform_interface.dart';
-import 'package:webview_flutter_platform_interface/v4/src/platform_navigation_delegate.dart';
-import 'package:webview_flutter_platform_interface/v4/src/platform_webview_controller.dart';
-import 'package:webview_flutter_platform_interface/v4/src/webview_platform.dart';
+import 'package:webview_flutter_platform_interface/webview_flutter_platform_interface.dart';
 
 import 'platform_navigation_delegate_test.dart';
 import 'webview_platform_test.mocks.dart';
@@ -359,34 +357,6 @@
 
   test(
       // ignore: lines_longer_than_80_chars
-      'Default implementation of enableDebugging should throw unimplemented error',
-      () {
-    final PlatformWebViewController controller =
-        ExtendsPlatformWebViewController(
-            const PlatformWebViewControllerCreationParams());
-
-    expect(
-      () => controller.enableDebugging(true),
-      throwsUnimplementedError,
-    );
-  });
-
-  test(
-      // ignore: lines_longer_than_80_chars
-      'Default implementation of enableGestureNavigation should throw unimplemented error',
-      () {
-    final PlatformWebViewController controller =
-        ExtendsPlatformWebViewController(
-            const PlatformWebViewControllerCreationParams());
-
-    expect(
-      () => controller.enableGestureNavigation(true),
-      throwsUnimplementedError,
-    );
-  });
-
-  test(
-      // ignore: lines_longer_than_80_chars
       'Default implementation of enableZoom should throw unimplemented error',
       () {
     final PlatformWebViewController controller =
diff --git a/packages/webview_flutter/webview_flutter_platform_interface/test/platform_webview_controller_test.mocks.dart b/packages/webview_flutter/webview_flutter_platform_interface/test/platform_webview_controller_test.mocks.dart
new file mode 100644
index 0000000..db142fe
--- /dev/null
+++ b/packages/webview_flutter/webview_flutter_platform_interface/test/platform_webview_controller_test.mocks.dart
@@ -0,0 +1,106 @@
+// Mocks generated by Mockito 5.3.2 from annotations
+// in webview_flutter_platform_interface/test/platform_webview_controller_test.dart.
+// Do not manually edit this file.
+
+// ignore_for_file: no_leading_underscores_for_library_prefixes
+import 'dart:async' as _i4;
+
+import 'package:mockito/mockito.dart' as _i1;
+import 'package:webview_flutter_platform_interface/src/platform_navigation_delegate.dart'
+    as _i3;
+import 'package:webview_flutter_platform_interface/src/webview_platform.dart'
+    as _i2;
+
+// ignore_for_file: type=lint
+// ignore_for_file: avoid_redundant_argument_values
+// ignore_for_file: avoid_setters_without_getters
+// ignore_for_file: comment_references
+// ignore_for_file: implementation_imports
+// ignore_for_file: invalid_use_of_visible_for_testing_member
+// ignore_for_file: prefer_const_constructors
+// ignore_for_file: unnecessary_parenthesis
+// ignore_for_file: camel_case_types
+// ignore_for_file: subtype_of_sealed_class
+
+class _FakePlatformNavigationDelegateCreationParams_0 extends _i1.SmartFake
+    implements _i2.PlatformNavigationDelegateCreationParams {
+  _FakePlatformNavigationDelegateCreationParams_0(
+    Object parent,
+    Invocation parentInvocation,
+  ) : super(
+          parent,
+          parentInvocation,
+        );
+}
+
+/// A class which mocks [PlatformNavigationDelegate].
+///
+/// See the documentation for Mockito's code generation for more information.
+class MockPlatformNavigationDelegate extends _i1.Mock
+    implements _i3.PlatformNavigationDelegate {
+  MockPlatformNavigationDelegate() {
+    _i1.throwOnMissingStub(this);
+  }
+
+  @override
+  _i2.PlatformNavigationDelegateCreationParams get params =>
+      (super.noSuchMethod(
+        Invocation.getter(#params),
+        returnValue: _FakePlatformNavigationDelegateCreationParams_0(
+          this,
+          Invocation.getter(#params),
+        ),
+      ) as _i2.PlatformNavigationDelegateCreationParams);
+  @override
+  _i4.Future<void> setOnNavigationRequest(
+          _i3.NavigationRequestCallback? onNavigationRequest) =>
+      (super.noSuchMethod(
+        Invocation.method(
+          #setOnNavigationRequest,
+          [onNavigationRequest],
+        ),
+        returnValue: _i4.Future<void>.value(),
+        returnValueForMissingStub: _i4.Future<void>.value(),
+      ) as _i4.Future<void>);
+  @override
+  _i4.Future<void> setOnPageStarted(_i3.PageEventCallback? onPageStarted) =>
+      (super.noSuchMethod(
+        Invocation.method(
+          #setOnPageStarted,
+          [onPageStarted],
+        ),
+        returnValue: _i4.Future<void>.value(),
+        returnValueForMissingStub: _i4.Future<void>.value(),
+      ) as _i4.Future<void>);
+  @override
+  _i4.Future<void> setOnPageFinished(_i3.PageEventCallback? onPageFinished) =>
+      (super.noSuchMethod(
+        Invocation.method(
+          #setOnPageFinished,
+          [onPageFinished],
+        ),
+        returnValue: _i4.Future<void>.value(),
+        returnValueForMissingStub: _i4.Future<void>.value(),
+      ) as _i4.Future<void>);
+  @override
+  _i4.Future<void> setOnProgress(_i3.ProgressCallback? onProgress) =>
+      (super.noSuchMethod(
+        Invocation.method(
+          #setOnProgress,
+          [onProgress],
+        ),
+        returnValue: _i4.Future<void>.value(),
+        returnValueForMissingStub: _i4.Future<void>.value(),
+      ) as _i4.Future<void>);
+  @override
+  _i4.Future<void> setOnWebResourceError(
+          _i3.WebResourceErrorCallback? onWebResourceError) =>
+      (super.noSuchMethod(
+        Invocation.method(
+          #setOnWebResourceError,
+          [onWebResourceError],
+        ),
+        returnValue: _i4.Future<void>.value(),
+        returnValueForMissingStub: _i4.Future<void>.value(),
+      ) as _i4.Future<void>);
+}
diff --git a/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/platform_webview_widget_test.dart b/packages/webview_flutter/webview_flutter_platform_interface/test/platform_webview_widget_test.dart
similarity index 92%
rename from packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/platform_webview_widget_test.dart
rename to packages/webview_flutter/webview_flutter_platform_interface/test/platform_webview_widget_test.dart
index ede16c1..652f326 100644
--- a/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/platform_webview_widget_test.dart
+++ b/packages/webview_flutter/webview_flutter_platform_interface/test/platform_webview_widget_test.dart
@@ -6,9 +6,7 @@
 import 'package:flutter_test/flutter_test.dart';
 import 'package:mockito/mockito.dart';
 import 'package:plugin_platform_interface/plugin_platform_interface.dart';
-import 'package:webview_flutter_platform_interface/v4/src/platform_webview_controller.dart';
-import 'package:webview_flutter_platform_interface/v4/src/platform_webview_widget.dart';
-import 'package:webview_flutter_platform_interface/v4/src/webview_platform.dart';
+import 'package:webview_flutter_platform_interface/webview_flutter_platform_interface.dart';
 
 import 'webview_platform_test.mocks.dart';
 
diff --git a/packages/webview_flutter/webview_flutter_platform_interface/test/src/method_channel/webview_method_channel_test.dart b/packages/webview_flutter/webview_flutter_platform_interface/test/src/method_channel/webview_method_channel_test.dart
deleted file mode 100644
index ea9eb92..0000000
--- a/packages/webview_flutter/webview_flutter_platform_interface/test/src/method_channel/webview_method_channel_test.dart
+++ /dev/null
@@ -1,746 +0,0 @@
-// 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.
-
-// TODO(a14n): remove this import once Flutter 3.1 or later reaches stable (including flutter/flutter#106316)
-// ignore: unnecessary_import
-import 'dart:typed_data';
-
-// TODO(a14n): remove this import once Flutter 3.1 or later reaches stable (including flutter/flutter#106316)
-// ignore: unnecessary_import
-import 'package:flutter/cupertino.dart';
-import 'package:flutter/services.dart';
-import 'package:flutter_test/flutter_test.dart';
-import 'package:mockito/mockito.dart';
-import 'package:webview_flutter_platform_interface/webview_flutter_platform_interface.dart';
-
-void main() {
-  TestWidgetsFlutterBinding.ensureInitialized();
-
-  group('Tests on `plugin.flutter.io/webview_<channel_id>` channel', () {
-    const int channelId = 1;
-    const MethodChannel channel =
-        MethodChannel('plugins.flutter.io/webview_$channelId');
-    final WebViewPlatformCallbacksHandler callbacksHandler =
-        MockWebViewPlatformCallbacksHandler();
-    final JavascriptChannelRegistry javascriptChannelRegistry =
-        MockJavascriptChannelRegistry();
-
-    final List<MethodCall> log = <MethodCall>[];
-    channel.setMockMethodCallHandler((MethodCall methodCall) async {
-      log.add(methodCall);
-
-      switch (methodCall.method) {
-        case 'currentUrl':
-          return 'https://test.url';
-        case 'canGoBack':
-        case 'canGoForward':
-          return true;
-        case 'loadFile':
-          if (methodCall.arguments == 'invalid file') {
-            throw PlatformException(
-                code: 'loadFile_failed', message: 'Failed loading file.');
-          } else if (methodCall.arguments == 'some error') {
-            throw PlatformException(
-              code: 'some_error',
-              message: 'Some error occurred.',
-            );
-          }
-          return null;
-        case 'loadFlutterAsset':
-          if (methodCall.arguments == 'invalid key') {
-            throw PlatformException(
-              code: 'loadFlutterAsset_invalidKey',
-              message: 'Failed loading asset.',
-            );
-          } else if (methodCall.arguments == 'some error') {
-            throw PlatformException(
-              code: 'some_error',
-              message: 'Some error occurred.',
-            );
-          }
-          return null;
-        case 'runJavascriptReturningResult':
-        case 'evaluateJavascript':
-          return methodCall.arguments as String;
-        case 'getScrollX':
-          return 10;
-        case 'getScrollY':
-          return 20;
-      }
-
-      // Return null explicitly instead of relying on the implicit null
-      // returned by the method channel if no return statement is specified.
-      return null;
-    });
-
-    final MethodChannelWebViewPlatform webViewPlatform =
-        MethodChannelWebViewPlatform(
-      channelId,
-      callbacksHandler,
-      javascriptChannelRegistry,
-    );
-
-    tearDown(() {
-      log.clear();
-    });
-
-    test('loadFile', () async {
-      await webViewPlatform.loadFile(
-        '/folder/asset.html',
-      );
-
-      expect(
-        log,
-        <Matcher>[
-          isMethodCall(
-            'loadFile',
-            arguments: '/folder/asset.html',
-          ),
-        ],
-      );
-    });
-
-    test('loadFile with invalid file', () async {
-      expect(
-        () => webViewPlatform.loadFile('invalid file'),
-        throwsA(
-          isA<ArgumentError>().having(
-            (ArgumentError error) => error.message,
-            'message',
-            'Failed loading file.',
-          ),
-        ),
-      );
-    });
-
-    test('loadFile with some error.', () async {
-      expect(
-        () => webViewPlatform.loadFile('some error'),
-        throwsA(
-          isA<PlatformException>().having(
-            (PlatformException error) => error.message,
-            'message',
-            'Some error occurred.',
-          ),
-        ),
-      );
-    });
-
-    test('loadFlutterAsset', () async {
-      await webViewPlatform.loadFlutterAsset(
-        'folder/asset.html',
-      );
-
-      expect(
-        log,
-        <Matcher>[
-          isMethodCall(
-            'loadFlutterAsset',
-            arguments: 'folder/asset.html',
-          ),
-        ],
-      );
-    });
-
-    test('loadFlutterAsset with empty key', () async {
-      expect(() => webViewPlatform.loadFlutterAsset(''), throwsAssertionError);
-    });
-
-    test('loadFlutterAsset with invalid key', () async {
-      expect(
-        () => webViewPlatform.loadFlutterAsset('invalid key'),
-        throwsA(
-          isA<ArgumentError>().having(
-            (ArgumentError error) => error.message,
-            'message',
-            'Failed loading asset.',
-          ),
-        ),
-      );
-    });
-
-    test('loadFlutterAsset with some error.', () async {
-      expect(
-        () => webViewPlatform.loadFlutterAsset('some error'),
-        throwsA(
-          isA<PlatformException>().having(
-            (PlatformException error) => error.message,
-            'message',
-            'Some error occurred.',
-          ),
-        ),
-      );
-    });
-
-    test('loadHtmlString without base URL', () async {
-      await webViewPlatform.loadHtmlString(
-        'Test HTML string',
-      );
-
-      expect(
-        log,
-        <Matcher>[
-          isMethodCall(
-            'loadHtmlString',
-            arguments: <String, String?>{
-              'html': 'Test HTML string',
-              'baseUrl': null,
-            },
-          ),
-        ],
-      );
-    });
-
-    test('loadHtmlString without base URL', () async {
-      await webViewPlatform.loadHtmlString(
-        'Test HTML string',
-        baseUrl: 'https://flutter.dev',
-      );
-
-      expect(
-        log,
-        <Matcher>[
-          isMethodCall(
-            'loadHtmlString',
-            arguments: <String, String?>{
-              'html': 'Test HTML string',
-              'baseUrl': 'https://flutter.dev',
-            },
-          ),
-        ],
-      );
-    });
-
-    test('loadUrl with headers', () async {
-      await webViewPlatform.loadUrl(
-        'https://test.url',
-        const <String, String>{
-          'Content-Type': 'text/plain',
-          'Accept': 'text/html',
-        },
-      );
-
-      expect(
-        log,
-        <Matcher>[
-          isMethodCall(
-            'loadUrl',
-            arguments: <String, dynamic>{
-              'url': 'https://test.url',
-              'headers': <String, String>{
-                'Content-Type': 'text/plain',
-                'Accept': 'text/html',
-              },
-            },
-          ),
-        ],
-      );
-    });
-
-    test('loadUrl without headers', () async {
-      await webViewPlatform.loadUrl(
-        'https://test.url',
-        null,
-      );
-
-      expect(
-        log,
-        <Matcher>[
-          isMethodCall(
-            'loadUrl',
-            arguments: <String, dynamic>{
-              'url': 'https://test.url',
-              'headers': null,
-            },
-          ),
-        ],
-      );
-    });
-
-    test('loadRequest', () async {
-      await webViewPlatform.loadRequest(WebViewRequest(
-        uri: Uri.parse('https://test.url'),
-        method: WebViewRequestMethod.get,
-      ));
-
-      expect(
-        log,
-        <Matcher>[
-          isMethodCall(
-            'loadRequest',
-            arguments: <String, dynamic>{
-              'request': <String, dynamic>{
-                'uri': 'https://test.url',
-                'method': 'get',
-                'headers': <String, String>{},
-                'body': null,
-              }
-            },
-          ),
-        ],
-      );
-    });
-
-    test('loadRequest with optional parameters', () async {
-      await webViewPlatform.loadRequest(WebViewRequest(
-        uri: Uri.parse('https://test.url'),
-        method: WebViewRequestMethod.get,
-        headers: <String, String>{'foo': 'bar'},
-        body: Uint8List.fromList('hello world'.codeUnits),
-      ));
-
-      expect(
-        log,
-        <Matcher>[
-          isMethodCall(
-            'loadRequest',
-            arguments: <String, dynamic>{
-              'request': <String, dynamic>{
-                'uri': 'https://test.url',
-                'method': 'get',
-                'headers': <String, String>{'foo': 'bar'},
-                'body': 'hello world'.codeUnits,
-              }
-            },
-          ),
-        ],
-      );
-    });
-
-    test('currentUrl', () async {
-      final String? currentUrl = await webViewPlatform.currentUrl();
-
-      expect(currentUrl, 'https://test.url');
-      expect(
-        log,
-        <Matcher>[
-          isMethodCall(
-            'currentUrl',
-            arguments: null,
-          ),
-        ],
-      );
-    });
-
-    test('canGoBack', () async {
-      final bool canGoBack = await webViewPlatform.canGoBack();
-
-      expect(canGoBack, true);
-      expect(
-        log,
-        <Matcher>[
-          isMethodCall(
-            'canGoBack',
-            arguments: null,
-          ),
-        ],
-      );
-    });
-
-    test('canGoForward', () async {
-      final bool canGoForward = await webViewPlatform.canGoForward();
-
-      expect(canGoForward, true);
-      expect(
-        log,
-        <Matcher>[
-          isMethodCall(
-            'canGoForward',
-            arguments: null,
-          ),
-        ],
-      );
-    });
-
-    test('goBack', () async {
-      await webViewPlatform.goBack();
-
-      expect(
-        log,
-        <Matcher>[
-          isMethodCall(
-            'goBack',
-            arguments: null,
-          ),
-        ],
-      );
-    });
-
-    test('goForward', () async {
-      await webViewPlatform.goForward();
-
-      expect(
-        log,
-        <Matcher>[
-          isMethodCall(
-            'goForward',
-            arguments: null,
-          ),
-        ],
-      );
-    });
-
-    test('reload', () async {
-      await webViewPlatform.reload();
-
-      expect(
-        log,
-        <Matcher>[
-          isMethodCall(
-            'reload',
-            arguments: null,
-          ),
-        ],
-      );
-    });
-
-    test('clearCache', () async {
-      await webViewPlatform.clearCache();
-
-      expect(
-        log,
-        <Matcher>[
-          isMethodCall(
-            'clearCache',
-            arguments: null,
-          ),
-        ],
-      );
-    });
-
-    test('updateSettings', () async {
-      final WebSettings settings =
-          WebSettings(userAgent: const WebSetting<String?>.of('Dart Test'));
-      await webViewPlatform.updateSettings(settings);
-
-      expect(
-        log,
-        <Matcher>[
-          isMethodCall(
-            'updateSettings',
-            arguments: <String, dynamic>{
-              'userAgent': 'Dart Test',
-            },
-          ),
-        ],
-      );
-    });
-
-    test('updateSettings all parameters', () async {
-      final WebSettings settings = WebSettings(
-        userAgent: const WebSetting<String?>.of('Dart Test'),
-        javascriptMode: JavascriptMode.disabled,
-        hasNavigationDelegate: true,
-        hasProgressTracking: true,
-        debuggingEnabled: true,
-        gestureNavigationEnabled: true,
-        allowsInlineMediaPlayback: true,
-        zoomEnabled: false,
-      );
-      await webViewPlatform.updateSettings(settings);
-
-      expect(
-        log,
-        <Matcher>[
-          isMethodCall(
-            'updateSettings',
-            arguments: <String, dynamic>{
-              'userAgent': 'Dart Test',
-              'jsMode': 0,
-              'hasNavigationDelegate': true,
-              'hasProgressTracking': true,
-              'debuggingEnabled': true,
-              'gestureNavigationEnabled': true,
-              'allowsInlineMediaPlayback': true,
-              'zoomEnabled': false,
-            },
-          ),
-        ],
-      );
-    });
-
-    test('updateSettings without settings', () async {
-      final WebSettings settings =
-          WebSettings(userAgent: const WebSetting<String?>.absent());
-      await webViewPlatform.updateSettings(settings);
-
-      expect(
-        log.isEmpty,
-        true,
-      );
-    });
-
-    test('evaluateJavascript', () async {
-      final String evaluateJavascript =
-          await webViewPlatform.evaluateJavascript(
-        'This simulates some JavaScript code.',
-      );
-
-      expect('This simulates some JavaScript code.', evaluateJavascript);
-      expect(
-        log,
-        <Matcher>[
-          isMethodCall(
-            'evaluateJavascript',
-            arguments: 'This simulates some JavaScript code.',
-          ),
-        ],
-      );
-    });
-
-    test('runJavascript', () async {
-      await webViewPlatform.runJavascript(
-        'This simulates some JavaScript code.',
-      );
-
-      expect(
-        log,
-        <Matcher>[
-          isMethodCall(
-            'runJavascript',
-            arguments: 'This simulates some JavaScript code.',
-          ),
-        ],
-      );
-    });
-
-    test('runJavascriptReturningResult', () async {
-      final String evaluateJavascript =
-          await webViewPlatform.runJavascriptReturningResult(
-        'This simulates some JavaScript code.',
-      );
-
-      expect('This simulates some JavaScript code.', evaluateJavascript);
-      expect(
-        log,
-        <Matcher>[
-          isMethodCall(
-            'runJavascriptReturningResult',
-            arguments: 'This simulates some JavaScript code.',
-          ),
-        ],
-      );
-    });
-
-    test('addJavascriptChannels', () async {
-      final Set<String> channels = <String>{'channel one', 'channel two'};
-      await webViewPlatform.addJavascriptChannels(channels);
-
-      expect(log, <Matcher>[
-        isMethodCall(
-          'addJavascriptChannels',
-          arguments: <String>[
-            'channel one',
-            'channel two',
-          ],
-        ),
-      ]);
-    });
-
-    test('addJavascriptChannels without channels', () async {
-      final Set<String> channels = <String>{};
-      await webViewPlatform.addJavascriptChannels(channels);
-
-      expect(log, <Matcher>[
-        isMethodCall(
-          'addJavascriptChannels',
-          arguments: <String>[],
-        ),
-      ]);
-    });
-
-    test('removeJavascriptChannels', () async {
-      final Set<String> channels = <String>{'channel one', 'channel two'};
-      await webViewPlatform.removeJavascriptChannels(channels);
-
-      expect(log, <Matcher>[
-        isMethodCall(
-          'removeJavascriptChannels',
-          arguments: <String>[
-            'channel one',
-            'channel two',
-          ],
-        ),
-      ]);
-    });
-
-    test('removeJavascriptChannels without channels', () async {
-      final Set<String> channels = <String>{};
-      await webViewPlatform.removeJavascriptChannels(channels);
-
-      expect(log, <Matcher>[
-        isMethodCall(
-          'removeJavascriptChannels',
-          arguments: <String>[],
-        ),
-      ]);
-    });
-
-    test('getTitle', () async {
-      final String? title = await webViewPlatform.getTitle();
-
-      expect(title, null);
-      expect(
-        log,
-        <Matcher>[
-          isMethodCall('getTitle', arguments: null),
-        ],
-      );
-    });
-
-    test('scrollTo', () async {
-      await webViewPlatform.scrollTo(10, 20);
-
-      expect(
-        log,
-        <Matcher>[
-          isMethodCall(
-            'scrollTo',
-            arguments: <String, int>{
-              'x': 10,
-              'y': 20,
-            },
-          ),
-        ],
-      );
-    });
-
-    test('scrollBy', () async {
-      await webViewPlatform.scrollBy(10, 20);
-
-      expect(
-        log,
-        <Matcher>[
-          isMethodCall(
-            'scrollBy',
-            arguments: <String, int>{
-              'x': 10,
-              'y': 20,
-            },
-          ),
-        ],
-      );
-    });
-
-    test('getScrollX', () async {
-      final int x = await webViewPlatform.getScrollX();
-
-      expect(x, 10);
-      expect(
-        log,
-        <Matcher>[
-          isMethodCall(
-            'getScrollX',
-            arguments: null,
-          ),
-        ],
-      );
-    });
-
-    test('getScrollY', () async {
-      final int y = await webViewPlatform.getScrollY();
-
-      expect(y, 20);
-      expect(
-        log,
-        <Matcher>[
-          isMethodCall(
-            'getScrollY',
-            arguments: null,
-          ),
-        ],
-      );
-    });
-
-    test('backgroundColor is null by default', () {
-      final CreationParams creationParams = CreationParams(
-        webSettings: WebSettings(
-          userAgent: const WebSetting<String?>.of('Dart Test'),
-        ),
-      );
-      final Map<String, dynamic> creationParamsMap =
-          MethodChannelWebViewPlatform.creationParamsToMap(creationParams);
-
-      expect(creationParamsMap['backgroundColor'], null);
-    });
-
-    test('backgroundColor is converted to an int', () {
-      const Color whiteColor = Color(0xFFFFFFFF);
-      final CreationParams creationParams = CreationParams(
-        backgroundColor: whiteColor,
-        webSettings: WebSettings(
-          userAgent: const WebSetting<String?>.of('Dart Test'),
-        ),
-      );
-      final Map<String, dynamic> creationParamsMap =
-          MethodChannelWebViewPlatform.creationParamsToMap(creationParams);
-
-      expect(creationParamsMap['backgroundColor'], whiteColor.value);
-    });
-  });
-
-  group('Tests on `plugins.flutter.io/cookie_manager` channel', () {
-    const MethodChannel cookieChannel =
-        MethodChannel('plugins.flutter.io/cookie_manager');
-
-    final List<MethodCall> log = <MethodCall>[];
-    cookieChannel.setMockMethodCallHandler((MethodCall methodCall) async {
-      log.add(methodCall);
-
-      if (methodCall.method == 'clearCookies') {
-        return true;
-      }
-
-      // Return null explicitly instead of relying on the implicit null
-      // returned by the method channel if no return statement is specified.
-      return null;
-    });
-
-    tearDown(() {
-      log.clear();
-    });
-
-    test('clearCookies', () async {
-      final bool clearCookies =
-          await MethodChannelWebViewPlatform.clearCookies();
-
-      expect(clearCookies, true);
-      expect(
-        log,
-        <Matcher>[
-          isMethodCall(
-            'clearCookies',
-            arguments: null,
-          ),
-        ],
-      );
-    });
-
-    test('setCookie', () async {
-      await MethodChannelWebViewPlatform.setCookie(const WebViewCookie(
-          name: 'foo', value: 'bar', domain: 'flutter.dev'));
-
-      expect(
-        log,
-        <Matcher>[
-          isMethodCall(
-            'setCookie',
-            arguments: <String, String>{
-              'name': 'foo',
-              'value': 'bar',
-              'domain': 'flutter.dev',
-              'path': '/',
-            },
-          ),
-        ],
-      );
-    });
-  });
-}
-
-class MockWebViewPlatformCallbacksHandler extends Mock
-    implements WebViewPlatformCallbacksHandler {}
-
-class MockJavascriptChannelRegistry extends Mock
-    implements JavascriptChannelRegistry {}
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
deleted file mode 100644
index 47e6737..0000000
--- a/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/platform_webview_controller_test.mocks.dart
+++ /dev/null
@@ -1,72 +0,0 @@
-// Mocks generated by Mockito 5.0.16 from annotations
-// in webview_flutter_platform_interface/test/src/v4/platform_webview_controller_test.dart.
-// Do not manually edit this file.
-
-import 'dart:async' as _i4;
-
-import 'package:mockito/mockito.dart' as _i1;
-import 'package:webview_flutter_platform_interface/v4/src/platform_navigation_delegate.dart'
-    as _i3;
-import 'package:webview_flutter_platform_interface/v4/src/webview_platform.dart'
-    as _i2;
-
-// ignore_for_file: avoid_redundant_argument_values
-// ignore_for_file: avoid_setters_without_getters
-// ignore_for_file: comment_references
-// ignore_for_file: implementation_imports
-// ignore_for_file: invalid_use_of_visible_for_testing_member
-// ignore_for_file: prefer_const_constructors
-// ignore_for_file: unnecessary_parenthesis
-// ignore_for_file: camel_case_types
-
-class _FakePlatformNavigationDelegateCreationParams_0 extends _i1.Fake
-    implements _i2.PlatformNavigationDelegateCreationParams {}
-
-/// A class which mocks [PlatformNavigationDelegate].
-///
-/// See the documentation for Mockito's code generation for more information.
-class MockPlatformNavigationDelegate extends _i1.Mock
-    implements _i3.PlatformNavigationDelegate {
-  MockPlatformNavigationDelegate() {
-    _i1.throwOnMissingStub(this);
-  }
-
-  @override
-  _i2.PlatformNavigationDelegateCreationParams get params =>
-      (super.noSuchMethod(Invocation.getter(#params),
-              returnValue: _FakePlatformNavigationDelegateCreationParams_0())
-          as _i2.PlatformNavigationDelegateCreationParams);
-  @override
-  _i4.Future<void> setOnNavigationRequest(
-          _i4.FutureOr<bool> Function({bool isForMainFrame, String url})?
-              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) =>
-      (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) =>
-      (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) =>
-      (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) =>
-      (super.noSuchMethod(
-          Invocation.method(#setOnWebResourceError, [onWebResourceError]),
-          returnValue: Future<void>.value(),
-          returnValueForMissingStub: Future<void>.value()) as _i4.Future<void>);
-  @override
-  String toString() => super.toString();
-}
diff --git a/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/webview_platform_test.mocks.dart b/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/webview_platform_test.mocks.dart
deleted file mode 100644
index 5ce0075..0000000
--- a/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/webview_platform_test.mocks.dart
+++ /dev/null
@@ -1,78 +0,0 @@
-// Mocks generated by Mockito 5.0.16 from annotations
-// in webview_flutter_platform_interface/test/src/v4/webview_platform_test.dart.
-// Do not manually edit this file.
-
-import 'package:mockito/mockito.dart' as _i1;
-import 'package:webview_flutter_platform_interface/v4/src/platform_navigation_delegate.dart'
-    as _i3;
-import 'package:webview_flutter_platform_interface/v4/src/platform_webview_controller.dart'
-    as _i4;
-import 'package:webview_flutter_platform_interface/v4/src/platform_webview_cookie_manager.dart'
-    as _i2;
-import 'package:webview_flutter_platform_interface/v4/src/platform_webview_widget.dart'
-    as _i5;
-import 'package:webview_flutter_platform_interface/v4/src/types/types.dart'
-    as _i7;
-import 'package:webview_flutter_platform_interface/v4/src/webview_platform.dart'
-    as _i6;
-
-// ignore_for_file: avoid_redundant_argument_values
-// ignore_for_file: avoid_setters_without_getters
-// ignore_for_file: comment_references
-// ignore_for_file: implementation_imports
-// ignore_for_file: invalid_use_of_visible_for_testing_member
-// ignore_for_file: prefer_const_constructors
-// ignore_for_file: unnecessary_parenthesis
-// ignore_for_file: camel_case_types
-
-class _FakePlatformWebViewCookieManager_0 extends _i1.Fake
-    implements _i2.PlatformWebViewCookieManager {}
-
-class _FakePlatformNavigationDelegate_1 extends _i1.Fake
-    implements _i3.PlatformNavigationDelegate {}
-
-class _FakePlatformWebViewController_2 extends _i1.Fake
-    implements _i4.PlatformWebViewController {}
-
-class _FakePlatformWebViewWidget_3 extends _i1.Fake
-    implements _i5.PlatformWebViewWidget {}
-
-/// A class which mocks [WebViewPlatform].
-///
-/// See the documentation for Mockito's code generation for more information.
-class MockWebViewPlatform extends _i1.Mock implements _i6.WebViewPlatform {
-  MockWebViewPlatform() {
-    _i1.throwOnMissingStub(this);
-  }
-
-  @override
-  _i2.PlatformWebViewCookieManager createPlatformCookieManager(
-          _i7.PlatformWebViewCookieManagerCreationParams? params) =>
-      (super.noSuchMethod(
-              Invocation.method(#createPlatformCookieManager, [params]),
-              returnValue: _FakePlatformWebViewCookieManager_0())
-          as _i2.PlatformWebViewCookieManager);
-  @override
-  _i3.PlatformNavigationDelegate createPlatformNavigationDelegate(
-          _i7.PlatformNavigationDelegateCreationParams? params) =>
-      (super.noSuchMethod(
-              Invocation.method(#createPlatformNavigationDelegate, [params]),
-              returnValue: _FakePlatformNavigationDelegate_1())
-          as _i3.PlatformNavigationDelegate);
-  @override
-  _i4.PlatformWebViewController createPlatformWebViewController(
-          _i7.PlatformWebViewControllerCreationParams? params) =>
-      (super.noSuchMethod(
-              Invocation.method(#createPlatformWebViewController, [params]),
-              returnValue: _FakePlatformWebViewController_2())
-          as _i4.PlatformWebViewController);
-  @override
-  _i5.PlatformWebViewWidget createPlatformWebViewWidget(
-          _i7.PlatformWebViewWidgetCreationParams? params) =>
-      (super.noSuchMethod(
-              Invocation.method(#createPlatformWebViewWidget, [params]),
-              returnValue: _FakePlatformWebViewWidget_3())
-          as _i5.PlatformWebViewWidget);
-  @override
-  String toString() => super.toString();
-}
diff --git a/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/webview_platform_test.dart b/packages/webview_flutter/webview_flutter_platform_interface/test/webview_platform_test.dart
similarity index 95%
rename from packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/webview_platform_test.dart
rename to packages/webview_flutter/webview_flutter_platform_interface/test/webview_platform_test.dart
index 4ab6d58..34f8406 100644
--- a/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/webview_platform_test.dart
+++ b/packages/webview_flutter/webview_flutter_platform_interface/test/webview_platform_test.dart
@@ -6,8 +6,7 @@
 import 'package:mockito/annotations.dart';
 import 'package:mockito/mockito.dart';
 import 'package:plugin_platform_interface/plugin_platform_interface.dart';
-import 'package:webview_flutter_platform_interface/v4/src/platform_webview_controller.dart';
-import 'package:webview_flutter_platform_interface/v4/src/webview_platform.dart';
+import 'package:webview_flutter_platform_interface/webview_flutter_platform_interface.dart';
 
 import 'webview_platform_test.mocks.dart';
 
diff --git a/packages/webview_flutter/webview_flutter_platform_interface/test/webview_platform_test.mocks.dart b/packages/webview_flutter/webview_flutter_platform_interface/test/webview_platform_test.mocks.dart
new file mode 100644
index 0000000..d613cdd
--- /dev/null
+++ b/packages/webview_flutter/webview_flutter_platform_interface/test/webview_platform_test.mocks.dart
@@ -0,0 +1,146 @@
+// Mocks generated by Mockito 5.3.2 from annotations
+// in webview_flutter_platform_interface/test/webview_platform_test.dart.
+// Do not manually edit this file.
+
+// ignore_for_file: no_leading_underscores_for_library_prefixes
+import 'package:mockito/mockito.dart' as _i1;
+import 'package:webview_flutter_platform_interface/src/platform_navigation_delegate.dart'
+    as _i3;
+import 'package:webview_flutter_platform_interface/src/platform_webview_controller.dart'
+    as _i4;
+import 'package:webview_flutter_platform_interface/src/platform_webview_cookie_manager.dart'
+    as _i2;
+import 'package:webview_flutter_platform_interface/src/platform_webview_widget.dart'
+    as _i5;
+import 'package:webview_flutter_platform_interface/src/types/types.dart' as _i7;
+import 'package:webview_flutter_platform_interface/src/webview_platform.dart'
+    as _i6;
+
+// ignore_for_file: type=lint
+// ignore_for_file: avoid_redundant_argument_values
+// ignore_for_file: avoid_setters_without_getters
+// ignore_for_file: comment_references
+// ignore_for_file: implementation_imports
+// ignore_for_file: invalid_use_of_visible_for_testing_member
+// ignore_for_file: prefer_const_constructors
+// ignore_for_file: unnecessary_parenthesis
+// ignore_for_file: camel_case_types
+// ignore_for_file: subtype_of_sealed_class
+
+class _FakePlatformWebViewCookieManager_0 extends _i1.SmartFake
+    implements _i2.PlatformWebViewCookieManager {
+  _FakePlatformWebViewCookieManager_0(
+    Object parent,
+    Invocation parentInvocation,
+  ) : super(
+          parent,
+          parentInvocation,
+        );
+}
+
+class _FakePlatformNavigationDelegate_1 extends _i1.SmartFake
+    implements _i3.PlatformNavigationDelegate {
+  _FakePlatformNavigationDelegate_1(
+    Object parent,
+    Invocation parentInvocation,
+  ) : super(
+          parent,
+          parentInvocation,
+        );
+}
+
+class _FakePlatformWebViewController_2 extends _i1.SmartFake
+    implements _i4.PlatformWebViewController {
+  _FakePlatformWebViewController_2(
+    Object parent,
+    Invocation parentInvocation,
+  ) : super(
+          parent,
+          parentInvocation,
+        );
+}
+
+class _FakePlatformWebViewWidget_3 extends _i1.SmartFake
+    implements _i5.PlatformWebViewWidget {
+  _FakePlatformWebViewWidget_3(
+    Object parent,
+    Invocation parentInvocation,
+  ) : super(
+          parent,
+          parentInvocation,
+        );
+}
+
+/// A class which mocks [WebViewPlatform].
+///
+/// See the documentation for Mockito's code generation for more information.
+class MockWebViewPlatform extends _i1.Mock implements _i6.WebViewPlatform {
+  MockWebViewPlatform() {
+    _i1.throwOnMissingStub(this);
+  }
+
+  @override
+  _i2.PlatformWebViewCookieManager createPlatformCookieManager(
+          _i7.PlatformWebViewCookieManagerCreationParams? params) =>
+      (super.noSuchMethod(
+        Invocation.method(
+          #createPlatformCookieManager,
+          [params],
+        ),
+        returnValue: _FakePlatformWebViewCookieManager_0(
+          this,
+          Invocation.method(
+            #createPlatformCookieManager,
+            [params],
+          ),
+        ),
+      ) as _i2.PlatformWebViewCookieManager);
+  @override
+  _i3.PlatformNavigationDelegate createPlatformNavigationDelegate(
+          _i7.PlatformNavigationDelegateCreationParams? params) =>
+      (super.noSuchMethod(
+        Invocation.method(
+          #createPlatformNavigationDelegate,
+          [params],
+        ),
+        returnValue: _FakePlatformNavigationDelegate_1(
+          this,
+          Invocation.method(
+            #createPlatformNavigationDelegate,
+            [params],
+          ),
+        ),
+      ) as _i3.PlatformNavigationDelegate);
+  @override
+  _i4.PlatformWebViewController createPlatformWebViewController(
+          _i7.PlatformWebViewControllerCreationParams? params) =>
+      (super.noSuchMethod(
+        Invocation.method(
+          #createPlatformWebViewController,
+          [params],
+        ),
+        returnValue: _FakePlatformWebViewController_2(
+          this,
+          Invocation.method(
+            #createPlatformWebViewController,
+            [params],
+          ),
+        ),
+      ) as _i4.PlatformWebViewController);
+  @override
+  _i5.PlatformWebViewWidget createPlatformWebViewWidget(
+          _i7.PlatformWebViewWidgetCreationParams? params) =>
+      (super.noSuchMethod(
+        Invocation.method(
+          #createPlatformWebViewWidget,
+          [params],
+        ),
+        returnValue: _FakePlatformWebViewWidget_3(
+          this,
+          Invocation.method(
+            #createPlatformWebViewWidget,
+            [params],
+          ),
+        ),
+      ) as _i5.PlatformWebViewWidget);
+}
diff --git a/script/configs/exclude_all_plugins_app.yaml b/script/configs/exclude_all_plugins_app.yaml
index 8dd0fde..62b20d9 100644
--- a/script/configs/exclude_all_plugins_app.yaml
+++ b/script/configs/exclude_all_plugins_app.yaml
@@ -8,3 +8,4 @@
 
 # This is a permament entry, as it should never be a direct app dependency.
 - plugin_platform_interface
+- webview_flutter_platform_interface