From ee662ecfbc7d1271a074fcc34d4f86002523b09c Mon Sep 17 00:00:00 2001 From: Maurits van Beusekom Date: Thu, 24 Mar 2022 16:29:27 +0100 Subject: [PATCH 01/31] Refactor to v4 --- .../navigation_callback_handler_delegate.dart | 60 +++ .../lib/src/v4/types/javascript_mode.dart | 12 + .../lib/src/v4/types/load_request_params.dart | 129 ++++++ .../lib/src/v4/types/types.dart | 10 + .../lib/src/v4/types/web_resource_error.dart | 60 +++ .../src/v4/types/web_resource_error_type.dart | 66 ++++ .../lib/src/v4/types/web_settings.dart | 208 ++++++++++ .../lib/src/v4/types/webview_cookie.dart | 52 +++ .../src/v4/webview_controller_delegate.dart | 264 +++++++++++++ .../v4/webview_cookie_manager_delegate.dart | 51 +++ .../lib/src/v4/webview_platform.dart | 96 +++++ .../lib/src/v4/webview_widget_delegate.dart | 90 +++++ .../pubspec.yaml | 1 + ...gation_callback_handler_delegate_test.dart | 83 ++++ .../v4/types/load_request_params_test.dart | 110 ++++++ .../test/src/v4/types/web_settings_test.dart | 90 +++++ .../v4/webview_controller_delegate_test.dart | 371 ++++++++++++++++++ .../test/src/v4/webview_platform_test.dart | 110 ++++++ .../src/v4/webview_platform_test.mocks.dart | 119 ++++++ 19 files changed, 1982 insertions(+) create mode 100644 packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/navigation_callback_handler_delegate.dart create mode 100644 packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/javascript_mode.dart create mode 100644 packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/load_request_params.dart create mode 100644 packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/types.dart create mode 100644 packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/web_resource_error.dart create mode 100644 packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/web_resource_error_type.dart create mode 100644 packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/web_settings.dart create mode 100644 packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/webview_cookie.dart create mode 100644 packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/webview_controller_delegate.dart create mode 100644 packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/webview_cookie_manager_delegate.dart create mode 100644 packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/webview_platform.dart create mode 100644 packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/webview_widget_delegate.dart create mode 100644 packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/navigation_callback_handler_delegate_test.dart create mode 100644 packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/types/load_request_params_test.dart create mode 100644 packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/types/web_settings_test.dart create mode 100644 packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/webview_controller_delegate_test.dart create mode 100644 packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/webview_platform_test.dart create mode 100644 packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/webview_platform_test.mocks.dart diff --git a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/navigation_callback_handler_delegate.dart b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/navigation_callback_handler_delegate.dart new file mode 100644 index 000000000000..1cee5654adfc --- /dev/null +++ b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/navigation_callback_handler_delegate.dart @@ -0,0 +1,60 @@ +// 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/foundation.dart'; +import 'package:plugin_platform_interface/plugin_platform_interface.dart'; + +import 'types/types.dart'; +import 'webview_platform.dart'; + +/// Interface for callbacks made by [NavigationCallbackHandlerDelegate]. +/// +/// The webview plugin implements this class, and passes an instance to the +/// [NavigationCallbackHandlerDelegate]. +/// [NavigationCallbackHandlerDelegate] is notifying this handler on events that +/// happened on the platform's webview. +abstract class NavigationCallbackHandlerDelegate extends PlatformInterface { + /// Creates a new [NavigationCallbacksHandlerDelegate] + factory NavigationCallbackHandlerDelegate() { + final NavigationCallbackHandlerDelegate callbackHandlerDelegate = + WebViewPlatform.instance!.createNavigationCallbackHandlerDelegate(); + PlatformInterface.verify(callbackHandlerDelegate, _token); + return callbackHandlerDelegate; + } + + /// Used by the platform implementation to create a new + /// [NavigationCallbackHandlerDelegate]. + /// + /// Should only be used by platform implementations because they can't extend + /// a class that only contains a factory constructor. + @protected + NavigationCallbackHandlerDelegate.implementation() : super(token: _token); + + static final Object _token = Object(); + + /// Invoked by [WebViewPlatformControllerDelegate] when a navigation request + /// is pending. + /// + /// If true is returned the navigation is allowed, otherwise it is blocked. + FutureOr onNavigationRequest( + {required String url, required bool isForMainFrame}); + + /// Invoked by [WebViewPlatformControllerDelegate] when a page has started + /// loading. + void onPageStarted(String url); + + /// Invoked by [WebViewPlatformControllerDelegate] when a page has finished + /// loading. + void onPageFinished(String url); + + /// Invoked by [WebViewPlatformControllerDelegate] when a page is loading. + /// + /// Only works when [WebSettings.hasProgressTracking] is set to `true`. + void onProgress(int progress); + + /// Report web resource loading error to the host application. + void onWebResourceError(WebResourceError error); +} diff --git a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/javascript_mode.dart b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/javascript_mode.dart new file mode 100644 index 000000000000..bcbebff8bb1a --- /dev/null +++ b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/javascript_mode.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. + +/// Describes the state of JavaScript support in a given web view. +enum JavaScriptMode { + /// JavaScript execution is disabled. + disabled, + + /// JavaScript execution is not restricted. + unrestricted, +} diff --git a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/load_request_params.dart b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/load_request_params.dart new file mode 100644 index 000000000000..5220097323fa --- /dev/null +++ b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/load_request_params.dart @@ -0,0 +1,129 @@ +// 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:typed_data'; + +import 'package:flutter/foundation.dart'; +import 'package:plugin_platform_interface/plugin_platform_interface.dart'; +import 'package:webview_flutter_platform_interface/src/v4/webview_controller_delegate.dart'; + +import '../webview_platform.dart'; + +/// Defines the supported HTTP methods for loading a page in +/// [WebViewControllerDelegate]. +enum LoadRequestMethod { + /// HTTP GET method. + get, + + /// HTTP POST method. + post, +} + +/// Extension methods on the [LoadRequestMethod] enum. +extension LoadRequestMethodExtensions on LoadRequestMethod { + /// Converts [LoadRequestMethod] to [String] format. + String serialize() { + switch (this) { + case LoadRequestMethod.get: + return 'get'; + case LoadRequestMethod.post: + return 'post'; + } + } +} + +/// Defines the parameters that can be used to load a page with the +/// [WebViewControllerDelegate]. +/// +/// Platform specific implementations can add additional fields by extending this +/// class and provide a factory method that takes the +/// [LoadRequestParamsDelegate] as a parameter. +/// +/// {@tool sample} +/// This example demonstrates how to extend the [LoadRequestParamsDelegate] to +/// provide additional platform specific parameters. +/// +/// Note that the additional parameters should always accept `null` or have a +/// default value to prevent breaking changes. +/// +/// ```dart +/// class AndroidLoadRequestParamsDelegate extends LoadRequestParamsDelegate { +/// AndroidLoadRequestParamsDelegate._( +/// LoadRequestParamsDelegate loadRequestParams, +/// this.historyUrl, +/// ) : super( +/// uri: loadRequestParams.uri, +/// method: loadRequestParams.method, +/// headers: loadRequestParams.headers, +/// body: loadRequestParams.body, +/// ); +/// +/// factory AndroidLoadRequestParamsDelegate.fromLoadRequestParamsDelegate( +/// LoadRequestParamsDelegate loadRequestParams, { +/// Uri? historyUrl, +/// }) { +/// return AndroidLoadRequestParamsDelegate._( +/// loadRequestParams: loadRequestParams, +/// historyUrl: historyUrl, +/// ); +/// } +/// +/// final Uri? historyUrl; +/// } +/// ``` +/// {@end-tool} +class LoadRequestParamsDelegate extends PlatformInterface { + /// Creates a new [LoadRequestParamsDelegate]. + factory LoadRequestParamsDelegate({ + required Uri uri, + required LoadRequestMethod method, + required Map headers, + Uint8List? body, + }) { + final LoadRequestParamsDelegate loadRequestParamsDelegate = + WebViewPlatform.instance!.createLoadRequestParamsDelegate( + uri: uri, + method: method, + headers: headers, + body: body, + ); + PlatformInterface.verify(loadRequestParamsDelegate, _token); + return loadRequestParamsDelegate; + } + + /// Used by the platform implementation to create a new + /// [LoadRequestParamsDelegate]. + /// + /// Should only be used by platform implementations because they can't extend + /// a class that only contains a factory constructor. + @protected + LoadRequestParamsDelegate.implementation({ + required this.uri, + required this.method, + required this.headers, + this.body, + }) : super(token: _token); + + static final Object _token = Object(); + + /// URI for the request. + final Uri uri; + + /// HTTP method used to make the request. + final LoadRequestMethod method; + + /// Headers for the request. + final Map headers; + + /// HTTP body for the request. + final Uint8List? body; + + /// Serializes the [WebViewRequest] to JSON. + Map toJson() => { + 'uri': uri.toString(), + 'method': method.serialize(), + 'headers': headers, + 'body': body, + }; +} diff --git a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/types.dart b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/types.dart new file mode 100644 index 000000000000..c9bc0e9121f9 --- /dev/null +++ b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/types.dart @@ -0,0 +1,10 @@ +// 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_mode.dart'; +export 'load_request_params.dart'; +export 'web_resource_error.dart'; +export 'web_resource_error_type.dart'; +export 'web_settings.dart'; +export 'webview_cookie.dart'; diff --git a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/web_resource_error.dart b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/web_resource_error.dart new file mode 100644 index 000000000000..589f9694b294 --- /dev/null +++ b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/web_resource_error.dart @@ -0,0 +1,60 @@ +// 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:meta/meta.dart'; + +import 'web_resource_error_type.dart'; + +/// Error returned in `WebView.onWebResourceError` when a web resource loading error has occurred. +@sealed +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/v4/types/web_resource_error_type.dart b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/web_resource_error_type.dart new file mode 100644 index 000000000000..a45816df8323 --- /dev/null +++ b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/web_resource_error_type.dart @@ -0,0 +1,66 @@ +// 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. + +/// 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, +} diff --git a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/web_settings.dart b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/web_settings.dart new file mode 100644 index 000000000000..f5d167121148 --- /dev/null +++ b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/web_settings.dart @@ -0,0 +1,208 @@ +// 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/widgets.dart'; +import 'package:plugin_platform_interface/plugin_platform_interface.dart'; + +import '../webview_platform.dart'; +import 'javascript_mode.dart'; + +/// A single setting for configuring a WebViewPlatform which may be absent. +@immutable +class WebSetting { + /// Constructs an absent setting instance. + /// + /// The [isPresent] field for the instance will be false. + /// + /// Accessing [value] for an absent instance will throw. + const WebSetting.absent() + : _value = null, + isPresent = false; + + /// Constructs a setting of the given `value`. + /// + /// The [isPresent] field for the instance will be true. + const WebSetting.of(T value) + : _value = value, + isPresent = true; + + final T? _value; + + /// The setting's value. + /// + /// Throws if [WebSetting.isPresent] is false. + T get value { + if (!isPresent) { + throw StateError('Cannot access a value of an absent WebSetting'); + } + assert(isPresent); + // The intention of this getter is to return T whether it is nullable or + // not whereas _value is of type T? since _value can be null even when + // T is not nullable (when isPresent == false). + // + // We promote _value to T using `as T` instead of `!` operator to handle + // the case when _value is legitimately null (and T is a nullable type). + // `!` operator would always throw if _value is null. + return _value as T; + } + + /// True when this web setting instance contains a value. + /// + /// When false the [WebSetting.value] getter throws. + final bool isPresent; + + @override + bool operator ==(Object other) { + if (other.runtimeType != runtimeType) { + return false; + } + + return other is WebSetting && + other.isPresent == isPresent && + other._value == _value; + } + + @override + int get hashCode => hashValues(_value, isPresent); +} + +/// Defines the parameters to configure a [WebViewPlatform]. +/// +/// Initial settings are passed as part of [CreationParams], settings updates +/// are sent with [WebViewPlatformController#updateSettings]. +/// +/// Platform specific implementations can add additional fields by extending this +/// class and provide a factory method that takes the +/// [WebSettingsDelegate] as a parameter. +/// +/// {@tool sample} +/// This example demonstrates how to extend the [WebSettingsDelegate] to +/// provide additional platform specific parameters. +/// +/// Note that the additional parameters should always accept `null` or have a +/// default value to prevent breaking changes. +/// +/// ```dart +/// class AndroidWebSettingsDelegate extends WebSettingsDelegate { +/// AndroidWebSettingsDelegate._( +/// WebSettingsDelegate webSettingsDelegate, +/// this.historyUrl, +/// ) : super( +/// allowsInlineMediaPlayback: webSettingsDelegate.allowsInlineMediaPlayback, +/// debuggingEnabled: webSettingsDelegate.debuggingEnabled, +/// gestureNavigationEnabled: webSettingsDelegate.gestureNavigationEnabled, +/// hasNavigationDelegate: webSettingsDelegate.hasNavigationDelegate, +/// hasProgressTracking: webSettingsDelegate.hasProgressTracking, +/// javaScriptMode: webSettingsDelegate.javaScriptMode, +/// userAgent: webSettingsDelegate.userAgent, +/// zoomEnabled: webSettingsDelegate.zoomEnabled, +/// ); +/// +/// factory AndroidWebSettingsDelegate.fromWebSettingsDelegate( +/// WebSettingsDelegate webSettings, { +/// Uri? historyUrl, +/// }) { +/// return AndroidWebSettingsDelegate._( +/// webSettings: webSettings, +/// historyUrl: historyUrl, +/// ); +/// } +/// +/// final Uri? historyUrl; +/// } +/// ``` +/// {@end-tool} +class WebSettingsDelegate extends PlatformInterface { + /// Construct an instance with initial settings. + /// + /// Future setting changes can be sent with [WebViewPlatformController#updateSettings]. + /// + /// The `userAgent` parameter cannot be null. + factory WebSettingsDelegate({ + bool? allowsInlineMediaPlayback, + bool? debuggingEnabled, + bool? gestureNavigationEnabled, + bool? hasNavigationDelegate, + bool? hasProgressTracking, + JavaScriptMode? javaScriptMode, + required WebSetting userAgent, + bool? zoomEnabled, + }) { + final WebSettingsDelegate webSettingsDelegate = + WebViewPlatform.instance!.createWebSettingsDelegate( + allowsInlineMediaPlayback: allowsInlineMediaPlayback, + debuggingEnabled: debuggingEnabled, + gestureNavigationEnabled: gestureNavigationEnabled, + hasNavigationDelegate: hasNavigationDelegate, + hasProgressTracking: hasProgressTracking, + javaScriptMode: javaScriptMode, + userAgent: userAgent, + zoomEnabled: zoomEnabled, + ); + PlatformInterface.verify(webSettingsDelegate, _token); + return webSettingsDelegate; + } + + /// Used by the platform implementation to create a new + /// [WebSettingsDelegate]. + /// + /// Should only be used by platform implementations because they can't extend + /// a class that only contains a factory constructor. + @protected + WebSettingsDelegate.implementation({ + this.allowsInlineMediaPlayback, + this.debuggingEnabled, + this.gestureNavigationEnabled, + this.hasNavigationDelegate, + this.hasProgressTracking, + this.javascriptMode, + required this.userAgent, + this.zoomEnabled, + }) : super(token: _token); + + static final Object _token = Object(); + + /// Whether to play HTML5 videos inline or use the native full-screen controller on iOS. + /// + /// This will have no effect on Android. + final bool? allowsInlineMediaPlayback; + + /// Whether to enable the platform's webview content debugging tools. + /// + /// See also: [WebView.debuggingEnabled]. + final bool? debuggingEnabled; + + /// Whether to allow swipe based navigation in iOS. + /// + /// See also: [WebView.gestureNavigationEnabled] + final bool? gestureNavigationEnabled; + + /// Whether the [WebView] has a [NavigationDelegate] set. + final bool? hasNavigationDelegate; + + /// Whether the [WebView] should track page loading progress. + /// See also: [WebViewPlatformCallbacksHandler.onProgress] to get the progress. + final bool? hasProgressTracking; + + /// The JavaScript execution mode to be used by the webview. + final JavaScriptMode? javascriptMode; + + /// The value used for the HTTP `User-Agent:` request header. + /// + /// If [userAgent.value] is null the platform's default user agent should be used. + /// + /// An absent value ([userAgent.isPresent] is false) represents no change to this setting from the + /// last time it was set. + /// + /// See also [WebView.userAgent]. + final WebSetting userAgent; + + /// Sets whether the WebView should support zooming using its on-screen zoom controls and gestures. + final bool? zoomEnabled; + + @override + String toString() { + return 'WebSettings(javascriptMode: $javascriptMode, hasNavigationDelegate: $hasNavigationDelegate, hasProgressTracking: $hasProgressTracking, debuggingEnabled: $debuggingEnabled, gestureNavigationEnabled: $gestureNavigationEnabled, userAgent: $userAgent, allowsInlineMediaPlayback: $allowsInlineMediaPlayback)'; + } +} diff --git a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/webview_cookie.dart b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/webview_cookie.dart new file mode 100644 index 000000000000..ab7f6c7640f0 --- /dev/null +++ b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/webview_cookie.dart @@ -0,0 +1,52 @@ +// 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:meta/meta.dart'; + +/// A cookie that can be set globally for all web views +/// using [WebViewCookieManagerPlatform]. +@sealed +class WebViewCookie { + /// Creates a new [WebViewCookieDelegate] + WebViewCookie({ + required this.name, + required this.value, + required this.domain, + this.path = '/', + }); + + /// The cookie-name of the cookie. + /// + /// Its value should match "cookie-name" in RFC6265bis: + /// https://datatracker.ietf.org/doc/html/draft-ietf-httpbis-rfc6265bis-02#section-4.1.1 + final String name; + + /// The cookie-value of the cookie. + /// + /// Its value should match "cookie-value" in RFC6265bis: + /// https://datatracker.ietf.org/doc/html/draft-ietf-httpbis-rfc6265bis-02#section-4.1.1 + final String value; + + /// The domain-value of the cookie. + /// + /// Its value should match "domain-value" in RFC6265bis: + /// 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. + /// + /// 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. + Map toJson() { + return { + 'name': name, + 'value': value, + 'domain': domain, + 'path': path + }; + } +} diff --git a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/webview_controller_delegate.dart b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/webview_controller_delegate.dart new file mode 100644 index 000000000000..3a9ddb2d451a --- /dev/null +++ b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/webview_controller_delegate.dart @@ -0,0 +1,264 @@ +// 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'; +import 'package:plugin_platform_interface/plugin_platform_interface.dart'; +import 'package:webview_flutter_platform_interface/src/v4/types/load_request_params.dart'; + +import 'types/types.dart'; +import 'webview_platform.dart'; + +/// Interface for a platform implementation of a web view controller. +/// +/// Platform implementations should extend this class rather than implement it +/// as `webview_flutter` does not consider newly added methods to be breaking +/// changes. Extending this class (using `extends`) ensures that the subclass +/// will get the default implementation, while platform implementations that +/// `implements` this interface will be broken by newly added +/// [WebViewCookieManagerDelegate] methods. +abstract class WebViewControllerDelegate extends PlatformInterface { + /// Creates a new [WebViewControllerDelegate] + factory WebViewControllerDelegate() { + final WebViewControllerDelegate webViewControllerDelegate = + WebViewPlatform.instance!.createWebViewControllerDelegate(); + PlatformInterface.verify(webViewControllerDelegate, _token); + return webViewControllerDelegate; + } + + /// Used by the platform implementation to create a new + /// [WebViewControllerDelegate]. + /// + /// Should only be used by platform implementations because they can't extend + /// a class that only contains a factory constructor. + @protected + WebViewControllerDelegate.implementation() : super(token: _token); + + static final Object _token = Object(); + + /// Loads the file located on the specified [absoluteFilePath]. + /// + /// The [absoluteFilePath] parameter should contain the absolute path to the + /// file as it is stored on the device. For example: + /// `/Users/username/Documents/www/index.html`. + /// + /// Throws an ArgumentError if the [absoluteFilePath] does not exist. + Future loadFile( + String absoluteFilePath, + ) { + throw UnimplementedError( + 'WebView loadFile is not implemented on the current platform'); + } + + /// Loads the Flutter asset specified in the pubspec.yaml file. + /// + /// Throws an ArgumentError if [key] is not part of the specified assets + /// in the pubspec.yaml file. + Future loadFlutterAsset( + String key, + ) { + throw UnimplementedError( + 'WebView loadFlutterAsset is not implemented on the current platform'); + } + + /// Loads the supplied HTML string. + /// + /// The [baseUrl] parameter is used when resolving relative URLs within the + /// HTML string. + Future loadHtmlString( + String html, { + String? baseUrl, + }) { + throw UnimplementedError( + 'WebView loadHtmlString is not implemented on the current platform'); + } + + /// Loads the specified URL. + /// + /// If `headers` is not null and the URL is an HTTP URL, the key value paris in `headers` will + /// be added as key value pairs of HTTP headers for the request. + /// + /// `url` must not be null. + /// + /// Throws an ArgumentError if `url` is not a valid URL string. + Future loadUrl( + String url, + Map? headers, + ) { + throw UnimplementedError( + 'WebView loadUrl is not implemented on the current platform'); + } + + /// Makes a specific HTTP request ands loads the response in the webview. + /// + /// [WebViewRequest.method] must be one of the supported HTTP methods + /// in [WebViewRequestMethod]. + /// + /// If [WebViewRequest.headers] is not empty, its key-value pairs will be + /// added as the headers for the request. + /// + /// If [WebViewRequest.body] is not null, it will be added as the body + /// for the request. + /// + /// Throws an ArgumentError if [WebViewRequest.uri] has empty scheme. + Future loadRequest( + LoadRequestParamsDelegate params, + ) { + throw UnimplementedError( + 'WebView loadRequest is not implemented on the current platform'); + } + + /// Updates the webview settings. + /// + /// Any non null field in `settings` will be set as the new setting value. + /// All null fields in `settings` are ignored. + Future updateSettings(WebSettingsDelegate setting) { + throw UnimplementedError( + 'WebView updateSettings is not implemented on the current platform'); + } + + /// Accessor to the current URL that the WebView is displaying. + /// + /// If no URL was ever loaded, returns `null`. + Future currentUrl() { + throw UnimplementedError( + 'WebView currentUrl is not implemented on the current platform'); + } + + /// Checks whether there's a back history item. + Future canGoBack() { + throw UnimplementedError( + 'WebView canGoBack is not implemented on the current platform'); + } + + /// Checks whether there's a forward history item. + Future canGoForward() { + throw UnimplementedError( + 'WebView canGoForward is not implemented on the current platform'); + } + + /// Goes back in the history of this WebView. + /// + /// If there is no back history item this is a no-op. + Future goBack() { + throw UnimplementedError( + 'WebView goBack is not implemented on the current platform'); + } + + /// Goes forward in the history of this WebView. + /// + /// If there is no forward history item this is a no-op. + Future goForward() { + throw UnimplementedError( + 'WebView goForward is not implemented on the current platform'); + } + + /// Reloads the current URL. + Future reload() { + throw UnimplementedError( + 'WebView reload is not implemented on the current platform'); + } + + /// Clears all caches used by the [WebView]. + /// + /// The following caches are cleared: + /// 1. Browser HTTP Cache. + /// 2. [Cache API](https://developers.google.com/web/fundamentals/instant-and-offline/web-storage/cache-api) caches. + /// These are not yet supported in iOS WkWebView. Service workers tend to use this cache. + /// 3. Application cache. + /// 4. Local Storage. + Future clearCache() { + throw UnimplementedError( + 'WebView clearCache is not implemented on the current platform'); + } + + /// Evaluates a JavaScript expression in the context of the current page. + /// + /// The Future completes with an error if a JavaScript error occurred, or if the type of the + /// evaluated expression is not supported (e.g on iOS not all non-primitive types can be evaluated). + Future evaluateJavaScript(String javascript) { + throw UnimplementedError( + 'WebView evaluateJavaScript is not implemented on the current platform'); + } + + /// Runs the given JavaScript in the context of the current page. + /// + /// The Future completes with an error if a JavaScript error occurred. + Future runJavaScript(String javascript) { + throw UnimplementedError( + 'WebView runJavaScript is not implemented on the current platform'); + } + + /// Runs the given JavaScript in the context of the current page, and returns the result. + /// + /// 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 runJavaScriptReturningResult(String javascript) { + throw UnimplementedError( + 'WebView runJavaScriptReturningResult is not implemented on the current platform'); + } + + /// Adds new JavaScript channels to the set of enabled channels. + /// + /// For each value in this list the platform's webview should make sure that a corresponding + /// property with a postMessage method is set on `window`. For example for a JavaScript channel + /// named `Foo` it should be possible for JavaScript code executing in the webview to do + /// + /// ```javascript + /// Foo.postMessage('hello'); + /// ``` + /// + /// See also: [CreationParams.javascriptChannelNames]. + Future addJavaScriptChannels(Set javascriptChannelNames) { + throw UnimplementedError( + 'WebView addJavaScriptChannels is not implemented on the current platform'); + } + + /// Removes JavaScript channel names from the set of enabled channels. + /// + /// This disables channels that were previously enabled by [addJavascriptChannels] or through + /// [CreationParams.javascriptChannelNames]. + Future removeJavaScriptChannels(Set javascriptChannelNames) { + throw UnimplementedError( + 'WebView removeJavaScriptChannels is not implemented on the current platform'); + } + + /// Returns the title of the currently loaded page. + Future getTitle() { + throw UnimplementedError( + 'WebView getTitle is not implemented on the current platform'); + } + + /// Set the scrolled position of this view. + /// + /// The parameters `x` and `y` specify the position to scroll to in WebView pixels. + Future scrollTo(int x, int y) { + throw UnimplementedError( + 'WebView scrollTo is not implemented on the current platform'); + } + + /// Move the scrolled position of this view. + /// + /// The parameters `x` and `y` specify the amount of WebView pixels to scroll by. + Future scrollBy(int x, int y) { + throw UnimplementedError( + 'WebView scrollBy is not implemented on the current platform'); + } + + /// Return the horizontal scroll position of this view. + /// + /// Scroll position is measured from left. + Future getScrollX() { + throw UnimplementedError( + 'WebView getScrollX is not implemented on the current platform'); + } + + /// Return the vertical scroll position of this view. + /// + /// Scroll position is measured from top. + Future getScrollY() { + throw UnimplementedError( + 'WebView getScrollY is not implemented on the current platform'); + } +} diff --git a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/webview_cookie_manager_delegate.dart b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/webview_cookie_manager_delegate.dart new file mode 100644 index 000000000000..9e0597c32648 --- /dev/null +++ b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/webview_cookie_manager_delegate.dart @@ -0,0 +1,51 @@ +// 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'; +import 'package:plugin_platform_interface/plugin_platform_interface.dart'; + +import 'types/types.dart'; +import 'webview_platform.dart'; + +/// Interface for a platform implementation of a cookie manager. +/// +/// Platform implementations should extend this class rather than implement it +/// as `webview_flutter` does not consider newly added methods to be breaking +/// changes. Extending this class (using `extends`) ensures that the subclass +/// will get the default implementation, while platform implementations that +/// `implements` this interface will be broken by newly added +/// [WebViewCookieManagerDelegate] methods. +abstract class WebViewCookieManagerDelegate extends PlatformInterface { + /// Creates a new [WebViewCookieManagerDelegate] + factory WebViewCookieManagerDelegate() { + final WebViewCookieManagerDelegate cookieManagerDelegate = + WebViewPlatform.instance!.createCookieManagerDelegate(); + PlatformInterface.verify(cookieManagerDelegate, _token); + return cookieManagerDelegate; + } + + /// Used by the platform implementation to create a new + /// [WebViewCookieManagerDelegate]. + /// + /// Should only be used by platform implementations because they can't extend + /// a class that only contains a factory constructor. + @protected + WebViewCookieManagerDelegate.implementation() : super(token: _token); + + static final Object _token = Object(); + + /// Clears all cookies for all [WebView] instances. + /// + /// Returns true if cookies were present before clearing, else false. + Future clearCookies() { + throw UnimplementedError( + 'clearCookies is not implemented on the current platform'); + } + + /// Sets a cookie for all [WebView] instances. + Future setCookie(WebViewCookie cookie) { + throw UnimplementedError( + 'setCookie is not implemented on the current platform'); + } +} diff --git a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/webview_platform.dart b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/webview_platform.dart new file mode 100644 index 000000000000..c36f9edc4d03 --- /dev/null +++ b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/webview_platform.dart @@ -0,0 +1,96 @@ +// 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:typed_data'; + +import 'package:flutter/foundation.dart'; +import 'package:flutter/gestures.dart'; +import 'package:plugin_platform_interface/plugin_platform_interface.dart'; +import 'package:webview_flutter_platform_interface/src/v4/types/load_request_params.dart'; +import 'package:webview_flutter_platform_interface/src/v4/types/types.dart'; +import 'package:webview_flutter_platform_interface/src/v4/webview_widget_delegate.dart'; + +import 'navigation_callback_handler_delegate.dart'; +import 'webview_controller_delegate.dart'; +import 'webview_cookie_manager_delegate.dart'; + +export 'types/types.dart'; + +abstract class WebViewPlatform extends PlatformInterface { + /// Creates a new [WebViewPlatform]. + WebViewPlatform() : super(token: _token); + + static final Object _token = Object(); + + static WebViewPlatform? _instance; + + /// The instance of [WebViewPlatform] to use. + static WebViewPlatform? get instance => _instance; + + /// Platform-specific plugins should set this with their own platform-specific + /// class that extends [WebViewPlatform] when they register themselves. + static set instance(WebViewPlatform? instance) { + if (instance == null) { + throw AssertionError( + 'Platform interfaces can only be set to a non-null instance'); + } + + PlatformInterface.verify(instance, _token); + _instance = instance; + } + + /// Creates a new [WebViewCookieManagerDelegate]. + WebViewCookieManagerDelegate createCookieManagerDelegate() { + throw UnimplementedError( + 'createCookieManagerDelegate is not implemented on the current platform.'); + } + + /// Create a new [LoadRequestParamsDelegate]. + LoadRequestParamsDelegate createLoadRequestParamsDelegate({ + required Uri uri, + required LoadRequestMethod method, + required Map headers, + Uint8List? body, + }) { + throw UnimplementedError( + 'createLoadRequestParamsDelegate is not implemented on the current platform.'); + } + + /// Creates a new [NavigationCallbackHandlerDelegate]. + NavigationCallbackHandlerDelegate createNavigationCallbackHandlerDelegate() { + throw UnimplementedError( + 'createNavigationCallbackHandlerDelegate is not implemented on the current platform.'); + } + + /// Create a new [WebSettingsDelegate]. + WebSettingsDelegate createWebSettingsDelegate({ + bool? allowsInlineMediaPlayback, + bool? debuggingEnabled, + bool? gestureNavigationEnabled, + bool? hasNavigationDelegate, + bool? hasProgressTracking, + JavaScriptMode? javaScriptMode, + required WebSetting userAgent, + bool? zoomEnabled, + }) { + throw UnimplementedError( + 'createWebSettingsDelegate is not implemented on the current platform.'); + } + + /// Create a new [WebViewControllerDelegate]. + WebViewControllerDelegate createWebViewControllerDelegate() { + throw UnimplementedError( + 'createWebViewControllerDelegate is not implemented on the current platform.'); + } + + /// Create a new [WebViewWidgetDelegate]. + WebViewWidgetDelegate createWebViewWidgetDelegate({ + Key? key, + required WebViewControllerDelegate controller, + Set>? gestureRecognizers, + }) { + throw UnimplementedError( + 'createWebViewWidgetDelegate is not implemented on the current platform.'); + } +} diff --git a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/webview_widget_delegate.dart b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/webview_widget_delegate.dart new file mode 100644 index 000000000000..0ed5d76140d7 --- /dev/null +++ b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/webview_widget_delegate.dart @@ -0,0 +1,90 @@ +// 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'; +import 'package:flutter/gestures.dart'; +import 'package:flutter/widgets.dart'; +import 'package:plugin_platform_interface/plugin_platform_interface.dart'; +import 'package:webview_flutter_platform_interface/src/v4/webview_controller_delegate.dart'; + +import 'webview_platform.dart'; + +/// Interface for a platform implementation of a web view widget. +abstract class WebViewWidgetDelegate extends PlatformInterface { + /// Creates a new [WebViewWidgetDelegate] + factory WebViewWidgetDelegate({ + Key? key, + required WebViewControllerDelegate controller, + Set>? gestureRecognizers, + }) { + final WebViewWidgetDelegate webViewWidgetDelegate = + WebViewPlatform.instance!.createWebViewWidgetDelegate( + key: key, + controller: controller, + gestureRecognizers: gestureRecognizers, + ); + PlatformInterface.verify(webViewWidgetDelegate, _token); + return webViewWidgetDelegate; + } + + /// Used by the platform implementation to create a new + /// [WebViewWidgetDelegate]. + /// + /// Should only be used by platform implementations because they can't extend + /// a class that only contains a factory constructor. + @protected + WebViewWidgetDelegate.implementation({ + this.key, + required this.controller, + this.gestureRecognizers, + }) : super(token: _token); + + static final Object _token = Object(); + + /// Controls how one widget replaces another widget in the tree. + /// + /// If the [runtimeType] and [key] properties of the two widgets are + /// [operator==], respectively, then the new widget replaces the old widget by + /// updating the underlying element (i.e., by calling [Element.update] with the + /// new widget). Otherwise, the old element is removed from the tree, the new + /// widget is inflated into an element, and the new element is inserted into the + /// tree. + /// + /// In addition, using a [GlobalKey] as the widget's [key] allows the element + /// to be moved around the tree (changing parent) without losing state. When a + /// new widget is found (its key and type do not match a previous widget in + /// the same location), but there was a widget with that same global key + /// elsewhere in the tree in the previous frame, then that widget's element is + /// moved to the new location. + /// + /// Generally, a widget that is the only child of another widget does not need + /// an explicit key. + /// + /// See also: + /// + /// * The discussions at [Key] and [GlobalKey]. + final Key? key; + + /// The [WebViewControllerDelegate] that allows controlling the native web + /// view. + final WebViewControllerDelegate controller; + + /// The `gestureRecognizers` specifies which gestures should be consumed by the + /// web view. + /// + /// It is possible for other gesture recognizers to be competing with the web + /// view on pointer events, e.g if the web view is inside a [ListView] the + /// [ListView] will want to handle vertical drags. The web view will claim + /// gestures that are recognized by any of the recognizers on this list. + /// + /// When `gestureRecognizers` is empty or null, the web view will only handle + /// pointer events for gestures that were not claimed by any other gesture + /// recognizer. + final Set>? gestureRecognizers; + + /// Builds a new WebView. + /// + /// Returns a Widget tree that embeds the created web view. + Widget build(BuildContext context); +} diff --git a/packages/webview_flutter/webview_flutter_platform_interface/pubspec.yaml b/packages/webview_flutter/webview_flutter_platform_interface/pubspec.yaml index 50b816d51d5d..113579e8bcb8 100644 --- a/packages/webview_flutter/webview_flutter_platform_interface/pubspec.yaml +++ b/packages/webview_flutter/webview_flutter_platform_interface/pubspec.yaml @@ -16,6 +16,7 @@ dependencies: plugin_platform_interface: ^2.1.0 dev_dependencies: + build_runner: ^2.1.8 flutter_test: sdk: flutter mockito: ^5.0.0 diff --git a/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/navigation_callback_handler_delegate_test.dart b/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/navigation_callback_handler_delegate_test.dart new file mode 100644 index 000000000000..0df6dc367e9e --- /dev/null +++ b/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/navigation_callback_handler_delegate_test.dart @@ -0,0 +1,83 @@ +// 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_test/flutter_test.dart'; +import 'package:mockito/mockito.dart'; +import 'package:plugin_platform_interface/plugin_platform_interface.dart'; +import 'package:webview_flutter_platform_interface/src/v4/navigation_callback_handler_delegate.dart'; +import 'package:webview_flutter_platform_interface/src/v4/webview_platform.dart'; + +import 'webview_platform_test.mocks.dart'; + +void main() { + setUp(() { + WebViewPlatform.instance = MockWebViewPlatformWithMixin(); + }); + + test('Cannot be implemented with `implements`', () { + when(WebViewPlatform.instance!.createNavigationCallbackHandlerDelegate()) + .thenReturn(ImplementsNavigationCallbackHandlerDelegate()); + + expect(() { + NavigationCallbackHandlerDelegate(); + }, throwsNoSuchMethodError); + }); + + test('Can be extended', () { + when(WebViewPlatform.instance!.createNavigationCallbackHandlerDelegate()) + .thenReturn(ExtendsNavigationCallbackHandlerDelegate()); + + expect(NavigationCallbackHandlerDelegate(), isNotNull); + }); + + test('Can be mocked with `implements`', () { + when(WebViewPlatform.instance!.createNavigationCallbackHandlerDelegate()) + .thenReturn(MockNavigationCallbackHandlerDelegate()); + + expect(NavigationCallbackHandlerDelegate(), isNotNull); + }); +} + +class MockWebViewPlatformWithMixin extends MockWebViewPlatform + with + // ignore: prefer_mixin + MockPlatformInterfaceMixin {} + +class ImplementsNavigationCallbackHandlerDelegate + implements NavigationCallbackHandlerDelegate { + @override + dynamic noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation); +} + +class MockNavigationCallbackHandlerDelegate extends Mock + with + // ignore: prefer_mixin + MockPlatformInterfaceMixin + implements + NavigationCallbackHandlerDelegate {} + +class ExtendsNavigationCallbackHandlerDelegate + extends NavigationCallbackHandlerDelegate { + ExtendsNavigationCallbackHandlerDelegate() : super.implementation(); + + @override + FutureOr onNavigationRequest( + {required String url, required bool isForMainFrame}) { + throw UnimplementedError(); + } + + @override + void onPageFinished(String url) {} + + @override + void onPageStarted(String url) {} + + @override + void onProgress(int progress) {} + + @override + void onWebResourceError(WebResourceError error) {} +} diff --git a/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/types/load_request_params_test.dart b/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/types/load_request_params_test.dart new file mode 100644 index 000000000000..2ccd03f09de4 --- /dev/null +++ b/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/types/load_request_params_test.dart @@ -0,0 +1,110 @@ +// 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:typed_data'; + +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/src/v4/webview_platform.dart'; + +import '../webview_platform_test.mocks.dart'; + +void main() { + setUp(() { + WebViewPlatform.instance = MockWebViewPlatformWithMixin(); + }); + + test('Cannot be implemented with `implements`', () { + final Uri testUri = Uri(path: 'https://flutter.dev'); + const LoadRequestMethod testMethod = LoadRequestMethod.get; + final Map testHeaders = {}; + when(WebViewPlatform.instance!.createLoadRequestParamsDelegate( + uri: testUri, + method: testMethod, + headers: testHeaders, + )).thenReturn(ImplementsLoadRequestParamsDelegate()); + + expect(() { + LoadRequestParamsDelegate( + uri: testUri, + method: testMethod, + headers: testHeaders, + ); + }, throwsNoSuchMethodError); + }); + + test('Can be extended', () { + final Uri testUri = Uri(path: 'https://flutter.dev'); + const LoadRequestMethod testMethod = LoadRequestMethod.get; + final Map testHeaders = {}; + when(WebViewPlatform.instance!.createLoadRequestParamsDelegate( + uri: testUri, + method: testMethod, + headers: testHeaders, + )).thenReturn(ExtendsLoadRequestParamsDelegate( + uri: testUri, + method: testMethod, + headers: testHeaders, + )); + + expect( + ExtendsLoadRequestParamsDelegate( + uri: testUri, + method: testMethod, + headers: testHeaders, + ), + isNotNull); + }); + + test('Can be mocked with `implements`', () { + final Uri testUri = Uri(path: 'https://flutter.dev'); + const LoadRequestMethod testMethod = LoadRequestMethod.get; + final Map testHeaders = {}; + when(WebViewPlatform.instance!.createLoadRequestParamsDelegate( + uri: testUri, + method: testMethod, + headers: testHeaders, + )).thenReturn(MockLoadRequestParamsDelegate()); + + expect( + ExtendsLoadRequestParamsDelegate( + uri: testUri, + method: testMethod, + headers: testHeaders, + ), + isNotNull); + }); +} + +class MockWebViewPlatformWithMixin extends MockWebViewPlatform + with + // ignore: prefer_mixin + MockPlatformInterfaceMixin {} + +class ImplementsLoadRequestParamsDelegate implements LoadRequestParamsDelegate { + @override + dynamic noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation); +} + +class MockLoadRequestParamsDelegate extends Mock + with + // ignore: prefer_mixin + MockPlatformInterfaceMixin + implements + LoadRequestParamsDelegate {} + +class ExtendsLoadRequestParamsDelegate extends LoadRequestParamsDelegate { + ExtendsLoadRequestParamsDelegate({ + required Uri uri, + required LoadRequestMethod method, + required Map headers, + Uint8List? body, + }) : super.implementation( + uri: uri, + method: method, + headers: headers, + body: body, + ); +} diff --git a/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/types/web_settings_test.dart b/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/types/web_settings_test.dart new file mode 100644 index 000000000000..08f097545610 --- /dev/null +++ b/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/types/web_settings_test.dart @@ -0,0 +1,90 @@ +// 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_test/flutter_test.dart'; +import 'package:mockito/mockito.dart'; +import 'package:plugin_platform_interface/plugin_platform_interface.dart'; +import 'package:webview_flutter_platform_interface/src/v4/webview_platform.dart'; + +import '../webview_platform_test.mocks.dart'; + +void main() { + TestWidgetsFlutterBinding.ensureInitialized(); + + group('WebSetting', () { + test('absent should initialize isPresent to false', () { + const WebSetting absent = WebSetting.absent(); + expect(absent.isPresent, isFalse); + }); + + test('Cannot access value of absent setting', () { + const WebSetting absent = WebSetting.absent(); + expect(() => absent.value, throwsA(isA())); + }); + + test('Setting should return value it is initialized with', () { + const WebSetting setting = WebSetting.of('Test value'); + expect(setting.isPresent, isTrue); + expect(setting.value, 'Test value'); + }); + }); + + group('WebSettingsDelegate', () { + setUp(() { + WebViewPlatform.instance = MockWebViewPlatformWithMixin(); + }); + + test('Cannot be implemented with `implements`', () { + const WebSetting absentSetting = WebSetting.absent(); + when(WebViewPlatform.instance! + .createWebSettingsDelegate(userAgent: absentSetting)) + .thenReturn(ImplementsWebSettingsDelegate()); + + expect(() { + WebSettingsDelegate(userAgent: absentSetting); + }, throwsNoSuchMethodError); + }); + + test('Can be extended', () { + const WebSetting absentSetting = WebSetting.absent(); + when(WebViewPlatform.instance! + .createWebSettingsDelegate(userAgent: absentSetting)) + .thenReturn(ExtendsWebSettingsDelegate(userAgent: absentSetting)); + + expect(WebSettingsDelegate(userAgent: absentSetting), isNotNull); + }); + + test('Can be mocked with `implements`', () { + const WebSetting absentSetting = WebSetting.absent(); + when(WebViewPlatform.instance! + .createWebSettingsDelegate(userAgent: absentSetting)) + .thenReturn(MockWebSettingsDelegate()); + + expect(WebSettingsDelegate(userAgent: absentSetting), isNotNull); + }); + }); +} + +class MockWebViewPlatformWithMixin extends MockWebViewPlatform + with + // ignore: prefer_mixin + MockPlatformInterfaceMixin {} + +class ImplementsWebSettingsDelegate implements WebSettingsDelegate { + @override + dynamic noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation); +} + +class MockWebSettingsDelegate extends Mock + with + // ignore: prefer_mixin + MockPlatformInterfaceMixin + implements + WebSettingsDelegate {} + +class ExtendsWebSettingsDelegate extends WebSettingsDelegate { + ExtendsWebSettingsDelegate({ + required WebSetting userAgent, + }) : super.implementation(userAgent: userAgent); +} diff --git a/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/webview_controller_delegate_test.dart b/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/webview_controller_delegate_test.dart new file mode 100644 index 000000000000..b0c9a19b2ba9 --- /dev/null +++ b/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/webview_controller_delegate_test.dart @@ -0,0 +1,371 @@ +// 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_test/flutter_test.dart'; +import 'package:mockito/mockito.dart'; +import 'package:plugin_platform_interface/plugin_platform_interface.dart'; +import 'package:webview_flutter_platform_interface/src/v4/webview_controller_delegate.dart'; +import 'package:webview_flutter_platform_interface/src/v4/webview_platform.dart'; + +import 'webview_platform_test.mocks.dart'; + +void main() { + setUp(() { + WebViewPlatform.instance = MockWebViewPlatformWithMixin(); + }); + + test('Cannot be implemented with `implements`', () { + when(WebViewPlatform.instance!.createWebViewControllerDelegate()) + .thenReturn(ImplementsWebViewControllerDelegate()); + + expect(() { + WebViewControllerDelegate(); + }, throwsNoSuchMethodError); + }); + + test('Can be extended', () { + when(WebViewPlatform.instance!.createWebViewControllerDelegate()) + .thenReturn(ExtendsWebViewControllerDelegate()); + + expect(WebViewControllerDelegate(), isNotNull); + }); + + test('Can be mocked with `implements`', () { + when(WebViewPlatform.instance!.createWebViewControllerDelegate()) + .thenReturn(MockWebViewControllerDelegate()); + + expect(WebViewControllerDelegate(), isNotNull); + }); + + test( + // ignore: lines_longer_than_80_chars + 'Default implementation of loadFile should throw unimplemented error', + () { + final WebViewControllerDelegate controller = + ExtendsWebViewControllerDelegate(); + + expect( + () => controller.loadFile(''), + throwsUnimplementedError, + ); + }); + + test( + // ignore: lines_longer_than_80_chars + 'Default implementation of loadFlutterAsset should throw unimplemented error', + () { + final WebViewControllerDelegate controller = + ExtendsWebViewControllerDelegate(); + + expect( + () => controller.loadFlutterAsset(''), + throwsUnimplementedError, + ); + }); + + test( + // ignore: lines_longer_than_80_chars + 'Default implementation of loadHtmlString should throw unimplemented error', + () { + final WebViewControllerDelegate controller = + ExtendsWebViewControllerDelegate(); + + expect( + () => controller.loadHtmlString(''), + throwsUnimplementedError, + ); + }); + + test( + // ignore: lines_longer_than_80_chars + 'Default implementation of loadUrl should throw unimplemented error', () { + final WebViewControllerDelegate controller = + ExtendsWebViewControllerDelegate(); + + expect( + () => controller.loadUrl('', {}), + throwsUnimplementedError, + ); + }); + + test( + // ignore: lines_longer_than_80_chars + 'Default implementation of loadRequest should throw unimplemented error', + () { + final WebViewControllerDelegate controller = + ExtendsWebViewControllerDelegate(); + + expect( + () => controller.loadRequest(MockLoadRequestParamsDelegate()), + throwsUnimplementedError, + ); + }); + + test( + // ignore: lines_longer_than_80_chars + 'Default implementation of updateSettings should throw unimplemented error', + () { + final WebViewControllerDelegate controller = + ExtendsWebViewControllerDelegate(); + + expect( + () => controller.updateSettings(MockWebSettingsDelegate()), + throwsUnimplementedError, + ); + }); + + test( + // ignore: lines_longer_than_80_chars + 'Default implementation of currentUrl should throw unimplemented error', + () { + final WebViewControllerDelegate controller = + ExtendsWebViewControllerDelegate(); + + expect( + () => controller.currentUrl(), + throwsUnimplementedError, + ); + }); + + test( + // ignore: lines_longer_than_80_chars + 'Default implementation of canGoBack should throw unimplemented error', + () { + final WebViewControllerDelegate controller = + ExtendsWebViewControllerDelegate(); + + expect( + () => controller.canGoBack(), + throwsUnimplementedError, + ); + }); + + test( + // ignore: lines_longer_than_80_chars + 'Default implementation of canGoForward should throw unimplemented error', + () { + final WebViewControllerDelegate controller = + ExtendsWebViewControllerDelegate(); + + expect( + () => controller.canGoForward(), + throwsUnimplementedError, + ); + }); + + test( + // ignore: lines_longer_than_80_chars + 'Default implementation of goBack should throw unimplemented error', () { + final WebViewControllerDelegate controller = + ExtendsWebViewControllerDelegate(); + + expect( + () => controller.goBack(), + throwsUnimplementedError, + ); + }); + + test( + // ignore: lines_longer_than_80_chars + 'Default implementation of goForward should throw unimplemented error', + () { + final WebViewControllerDelegate controller = + ExtendsWebViewControllerDelegate(); + + expect( + () => controller.goForward(), + throwsUnimplementedError, + ); + }); + + test( + // ignore: lines_longer_than_80_chars + 'Default implementation of reload should throw unimplemented error', () { + final WebViewControllerDelegate controller = + ExtendsWebViewControllerDelegate(); + + expect( + () => controller.reload(), + throwsUnimplementedError, + ); + }); + + test( + // ignore: lines_longer_than_80_chars + 'Default implementation of clearCache should throw unimplemented error', + () { + final WebViewControllerDelegate controller = + ExtendsWebViewControllerDelegate(); + + expect( + () => controller.clearCache(), + throwsUnimplementedError, + ); + }); + + test( + // ignore: lines_longer_than_80_chars + 'Default implementation of evaluateJavaScript should throw unimplemented error', + () { + final WebViewControllerDelegate controller = + ExtendsWebViewControllerDelegate(); + + expect( + () => controller.evaluateJavaScript('javaScript'), + throwsUnimplementedError, + ); + }); + + test( + // ignore: lines_longer_than_80_chars + 'Default implementation of runJavaScript should throw unimplemented error', + () { + final WebViewControllerDelegate controller = + ExtendsWebViewControllerDelegate(); + + expect( + () => controller.runJavaScript('javaScript'), + throwsUnimplementedError, + ); + }); + + test( + // ignore: lines_longer_than_80_chars + 'Default implementation of runJavaScriptReturningResult should throw unimplemented error', + () { + final WebViewControllerDelegate controller = + ExtendsWebViewControllerDelegate(); + + expect( + () => controller.runJavaScriptReturningResult('javaScript'), + throwsUnimplementedError, + ); + }); + + test( + // ignore: lines_longer_than_80_chars + 'Default implementation of addJavaScriptChannels should throw unimplemented error', + () { + final WebViewControllerDelegate controller = + ExtendsWebViewControllerDelegate(); + + expect( + () => controller.addJavaScriptChannels({}), + throwsUnimplementedError, + ); + }); + + test( + // ignore: lines_longer_than_80_chars + 'Default implementation of removeJavaScriptChannels should throw unimplemented error', + () { + final WebViewControllerDelegate controller = + ExtendsWebViewControllerDelegate(); + + expect( + () => controller.removeJavaScriptChannels({}), + throwsUnimplementedError, + ); + }); + + test( + // ignore: lines_longer_than_80_chars + 'Default implementation of getTitle should throw unimplemented error', + () { + final WebViewControllerDelegate controller = + ExtendsWebViewControllerDelegate(); + + expect( + () => controller.getTitle(), + throwsUnimplementedError, + ); + }); + + test( + // ignore: lines_longer_than_80_chars + 'Default implementation of scrollTo should throw unimplemented error', + () { + final WebViewControllerDelegate controller = + ExtendsWebViewControllerDelegate(); + + expect( + () => controller.scrollTo(0, 0), + throwsUnimplementedError, + ); + }); + + test( + // ignore: lines_longer_than_80_chars + 'Default implementation of scrollBy should throw unimplemented error', + () { + final WebViewControllerDelegate controller = + ExtendsWebViewControllerDelegate(); + + expect( + () => controller.scrollBy(0, 0), + throwsUnimplementedError, + ); + }); + + test( + // ignore: lines_longer_than_80_chars + 'Default implementation of getScrollX should throw unimplemented error', + () { + final WebViewControllerDelegate controller = + ExtendsWebViewControllerDelegate(); + + expect( + () => controller.getScrollX(), + throwsUnimplementedError, + ); + }); + + test( + // ignore: lines_longer_than_80_chars + 'Default implementation of getScrollY should throw unimplemented error', + () { + final WebViewControllerDelegate controller = + ExtendsWebViewControllerDelegate(); + + expect( + () => controller.getScrollY(), + throwsUnimplementedError, + ); + }); +} + +class MockWebViewPlatformWithMixin extends MockWebViewPlatform + with + // ignore: prefer_mixin + MockPlatformInterfaceMixin {} + +class ImplementsWebViewControllerDelegate implements WebViewControllerDelegate { + @override + dynamic noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation); +} + +class MockWebViewControllerDelegate extends Mock + with + // ignore: prefer_mixin + MockPlatformInterfaceMixin + implements + WebViewControllerDelegate {} + +class ExtendsWebViewControllerDelegate extends WebViewControllerDelegate { + ExtendsWebViewControllerDelegate() : super.implementation(); +} + +class MockLoadRequestParamsDelegate extends Mock + with + //ignore: prefer_mixin + MockPlatformInterfaceMixin + implements + LoadRequestParamsDelegate {} + +class MockWebSettingsDelegate extends Mock + with + //ignore: prefer_mixin + MockPlatformInterfaceMixin + implements + WebSettingsDelegate {} 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/src/v4/webview_platform_test.dart new file mode 100644 index 000000000000..b7d01feea354 --- /dev/null +++ b/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/webview_platform_test.dart @@ -0,0 +1,110 @@ +// 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_test/flutter_test.dart'; +import 'package:mockito/annotations.dart'; +import 'package:plugin_platform_interface/plugin_platform_interface.dart'; +import 'package:webview_flutter_platform_interface/src/v4/webview_platform.dart'; + +import 'webview_platform_test.mocks.dart'; + +@GenerateMocks([WebViewPlatform]) +void main() { + TestWidgetsFlutterBinding.ensureInitialized(); + + test('Default instance WebViewPlatform instance should be null', () { + expect(WebViewPlatform.instance, isNull); + }); + + test('Cannot be implemented with `implements`', () { + expect(() { + WebViewPlatform.instance = ImplementsWebViewPlatform(); + }, throwsNoSuchMethodError); + }); + + test('Can be extended', () { + WebViewPlatform.instance = ExtendsWebViewPlatform(); + }); + + test('Can be mocked with `implements`', () { + final MockWebViewPlatform mock = MockWebViewPlatform(); + WebViewPlatform.instance = mock; + }); + + test( + // ignore: lines_longer_than_80_chars + 'Default implementation of createCookieManagerDelegate should throw unimplemented error', + () { + final WebViewPlatform webViewPlatform = ExtendsWebViewPlatform(); + + expect( + webViewPlatform.createCookieManagerDelegate, + throwsUnimplementedError, + ); + }); + + test( + // ignore: lines_longer_than_80_chars + 'Default implementation of createLoadRequestParamsDelegate should throw unimplemented error', + () { + final WebViewPlatform webViewPlatform = ExtendsWebViewPlatform(); + + expect( + () => webViewPlatform.createLoadRequestParamsDelegate( + uri: Uri(path: 'https://flutter.dev'), + method: LoadRequestMethod.get, + headers: {}), + throwsUnimplementedError, + ); + }); + + test( + // ignore: lines_longer_than_80_chars + 'Default implementation of createNavigationCallbackHandlerDelegate should throw unimplemented error', + () { + final WebViewPlatform webViewPlatform = ExtendsWebViewPlatform(); + + expect( + webViewPlatform.createNavigationCallbackHandlerDelegate(), + throwsUnimplementedError, + ); + }); + + test( + // ignore: lines_longer_than_80_chars + 'Default implementation of createWebSettingsDelegate should throw unimplemented error', + () { + final WebViewPlatform webViewPlatform = ExtendsWebViewPlatform(); + + expect( + () => webViewPlatform.createWebSettingsDelegate( + userAgent: const WebSetting.absent()), + throwsUnimplementedError, + ); + }); + + test( + // ignore: lines_longer_than_80_chars + 'Default implementation of createWebViewControllerDelegate should throw unimplemented error', + () { + final WebViewPlatform webViewPlatform = ExtendsWebViewPlatform(); + + expect( + webViewPlatform.createWebViewControllerDelegate, + throwsUnimplementedError, + ); + }); +} + +class ImplementsWebViewPlatform implements WebViewPlatform { + @override + dynamic noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation); +} + +class MockWebViewPlatformWithMixin extends MockWebViewPlatform + with + // ignore: prefer_mixin + MockPlatformInterfaceMixin {} + +class ExtendsWebViewPlatform extends WebViewPlatform {} 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 new file mode 100644 index 000000000000..e35b4401a8f8 --- /dev/null +++ b/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/webview_platform_test.mocks.dart @@ -0,0 +1,119 @@ +// 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 'dart:typed_data' as _i9; + +import 'package:flutter/foundation.dart' as _i10; +import 'package:mockito/mockito.dart' as _i1; +import 'package:webview_flutter_platform_interface/src/v4/navigation_callback_handler_delegate.dart' + as _i4; +import 'package:webview_flutter_platform_interface/src/v4/types/load_request_params.dart' + as _i3; +import 'package:webview_flutter_platform_interface/src/v4/types/types.dart' + as _i5; +import 'package:webview_flutter_platform_interface/src/v4/webview_controller_delegate.dart' + as _i6; +import 'package:webview_flutter_platform_interface/src/v4/webview_cookie_manager_delegate.dart' + as _i2; +import 'package:webview_flutter_platform_interface/src/v4/webview_platform.dart' + as _i8; +import 'package:webview_flutter_platform_interface/src/v4/webview_widget_delegate.dart' + as _i7; + +// 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 _FakeWebViewCookieManagerDelegate_0 extends _i1.Fake + implements _i2.WebViewCookieManagerDelegate {} + +class _FakeLoadRequestParamsDelegate_1 extends _i1.Fake + implements _i3.LoadRequestParamsDelegate {} + +class _FakeNavigationCallbackHandlerDelegate_2 extends _i1.Fake + implements _i4.NavigationCallbackHandlerDelegate {} + +class _FakeWebSettingsDelegate_3 extends _i1.Fake + implements _i5.WebSettingsDelegate {} + +class _FakeWebViewControllerDelegate_4 extends _i1.Fake + implements _i6.WebViewControllerDelegate {} + +class _FakeWebViewWidgetDelegate_5 extends _i1.Fake + implements _i7.WebViewWidgetDelegate {} + +/// A class which mocks [WebViewPlatform]. +/// +/// See the documentation for Mockito's code generation for more information. +class MockWebViewPlatform extends _i1.Mock implements _i8.WebViewPlatform { + MockWebViewPlatform() { + _i1.throwOnMissingStub(this); + } + + @override + _i2.WebViewCookieManagerDelegate createCookieManagerDelegate() => + (super.noSuchMethod(Invocation.method(#createCookieManagerDelegate, []), + returnValue: _FakeWebViewCookieManagerDelegate_0()) + as _i2.WebViewCookieManagerDelegate); + @override + _i3.LoadRequestParamsDelegate createLoadRequestParamsDelegate( + {Uri? uri, + _i3.LoadRequestMethod? method, + Map? headers, + _i9.Uint8List? body}) => + (super.noSuchMethod( + Invocation.method(#createLoadRequestParamsDelegate, [], + {#uri: uri, #method: method, #headers: headers, #body: body}), + returnValue: _FakeLoadRequestParamsDelegate_1()) + as _i3.LoadRequestParamsDelegate); + @override + _i4.NavigationCallbackHandlerDelegate + createNavigationCallbackHandlerDelegate() => (super.noSuchMethod( + Invocation.method(#createNavigationCallbackHandlerDelegate, []), + returnValue: _FakeNavigationCallbackHandlerDelegate_2()) + as _i4.NavigationCallbackHandlerDelegate); + @override + _i5.WebSettingsDelegate createWebSettingsDelegate( + {bool? allowsInlineMediaPlayback, + bool? debuggingEnabled, + bool? gestureNavigationEnabled, + bool? hasNavigationDelegate, + bool? hasProgressTracking, + _i5.JavaScriptMode? javaScriptMode, + _i5.WebSetting? userAgent, + bool? zoomEnabled}) => + (super.noSuchMethod( + Invocation.method(#createWebSettingsDelegate, [], { + #allowsInlineMediaPlayback: allowsInlineMediaPlayback, + #debuggingEnabled: debuggingEnabled, + #gestureNavigationEnabled: gestureNavigationEnabled, + #hasNavigationDelegate: hasNavigationDelegate, + #hasProgressTracking: hasProgressTracking, + #javaScriptMode: javaScriptMode, + #userAgent: userAgent, + #zoomEnabled: zoomEnabled + }), + returnValue: _FakeWebSettingsDelegate_3()) + as _i5.WebSettingsDelegate); + @override + _i6.WebViewControllerDelegate createWebViewControllerDelegate() => (super + .noSuchMethod(Invocation.method(#createWebViewControllerDelegate, []), + returnValue: _FakeWebViewControllerDelegate_4()) + as _i6.WebViewControllerDelegate); + @override + _i7.WebViewWidgetDelegate createWebViewWidgetDelegate( + {_i10.Key? key, _i6.WebViewControllerDelegate? controller}) => + (super.noSuchMethod( + Invocation.method(#createWebViewWidgetDelegate, [], + {#key: key, #controller: controller}), + returnValue: _FakeWebViewWidgetDelegate_5()) + as _i7.WebViewWidgetDelegate); + @override + String toString() => super.toString(); +} From 06bb7b64cfa7123ec35f0446850b01d1e1789cb3 Mon Sep 17 00:00:00 2001 From: Maurits van Beusekom Date: Fri, 25 Mar 2022 21:29:53 +0100 Subject: [PATCH 02/31] First definition of platform interface v4 --- .../lib/src/v4/webview_platform.dart | 1 + .../test/src/v4/webview_platform_test.dart | 6 +- .../src/v4/webview_platform_test.mocks.dart | 58 +++++++------ .../src/v4/webview_widget_delegate_test.dart | 87 +++++++++++++++++++ 4 files changed, 122 insertions(+), 30 deletions(-) create mode 100644 packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/webview_widget_delegate_test.dart diff --git a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/webview_platform.dart b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/webview_platform.dart index c36f9edc4d03..0ca20edc9af8 100644 --- a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/webview_platform.dart +++ b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/webview_platform.dart @@ -17,6 +17,7 @@ import 'webview_cookie_manager_delegate.dart'; export 'types/types.dart'; +/// Interface for a platform implementation of a WebView. abstract class WebViewPlatform extends PlatformInterface { /// Creates a new [WebViewPlatform]. WebViewPlatform() : super(token: _token); 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/src/v4/webview_platform_test.dart index b7d01feea354..67e7569f6dd1 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/src/v4/webview_platform_test.dart @@ -9,7 +9,7 @@ import 'package:webview_flutter_platform_interface/src/v4/webview_platform.dart' import 'webview_platform_test.mocks.dart'; -@GenerateMocks([WebViewPlatform]) +@GenerateMocks([WebViewPlatform]) void main() { TestWidgetsFlutterBinding.ensureInitialized(); @@ -28,7 +28,7 @@ void main() { }); test('Can be mocked with `implements`', () { - final MockWebViewPlatform mock = MockWebViewPlatform(); + final MockWebViewPlatform mock = MockWebViewPlatformWithMixin(); WebViewPlatform.instance = mock; }); @@ -66,7 +66,7 @@ void main() { final WebViewPlatform webViewPlatform = ExtendsWebViewPlatform(); expect( - webViewPlatform.createNavigationCallbackHandlerDelegate(), + () => webViewPlatform.createNavigationCallbackHandlerDelegate(), throwsUnimplementedError, ); }); 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 index e35b4401a8f8..e35250766fd2 100644 --- 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 @@ -1,26 +1,26 @@ -// Mocks generated by Mockito 5.0.16 from annotations +// Mocks generated by Mockito 5.1.0 from annotations // in webview_flutter_platform_interface/test/src/v4/webview_platform_test.dart. // Do not manually edit this file. -import 'dart:typed_data' as _i9; +import 'dart:typed_data' as _i8; -import 'package:flutter/foundation.dart' as _i10; +import 'package:flutter/foundation.dart' as _i9; +import 'package:flutter/gestures.dart' as _i10; import 'package:mockito/mockito.dart' as _i1; import 'package:webview_flutter_platform_interface/src/v4/navigation_callback_handler_delegate.dart' as _i4; -import 'package:webview_flutter_platform_interface/src/v4/types/load_request_params.dart' - as _i3; import 'package:webview_flutter_platform_interface/src/v4/types/types.dart' - as _i5; + as _i3; import 'package:webview_flutter_platform_interface/src/v4/webview_controller_delegate.dart' - as _i6; + as _i5; import 'package:webview_flutter_platform_interface/src/v4/webview_cookie_manager_delegate.dart' as _i2; import 'package:webview_flutter_platform_interface/src/v4/webview_platform.dart' - as _i8; -import 'package:webview_flutter_platform_interface/src/v4/webview_widget_delegate.dart' as _i7; +import 'package:webview_flutter_platform_interface/src/v4/webview_widget_delegate.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 @@ -40,18 +40,18 @@ class _FakeNavigationCallbackHandlerDelegate_2 extends _i1.Fake implements _i4.NavigationCallbackHandlerDelegate {} class _FakeWebSettingsDelegate_3 extends _i1.Fake - implements _i5.WebSettingsDelegate {} + implements _i3.WebSettingsDelegate {} class _FakeWebViewControllerDelegate_4 extends _i1.Fake - implements _i6.WebViewControllerDelegate {} + implements _i5.WebViewControllerDelegate {} class _FakeWebViewWidgetDelegate_5 extends _i1.Fake - implements _i7.WebViewWidgetDelegate {} + implements _i6.WebViewWidgetDelegate {} /// A class which mocks [WebViewPlatform]. /// /// See the documentation for Mockito's code generation for more information. -class MockWebViewPlatform extends _i1.Mock implements _i8.WebViewPlatform { +class MockWebViewPlatform extends _i1.Mock implements _i7.WebViewPlatform { MockWebViewPlatform() { _i1.throwOnMissingStub(this); } @@ -66,7 +66,7 @@ class MockWebViewPlatform extends _i1.Mock implements _i8.WebViewPlatform { {Uri? uri, _i3.LoadRequestMethod? method, Map? headers, - _i9.Uint8List? body}) => + _i8.Uint8List? body}) => (super.noSuchMethod( Invocation.method(#createLoadRequestParamsDelegate, [], {#uri: uri, #method: method, #headers: headers, #body: body}), @@ -79,14 +79,14 @@ class MockWebViewPlatform extends _i1.Mock implements _i8.WebViewPlatform { returnValue: _FakeNavigationCallbackHandlerDelegate_2()) as _i4.NavigationCallbackHandlerDelegate); @override - _i5.WebSettingsDelegate createWebSettingsDelegate( + _i3.WebSettingsDelegate createWebSettingsDelegate( {bool? allowsInlineMediaPlayback, bool? debuggingEnabled, bool? gestureNavigationEnabled, bool? hasNavigationDelegate, bool? hasProgressTracking, - _i5.JavaScriptMode? javaScriptMode, - _i5.WebSetting? userAgent, + _i3.JavaScriptMode? javaScriptMode, + _i3.WebSetting? userAgent, bool? zoomEnabled}) => (super.noSuchMethod( Invocation.method(#createWebSettingsDelegate, [], { @@ -100,20 +100,24 @@ class MockWebViewPlatform extends _i1.Mock implements _i8.WebViewPlatform { #zoomEnabled: zoomEnabled }), returnValue: _FakeWebSettingsDelegate_3()) - as _i5.WebSettingsDelegate); + as _i3.WebSettingsDelegate); @override - _i6.WebViewControllerDelegate createWebViewControllerDelegate() => (super + _i5.WebViewControllerDelegate createWebViewControllerDelegate() => (super .noSuchMethod(Invocation.method(#createWebViewControllerDelegate, []), returnValue: _FakeWebViewControllerDelegate_4()) - as _i6.WebViewControllerDelegate); + as _i5.WebViewControllerDelegate); @override - _i7.WebViewWidgetDelegate createWebViewWidgetDelegate( - {_i10.Key? key, _i6.WebViewControllerDelegate? controller}) => + _i6.WebViewWidgetDelegate createWebViewWidgetDelegate( + {_i9.Key? key, + _i5.WebViewControllerDelegate? controller, + Set<_i9.Factory<_i10.OneSequenceGestureRecognizer>>? + gestureRecognizers}) => (super.noSuchMethod( - Invocation.method(#createWebViewWidgetDelegate, [], - {#key: key, #controller: controller}), + Invocation.method(#createWebViewWidgetDelegate, [], { + #key: key, + #controller: controller, + #gestureRecognizers: gestureRecognizers + }), returnValue: _FakeWebViewWidgetDelegate_5()) - as _i7.WebViewWidgetDelegate); - @override - String toString() => super.toString(); + as _i6.WebViewWidgetDelegate); } diff --git a/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/webview_widget_delegate_test.dart b/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/webview_widget_delegate_test.dart new file mode 100644 index 000000000000..b68cf7916a8e --- /dev/null +++ b/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/webview_widget_delegate_test.dart @@ -0,0 +1,87 @@ +// 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/widgets.dart'; +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/src/v4/webview_controller_delegate.dart'; +import 'package:webview_flutter_platform_interface/src/v4/webview_platform.dart'; +import 'package:webview_flutter_platform_interface/src/v4/webview_widget_delegate.dart'; + +import 'webview_platform_test.mocks.dart'; + +void main() { + setUp(() { + WebViewPlatform.instance = MockWebViewPlatformWithMixin(); + }); + + test('Cannot be implemented with `implements`', () { + final MockWebViewControllerDelegate controller = + MockWebViewControllerDelegate(); + when(WebViewPlatform.instance! + .createWebViewWidgetDelegate(controller: controller)) + .thenReturn(ImplementsWebViewWidgetDelegate()); + + expect(() { + WebViewWidgetDelegate(controller: controller); + }, throwsNoSuchMethodError); + }); + + test('Can be extended', () { + final MockWebViewControllerDelegate controller = + MockWebViewControllerDelegate(); + when(WebViewPlatform.instance! + .createWebViewWidgetDelegate(controller: controller)) + .thenReturn(ExtendsWebViewWidgetDelegate(controller: controller)); + + expect(WebViewWidgetDelegate(controller: controller), isNotNull); + }); + + test('Can be mocked with `implements`', () { + final MockWebViewControllerDelegate controller = + MockWebViewControllerDelegate(); + when(WebViewPlatform.instance! + .createWebViewWidgetDelegate(controller: controller)) + .thenReturn(MockWebViewWidgetDelegate()); + + expect(WebViewWidgetDelegate(controller: controller), isNotNull); + }); +} + +class MockWebViewPlatformWithMixin extends MockWebViewPlatform + with + // ignore: prefer_mixin + MockPlatformInterfaceMixin {} + +class ImplementsWebViewWidgetDelegate implements WebViewWidgetDelegate { + @override + dynamic noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation); +} + +class MockWebViewWidgetDelegate extends Mock + with + // ignore: prefer_mixin + MockPlatformInterfaceMixin + implements + WebViewWidgetDelegate {} + +class ExtendsWebViewWidgetDelegate extends WebViewWidgetDelegate { + ExtendsWebViewWidgetDelegate({ + required MockWebViewControllerDelegate controller, + }) : super.implementation(controller: controller); + + @override + Widget build(BuildContext context) { + throw UnimplementedError( + 'build is not implemented for ExtendedWebViewWidgetDelegate.'); + } +} + +class MockWebViewControllerDelegate extends Mock + with + // ignore: prefer_mixin + MockPlatformInterfaceMixin + implements + WebViewControllerDelegate {} From d8ce25fad5d15689c4aafd9e283249ff1135e013 Mon Sep 17 00:00:00 2001 From: Maurits van Beusekom Date: Thu, 31 Mar 2022 17:20:23 +0200 Subject: [PATCH 03/31] Converted WebResourceError to full delegate --- .../lib/src/v4/types/load_request_params.dart | 2 +- .../lib/src/v4/types/web_resource_error.dart | 92 ++++++++++++++----- .../lib/src/v4/webview_platform.dart | 6 ++ 3 files changed, 75 insertions(+), 25 deletions(-) diff --git a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/load_request_params.dart b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/load_request_params.dart index 5220097323fa..88e78d69815a 100644 --- a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/load_request_params.dart +++ b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/load_request_params.dart @@ -78,7 +78,7 @@ class LoadRequestParamsDelegate extends PlatformInterface { factory LoadRequestParamsDelegate({ required Uri uri, required LoadRequestMethod method, - required Map headers, + Map headers = const { }, Uint8List? body, }) { final LoadRequestParamsDelegate loadRequestParamsDelegate = diff --git a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/web_resource_error.dart b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/web_resource_error.dart index 589f9694b294..2c5ce9ef016b 100644 --- a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/web_resource_error.dart +++ b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/web_resource_error.dart @@ -2,25 +2,84 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -import 'package:meta/meta.dart'; +import 'package:flutter/foundation.dart'; +import 'package:plugin_platform_interface/plugin_platform_interface.dart'; +import '../webview_platform.dart'; import 'web_resource_error_type.dart'; -/// Error returned in `WebView.onWebResourceError` when a web resource loading error has occurred. -@sealed -class WebResourceError { +/// Error returned in `WebView.onWebResourceError` when a web resource loading +/// error has occurred. +/// +/// Platform specific implementations can add additional fields by extending +/// this class and provide a factory method that takes the +/// [WebResourceErrorDelegate] as a parameter. +/// +/// {@tool sample} +/// This example demonstrates how to extend the [WebResourceErrorDelegate] to +/// provide additional platform specific parameters. +/// +/// Note that the additional parameters should always accept `null` or have a +/// default value to prevent breaking changes. +/// +/// ```dart +/// class IOSWebResourceError extends WebResourceErrorDelegate { +/// IOSWebResourceError._( +/// WebResourceErrorDelegate webResourceError, +/// this.domain, +/// ) : super( +/// errorCode: webResourceError.errorCode, +/// description: webResourceError.description, +/// errorType: webResourceError.errorType, +/// ); +/// +/// factory IOSWebResourceError.fromWebResourceError( +/// WebResourceErrorDelegate webResourceError, { +/// String? domain, +/// }) { +/// return IOSWebResourceError._( +/// webResourceError: webResourceError, +/// domain: domain, +/// ); +/// } +/// +/// final String? domain; +/// } +/// ``` +/// {@end-tool} +class WebResourceErrorDelegate extends PlatformInterface { /// Creates a new [WebResourceError] /// /// A user should not need to instantiate this class, but will receive one in /// [WebResourceErrorCallback]. - WebResourceError({ + factory WebResourceErrorDelegate({ + required String errorCode, + required String description, + WebResourceErrorType? errorType, + }) { + final WebResourceErrorDelegate webResourceErrorDelegate = + WebViewPlatform.instance!.createWebResourceErrorDelegate( + errorCode: errorCode, + description: description, + errorType: errorType, + ); + PlatformInterface.verify(webResourceErrorDelegate, _token); + return webResourceErrorDelegate; + } + + /// Used by the platform implementation to create a new + /// [WebResourceErrorDelegate]. + /// + /// Should only be used by platform implementations because they can't extend + /// a class that only contains a factory constructor. + @protected + WebResourceErrorDelegate.implementation({ required this.errorCode, required this.description, - this.domain, this.errorType, - this.failingUrl, - }) : assert(errorCode != null), - assert(description != null); + }) : super(token: _token); + + static final Object _token = Object(); /// Raw code of the error from the respective platform. /// @@ -35,15 +94,6 @@ class WebResourceError { /// 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; @@ -51,10 +101,4 @@ class WebResourceError { /// /// 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/v4/webview_platform.dart b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/webview_platform.dart index c36f9edc4d03..03cf61b03e13 100644 --- a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/webview_platform.dart +++ b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/webview_platform.dart @@ -63,6 +63,12 @@ abstract class WebViewPlatform extends PlatformInterface { 'createNavigationCallbackHandlerDelegate is not implemented on the current platform.'); } + /// Create a new [WebResourceErrorDelegate]. + WebResourceErrorDelegate createWebResourceErrorDelegate() { + throw UnimplementedError( + 'createWebResourceErrorDelegate is not implemented on the current platform.'); + } + /// Create a new [WebSettingsDelegate]. WebSettingsDelegate createWebSettingsDelegate({ bool? allowsInlineMediaPlayback, From 2abdd4aef07e3f8680eb87f63f5bad02d87c1d70 Mon Sep 17 00:00:00 2001 From: Maurits van Beusekom Date: Fri, 1 Apr 2022 07:43:55 +0200 Subject: [PATCH 04/31] Processed feedback on pull request --- .../navigation_callback_handler_delegate.dart | 57 +++++++--- ...dart => load_request_params_delegate.dart} | 0 .../lib/src/v4/types/types.dart | 7 +- ....dart => web_resource_error_delegate.dart} | 80 +++++++++++--- .../src/v4/types/web_resource_error_type.dart | 66 ------------ ...ttings.dart => web_settings_delegate.dart} | 0 .../src/v4/webview_controller_delegate.dart | 2 +- .../lib/src/v4/webview_platform.dart | 8 +- ...gation_callback_handler_delegate_test.dart | 85 +++++++++++---- ...=> load_request_params_delegate_test.dart} | 0 .../web_resource_error_delegate_test.dart | 101 ++++++++++++++++++ ...eb_resource_error_delegate_test.mocks.dart | 37 +++++++ ...t.dart => web_settings_delegate_test.dart} | 0 .../src/v4/webview_platform_test.mocks.dart | 33 ++++-- 14 files changed, 348 insertions(+), 128 deletions(-) rename packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/{load_request_params.dart => load_request_params_delegate.dart} (100%) rename packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/{web_resource_error.dart => web_resource_error_delegate.dart} (67%) delete mode 100644 packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/web_resource_error_type.dart rename packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/{web_settings.dart => web_settings_delegate.dart} (100%) rename packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/types/{load_request_params_test.dart => load_request_params_delegate_test.dart} (100%) create mode 100644 packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/types/web_resource_error_delegate_test.dart create mode 100644 packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/types/web_resource_error_delegate_test.mocks.dart rename packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/types/{web_settings_test.dart => web_settings_delegate_test.dart} (100%) diff --git a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/navigation_callback_handler_delegate.dart b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/navigation_callback_handler_delegate.dart index 1cee5654adfc..b9a680200727 100644 --- a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/navigation_callback_handler_delegate.dart +++ b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/navigation_callback_handler_delegate.dart @@ -7,7 +7,6 @@ import 'dart:async'; import 'package:flutter/foundation.dart'; import 'package:plugin_platform_interface/plugin_platform_interface.dart'; -import 'types/types.dart'; import 'webview_platform.dart'; /// Interface for callbacks made by [NavigationCallbackHandlerDelegate]. @@ -35,26 +34,50 @@ abstract class NavigationCallbackHandlerDelegate extends PlatformInterface { static final Object _token = Object(); - /// Invoked by [WebViewPlatformControllerDelegate] when a navigation request - /// is pending. - /// - /// If true is returned the navigation is allowed, otherwise it is blocked. - FutureOr onNavigationRequest( - {required String url, required bool isForMainFrame}); + /// Sets the callback method that is invoked by the + /// [WebViewPlatformControllerDelegate] when a navigation request is pending. + Future setOnNavigationRequest( + void Function({required String url, required bool isForMainFrame}) + onNavigationRequest, + ) { + throw UnimplementedError( + 'setOnNavigationRequest is not implemented on the current platform.'); + } - /// Invoked by [WebViewPlatformControllerDelegate] when a page has started - /// loading. - void onPageStarted(String url); + /// Sets the callback method that is invoked by [WebViewControllerDelegate] + /// when a page has started loading. + Future setOnPageStarted( + void Function(String url) onPageStarted, + ) { + throw UnimplementedError( + 'setOnPageStarted is not implemented on the current platform.'); + } - /// Invoked by [WebViewPlatformControllerDelegate] when a page has finished - /// loading. - void onPageFinished(String url); + /// Sets the callback method that is invoked by [WebViewControllerDelegate] + /// when a page has finished loading. + Future setOnPageFinished( + void Function(String url) onPageFinished, + ) { + throw UnimplementedError( + 'setOnPageFinished is not implemented on the current platform.'); + } - /// Invoked by [WebViewPlatformControllerDelegate] when a page is loading. + /// Sets the callback method that is invoked by [WebViewControllerDelegate] + /// when a page is loading. /// /// Only works when [WebSettings.hasProgressTracking] is set to `true`. - void onProgress(int progress); + Future setOnProgress( + void Function(int progress) onProgress, + ) { + throw UnimplementedError( + 'setOnProgress is not implemented on the current platform.'); + } - /// Report web resource loading error to the host application. - void onWebResourceError(WebResourceError error); + /// Sets the callback that is invoked when a resource loading error occurred.. + Future setOnWebResourceError( + void Function(WebResourceErrorDelegate error) onWebResourceError, + ) { + throw UnimplementedError( + 'setOnWebResourceError is not implemented on the current platform.'); + } } diff --git a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/load_request_params.dart b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/load_request_params_delegate.dart similarity index 100% rename from packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/load_request_params.dart rename to packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/load_request_params_delegate.dart diff --git a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/types.dart b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/types.dart index c9bc0e9121f9..0ed7a6680654 100644 --- a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/types.dart +++ b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/types.dart @@ -3,8 +3,7 @@ // found in the LICENSE file. export 'javascript_mode.dart'; -export 'load_request_params.dart'; -export 'web_resource_error.dart'; -export 'web_resource_error_type.dart'; -export 'web_settings.dart'; +export 'load_request_params_delegate.dart'; +export 'web_resource_error_delegate.dart'; +export 'web_settings_delegate.dart'; export 'webview_cookie.dart'; diff --git a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/web_resource_error.dart b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/web_resource_error_delegate.dart similarity index 67% rename from packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/web_resource_error.dart rename to packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/web_resource_error_delegate.dart index 2c5ce9ef016b..32adeabd295d 100644 --- a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/web_resource_error.dart +++ b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/web_resource_error_delegate.dart @@ -6,7 +6,73 @@ import 'package:flutter/foundation.dart'; import 'package:plugin_platform_interface/plugin_platform_interface.dart'; import '../webview_platform.dart'; -import 'web_resource_error_type.dart'; + +// 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. + +/// 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. @@ -53,7 +119,7 @@ class WebResourceErrorDelegate extends PlatformInterface { /// A user should not need to instantiate this class, but will receive one in /// [WebResourceErrorCallback]. factory WebResourceErrorDelegate({ - required String errorCode, + required int errorCode, required String description, WebResourceErrorType? errorType, }) { @@ -82,16 +148,6 @@ class WebResourceErrorDelegate extends PlatformInterface { static final Object _token = Object(); /// 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; /// Description of the error that can be used to communicate the problem to the user. diff --git a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/web_resource_error_type.dart b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/web_resource_error_type.dart deleted file mode 100644 index a45816df8323..000000000000 --- a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/web_resource_error_type.dart +++ /dev/null @@ -1,66 +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. - -/// 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, -} diff --git a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/web_settings.dart b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/web_settings_delegate.dart similarity index 100% rename from packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/web_settings.dart rename to packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/web_settings_delegate.dart diff --git a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/webview_controller_delegate.dart b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/webview_controller_delegate.dart index 3a9ddb2d451a..d42f795c76b8 100644 --- a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/webview_controller_delegate.dart +++ b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/webview_controller_delegate.dart @@ -4,7 +4,7 @@ import 'package:flutter/foundation.dart'; import 'package:plugin_platform_interface/plugin_platform_interface.dart'; -import 'package:webview_flutter_platform_interface/src/v4/types/load_request_params.dart'; +import 'package:webview_flutter_platform_interface/src/v4/types/load_request_params_delegate.dart'; import 'types/types.dart'; import 'webview_platform.dart'; diff --git a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/webview_platform.dart b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/webview_platform.dart index c345f4fb929c..b9755e4f9a12 100644 --- a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/webview_platform.dart +++ b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/webview_platform.dart @@ -7,7 +7,7 @@ import 'dart:typed_data'; import 'package:flutter/foundation.dart'; import 'package:flutter/gestures.dart'; import 'package:plugin_platform_interface/plugin_platform_interface.dart'; -import 'package:webview_flutter_platform_interface/src/v4/types/load_request_params.dart'; +import 'package:webview_flutter_platform_interface/src/v4/types/load_request_params_delegate.dart'; import 'package:webview_flutter_platform_interface/src/v4/types/types.dart'; import 'package:webview_flutter_platform_interface/src/v4/webview_widget_delegate.dart'; @@ -65,7 +65,11 @@ abstract class WebViewPlatform extends PlatformInterface { } /// Create a new [WebResourceErrorDelegate]. - WebResourceErrorDelegate createWebResourceErrorDelegate() { + WebResourceErrorDelegate createWebResourceErrorDelegate({ + required int errorCode, + required String description, + WebResourceErrorType? errorType, + }) { throw UnimplementedError( 'createWebResourceErrorDelegate is not implemented on the current platform.'); } diff --git a/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/navigation_callback_handler_delegate_test.dart b/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/navigation_callback_handler_delegate_test.dart index 0df6dc367e9e..384539787df6 100644 --- a/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/navigation_callback_handler_delegate_test.dart +++ b/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/navigation_callback_handler_delegate_test.dart @@ -39,6 +39,73 @@ void main() { expect(NavigationCallbackHandlerDelegate(), isNotNull); }); + + test( + // ignore: lines_longer_than_80_chars + 'Default implementation of setOnNavigationRequest should throw unimplemented error', + () { + final NavigationCallbackHandlerDelegate callbackHandler = + ExtendsNavigationCallbackHandlerDelegate(); + + expect( + () => callbackHandler.setOnNavigationRequest( + ({required bool isForMainFrame, required String url}) {}), + throwsUnimplementedError, + ); + }); + + test( + // ignore: lines_longer_than_80_chars + 'Default implementation of setOnPageStarted should throw unimplemented error', + () { + final NavigationCallbackHandlerDelegate callbackHandler = + ExtendsNavigationCallbackHandlerDelegate(); + + expect( + () => callbackHandler.setOnPageStarted((String url) {}), + throwsUnimplementedError, + ); + }); + + test( + // ignore: lines_longer_than_80_chars + 'Default implementation of setOnPageFinished should throw unimplemented error', + () { + final NavigationCallbackHandlerDelegate callbackHandler = + ExtendsNavigationCallbackHandlerDelegate(); + + expect( + () => callbackHandler.setOnPageFinished((String url) {}), + throwsUnimplementedError, + ); + }); + + test( + // ignore: lines_longer_than_80_chars + 'Default implementation of setOnProgress should throw unimplemented error', + () { + final NavigationCallbackHandlerDelegate callbackHandler = + ExtendsNavigationCallbackHandlerDelegate(); + + expect( + () => callbackHandler.setOnProgress((int progress) {}), + throwsUnimplementedError, + ); + }); + + test( + // ignore: lines_longer_than_80_chars + 'Default implementation of setOnWebResourceError should throw unimplemented error', + () { + final NavigationCallbackHandlerDelegate callbackHandler = + ExtendsNavigationCallbackHandlerDelegate(); + + expect( + () => callbackHandler + .setOnWebResourceError((WebResourceErrorDelegate error) {}), + throwsUnimplementedError, + ); + }); } class MockWebViewPlatformWithMixin extends MockWebViewPlatform @@ -62,22 +129,4 @@ class MockNavigationCallbackHandlerDelegate extends Mock class ExtendsNavigationCallbackHandlerDelegate extends NavigationCallbackHandlerDelegate { ExtendsNavigationCallbackHandlerDelegate() : super.implementation(); - - @override - FutureOr onNavigationRequest( - {required String url, required bool isForMainFrame}) { - throw UnimplementedError(); - } - - @override - void onPageFinished(String url) {} - - @override - void onPageStarted(String url) {} - - @override - void onProgress(int progress) {} - - @override - void onWebResourceError(WebResourceError error) {} } diff --git a/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/types/load_request_params_test.dart b/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/types/load_request_params_delegate_test.dart similarity index 100% rename from packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/types/load_request_params_test.dart rename to packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/types/load_request_params_delegate_test.dart diff --git a/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/types/web_resource_error_delegate_test.dart b/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/types/web_resource_error_delegate_test.dart new file mode 100644 index 000000000000..90a474a20f23 --- /dev/null +++ b/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/types/web_resource_error_delegate_test.dart @@ -0,0 +1,101 @@ +// 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:typed_data'; + +import 'package:flutter_test/flutter_test.dart'; +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/src/v4/webview_platform.dart'; + +import '../webview_platform_test.mocks.dart'; +import 'web_resource_error_delegate_test.mocks.dart'; + +@GenerateMocks([WebResourceErrorDelegate]) +void main() { + setUp(() { + WebViewPlatform.instance = MockWebViewPlatformWithMixin(); + }); + + test('Cannot be implemented with `implements`', () { + const int errorCode = 401; + const String description = + 'Error used to test the WebResourceErrorDelegate'; + when(WebViewPlatform.instance!.createWebResourceErrorDelegate( + errorCode: errorCode, + description: description, + )).thenReturn(ImplementsWebResourceErrorDelegate()); + + expect(() { + WebResourceErrorDelegate( + errorCode: errorCode, + description: description, + ); + }, throwsNoSuchMethodError); + }); + + test('Can be extended', () { + const int errorCode = 401; + const String description = + 'Error used to test the WebResourceErrorDelegate'; + when(WebViewPlatform.instance!.createWebResourceErrorDelegate( + errorCode: errorCode, + description: description, + )).thenReturn(ExtendsWebResourceErrorDelegate( + errorCode: errorCode, + description: description, + )); + + expect(() { + WebResourceErrorDelegate( + errorCode: errorCode, + description: description, + ); + }, isNotNull); + }); + + test('Can be mocked with `implements`', () { + const int errorCode = 401; + const String description = + 'Error used to test the WebResourceErrorDelegate'; + when(WebViewPlatform.instance!.createWebResourceErrorDelegate( + errorCode: errorCode, + description: description, + )).thenReturn(MockWebResourceErrorDelegateWithMixin()); + + expect(() { + WebResourceErrorDelegate( + errorCode: errorCode, + description: description, + ); + }, isNotNull); + }); +} + +class MockWebViewPlatformWithMixin extends MockWebViewPlatform + with + // ignore: prefer_mixin + MockPlatformInterfaceMixin {} + +class ImplementsWebResourceErrorDelegate implements WebResourceErrorDelegate { + @override + dynamic noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation); +} + +class MockWebResourceErrorDelegateWithMixin extends MockWebResourceErrorDelegate + with + // ignore: prefer_mixin + MockPlatformInterfaceMixin {} + +class ExtendsWebResourceErrorDelegate extends WebResourceErrorDelegate { + ExtendsWebResourceErrorDelegate({ + required int errorCode, + required String description, + WebResourceErrorType? errorType, + }) : super.implementation( + errorCode: errorCode, + description: description, + errorType: errorType); +} diff --git a/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/types/web_resource_error_delegate_test.mocks.dart b/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/types/web_resource_error_delegate_test.mocks.dart new file mode 100644 index 000000000000..7bc7f13eaf1f --- /dev/null +++ b/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/types/web_resource_error_delegate_test.mocks.dart @@ -0,0 +1,37 @@ +// Mocks generated by Mockito 5.0.16 from annotations +// in webview_flutter_platform_interface/test/src/v4/types/web_resource_error_delegate_test.dart. +// Do not manually edit this file. + +import 'package:mockito/mockito.dart' as _i1; +import 'package:webview_flutter_platform_interface/src/v4/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 + +/// A class which mocks [WebResourceErrorDelegate]. +/// +/// See the documentation for Mockito's code generation for more information. +class MockWebResourceErrorDelegate extends _i1.Mock + implements _i2.WebResourceErrorDelegate { + MockWebResourceErrorDelegate() { + _i1.throwOnMissingStub(this); + } + + @override + int get errorCode => + (super.noSuchMethod(Invocation.getter(#errorCode), returnValue: 0) + as int); + @override + String get description => + (super.noSuchMethod(Invocation.getter(#description), returnValue: '') + as String); + @override + String toString() => super.toString(); +} diff --git a/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/types/web_settings_test.dart b/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/types/web_settings_delegate_test.dart similarity index 100% rename from packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/types/web_settings_test.dart rename to packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/types/web_settings_delegate_test.dart 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 index e35250766fd2..31a0b1784be8 100644 --- 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 @@ -1,4 +1,4 @@ -// Mocks generated by Mockito 5.1.0 from annotations +// 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. @@ -20,7 +20,6 @@ import 'package:webview_flutter_platform_interface/src/v4/webview_platform.dart' import 'package:webview_flutter_platform_interface/src/v4/webview_widget_delegate.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 @@ -39,13 +38,16 @@ class _FakeLoadRequestParamsDelegate_1 extends _i1.Fake class _FakeNavigationCallbackHandlerDelegate_2 extends _i1.Fake implements _i4.NavigationCallbackHandlerDelegate {} -class _FakeWebSettingsDelegate_3 extends _i1.Fake +class _FakeWebResourceErrorDelegate_3 extends _i1.Fake + implements _i3.WebResourceErrorDelegate {} + +class _FakeWebSettingsDelegate_4 extends _i1.Fake implements _i3.WebSettingsDelegate {} -class _FakeWebViewControllerDelegate_4 extends _i1.Fake +class _FakeWebViewControllerDelegate_5 extends _i1.Fake implements _i5.WebViewControllerDelegate {} -class _FakeWebViewWidgetDelegate_5 extends _i1.Fake +class _FakeWebViewWidgetDelegate_6 extends _i1.Fake implements _i6.WebViewWidgetDelegate {} /// A class which mocks [WebViewPlatform]. @@ -79,6 +81,19 @@ class MockWebViewPlatform extends _i1.Mock implements _i7.WebViewPlatform { returnValue: _FakeNavigationCallbackHandlerDelegate_2()) as _i4.NavigationCallbackHandlerDelegate); @override + _i3.WebResourceErrorDelegate createWebResourceErrorDelegate( + {int? errorCode, + String? description, + _i3.WebResourceErrorType? errorType}) => + (super.noSuchMethod( + Invocation.method(#createWebResourceErrorDelegate, [], { + #errorCode: errorCode, + #description: description, + #errorType: errorType + }), + returnValue: _FakeWebResourceErrorDelegate_3()) + as _i3.WebResourceErrorDelegate); + @override _i3.WebSettingsDelegate createWebSettingsDelegate( {bool? allowsInlineMediaPlayback, bool? debuggingEnabled, @@ -99,12 +114,12 @@ class MockWebViewPlatform extends _i1.Mock implements _i7.WebViewPlatform { #userAgent: userAgent, #zoomEnabled: zoomEnabled }), - returnValue: _FakeWebSettingsDelegate_3()) + returnValue: _FakeWebSettingsDelegate_4()) as _i3.WebSettingsDelegate); @override _i5.WebViewControllerDelegate createWebViewControllerDelegate() => (super .noSuchMethod(Invocation.method(#createWebViewControllerDelegate, []), - returnValue: _FakeWebViewControllerDelegate_4()) + returnValue: _FakeWebViewControllerDelegate_5()) as _i5.WebViewControllerDelegate); @override _i6.WebViewWidgetDelegate createWebViewWidgetDelegate( @@ -118,6 +133,8 @@ class MockWebViewPlatform extends _i1.Mock implements _i7.WebViewPlatform { #controller: controller, #gestureRecognizers: gestureRecognizers }), - returnValue: _FakeWebViewWidgetDelegate_5()) + returnValue: _FakeWebViewWidgetDelegate_6()) as _i6.WebViewWidgetDelegate); + @override + String toString() => super.toString(); } From 78c56e67d693f13aa1d57dd6f0a8759faba38276 Mon Sep 17 00:00:00 2001 From: Maurits van Beusekom Date: Fri, 1 Apr 2022 11:25:47 +0200 Subject: [PATCH 05/31] Fixed formatting --- .../lib/src/v4/types/load_request_params_delegate.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/load_request_params_delegate.dart b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/load_request_params_delegate.dart index 88e78d69815a..ba4233a7e4f8 100644 --- a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/load_request_params_delegate.dart +++ b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/load_request_params_delegate.dart @@ -78,7 +78,7 @@ class LoadRequestParamsDelegate extends PlatformInterface { factory LoadRequestParamsDelegate({ required Uri uri, required LoadRequestMethod method, - Map headers = const { }, + Map headers = const {}, Uint8List? body, }) { final LoadRequestParamsDelegate loadRequestParamsDelegate = From 3b5bad579d3af7149c269f1685de26320d5f894d Mon Sep 17 00:00:00 2001 From: Maurits van Beusekom Date: Fri, 1 Apr 2022 11:29:11 +0200 Subject: [PATCH 06/31] Removed obsolete import statements --- .../test/src/v4/navigation_callback_handler_delegate_test.dart | 2 -- .../test/src/v4/types/web_resource_error_delegate_test.dart | 2 -- 2 files changed, 4 deletions(-) diff --git a/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/navigation_callback_handler_delegate_test.dart b/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/navigation_callback_handler_delegate_test.dart index 384539787df6..f6d830761333 100644 --- a/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/navigation_callback_handler_delegate_test.dart +++ b/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/navigation_callback_handler_delegate_test.dart @@ -2,8 +2,6 @@ // 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_test/flutter_test.dart'; import 'package:mockito/mockito.dart'; import 'package:plugin_platform_interface/plugin_platform_interface.dart'; diff --git a/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/types/web_resource_error_delegate_test.dart b/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/types/web_resource_error_delegate_test.dart index 90a474a20f23..db704f60862c 100644 --- a/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/types/web_resource_error_delegate_test.dart +++ b/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/types/web_resource_error_delegate_test.dart @@ -2,8 +2,6 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -import 'dart:typed_data'; - import 'package:flutter_test/flutter_test.dart'; import 'package:mockito/annotations.dart'; import 'package:mockito/mockito.dart'; From 8684ac3a2343ae50568ec6a327c609e16dd9a72a Mon Sep 17 00:00:00 2001 From: Maurits van Beusekom Date: Mon, 4 Apr 2022 11:41:49 +0200 Subject: [PATCH 07/31] Applied feedback on WebViewControllerDelegate pull request --- .../lib/src/v4/types/javascript_message.dart | 17 +++ .../lib/src/v4/types/types.dart | 1 + .../src/v4/webview_controller_delegate.dart | 120 +++++++++--------- .../v4/webview_controller_delegate_test.dart | 64 ++++------ 4 files changed, 97 insertions(+), 105 deletions(-) create mode 100644 packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/javascript_message.dart diff --git a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/javascript_message.dart b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/javascript_message.dart new file mode 100644 index 000000000000..a4807ea36c3e --- /dev/null +++ b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/javascript_message.dart @@ -0,0 +1,17 @@ +// 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:meta/meta.dart'; + +/// A message that was sent by JavaScript code running in a [WebView]. +@sealed +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/src/v4/types/types.dart b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/types.dart index 0ed7a6680654..034b5967e81c 100644 --- a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/types.dart +++ b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/types.dart @@ -2,6 +2,7 @@ // 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_delegate.dart'; export 'web_resource_error_delegate.dart'; diff --git a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/webview_controller_delegate.dart b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/webview_controller_delegate.dart index d42f795c76b8..f8faa18807ff 100644 --- a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/webview_controller_delegate.dart +++ b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/webview_controller_delegate.dart @@ -2,6 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +import 'dart:math'; + import 'package:flutter/foundation.dart'; import 'package:plugin_platform_interface/plugin_platform_interface.dart'; import 'package:webview_flutter_platform_interface/src/v4/types/load_request_params_delegate.dart'; @@ -47,7 +49,7 @@ abstract class WebViewControllerDelegate extends PlatformInterface { String absoluteFilePath, ) { throw UnimplementedError( - 'WebView loadFile is not implemented on the current platform'); + 'loadFile is not implemented on the current platform'); } /// Loads the Flutter asset specified in the pubspec.yaml file. @@ -58,7 +60,7 @@ abstract class WebViewControllerDelegate extends PlatformInterface { String key, ) { throw UnimplementedError( - 'WebView loadFlutterAsset is not implemented on the current platform'); + 'loadFlutterAsset is not implemented on the current platform'); } /// Loads the supplied HTML string. @@ -70,23 +72,7 @@ abstract class WebViewControllerDelegate extends PlatformInterface { String? baseUrl, }) { throw UnimplementedError( - 'WebView loadHtmlString is not implemented on the current platform'); - } - - /// Loads the specified URL. - /// - /// If `headers` is not null and the URL is an HTTP URL, the key value paris in `headers` will - /// be added as key value pairs of HTTP headers for the request. - /// - /// `url` must not be null. - /// - /// Throws an ArgumentError if `url` is not a valid URL string. - Future loadUrl( - String url, - Map? headers, - ) { - throw UnimplementedError( - 'WebView loadUrl is not implemented on the current platform'); + 'loadHtmlString is not implemented on the current platform'); } /// Makes a specific HTTP request ands loads the response in the webview. @@ -105,7 +91,7 @@ abstract class WebViewControllerDelegate extends PlatformInterface { LoadRequestParamsDelegate params, ) { throw UnimplementedError( - 'WebView loadRequest is not implemented on the current platform'); + 'loadRequest is not implemented on the current platform'); } /// Updates the webview settings. @@ -114,7 +100,7 @@ abstract class WebViewControllerDelegate extends PlatformInterface { /// All null fields in `settings` are ignored. Future updateSettings(WebSettingsDelegate setting) { throw UnimplementedError( - 'WebView updateSettings is not implemented on the current platform'); + 'updateSettings is not implemented on the current platform'); } /// Accessor to the current URL that the WebView is displaying. @@ -122,19 +108,19 @@ abstract class WebViewControllerDelegate extends PlatformInterface { /// If no URL was ever loaded, returns `null`. Future currentUrl() { throw UnimplementedError( - 'WebView currentUrl is not implemented on the current platform'); + 'currentUrl is not implemented on the current platform'); } /// Checks whether there's a back history item. Future canGoBack() { throw UnimplementedError( - 'WebView canGoBack is not implemented on the current platform'); + 'canGoBack is not implemented on the current platform'); } /// Checks whether there's a forward history item. Future canGoForward() { throw UnimplementedError( - 'WebView canGoForward is not implemented on the current platform'); + 'canGoForward is not implemented on the current platform'); } /// Goes back in the history of this WebView. @@ -142,7 +128,7 @@ abstract class WebViewControllerDelegate extends PlatformInterface { /// If there is no back history item this is a no-op. Future goBack() { throw UnimplementedError( - 'WebView goBack is not implemented on the current platform'); + 'goBack is not implemented on the current platform'); } /// Goes forward in the history of this WebView. @@ -150,13 +136,13 @@ abstract class WebViewControllerDelegate extends PlatformInterface { /// If there is no forward history item this is a no-op. Future goForward() { throw UnimplementedError( - 'WebView goForward is not implemented on the current platform'); + 'goForward is not implemented on the current platform'); } /// Reloads the current URL. Future reload() { throw UnimplementedError( - 'WebView reload is not implemented on the current platform'); + 'reload is not implemented on the current platform'); } /// Clears all caches used by the [WebView]. @@ -169,7 +155,14 @@ abstract class WebViewControllerDelegate extends PlatformInterface { /// 4. Local Storage. Future clearCache() { throw UnimplementedError( - 'WebView clearCache is not implemented on the current platform'); + 'clearCache is not implemented on the current platform'); + } + + /// Sets the [NavigationCallbackHandler] containing the callback methods that + /// are called during navigation events. + Future setNavigationCallbackHandler() { + throw UnimplementedError( + 'setNavigationCallbackHandler is not implemented on the current platform'); } /// Evaluates a JavaScript expression in the context of the current page. @@ -178,7 +171,7 @@ abstract class WebViewControllerDelegate extends PlatformInterface { /// evaluated expression is not supported (e.g on iOS not all non-primitive types can be evaluated). Future evaluateJavaScript(String javascript) { throw UnimplementedError( - 'WebView evaluateJavaScript is not implemented on the current platform'); + 'evaluateJavaScript is not implemented on the current platform'); } /// Runs the given JavaScript in the context of the current page. @@ -186,7 +179,7 @@ abstract class WebViewControllerDelegate extends PlatformInterface { /// The Future completes with an error if a JavaScript error occurred. Future runJavaScript(String javascript) { throw UnimplementedError( - 'WebView runJavaScript is not implemented on the current platform'); + 'runJavaScript is not implemented on the current platform'); } /// Runs the given JavaScript in the context of the current page, and returns the result. @@ -196,38 +189,31 @@ abstract class WebViewControllerDelegate extends PlatformInterface { /// certain non-primitive types on iOS, as well as `undefined` or `null` on iOS 14+. Future runJavaScriptReturningResult(String javascript) { throw UnimplementedError( - 'WebView runJavaScriptReturningResult is not implemented on the current platform'); + 'runJavaScriptReturningResult is not implemented on the current platform'); } - /// Adds new JavaScript channels to the set of enabled channels. - /// - /// For each value in this list the platform's webview should make sure that a corresponding - /// property with a postMessage method is set on `window`. For example for a JavaScript channel - /// named `Foo` it should be possible for JavaScript code executing in the webview to do - /// - /// ```javascript - /// Foo.postMessage('hello'); - /// ``` - /// - /// See also: [CreationParams.javascriptChannelNames]. - Future addJavaScriptChannels(Set javascriptChannelNames) { + /// Adds a new JavaScript channel to the set of enabled channels. + Future addJavaScriptChannel( + JavaScriptChannelParams javaScriptChannelParams, + ) { throw UnimplementedError( - 'WebView addJavaScriptChannels is not implemented on the current platform'); + 'addJavaScriptChannel is not implemented on the current platform'); } - /// Removes JavaScript channel names from the set of enabled channels. + /// Removes the JavaScript channel with the matching name from the set of + /// enabled channels. /// - /// This disables channels that were previously enabled by [addJavascriptChannels] or through - /// [CreationParams.javascriptChannelNames]. - Future removeJavaScriptChannels(Set javascriptChannelNames) { + /// This disables the channel with the matching name if it was previously + /// enabled through the [addJavascriptChannel]. + Future removeJavaScriptChannel(String javaScriptChannelName) { throw UnimplementedError( - 'WebView removeJavaScriptChannels is not implemented on the current platform'); + 'removeJavaScriptChannel is not implemented on the current platform'); } /// Returns the title of the currently loaded page. Future getTitle() { throw UnimplementedError( - 'WebView getTitle is not implemented on the current platform'); + 'getTitle is not implemented on the current platform'); } /// Set the scrolled position of this view. @@ -235,7 +221,7 @@ abstract class WebViewControllerDelegate extends PlatformInterface { /// The parameters `x` and `y` specify the position to scroll to in WebView pixels. Future scrollTo(int x, int y) { throw UnimplementedError( - 'WebView scrollTo is not implemented on the current platform'); + 'scrollTo is not implemented on the current platform'); } /// Move the scrolled position of this view. @@ -243,22 +229,30 @@ abstract class WebViewControllerDelegate extends PlatformInterface { /// The parameters `x` and `y` specify the amount of WebView pixels to scroll by. Future scrollBy(int x, int y) { throw UnimplementedError( - 'WebView scrollBy is not implemented on the current platform'); + 'scrollBy is not implemented on the current platform'); } - /// Return the horizontal scroll position of this view. + /// Return the current scroll position of this view. /// - /// Scroll position is measured from left. - Future getScrollX() { + /// Scroll position is measured from the top left. + Future> getScrollPosition() { throw UnimplementedError( - 'WebView getScrollX is not implemented on the current platform'); + 'getScrollPosition is not implemented on the current platform'); } +} - /// Return the vertical scroll position of this view. - /// - /// Scroll position is measured from top. - Future getScrollY() { - throw UnimplementedError( - 'WebView getScrollY is not implemented on the current platform'); - } +/// Describes the parameters necessary for registering a JavaScript channel. +class JavaScriptChannelParams { + /// Creates a new [JavaScriptChannelParams] object. + JavaScriptChannelParams({ + required this.name, + required this.onMessageReceived, + }); + + /// The name that identifies the JavaScript channel. + final String name; + + /// The callback method that is invoked when a [JavaScriptMessage] is + /// received. + final void Function(JavaScriptMessage) onMessageReceived; } diff --git a/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/webview_controller_delegate_test.dart b/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/webview_controller_delegate_test.dart index b0c9a19b2ba9..0796ee851665 100644 --- a/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/webview_controller_delegate_test.dart +++ b/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/webview_controller_delegate_test.dart @@ -77,18 +77,6 @@ void main() { ); }); - test( - // ignore: lines_longer_than_80_chars - 'Default implementation of loadUrl should throw unimplemented error', () { - final WebViewControllerDelegate controller = - ExtendsWebViewControllerDelegate(); - - expect( - () => controller.loadUrl('', {}), - throwsUnimplementedError, - ); - }); - test( // ignore: lines_longer_than_80_chars 'Default implementation of loadRequest should throw unimplemented error', @@ -205,17 +193,17 @@ void main() { }); test( - // ignore: lines_longer_than_80_chars - 'Default implementation of evaluateJavaScript should throw unimplemented error', - () { - final WebViewControllerDelegate controller = - ExtendsWebViewControllerDelegate(); - - expect( - () => controller.evaluateJavaScript('javaScript'), - throwsUnimplementedError, - ); - }); + 'Default implementation of the setNavigationCallback should throw unimplemented error', + () { + final WebViewControllerDelegate controller = + ExtendsWebViewControllerDelegate(); + + expect( + () => controller.setNavigationCallbackHandler(), + throwsUnimplementedError, + ); + }, + ); test( // ignore: lines_longer_than_80_chars @@ -245,26 +233,31 @@ void main() { test( // ignore: lines_longer_than_80_chars - 'Default implementation of addJavaScriptChannels should throw unimplemented error', + 'Default implementation of addJavaScriptChannel should throw unimplemented error', () { final WebViewControllerDelegate controller = ExtendsWebViewControllerDelegate(); expect( - () => controller.addJavaScriptChannels({}), + () => controller.addJavaScriptChannel( + JavaScriptChannelParams( + name: 'test', + onMessageReceived: (_) {}, + ), + ), throwsUnimplementedError, ); }); test( // ignore: lines_longer_than_80_chars - 'Default implementation of removeJavaScriptChannels should throw unimplemented error', + 'Default implementation of removeJavaScriptChannel should throw unimplemented error', () { final WebViewControllerDelegate controller = ExtendsWebViewControllerDelegate(); expect( - () => controller.removeJavaScriptChannels({}), + () => controller.removeJavaScriptChannel('test'), throwsUnimplementedError, ); }); @@ -310,26 +303,13 @@ void main() { test( // ignore: lines_longer_than_80_chars - 'Default implementation of getScrollX should throw unimplemented error', - () { - final WebViewControllerDelegate controller = - ExtendsWebViewControllerDelegate(); - - expect( - () => controller.getScrollX(), - throwsUnimplementedError, - ); - }); - - test( - // ignore: lines_longer_than_80_chars - 'Default implementation of getScrollY should throw unimplemented error', + 'Default implementation of getScrollPosition should throw unimplemented error', () { final WebViewControllerDelegate controller = ExtendsWebViewControllerDelegate(); expect( - () => controller.getScrollY(), + () => controller.getScrollPosition(), throwsUnimplementedError, ); }); From 5302592b7fc8ba88287b6304265625fca7183520 Mon Sep 17 00:00:00 2001 From: "Bodhi Mulders (BeMacized)" Date: Wed, 6 Apr 2022 14:15:53 +0200 Subject: [PATCH 08/31] Implemented PR feedback. (Unit tests not yet updated) --- .../navigation_callback_handler_delegate.dart | 28 +++++---- .../lib/src/v4/types/javascript_message.dart | 60 +++++++++++++++++-- ...delegate.dart => load_request_params.dart} | 25 ++++---- .../lib/src/v4/types/types.dart | 5 +- ..._delegate.dart => web_resource_error.dart} | 34 ++++------- .../src/v4/types/web_settings_delegate.dart | 15 +---- .../webview_controller_creation_params.dart | 54 +++++++++++++++++ .../src/v4/webview_controller_delegate.dart | 18 ++++-- .../lib/src/v4/webview_platform.dart | 28 +++------ ...gation_callback_handler_delegate_test.dart | 3 +- .../load_request_params_delegate_test.dart | 8 +-- .../web_resource_error_delegate_test.dart | 18 +++--- .../v4/webview_controller_delegate_test.dart | 2 +- 13 files changed, 189 insertions(+), 109 deletions(-) rename packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/{load_request_params_delegate.dart => load_request_params.dart} (85%) rename packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/{web_resource_error_delegate.dart => web_resource_error.dart} (80%) create mode 100644 packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/webview_controller_creation_params.dart diff --git a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/navigation_callback_handler_delegate.dart b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/navigation_callback_handler_delegate.dart index b9a680200727..9874074deb19 100644 --- a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/navigation_callback_handler_delegate.dart +++ b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/navigation_callback_handler_delegate.dart @@ -24,8 +24,7 @@ abstract class NavigationCallbackHandlerDelegate extends PlatformInterface { return callbackHandlerDelegate; } - /// Used by the platform implementation to create a new - /// [NavigationCallbackHandlerDelegate]. + /// Used by the platform implementation to create a new [NavigationCallbackHandlerDelegate]. /// /// Should only be used by platform implementations because they can't extend /// a class that only contains a factory constructor. @@ -34,8 +33,9 @@ abstract class NavigationCallbackHandlerDelegate extends PlatformInterface { static final Object _token = Object(); - /// Sets the callback method that is invoked by the - /// [WebViewPlatformControllerDelegate] when a navigation request is pending. + /// Invoked when a navigation request is pending. + /// + /// See [WebViewControllerDelegate.setNavigationCallbackHandler]. Future setOnNavigationRequest( void Function({required String url, required bool isForMainFrame}) onNavigationRequest, @@ -44,8 +44,9 @@ abstract class NavigationCallbackHandlerDelegate extends PlatformInterface { 'setOnNavigationRequest is not implemented on the current platform.'); } - /// Sets the callback method that is invoked by [WebViewControllerDelegate] - /// when a page has started loading. + /// Invoked when a page has started loading. + /// + /// See [WebViewControllerDelegate.setNavigationCallbackHandler]. Future setOnPageStarted( void Function(String url) onPageStarted, ) { @@ -53,8 +54,9 @@ abstract class NavigationCallbackHandlerDelegate extends PlatformInterface { 'setOnPageStarted is not implemented on the current platform.'); } - /// Sets the callback method that is invoked by [WebViewControllerDelegate] - /// when a page has finished loading. + /// Invoked when a page has finished loading. + /// + /// See [WebViewControllerDelegate.setNavigationCallbackHandler]. Future setOnPageFinished( void Function(String url) onPageFinished, ) { @@ -62,10 +64,10 @@ abstract class NavigationCallbackHandlerDelegate extends PlatformInterface { 'setOnPageFinished is not implemented on the current platform.'); } - /// Sets the callback method that is invoked by [WebViewControllerDelegate] - /// when a page is loading. + /// Invoked when a page is loading to report the progress. /// /// Only works when [WebSettings.hasProgressTracking] is set to `true`. + /// See [WebViewControllerDelegate.setNavigationCallbackHandler]. Future setOnProgress( void Function(int progress) onProgress, ) { @@ -73,9 +75,11 @@ abstract class NavigationCallbackHandlerDelegate extends PlatformInterface { 'setOnProgress is not implemented on the current platform.'); } - /// Sets the callback that is invoked when a resource loading error occurred.. + /// Invoked when a resource loading error occurred. + /// + /// See [WebViewControllerDelegate.setNavigationCallbackHandler]. Future setOnWebResourceError( - void Function(WebResourceErrorDelegate error) onWebResourceError, + void Function(WebResourceError error) onWebResourceError, ) { throw UnimplementedError( 'setOnWebResourceError is not implemented on the current platform.'); diff --git a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/javascript_message.dart b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/javascript_message.dart index a4807ea36c3e..703e53fca748 100644 --- a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/javascript_message.dart +++ b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/javascript_message.dart @@ -2,15 +2,65 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -import 'package:meta/meta.dart'; +import 'package:flutter/foundation.dart'; +import 'package:plugin_platform_interface/plugin_platform_interface.dart'; + +import '../webview_platform.dart'; /// A message that was sent by JavaScript code running in a [WebView]. -@sealed -class JavaScriptMessage { - /// Constructs a JavaScript message object. +/// +/// Platform specific implementations can add additional fields by extending +/// this class and provide 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. +/// +/// Note that the additional parameters should always accept `null` or have a +/// default value to prevent breaking changes. +/// +/// ```dart +/// class WKScriptMessage extends JavaScriptMessage { +/// WKScriptMessage._( +/// JavaScriptMessage javaScriptMessage, +/// this.extraData, +/// ) : super(javaScriptMessage.message); +/// +/// factory WKScriptMessage.fromJavaScriptMessage( +/// JavaScriptMessage javaScriptMessage, +/// String? extraData, +/// }) { +/// return WKScriptMessage._( +/// javaScriptMessage: javaScriptMessage, +/// extraData: extraData, +/// ); +/// } +/// +/// final String? extraData; +/// } +/// ``` +/// {@end-tool} +class JavaScriptMessage extends PlatformInterface { + /// Creates a new JavaScript message object. /// /// The `message` parameter must not be null. - const JavaScriptMessage(this.message) : assert(message != null); + factory JavaScriptMessage(String message) { + final JavaScriptMessage javaScriptMessage = + WebViewPlatform.instance!.createJavaScriptMessage(message); + PlatformInterface.verify(javaScriptMessage, _token); + return javaScriptMessage; + } + + /// Used by the platform implementation to create a new + /// [JavaScriptMessage]. + /// + /// Should only be used by platform implementations because they can't extend + /// a class that only contains a factory constructor. + @protected + JavaScriptMessage.implementation(this.message) : super(token: _token); + + static final Object _token = Object(); /// 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/v4/types/load_request_params_delegate.dart b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/load_request_params.dart similarity index 85% rename from packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/load_request_params_delegate.dart rename to packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/load_request_params.dart index ba4233a7e4f8..007fa24b47bd 100644 --- a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/load_request_params_delegate.dart +++ b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/load_request_params.dart @@ -33,15 +33,14 @@ extension LoadRequestMethodExtensions on LoadRequestMethod { } } -/// Defines the parameters that can be used to load a page with the -/// [WebViewControllerDelegate]. +/// Defines the parameters that can be used to load a page with the [WebViewControllerDelegate]. /// /// Platform specific implementations can add additional fields by extending this /// class and provide a factory method that takes the -/// [LoadRequestParamsDelegate] as a parameter. +/// [LoadRequestParams] as a parameter. /// /// {@tool sample} -/// This example demonstrates how to extend the [LoadRequestParamsDelegate] to +/// This example demonstrates how to extend the [LoadRequestParams] to /// provide additional platform specific parameters. /// /// Note that the additional parameters should always accept `null` or have a @@ -73,32 +72,32 @@ extension LoadRequestMethodExtensions on LoadRequestMethod { /// } /// ``` /// {@end-tool} -class LoadRequestParamsDelegate extends PlatformInterface { - /// Creates a new [LoadRequestParamsDelegate]. - factory LoadRequestParamsDelegate({ +class LoadRequestParams extends PlatformInterface { + /// Creates a new [LoadRequestParams]. + factory LoadRequestParams({ required Uri uri, required LoadRequestMethod method, Map headers = const {}, Uint8List? body, }) { - final LoadRequestParamsDelegate loadRequestParamsDelegate = - WebViewPlatform.instance!.createLoadRequestParamsDelegate( + final LoadRequestParams loadRequestParams = + LoadRequestParams.implementation( uri: uri, method: method, headers: headers, body: body, ); - PlatformInterface.verify(loadRequestParamsDelegate, _token); - return loadRequestParamsDelegate; + PlatformInterface.verify(loadRequestParams, _token); + return loadRequestParams; } /// Used by the platform implementation to create a new - /// [LoadRequestParamsDelegate]. + /// [LoadRequestParams]. /// /// Should only be used by platform implementations because they can't extend /// a class that only contains a factory constructor. @protected - LoadRequestParamsDelegate.implementation({ + LoadRequestParams.implementation({ required this.uri, required this.method, required this.headers, diff --git a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/types.dart b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/types.dart index 034b5967e81c..a42c58dd7cd2 100644 --- a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/types.dart +++ b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/types.dart @@ -4,7 +4,8 @@ export 'javascript_message.dart'; export 'javascript_mode.dart'; -export 'load_request_params_delegate.dart'; -export 'web_resource_error_delegate.dart'; +export 'load_request_params.dart'; +export 'web_resource_error.dart'; export 'web_settings_delegate.dart'; +export 'webview_controller_creation_params.dart'; export 'webview_cookie.dart'; diff --git a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/web_resource_error_delegate.dart b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/web_resource_error.dart similarity index 80% rename from packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/web_resource_error_delegate.dart rename to packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/web_resource_error.dart index 32adeabd295d..b2f54d7afef8 100644 --- a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/web_resource_error_delegate.dart +++ b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/web_resource_error.dart @@ -7,10 +7,6 @@ import 'package:plugin_platform_interface/plugin_platform_interface.dart'; import '../webview_platform.dart'; -// 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. - /// Possible error type categorizations used by [WebResourceError]. enum WebResourceErrorType { /// User authentication failed on server. @@ -79,19 +75,19 @@ enum WebResourceErrorType { /// /// Platform specific implementations can add additional fields by extending /// this class and provide a factory method that takes the -/// [WebResourceErrorDelegate] as a parameter. +/// [WebResourceError] as a parameter. /// /// {@tool sample} -/// This example demonstrates how to extend the [WebResourceErrorDelegate] to +/// This example demonstrates how to extend the [WebResourceError] to /// provide additional platform specific parameters. /// /// Note that the additional parameters should always accept `null` or have a /// default value to prevent breaking changes. /// /// ```dart -/// class IOSWebResourceError extends WebResourceErrorDelegate { +/// class IOSWebResourceError extends WebResourceError { /// IOSWebResourceError._( -/// WebResourceErrorDelegate webResourceError, +/// WebResourceError webResourceError, /// this.domain, /// ) : super( /// errorCode: webResourceError.errorCode, @@ -100,7 +96,7 @@ enum WebResourceErrorType { /// ); /// /// factory IOSWebResourceError.fromWebResourceError( -/// WebResourceErrorDelegate webResourceError, { +/// WebResourceError webResourceError, { /// String? domain, /// }) { /// return IOSWebResourceError._( @@ -113,33 +109,29 @@ enum WebResourceErrorType { /// } /// ``` /// {@end-tool} -class WebResourceErrorDelegate extends PlatformInterface { +class WebResourceError extends PlatformInterface { /// Creates a new [WebResourceError] /// /// A user should not need to instantiate this class, but will receive one in /// [WebResourceErrorCallback]. - factory WebResourceErrorDelegate({ + factory WebResourceError({ required int errorCode, required String description, WebResourceErrorType? errorType, }) { - final WebResourceErrorDelegate webResourceErrorDelegate = - WebViewPlatform.instance!.createWebResourceErrorDelegate( - errorCode: errorCode, - description: description, - errorType: errorType, - ); - PlatformInterface.verify(webResourceErrorDelegate, _token); - return webResourceErrorDelegate; + final WebResourceError webResourceError = WebResourceError.implementation( + errorCode: errorCode, description: description, errorType: errorType); + PlatformInterface.verify(webResourceError, _token); + return webResourceError; } /// Used by the platform implementation to create a new - /// [WebResourceErrorDelegate]. + /// [WebResourceError]. /// /// Should only be used by platform implementations because they can't extend /// a class that only contains a factory constructor. @protected - WebResourceErrorDelegate.implementation({ + WebResourceError.implementation({ required this.errorCode, required this.description, this.errorType, diff --git a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/web_settings_delegate.dart b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/web_settings_delegate.dart index f5d167121148..bdf08378ce75 100644 --- a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/web_settings_delegate.dart +++ b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/web_settings_delegate.dart @@ -123,8 +123,6 @@ class WebSettingsDelegate extends PlatformInterface { bool? allowsInlineMediaPlayback, bool? debuggingEnabled, bool? gestureNavigationEnabled, - bool? hasNavigationDelegate, - bool? hasProgressTracking, JavaScriptMode? javaScriptMode, required WebSetting userAgent, bool? zoomEnabled, @@ -134,8 +132,6 @@ class WebSettingsDelegate extends PlatformInterface { allowsInlineMediaPlayback: allowsInlineMediaPlayback, debuggingEnabled: debuggingEnabled, gestureNavigationEnabled: gestureNavigationEnabled, - hasNavigationDelegate: hasNavigationDelegate, - hasProgressTracking: hasProgressTracking, javaScriptMode: javaScriptMode, userAgent: userAgent, zoomEnabled: zoomEnabled, @@ -154,8 +150,6 @@ class WebSettingsDelegate extends PlatformInterface { this.allowsInlineMediaPlayback, this.debuggingEnabled, this.gestureNavigationEnabled, - this.hasNavigationDelegate, - this.hasProgressTracking, this.javascriptMode, required this.userAgent, this.zoomEnabled, @@ -178,13 +172,6 @@ class WebSettingsDelegate extends PlatformInterface { /// See also: [WebView.gestureNavigationEnabled] final bool? gestureNavigationEnabled; - /// Whether the [WebView] has a [NavigationDelegate] set. - final bool? hasNavigationDelegate; - - /// Whether the [WebView] should track page loading progress. - /// See also: [WebViewPlatformCallbacksHandler.onProgress] to get the progress. - final bool? hasProgressTracking; - /// The JavaScript execution mode to be used by the webview. final JavaScriptMode? javascriptMode; @@ -203,6 +190,6 @@ class WebSettingsDelegate extends PlatformInterface { @override String toString() { - return 'WebSettings(javascriptMode: $javascriptMode, hasNavigationDelegate: $hasNavigationDelegate, hasProgressTracking: $hasProgressTracking, debuggingEnabled: $debuggingEnabled, gestureNavigationEnabled: $gestureNavigationEnabled, userAgent: $userAgent, allowsInlineMediaPlayback: $allowsInlineMediaPlayback)'; + return 'WebSettings(javascriptMode: $javascriptMode, debuggingEnabled: $debuggingEnabled, gestureNavigationEnabled: $gestureNavigationEnabled, userAgent: $userAgent, allowsInlineMediaPlayback: $allowsInlineMediaPlayback)'; } } diff --git a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/webview_controller_creation_params.dart b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/webview_controller_creation_params.dart new file mode 100644 index 000000000000..a81eda8eca07 --- /dev/null +++ b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/webview_controller_creation_params.dart @@ -0,0 +1,54 @@ +// 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'; +import 'package:plugin_platform_interface/plugin_platform_interface.dart'; + +/// Object specifying creation parameters for creating a [WebViewControllerDelegate]. +/// +/// Platform specific implementations can add additional fields by extending +/// this class and provide a factory method that takes the +/// [WebViewControllerCreationParams] as a parameter. +/// +/// {@tool sample} +/// This example demonstrates how to extend the [WebViewControllerCreationParams] to +/// provide additional platform specific parameters. +/// +/// Note that the additional parameters should always accept `null` or have a +/// default value to prevent breaking changes. +/// +/// ```dart +/// class IOSWebViewControllerCreationParams extends WebViewControllerCreationParams { +/// IOSWebViewControllerCreationParams._(this.iosParameter) : super(); +/// +/// factory IOSWebViewControllerCreationParams.fromWebViewControllerCreationParams({ +/// String? iosParameter, +/// }) { +/// return IOSWebViewControllerCreationParams._( +/// iosParameter: iosParameter, +/// ); +/// } +/// +/// final String? iosParameter; +/// } +/// ``` +/// {@end-tool} +class WebViewControllerCreationParams extends PlatformInterface { + /// Creates a new [WebViewControllerCreationParams] + factory WebViewControllerCreationParams() { + final WebViewControllerCreationParams params = + WebViewControllerCreationParams.implementation(); + PlatformInterface.verify(params, _token); + return params; + } + + /// Used by the platform implementation to create a new [WebViewControllerCreationParams]. + /// + /// Should only be used by platform implementations because they can't extend + /// a class that only contains a factory constructor. + @protected + WebViewControllerCreationParams.implementation() : super(token: _token); + + static final Object _token = Object(); +} diff --git a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/webview_controller_delegate.dart b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/webview_controller_delegate.dart index f8faa18807ff..f57d6d279714 100644 --- a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/webview_controller_delegate.dart +++ b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/webview_controller_delegate.dart @@ -3,10 +3,12 @@ // found in the LICENSE file. import 'dart:math'; +import 'dart:ui'; import 'package:flutter/foundation.dart'; import 'package:plugin_platform_interface/plugin_platform_interface.dart'; -import 'package:webview_flutter_platform_interface/src/v4/types/load_request_params_delegate.dart'; +import 'package:webview_flutter_platform_interface/src/v4/navigation_callback_handler_delegate.dart'; +import 'package:webview_flutter_platform_interface/src/v4/types/load_request_params.dart'; import 'types/types.dart'; import 'webview_platform.dart'; @@ -21,9 +23,9 @@ import 'webview_platform.dart'; /// [WebViewCookieManagerDelegate] methods. abstract class WebViewControllerDelegate extends PlatformInterface { /// Creates a new [WebViewControllerDelegate] - factory WebViewControllerDelegate() { + factory WebViewControllerDelegate(WebViewControllerCreationParams params) { final WebViewControllerDelegate webViewControllerDelegate = - WebViewPlatform.instance!.createWebViewControllerDelegate(); + WebViewPlatform.instance!.createWebViewControllerDelegate(params); PlatformInterface.verify(webViewControllerDelegate, _token); return webViewControllerDelegate; } @@ -88,7 +90,7 @@ abstract class WebViewControllerDelegate extends PlatformInterface { /// /// Throws an ArgumentError if [WebViewRequest.uri] has empty scheme. Future loadRequest( - LoadRequestParamsDelegate params, + LoadRequestParams params, ) { throw UnimplementedError( 'loadRequest is not implemented on the current platform'); @@ -160,7 +162,8 @@ abstract class WebViewControllerDelegate extends PlatformInterface { /// Sets the [NavigationCallbackHandler] containing the callback methods that /// are called during navigation events. - Future setNavigationCallbackHandler() { + Future setNavigationCallbackHandler( + NavigationCallbackHandlerDelegate handler) { throw UnimplementedError( 'setNavigationCallbackHandler is not implemented on the current platform'); } @@ -239,6 +242,11 @@ abstract class WebViewControllerDelegate extends PlatformInterface { throw UnimplementedError( 'getScrollPosition is not implemented on the current platform'); } + + Future setBackgroundColor(Color color) { + throw UnimplementedError( + 'setBackgroundColor is not implemented on the current platform'); + } } /// Describes the parameters necessary for registering a JavaScript channel. diff --git a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/webview_platform.dart b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/webview_platform.dart index b9755e4f9a12..7383bfad2fd0 100644 --- a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/webview_platform.dart +++ b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/webview_platform.dart @@ -7,7 +7,7 @@ import 'dart:typed_data'; import 'package:flutter/foundation.dart'; import 'package:flutter/gestures.dart'; import 'package:plugin_platform_interface/plugin_platform_interface.dart'; -import 'package:webview_flutter_platform_interface/src/v4/types/load_request_params_delegate.dart'; +import 'package:webview_flutter_platform_interface/src/v4/types/load_request_params.dart'; import 'package:webview_flutter_platform_interface/src/v4/types/types.dart'; import 'package:webview_flutter_platform_interface/src/v4/webview_widget_delegate.dart'; @@ -47,31 +47,16 @@ abstract class WebViewPlatform extends PlatformInterface { 'createCookieManagerDelegate is not implemented on the current platform.'); } - /// Create a new [LoadRequestParamsDelegate]. - LoadRequestParamsDelegate createLoadRequestParamsDelegate({ - required Uri uri, - required LoadRequestMethod method, - required Map headers, - Uint8List? body, - }) { - throw UnimplementedError( - 'createLoadRequestParamsDelegate is not implemented on the current platform.'); - } - /// Creates a new [NavigationCallbackHandlerDelegate]. NavigationCallbackHandlerDelegate createNavigationCallbackHandlerDelegate() { throw UnimplementedError( 'createNavigationCallbackHandlerDelegate is not implemented on the current platform.'); } - /// Create a new [WebResourceErrorDelegate]. - WebResourceErrorDelegate createWebResourceErrorDelegate({ - required int errorCode, - required String description, - WebResourceErrorType? errorType, - }) { + /// Create a new [JavaScriptMessage]. + JavaScriptMessage createJavaScriptMessage(String message) { throw UnimplementedError( - 'createWebResourceErrorDelegate is not implemented on the current platform.'); + 'createJavaScriptMessage is not implemented on the current platform.'); } /// Create a new [WebSettingsDelegate]. @@ -89,8 +74,9 @@ abstract class WebViewPlatform extends PlatformInterface { 'createWebSettingsDelegate is not implemented on the current platform.'); } - /// Create a new [WebViewControllerDelegate]. - WebViewControllerDelegate createWebViewControllerDelegate() { + /// Create a new [WebViewControllerDelegate]. + WebViewControllerDelegate createWebViewControllerDelegate( + WebViewControllerCreationParams params) { throw UnimplementedError( 'createWebViewControllerDelegate is not implemented on the current platform.'); } diff --git a/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/navigation_callback_handler_delegate_test.dart b/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/navigation_callback_handler_delegate_test.dart index f6d830761333..7f266666e379 100644 --- a/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/navigation_callback_handler_delegate_test.dart +++ b/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/navigation_callback_handler_delegate_test.dart @@ -99,8 +99,7 @@ void main() { ExtendsNavigationCallbackHandlerDelegate(); expect( - () => callbackHandler - .setOnWebResourceError((WebResourceErrorDelegate error) {}), + () => callbackHandler.setOnWebResourceError((WebResourceError error) {}), throwsUnimplementedError, ); }); diff --git a/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/types/load_request_params_delegate_test.dart b/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/types/load_request_params_delegate_test.dart index 2ccd03f09de4..f4aa2aee2cca 100644 --- a/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/types/load_request_params_delegate_test.dart +++ b/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/types/load_request_params_delegate_test.dart @@ -27,7 +27,7 @@ void main() { )).thenReturn(ImplementsLoadRequestParamsDelegate()); expect(() { - LoadRequestParamsDelegate( + LoadRequestParams( uri: testUri, method: testMethod, headers: testHeaders, @@ -83,7 +83,7 @@ class MockWebViewPlatformWithMixin extends MockWebViewPlatform // ignore: prefer_mixin MockPlatformInterfaceMixin {} -class ImplementsLoadRequestParamsDelegate implements LoadRequestParamsDelegate { +class ImplementsLoadRequestParamsDelegate implements LoadRequestParams { @override dynamic noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation); } @@ -93,9 +93,9 @@ class MockLoadRequestParamsDelegate extends Mock // ignore: prefer_mixin MockPlatformInterfaceMixin implements - LoadRequestParamsDelegate {} + LoadRequestParams {} -class ExtendsLoadRequestParamsDelegate extends LoadRequestParamsDelegate { +class ExtendsLoadRequestParamsDelegate extends LoadRequestParams { ExtendsLoadRequestParamsDelegate({ required Uri uri, required LoadRequestMethod method, diff --git a/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/types/web_resource_error_delegate_test.dart b/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/types/web_resource_error_delegate_test.dart index db704f60862c..1e1322a40f60 100644 --- a/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/types/web_resource_error_delegate_test.dart +++ b/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/types/web_resource_error_delegate_test.dart @@ -11,7 +11,7 @@ import 'package:webview_flutter_platform_interface/src/v4/webview_platform.dart' import '../webview_platform_test.mocks.dart'; import 'web_resource_error_delegate_test.mocks.dart'; -@GenerateMocks([WebResourceErrorDelegate]) +@GenerateMocks([WebResourceError]) void main() { setUp(() { WebViewPlatform.instance = MockWebViewPlatformWithMixin(); @@ -21,13 +21,13 @@ void main() { const int errorCode = 401; const String description = 'Error used to test the WebResourceErrorDelegate'; - when(WebViewPlatform.instance!.createWebResourceErrorDelegate( + when(WebViewPlatform.instance!.createWebResourceError( errorCode: errorCode, description: description, )).thenReturn(ImplementsWebResourceErrorDelegate()); expect(() { - WebResourceErrorDelegate( + WebResourceError( errorCode: errorCode, description: description, ); @@ -38,7 +38,7 @@ void main() { const int errorCode = 401; const String description = 'Error used to test the WebResourceErrorDelegate'; - when(WebViewPlatform.instance!.createWebResourceErrorDelegate( + when(WebViewPlatform.instance!.createWebResourceError( errorCode: errorCode, description: description, )).thenReturn(ExtendsWebResourceErrorDelegate( @@ -47,7 +47,7 @@ void main() { )); expect(() { - WebResourceErrorDelegate( + WebResourceError( errorCode: errorCode, description: description, ); @@ -58,13 +58,13 @@ void main() { const int errorCode = 401; const String description = 'Error used to test the WebResourceErrorDelegate'; - when(WebViewPlatform.instance!.createWebResourceErrorDelegate( + when(WebViewPlatform.instance!.createWebResourceError( errorCode: errorCode, description: description, )).thenReturn(MockWebResourceErrorDelegateWithMixin()); expect(() { - WebResourceErrorDelegate( + WebResourceError( errorCode: errorCode, description: description, ); @@ -77,7 +77,7 @@ class MockWebViewPlatformWithMixin extends MockWebViewPlatform // ignore: prefer_mixin MockPlatformInterfaceMixin {} -class ImplementsWebResourceErrorDelegate implements WebResourceErrorDelegate { +class ImplementsWebResourceErrorDelegate implements WebResourceError { @override dynamic noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation); } @@ -87,7 +87,7 @@ class MockWebResourceErrorDelegateWithMixin extends MockWebResourceErrorDelegate // ignore: prefer_mixin MockPlatformInterfaceMixin {} -class ExtendsWebResourceErrorDelegate extends WebResourceErrorDelegate { +class ExtendsWebResourceErrorDelegate extends WebResourceError { ExtendsWebResourceErrorDelegate({ required int errorCode, required String description, diff --git a/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/webview_controller_delegate_test.dart b/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/webview_controller_delegate_test.dart index 0796ee851665..94aa1c54c644 100644 --- a/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/webview_controller_delegate_test.dart +++ b/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/webview_controller_delegate_test.dart @@ -341,7 +341,7 @@ class MockLoadRequestParamsDelegate extends Mock //ignore: prefer_mixin MockPlatformInterfaceMixin implements - LoadRequestParamsDelegate {} + LoadRequestParams {} class MockWebSettingsDelegate extends Mock with From 19c458008cef42288f0d0f13d7cdb234c010464a Mon Sep 17 00:00:00 2001 From: "Bodhi Mulders (BeMacized)" Date: Wed, 6 Apr 2022 16:20:22 +0200 Subject: [PATCH 09/31] Update tests --- .../lib/src/v4/types/load_request_params.dart | 66 +++++------ .../lib/src/v4/types/web_resource_error.dart | 62 +++------- .../webview_controller_creation_params.dart | 41 ++++--- .../src/v4/webview_controller_delegate.dart | 1 + .../lib/src/v4/webview_platform.dart | 3 - .../load_request_params_delegate_test.dart | 110 ------------------ .../web_resource_error_delegate_test.dart | 99 ---------------- ...eb_resource_error_delegate_test.mocks.dart | 12 +- .../v4/webview_controller_delegate_test.dart | 24 ++-- ...ebview_controller_delegate_test.mocks.dart | 63 ++++++++++ .../test/src/v4/webview_platform_test.dart | 14 +-- .../src/v4/webview_platform_test.mocks.dart | 92 ++++++--------- 12 files changed, 193 insertions(+), 394 deletions(-) delete mode 100644 packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/types/load_request_params_delegate_test.dart delete mode 100644 packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/types/web_resource_error_delegate_test.dart create mode 100644 packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/webview_controller_delegate_test.mocks.dart diff --git a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/load_request_params.dart b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/load_request_params.dart index 007fa24b47bd..da3f722d44d4 100644 --- a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/load_request_params.dart +++ b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/load_request_params.dart @@ -3,13 +3,8 @@ // found in the LICENSE file. import 'dart:typed_data'; - -import 'package:flutter/foundation.dart'; -import 'package:plugin_platform_interface/plugin_platform_interface.dart'; import 'package:webview_flutter_platform_interface/src/v4/webview_controller_delegate.dart'; -import '../webview_platform.dart'; - /// Defines the supported HTTP methods for loading a page in /// [WebViewControllerDelegate]. enum LoadRequestMethod { @@ -72,39 +67,42 @@ extension LoadRequestMethodExtensions on LoadRequestMethod { /// } /// ``` /// {@end-tool} -class LoadRequestParams extends PlatformInterface { - /// Creates a new [LoadRequestParams]. - factory LoadRequestParams({ - required Uri uri, - required LoadRequestMethod method, - Map headers = const {}, - Uint8List? body, - }) { - final LoadRequestParams loadRequestParams = - LoadRequestParams.implementation( - uri: uri, - method: method, - headers: headers, - body: body, - ); - PlatformInterface.verify(loadRequestParams, _token); - return loadRequestParams; - } - - /// Used by the platform implementation to create a new - /// [LoadRequestParams]. - /// - /// Should only be used by platform implementations because they can't extend - /// a class that only contains a factory constructor. - @protected - LoadRequestParams.implementation({ +/// Platform specific implementations can add additional fields by extending +/// this class. +/// +/// {@tool sample} +/// This example demonstrates how to extend the [LoadRequestParams] to +/// provide additional platform specific parameters. +/// +/// Note that the additional parameters should always accept `null` or have a +/// default value to prevent breaking changes. +/// +/// ```dart +/// class AndroidLoadRequestParamsDelegate extends LoadRequestParamsDelegate { +/// AndroidLoadRequestParamsDelegate({ +/// required Uri uri, +/// required LoadRequestMethod method, +/// required Map headers, +/// Uint8List? body, +/// this.historyUrl, +/// }) : super( +/// uri: uri, +/// method: method, +/// body: body, +/// ); +/// +/// final Uri? historyUrl; +/// } +/// ``` +/// {@end-tool} +class LoadRequestParams { + /// Used by the platform implementation to create a new [LoadRequestParams]. + LoadRequestParams({ required this.uri, required this.method, required this.headers, this.body, - }) : super(token: _token); - - static final Object _token = Object(); + }); /// URI for the request. final Uri uri; diff --git a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/web_resource_error.dart b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/web_resource_error.dart index b2f54d7afef8..8bbb1d40d565 100644 --- a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/web_resource_error.dart +++ b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/web_resource_error.dart @@ -2,11 +2,6 @@ // 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'; -import 'package:plugin_platform_interface/plugin_platform_interface.dart'; - -import '../webview_platform.dart'; - /// Possible error type categorizations used by [WebResourceError]. enum WebResourceErrorType { /// User authentication failed on server. @@ -74,8 +69,7 @@ enum WebResourceErrorType { /// error has occurred. /// /// Platform specific implementations can add additional fields by extending -/// this class and provide a factory method that takes the -/// [WebResourceError] as a parameter. +/// this class. /// /// {@tool sample} /// This example demonstrates how to extend the [WebResourceError] to @@ -86,58 +80,28 @@ enum WebResourceErrorType { /// /// ```dart /// class IOSWebResourceError extends WebResourceError { -/// IOSWebResourceError._( -/// WebResourceError webResourceError, +/// IOSWebResourceError({ +/// required int errorCode, +/// required String description, +/// WebResourceErrorType? errorType, /// this.domain, -/// ) : super( -/// errorCode: webResourceError.errorCode, -/// description: webResourceError.description, -/// errorType: webResourceError.errorType, +/// }) : super( +/// errorCode: errorCode, +/// description: description, +/// errorType: errorType, /// ); /// -/// factory IOSWebResourceError.fromWebResourceError( -/// WebResourceError webResourceError, { -/// String? domain, -/// }) { -/// return IOSWebResourceError._( -/// webResourceError: webResourceError, -/// domain: domain, -/// ); -/// } -/// /// final String? domain; /// } /// ``` /// {@end-tool} -class WebResourceError extends PlatformInterface { - /// Creates a new [WebResourceError] - /// - /// A user should not need to instantiate this class, but will receive one in - /// [WebResourceErrorCallback]. - factory WebResourceError({ - required int errorCode, - required String description, - WebResourceErrorType? errorType, - }) { - final WebResourceError webResourceError = WebResourceError.implementation( - errorCode: errorCode, description: description, errorType: errorType); - PlatformInterface.verify(webResourceError, _token); - return webResourceError; - } - - /// Used by the platform implementation to create a new - /// [WebResourceError]. - /// - /// Should only be used by platform implementations because they can't extend - /// a class that only contains a factory constructor. - @protected - WebResourceError.implementation({ +class WebResourceError { + /// Used by the platform implementation to create a new [WebResourceError]. + WebResourceError({ required this.errorCode, required this.description, this.errorType, - }) : super(token: _token); - - static final Object _token = Object(); + }); /// Raw code of the error from the respective platform. final int errorCode; diff --git a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/webview_controller_creation_params.dart b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/webview_controller_creation_params.dart index a81eda8eca07..88ffd427493e 100644 --- a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/webview_controller_creation_params.dart +++ b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/webview_controller_creation_params.dart @@ -2,9 +2,6 @@ // 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'; -import 'package:plugin_platform_interface/plugin_platform_interface.dart'; - /// Object specifying creation parameters for creating a [WebViewControllerDelegate]. /// /// Platform specific implementations can add additional fields by extending @@ -34,21 +31,27 @@ import 'package:plugin_platform_interface/plugin_platform_interface.dart'; /// } /// ``` /// {@end-tool} -class WebViewControllerCreationParams extends PlatformInterface { - /// Creates a new [WebViewControllerCreationParams] - factory WebViewControllerCreationParams() { - final WebViewControllerCreationParams params = - WebViewControllerCreationParams.implementation(); - PlatformInterface.verify(params, _token); - return params; - } - +/// Platform specific implementations can add additional fields by extending +/// this class. +/// +/// {@tool sample} +/// This example demonstrates how to extend the [WebViewControllerCreationParams] to +/// provide additional platform specific parameters. +/// +/// Note that the additional parameters should always accept `null` or have a +/// default value to prevent breaking changes. +/// +/// ```dart +/// class IOSWebViewControllerCreationParams extends WebViewControllerCreationParams { +/// IOSWebViewControllerCreationParams({ +/// this.domain, +/// }) : super(); +/// +/// final String? domain; +/// } +/// ``` +/// {@end-tool} +class WebViewControllerCreationParams { /// Used by the platform implementation to create a new [WebViewControllerCreationParams]. - /// - /// Should only be used by platform implementations because they can't extend - /// a class that only contains a factory constructor. - @protected - WebViewControllerCreationParams.implementation() : super(token: _token); - - static final Object _token = Object(); + WebViewControllerCreationParams(); } diff --git a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/webview_controller_delegate.dart b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/webview_controller_delegate.dart index f57d6d279714..b16987761ceb 100644 --- a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/webview_controller_delegate.dart +++ b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/webview_controller_delegate.dart @@ -243,6 +243,7 @@ abstract class WebViewControllerDelegate extends PlatformInterface { 'getScrollPosition is not implemented on the current platform'); } + /// Set the current background color of this view. Future setBackgroundColor(Color color) { throw UnimplementedError( 'setBackgroundColor is not implemented on the current platform'); diff --git a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/webview_platform.dart b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/webview_platform.dart index 7383bfad2fd0..81e8dcec4453 100644 --- a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/webview_platform.dart +++ b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/webview_platform.dart @@ -2,12 +2,9 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -import 'dart:typed_data'; - import 'package:flutter/foundation.dart'; import 'package:flutter/gestures.dart'; import 'package:plugin_platform_interface/plugin_platform_interface.dart'; -import 'package:webview_flutter_platform_interface/src/v4/types/load_request_params.dart'; import 'package:webview_flutter_platform_interface/src/v4/types/types.dart'; import 'package:webview_flutter_platform_interface/src/v4/webview_widget_delegate.dart'; diff --git a/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/types/load_request_params_delegate_test.dart b/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/types/load_request_params_delegate_test.dart deleted file mode 100644 index f4aa2aee2cca..000000000000 --- a/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/types/load_request_params_delegate_test.dart +++ /dev/null @@ -1,110 +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:typed_data'; - -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/src/v4/webview_platform.dart'; - -import '../webview_platform_test.mocks.dart'; - -void main() { - setUp(() { - WebViewPlatform.instance = MockWebViewPlatformWithMixin(); - }); - - test('Cannot be implemented with `implements`', () { - final Uri testUri = Uri(path: 'https://flutter.dev'); - const LoadRequestMethod testMethod = LoadRequestMethod.get; - final Map testHeaders = {}; - when(WebViewPlatform.instance!.createLoadRequestParamsDelegate( - uri: testUri, - method: testMethod, - headers: testHeaders, - )).thenReturn(ImplementsLoadRequestParamsDelegate()); - - expect(() { - LoadRequestParams( - uri: testUri, - method: testMethod, - headers: testHeaders, - ); - }, throwsNoSuchMethodError); - }); - - test('Can be extended', () { - final Uri testUri = Uri(path: 'https://flutter.dev'); - const LoadRequestMethod testMethod = LoadRequestMethod.get; - final Map testHeaders = {}; - when(WebViewPlatform.instance!.createLoadRequestParamsDelegate( - uri: testUri, - method: testMethod, - headers: testHeaders, - )).thenReturn(ExtendsLoadRequestParamsDelegate( - uri: testUri, - method: testMethod, - headers: testHeaders, - )); - - expect( - ExtendsLoadRequestParamsDelegate( - uri: testUri, - method: testMethod, - headers: testHeaders, - ), - isNotNull); - }); - - test('Can be mocked with `implements`', () { - final Uri testUri = Uri(path: 'https://flutter.dev'); - const LoadRequestMethod testMethod = LoadRequestMethod.get; - final Map testHeaders = {}; - when(WebViewPlatform.instance!.createLoadRequestParamsDelegate( - uri: testUri, - method: testMethod, - headers: testHeaders, - )).thenReturn(MockLoadRequestParamsDelegate()); - - expect( - ExtendsLoadRequestParamsDelegate( - uri: testUri, - method: testMethod, - headers: testHeaders, - ), - isNotNull); - }); -} - -class MockWebViewPlatformWithMixin extends MockWebViewPlatform - with - // ignore: prefer_mixin - MockPlatformInterfaceMixin {} - -class ImplementsLoadRequestParamsDelegate implements LoadRequestParams { - @override - dynamic noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation); -} - -class MockLoadRequestParamsDelegate extends Mock - with - // ignore: prefer_mixin - MockPlatformInterfaceMixin - implements - LoadRequestParams {} - -class ExtendsLoadRequestParamsDelegate extends LoadRequestParams { - ExtendsLoadRequestParamsDelegate({ - required Uri uri, - required LoadRequestMethod method, - required Map headers, - Uint8List? body, - }) : super.implementation( - uri: uri, - method: method, - headers: headers, - body: body, - ); -} diff --git a/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/types/web_resource_error_delegate_test.dart b/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/types/web_resource_error_delegate_test.dart deleted file mode 100644 index 1e1322a40f60..000000000000 --- a/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/types/web_resource_error_delegate_test.dart +++ /dev/null @@ -1,99 +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_test/flutter_test.dart'; -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/src/v4/webview_platform.dart'; - -import '../webview_platform_test.mocks.dart'; -import 'web_resource_error_delegate_test.mocks.dart'; - -@GenerateMocks([WebResourceError]) -void main() { - setUp(() { - WebViewPlatform.instance = MockWebViewPlatformWithMixin(); - }); - - test('Cannot be implemented with `implements`', () { - const int errorCode = 401; - const String description = - 'Error used to test the WebResourceErrorDelegate'; - when(WebViewPlatform.instance!.createWebResourceError( - errorCode: errorCode, - description: description, - )).thenReturn(ImplementsWebResourceErrorDelegate()); - - expect(() { - WebResourceError( - errorCode: errorCode, - description: description, - ); - }, throwsNoSuchMethodError); - }); - - test('Can be extended', () { - const int errorCode = 401; - const String description = - 'Error used to test the WebResourceErrorDelegate'; - when(WebViewPlatform.instance!.createWebResourceError( - errorCode: errorCode, - description: description, - )).thenReturn(ExtendsWebResourceErrorDelegate( - errorCode: errorCode, - description: description, - )); - - expect(() { - WebResourceError( - errorCode: errorCode, - description: description, - ); - }, isNotNull); - }); - - test('Can be mocked with `implements`', () { - const int errorCode = 401; - const String description = - 'Error used to test the WebResourceErrorDelegate'; - when(WebViewPlatform.instance!.createWebResourceError( - errorCode: errorCode, - description: description, - )).thenReturn(MockWebResourceErrorDelegateWithMixin()); - - expect(() { - WebResourceError( - errorCode: errorCode, - description: description, - ); - }, isNotNull); - }); -} - -class MockWebViewPlatformWithMixin extends MockWebViewPlatform - with - // ignore: prefer_mixin - MockPlatformInterfaceMixin {} - -class ImplementsWebResourceErrorDelegate implements WebResourceError { - @override - dynamic noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation); -} - -class MockWebResourceErrorDelegateWithMixin extends MockWebResourceErrorDelegate - with - // ignore: prefer_mixin - MockPlatformInterfaceMixin {} - -class ExtendsWebResourceErrorDelegate extends WebResourceError { - ExtendsWebResourceErrorDelegate({ - required int errorCode, - required String description, - WebResourceErrorType? errorType, - }) : super.implementation( - errorCode: errorCode, - description: description, - errorType: errorType); -} diff --git a/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/types/web_resource_error_delegate_test.mocks.dart b/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/types/web_resource_error_delegate_test.mocks.dart index 7bc7f13eaf1f..66505792233d 100644 --- a/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/types/web_resource_error_delegate_test.mocks.dart +++ b/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/types/web_resource_error_delegate_test.mocks.dart @@ -1,4 +1,4 @@ -// Mocks generated by Mockito 5.0.16 from annotations +// Mocks generated by Mockito 5.1.0 from annotations // in webview_flutter_platform_interface/test/src/v4/types/web_resource_error_delegate_test.dart. // Do not manually edit this file. @@ -6,6 +6,7 @@ import 'package:mockito/mockito.dart' as _i1; import 'package:webview_flutter_platform_interface/src/v4/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 @@ -15,12 +16,11 @@ import 'package:webview_flutter_platform_interface/src/v4/webview_platform.dart' // ignore_for_file: unnecessary_parenthesis // ignore_for_file: camel_case_types -/// A class which mocks [WebResourceErrorDelegate]. +/// A class which mocks [WebResourceError]. /// /// See the documentation for Mockito's code generation for more information. -class MockWebResourceErrorDelegate extends _i1.Mock - implements _i2.WebResourceErrorDelegate { - MockWebResourceErrorDelegate() { +class MockWebResourceError extends _i1.Mock implements _i2.WebResourceError { + MockWebResourceError() { _i1.throwOnMissingStub(this); } @@ -32,6 +32,4 @@ class MockWebResourceErrorDelegate extends _i1.Mock String get description => (super.noSuchMethod(Invocation.getter(#description), returnValue: '') as String); - @override - String toString() => super.toString(); } diff --git a/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/webview_controller_delegate_test.dart b/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/webview_controller_delegate_test.dart index 94aa1c54c644..0d06f9fa6f9b 100644 --- a/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/webview_controller_delegate_test.dart +++ b/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/webview_controller_delegate_test.dart @@ -3,39 +3,48 @@ // found in the LICENSE file. import 'package:flutter_test/flutter_test.dart'; +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/src/v4/navigation_callback_handler_delegate.dart'; import 'package:webview_flutter_platform_interface/src/v4/webview_controller_delegate.dart'; import 'package:webview_flutter_platform_interface/src/v4/webview_platform.dart'; +import 'navigation_callback_handler_delegate_test.dart'; import 'webview_platform_test.mocks.dart'; +@GenerateMocks([NavigationCallbackHandlerDelegate]) void main() { setUp(() { WebViewPlatform.instance = MockWebViewPlatformWithMixin(); }); test('Cannot be implemented with `implements`', () { - when(WebViewPlatform.instance!.createWebViewControllerDelegate()) + when((WebViewPlatform.instance! as MockWebViewPlatform) + .createWebViewControllerDelegate(any)) .thenReturn(ImplementsWebViewControllerDelegate()); expect(() { - WebViewControllerDelegate(); + WebViewControllerDelegate(WebViewControllerCreationParams()); }, throwsNoSuchMethodError); }); test('Can be extended', () { - when(WebViewPlatform.instance!.createWebViewControllerDelegate()) + when((WebViewPlatform.instance! as MockWebViewPlatform) + .createWebViewControllerDelegate(any)) .thenReturn(ExtendsWebViewControllerDelegate()); - expect(WebViewControllerDelegate(), isNotNull); + expect(WebViewControllerDelegate(WebViewControllerCreationParams()), + isNotNull); }); test('Can be mocked with `implements`', () { - when(WebViewPlatform.instance!.createWebViewControllerDelegate()) + when((WebViewPlatform.instance! as MockWebViewPlatform) + .createWebViewControllerDelegate(any)) .thenReturn(MockWebViewControllerDelegate()); - expect(WebViewControllerDelegate(), isNotNull); + expect(WebViewControllerDelegate(WebViewControllerCreationParams()), + isNotNull); }); test( @@ -199,7 +208,8 @@ void main() { ExtendsWebViewControllerDelegate(); expect( - () => controller.setNavigationCallbackHandler(), + () => controller.setNavigationCallbackHandler( + MockNavigationCallbackHandlerDelegate()), throwsUnimplementedError, ); }, diff --git a/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/webview_controller_delegate_test.mocks.dart b/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/webview_controller_delegate_test.mocks.dart new file mode 100644 index 000000000000..2435e5169914 --- /dev/null +++ b/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/webview_controller_delegate_test.mocks.dart @@ -0,0 +1,63 @@ +// Mocks generated by Mockito 5.1.0 from annotations +// in webview_flutter_platform_interface/test/src/v4/webview_controller_delegate_test.dart. +// Do not manually edit this file. + +import 'dart:async' as _i3; + +import 'package:mockito/mockito.dart' as _i1; +import 'package:webview_flutter_platform_interface/src/v4/navigation_callback_handler_delegate.dart' + as _i2; +import 'package:webview_flutter_platform_interface/src/v4/webview_platform.dart' + as _i4; + +// 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 + +/// A class which mocks [NavigationCallbackHandlerDelegate]. +/// +/// See the documentation for Mockito's code generation for more information. +class MockNavigationCallbackHandlerDelegate extends _i1.Mock + implements _i2.NavigationCallbackHandlerDelegate { + MockNavigationCallbackHandlerDelegate() { + _i1.throwOnMissingStub(this); + } + + @override + _i3.Future setOnNavigationRequest( + void Function({bool isForMainFrame, String url})? + onNavigationRequest) => + (super.noSuchMethod( + Invocation.method(#setOnNavigationRequest, [onNavigationRequest]), + returnValue: Future.value(), + returnValueForMissingStub: Future.value()) as _i3.Future); + @override + _i3.Future setOnPageStarted(void Function(String)? onPageStarted) => + (super.noSuchMethod(Invocation.method(#setOnPageStarted, [onPageStarted]), + returnValue: Future.value(), + returnValueForMissingStub: Future.value()) as _i3.Future); + @override + _i3.Future setOnPageFinished(void Function(String)? onPageFinished) => + (super.noSuchMethod( + Invocation.method(#setOnPageFinished, [onPageFinished]), + returnValue: Future.value(), + returnValueForMissingStub: Future.value()) as _i3.Future); + @override + _i3.Future setOnProgress(void Function(int)? onProgress) => + (super.noSuchMethod(Invocation.method(#setOnProgress, [onProgress]), + returnValue: Future.value(), + returnValueForMissingStub: Future.value()) as _i3.Future); + @override + _i3.Future setOnWebResourceError( + void Function(_i4.WebResourceError)? onWebResourceError) => + (super.noSuchMethod( + Invocation.method(#setOnWebResourceError, [onWebResourceError]), + returnValue: Future.value(), + returnValueForMissingStub: Future.value()) as _i3.Future); +} 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/src/v4/webview_platform_test.dart index 67e7569f6dd1..474236d057f5 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/src/v4/webview_platform_test.dart @@ -46,27 +46,24 @@ void main() { test( // ignore: lines_longer_than_80_chars - 'Default implementation of createLoadRequestParamsDelegate should throw unimplemented error', + 'Default implementation of createNavigationCallbackHandlerDelegate should throw unimplemented error', () { final WebViewPlatform webViewPlatform = ExtendsWebViewPlatform(); expect( - () => webViewPlatform.createLoadRequestParamsDelegate( - uri: Uri(path: 'https://flutter.dev'), - method: LoadRequestMethod.get, - headers: {}), + () => webViewPlatform.createNavigationCallbackHandlerDelegate(), throwsUnimplementedError, ); }); test( // ignore: lines_longer_than_80_chars - 'Default implementation of createNavigationCallbackHandlerDelegate should throw unimplemented error', + 'Default implementation of createJavaScriptMessage should throw unimplemented error', () { final WebViewPlatform webViewPlatform = ExtendsWebViewPlatform(); expect( - () => webViewPlatform.createNavigationCallbackHandlerDelegate(), + () => webViewPlatform.createJavaScriptMessage('0'), throwsUnimplementedError, ); }); @@ -91,7 +88,8 @@ void main() { final WebViewPlatform webViewPlatform = ExtendsWebViewPlatform(); expect( - webViewPlatform.createWebViewControllerDelegate, + () => webViewPlatform + .createWebViewControllerDelegate(WebViewControllerCreationParams()), throwsUnimplementedError, ); }); 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 index 31a0b1784be8..573b7b8aafba 100644 --- 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 @@ -1,16 +1,14 @@ -// Mocks generated by Mockito 5.0.16 from annotations +// Mocks generated by Mockito 5.1.0 from annotations // in webview_flutter_platform_interface/test/src/v4/webview_platform_test.dart. // Do not manually edit this file. -import 'dart:typed_data' as _i8; - -import 'package:flutter/foundation.dart' as _i9; -import 'package:flutter/gestures.dart' as _i10; +import 'package:flutter/foundation.dart' as _i8; +import 'package:flutter/gestures.dart' as _i9; import 'package:mockito/mockito.dart' as _i1; import 'package:webview_flutter_platform_interface/src/v4/navigation_callback_handler_delegate.dart' - as _i4; -import 'package:webview_flutter_platform_interface/src/v4/types/types.dart' as _i3; +import 'package:webview_flutter_platform_interface/src/v4/types/types.dart' + as _i4; import 'package:webview_flutter_platform_interface/src/v4/webview_controller_delegate.dart' as _i5; import 'package:webview_flutter_platform_interface/src/v4/webview_cookie_manager_delegate.dart' @@ -20,6 +18,7 @@ import 'package:webview_flutter_platform_interface/src/v4/webview_platform.dart' import 'package:webview_flutter_platform_interface/src/v4/webview_widget_delegate.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 @@ -32,22 +31,19 @@ import 'package:webview_flutter_platform_interface/src/v4/webview_widget_delegat class _FakeWebViewCookieManagerDelegate_0 extends _i1.Fake implements _i2.WebViewCookieManagerDelegate {} -class _FakeLoadRequestParamsDelegate_1 extends _i1.Fake - implements _i3.LoadRequestParamsDelegate {} - -class _FakeNavigationCallbackHandlerDelegate_2 extends _i1.Fake - implements _i4.NavigationCallbackHandlerDelegate {} +class _FakeNavigationCallbackHandlerDelegate_1 extends _i1.Fake + implements _i3.NavigationCallbackHandlerDelegate {} -class _FakeWebResourceErrorDelegate_3 extends _i1.Fake - implements _i3.WebResourceErrorDelegate {} +class _FakeJavaScriptMessage_2 extends _i1.Fake + implements _i4.JavaScriptMessage {} -class _FakeWebSettingsDelegate_4 extends _i1.Fake - implements _i3.WebSettingsDelegate {} +class _FakeWebSettingsDelegate_3 extends _i1.Fake + implements _i4.WebSettingsDelegate {} -class _FakeWebViewControllerDelegate_5 extends _i1.Fake +class _FakeWebViewControllerDelegate_4 extends _i1.Fake implements _i5.WebViewControllerDelegate {} -class _FakeWebViewWidgetDelegate_6 extends _i1.Fake +class _FakeWebViewWidgetDelegate_5 extends _i1.Fake implements _i6.WebViewWidgetDelegate {} /// A class which mocks [WebViewPlatform]. @@ -64,44 +60,24 @@ class MockWebViewPlatform extends _i1.Mock implements _i7.WebViewPlatform { returnValue: _FakeWebViewCookieManagerDelegate_0()) as _i2.WebViewCookieManagerDelegate); @override - _i3.LoadRequestParamsDelegate createLoadRequestParamsDelegate( - {Uri? uri, - _i3.LoadRequestMethod? method, - Map? headers, - _i8.Uint8List? body}) => - (super.noSuchMethod( - Invocation.method(#createLoadRequestParamsDelegate, [], - {#uri: uri, #method: method, #headers: headers, #body: body}), - returnValue: _FakeLoadRequestParamsDelegate_1()) - as _i3.LoadRequestParamsDelegate); - @override - _i4.NavigationCallbackHandlerDelegate + _i3.NavigationCallbackHandlerDelegate createNavigationCallbackHandlerDelegate() => (super.noSuchMethod( Invocation.method(#createNavigationCallbackHandlerDelegate, []), - returnValue: _FakeNavigationCallbackHandlerDelegate_2()) - as _i4.NavigationCallbackHandlerDelegate); + returnValue: _FakeNavigationCallbackHandlerDelegate_1()) + as _i3.NavigationCallbackHandlerDelegate); @override - _i3.WebResourceErrorDelegate createWebResourceErrorDelegate( - {int? errorCode, - String? description, - _i3.WebResourceErrorType? errorType}) => - (super.noSuchMethod( - Invocation.method(#createWebResourceErrorDelegate, [], { - #errorCode: errorCode, - #description: description, - #errorType: errorType - }), - returnValue: _FakeWebResourceErrorDelegate_3()) - as _i3.WebResourceErrorDelegate); + _i4.JavaScriptMessage createJavaScriptMessage(String? message) => (super + .noSuchMethod(Invocation.method(#createJavaScriptMessage, [message]), + returnValue: _FakeJavaScriptMessage_2()) as _i4.JavaScriptMessage); @override - _i3.WebSettingsDelegate createWebSettingsDelegate( + _i4.WebSettingsDelegate createWebSettingsDelegate( {bool? allowsInlineMediaPlayback, bool? debuggingEnabled, bool? gestureNavigationEnabled, bool? hasNavigationDelegate, bool? hasProgressTracking, - _i3.JavaScriptMode? javaScriptMode, - _i3.WebSetting? userAgent, + _i4.JavaScriptMode? javaScriptMode, + _i4.WebSetting? userAgent, bool? zoomEnabled}) => (super.noSuchMethod( Invocation.method(#createWebSettingsDelegate, [], { @@ -114,18 +90,20 @@ class MockWebViewPlatform extends _i1.Mock implements _i7.WebViewPlatform { #userAgent: userAgent, #zoomEnabled: zoomEnabled }), - returnValue: _FakeWebSettingsDelegate_4()) - as _i3.WebSettingsDelegate); + returnValue: _FakeWebSettingsDelegate_3()) + as _i4.WebSettingsDelegate); @override - _i5.WebViewControllerDelegate createWebViewControllerDelegate() => (super - .noSuchMethod(Invocation.method(#createWebViewControllerDelegate, []), - returnValue: _FakeWebViewControllerDelegate_5()) - as _i5.WebViewControllerDelegate); + _i5.WebViewControllerDelegate createWebViewControllerDelegate( + _i4.WebViewControllerCreationParams? params) => + (super.noSuchMethod( + Invocation.method(#createWebViewControllerDelegate, [params]), + returnValue: _FakeWebViewControllerDelegate_4()) + as _i5.WebViewControllerDelegate); @override _i6.WebViewWidgetDelegate createWebViewWidgetDelegate( - {_i9.Key? key, + {_i8.Key? key, _i5.WebViewControllerDelegate? controller, - Set<_i9.Factory<_i10.OneSequenceGestureRecognizer>>? + Set<_i8.Factory<_i9.OneSequenceGestureRecognizer>>? gestureRecognizers}) => (super.noSuchMethod( Invocation.method(#createWebViewWidgetDelegate, [], { @@ -133,8 +111,6 @@ class MockWebViewPlatform extends _i1.Mock implements _i7.WebViewPlatform { #controller: controller, #gestureRecognizers: gestureRecognizers }), - returnValue: _FakeWebViewWidgetDelegate_6()) + returnValue: _FakeWebViewWidgetDelegate_5()) as _i6.WebViewWidgetDelegate); - @override - String toString() => super.toString(); } From 196b4d8f45c6e61d4ad5daeb90ec4ed62af15317 Mon Sep 17 00:00:00 2001 From: "Bodhi Mulders (BeMacized)" Date: Mon, 11 Apr 2022 15:07:49 +0200 Subject: [PATCH 10/31] Process PR feedback --- .../lib/src/v4/types/javascript_message.dart | 3 +- .../lib/src/v4/types/types.dart | 1 + .../src/v4/types/web_settings_delegate.dart | 38 ++++++--------- ...web_settings_delegate_creation_params.dart | 47 +++++++++++++++++++ .../webview_controller_creation_params.dart | 27 ----------- .../lib/src/v4/types/webview_cookie.dart | 3 +- .../src/v4/webview_controller_delegate.dart | 15 ++---- .../lib/src/v4/webview_platform.dart | 9 +--- ...eb_resource_error_delegate_test.mocks.dart | 35 -------------- .../v4/types/web_settings_delegate_test.dart | 40 +++++++++++----- .../test/src/v4/webview_platform_test.dart | 4 +- .../src/v4/webview_platform_test.mocks.dart | 21 ++------- 12 files changed, 102 insertions(+), 141 deletions(-) create mode 100644 packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/web_settings_delegate_creation_params.dart delete mode 100644 packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/types/web_resource_error_delegate_test.mocks.dart diff --git a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/javascript_message.dart b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/javascript_message.dart index 703e53fca748..bda7827a96e7 100644 --- a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/javascript_message.dart +++ b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/javascript_message.dart @@ -41,10 +41,9 @@ import '../webview_platform.dart'; /// } /// ``` /// {@end-tool} +@immutable class JavaScriptMessage extends PlatformInterface { /// Creates a new JavaScript message object. - /// - /// The `message` parameter must not be null. factory JavaScriptMessage(String message) { final JavaScriptMessage javaScriptMessage = WebViewPlatform.instance!.createJavaScriptMessage(message); diff --git a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/types.dart b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/types.dart index a42c58dd7cd2..cd80a1ea44be 100644 --- a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/types.dart +++ b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/types.dart @@ -7,5 +7,6 @@ export 'javascript_mode.dart'; export 'load_request_params.dart'; export 'web_resource_error.dart'; export 'web_settings_delegate.dart'; +export 'web_settings_delegate_creation_params.dart'; export 'webview_controller_creation_params.dart'; export 'webview_cookie.dart'; diff --git a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/web_settings_delegate.dart b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/web_settings_delegate.dart index bdf08378ce75..55f74fd25ee8 100644 --- a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/web_settings_delegate.dart +++ b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/web_settings_delegate.dart @@ -7,6 +7,7 @@ import 'package:plugin_platform_interface/plugin_platform_interface.dart'; import '../webview_platform.dart'; import 'javascript_mode.dart'; +import 'web_settings_delegate_creation_params.dart'; /// A single setting for configuring a WebViewPlatform which may be absent. @immutable @@ -117,24 +118,12 @@ class WebSettingsDelegate extends PlatformInterface { /// Construct an instance with initial settings. /// /// Future setting changes can be sent with [WebViewPlatformController#updateSettings]. - /// - /// The `userAgent` parameter cannot be null. factory WebSettingsDelegate({ - bool? allowsInlineMediaPlayback, - bool? debuggingEnabled, - bool? gestureNavigationEnabled, - JavaScriptMode? javaScriptMode, - required WebSetting userAgent, - bool? zoomEnabled, + required WebSettingsDelegateCreationParams options, }) { final WebSettingsDelegate webSettingsDelegate = WebViewPlatform.instance!.createWebSettingsDelegate( - allowsInlineMediaPlayback: allowsInlineMediaPlayback, - debuggingEnabled: debuggingEnabled, - gestureNavigationEnabled: gestureNavigationEnabled, - javaScriptMode: javaScriptMode, - userAgent: userAgent, - zoomEnabled: zoomEnabled, + options: options, ); PlatformInterface.verify(webSettingsDelegate, _token); return webSettingsDelegate; @@ -147,13 +136,14 @@ class WebSettingsDelegate extends PlatformInterface { /// a class that only contains a factory constructor. @protected WebSettingsDelegate.implementation({ - this.allowsInlineMediaPlayback, - this.debuggingEnabled, - this.gestureNavigationEnabled, - this.javascriptMode, - required this.userAgent, - this.zoomEnabled, - }) : super(token: _token); + required WebSettingsDelegateCreationParams options, + }) : allowsInlineMediaPlayback = options.allowsInlineMediaPlayback, + userAgent = options.userAgent, + debuggingEnabled = options.debuggingEnabled, + gestureNavigationEnabled = options.gestureNavigationEnabled, + javaScriptMode = options.javaScriptMode, + zoomEnabled = options.zoomEnabled, + super(token: _token); static final Object _token = Object(); @@ -167,13 +157,13 @@ class WebSettingsDelegate extends PlatformInterface { /// See also: [WebView.debuggingEnabled]. final bool? debuggingEnabled; - /// Whether to allow swipe based navigation in iOS. + /// Whether to allow swipe based navigation on supported platforms. /// /// See also: [WebView.gestureNavigationEnabled] final bool? gestureNavigationEnabled; /// The JavaScript execution mode to be used by the webview. - final JavaScriptMode? javascriptMode; + final JavaScriptMode? javaScriptMode; /// The value used for the HTTP `User-Agent:` request header. /// @@ -190,6 +180,6 @@ class WebSettingsDelegate extends PlatformInterface { @override String toString() { - return 'WebSettings(javascriptMode: $javascriptMode, debuggingEnabled: $debuggingEnabled, gestureNavigationEnabled: $gestureNavigationEnabled, userAgent: $userAgent, allowsInlineMediaPlayback: $allowsInlineMediaPlayback)'; + return 'WebSettings(javaScriptMode: $javaScriptMode, debuggingEnabled: $debuggingEnabled, gestureNavigationEnabled: $gestureNavigationEnabled, userAgent: $userAgent, allowsInlineMediaPlayback: $allowsInlineMediaPlayback)'; } } diff --git a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/web_settings_delegate_creation_params.dart b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/web_settings_delegate_creation_params.dart new file mode 100644 index 000000000000..188180592e14 --- /dev/null +++ b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/web_settings_delegate_creation_params.dart @@ -0,0 +1,47 @@ +import 'javascript_mode.dart'; +import 'web_settings_delegate.dart'; + +/// Parameters object for creating a [WebSettingsDelegate] object. +/// See more at [WebViewPlatform.createWebSettingsDelegate]. +class WebSettingsDelegateCreationParams { + /// Constructs a new [WebSettingsDelegateCreationParams] object. + const WebSettingsDelegateCreationParams({ + required this.userAgent, + this.allowsInlineMediaPlayback, + this.debuggingEnabled, + this.gestureNavigationEnabled, + this.javaScriptMode, + this.zoomEnabled, + }); + + /// The value used for the HTTP `User-Agent:` request header. + /// + /// If [userAgent.value] is null the platform's default user agent should be used. + /// + /// An absent value ([userAgent.isPresent] is false) represents no change to this setting from the + /// last time it was set. + /// + /// See also [WebView.userAgent]. + final WebSetting userAgent; + + /// Whether to play HTML5 videos inline or use the native full-screen controller on iOS. + /// + /// This will have no effect on Android. + final bool? allowsInlineMediaPlayback; + + /// Whether to enable the platform's webview content debugging tools. + /// + /// See also: [WebView.debuggingEnabled]. + final bool? debuggingEnabled; + + /// Whether to allow swipe based navigation on supported platforms. + /// + /// See also: [WebView.gestureNavigationEnabled] + final bool? gestureNavigationEnabled; + + /// The JavaScript execution mode to be used by the webview. + final JavaScriptMode? javaScriptMode; + + /// Sets whether the WebView should support zooming using its on-screen zoom controls and gestures. + final bool? zoomEnabled; +} diff --git a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/webview_controller_creation_params.dart b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/webview_controller_creation_params.dart index 88ffd427493e..6791ac369ba5 100644 --- a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/webview_controller_creation_params.dart +++ b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/webview_controller_creation_params.dart @@ -5,33 +5,6 @@ /// Object specifying creation parameters for creating a [WebViewControllerDelegate]. /// /// Platform specific implementations can add additional fields by extending -/// this class and provide a factory method that takes the -/// [WebViewControllerCreationParams] as a parameter. -/// -/// {@tool sample} -/// This example demonstrates how to extend the [WebViewControllerCreationParams] to -/// provide additional platform specific parameters. -/// -/// Note that the additional parameters should always accept `null` or have a -/// default value to prevent breaking changes. -/// -/// ```dart -/// class IOSWebViewControllerCreationParams extends WebViewControllerCreationParams { -/// IOSWebViewControllerCreationParams._(this.iosParameter) : super(); -/// -/// factory IOSWebViewControllerCreationParams.fromWebViewControllerCreationParams({ -/// String? iosParameter, -/// }) { -/// return IOSWebViewControllerCreationParams._( -/// iosParameter: iosParameter, -/// ); -/// } -/// -/// final String? iosParameter; -/// } -/// ``` -/// {@end-tool} -/// Platform specific implementations can add additional fields by extending /// this class. /// /// {@tool sample} diff --git a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/webview_cookie.dart b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/webview_cookie.dart index ab7f6c7640f0..868f8d547209 100644 --- a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/webview_cookie.dart +++ b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/webview_cookie.dart @@ -7,9 +7,10 @@ import 'package:meta/meta.dart'; /// A cookie that can be set globally for all web views /// using [WebViewCookieManagerPlatform]. @sealed +@immutable class WebViewCookie { /// Creates a new [WebViewCookieDelegate] - WebViewCookie({ + const WebViewCookie({ required this.name, required this.value, required this.domain, diff --git a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/webview_controller_delegate.dart b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/webview_controller_delegate.dart index b16987761ceb..7797bbede171 100644 --- a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/webview_controller_delegate.dart +++ b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/webview_controller_delegate.dart @@ -168,19 +168,10 @@ abstract class WebViewControllerDelegate extends PlatformInterface { 'setNavigationCallbackHandler is not implemented on the current platform'); } - /// Evaluates a JavaScript expression in the context of the current page. - /// - /// The Future completes with an error if a JavaScript error occurred, or if the type of the - /// evaluated expression is not supported (e.g on iOS not all non-primitive types can be evaluated). - Future evaluateJavaScript(String javascript) { - throw UnimplementedError( - 'evaluateJavaScript is not implemented on the current platform'); - } - /// Runs the given JavaScript in the context of the current page. /// /// The Future completes with an error if a JavaScript error occurred. - Future runJavaScript(String javascript) { + Future runJavaScript(String javaScript) { throw UnimplementedError( 'runJavaScript is not implemented on the current platform'); } @@ -190,7 +181,7 @@ abstract class WebViewControllerDelegate extends PlatformInterface { /// 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 runJavaScriptReturningResult(String javascript) { + Future runJavaScriptReturningResult(String javaScript) { throw UnimplementedError( 'runJavaScriptReturningResult is not implemented on the current platform'); } @@ -207,7 +198,7 @@ abstract class WebViewControllerDelegate extends PlatformInterface { /// enabled channels. /// /// This disables the channel with the matching name if it was previously - /// enabled through the [addJavascriptChannel]. + /// enabled through the [addJavaScriptChannel]. Future removeJavaScriptChannel(String javaScriptChannelName) { throw UnimplementedError( 'removeJavaScriptChannel is not implemented on the current platform'); diff --git a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/webview_platform.dart b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/webview_platform.dart index 81e8dcec4453..9fbfff74587c 100644 --- a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/webview_platform.dart +++ b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/webview_platform.dart @@ -58,14 +58,7 @@ abstract class WebViewPlatform extends PlatformInterface { /// Create a new [WebSettingsDelegate]. WebSettingsDelegate createWebSettingsDelegate({ - bool? allowsInlineMediaPlayback, - bool? debuggingEnabled, - bool? gestureNavigationEnabled, - bool? hasNavigationDelegate, - bool? hasProgressTracking, - JavaScriptMode? javaScriptMode, - required WebSetting userAgent, - bool? zoomEnabled, + required WebSettingsDelegateCreationParams options, }) { throw UnimplementedError( 'createWebSettingsDelegate is not implemented on the current platform.'); diff --git a/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/types/web_resource_error_delegate_test.mocks.dart b/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/types/web_resource_error_delegate_test.mocks.dart deleted file mode 100644 index 66505792233d..000000000000 --- a/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/types/web_resource_error_delegate_test.mocks.dart +++ /dev/null @@ -1,35 +0,0 @@ -// Mocks generated by Mockito 5.1.0 from annotations -// in webview_flutter_platform_interface/test/src/v4/types/web_resource_error_delegate_test.dart. -// Do not manually edit this file. - -import 'package:mockito/mockito.dart' as _i1; -import 'package:webview_flutter_platform_interface/src/v4/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 - -/// A class which mocks [WebResourceError]. -/// -/// See the documentation for Mockito's code generation for more information. -class MockWebResourceError extends _i1.Mock implements _i2.WebResourceError { - MockWebResourceError() { - _i1.throwOnMissingStub(this); - } - - @override - int get errorCode => - (super.noSuchMethod(Invocation.getter(#errorCode), returnValue: 0) - as int); - @override - String get description => - (super.noSuchMethod(Invocation.getter(#description), returnValue: '') - as String); -} diff --git a/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/types/web_settings_delegate_test.dart b/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/types/web_settings_delegate_test.dart index 08f097545610..fcaafa374f21 100644 --- a/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/types/web_settings_delegate_test.dart +++ b/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/types/web_settings_delegate_test.dart @@ -37,31 +37,45 @@ void main() { test('Cannot be implemented with `implements`', () { const WebSetting absentSetting = WebSetting.absent(); - when(WebViewPlatform.instance! - .createWebSettingsDelegate(userAgent: absentSetting)) - .thenReturn(ImplementsWebSettingsDelegate()); + when(WebViewPlatform.instance!.createWebSettingsDelegate( + options: const WebSettingsDelegateCreationParams( + userAgent: absentSetting, + ), + )).thenReturn(ImplementsWebSettingsDelegate()); expect(() { - WebSettingsDelegate(userAgent: absentSetting); + WebSettingsDelegate( + options: const WebSettingsDelegateCreationParams( + userAgent: absentSetting, + ), + ); }, throwsNoSuchMethodError); }); test('Can be extended', () { const WebSetting absentSetting = WebSetting.absent(); - when(WebViewPlatform.instance! - .createWebSettingsDelegate(userAgent: absentSetting)) - .thenReturn(ExtendsWebSettingsDelegate(userAgent: absentSetting)); - - expect(WebSettingsDelegate(userAgent: absentSetting), isNotNull); + const WebSettingsDelegateCreationParams options = + WebSettingsDelegateCreationParams( + userAgent: absentSetting, + ); + when(WebViewPlatform.instance!.createWebSettingsDelegate( + options: options, + )).thenReturn(ExtendsWebSettingsDelegate(options: options)); + + expect(WebSettingsDelegate(options: options), isNotNull); }); test('Can be mocked with `implements`', () { const WebSetting absentSetting = WebSetting.absent(); + const WebSettingsDelegateCreationParams options = + WebSettingsDelegateCreationParams( + userAgent: absentSetting, + ); when(WebViewPlatform.instance! - .createWebSettingsDelegate(userAgent: absentSetting)) + .createWebSettingsDelegate(options: options)) .thenReturn(MockWebSettingsDelegate()); - expect(WebSettingsDelegate(userAgent: absentSetting), isNotNull); + expect(WebSettingsDelegate(options: options), isNotNull); }); }); } @@ -85,6 +99,6 @@ class MockWebSettingsDelegate extends Mock class ExtendsWebSettingsDelegate extends WebSettingsDelegate { ExtendsWebSettingsDelegate({ - required WebSetting userAgent, - }) : super.implementation(userAgent: userAgent); + required WebSettingsDelegateCreationParams options, + }) : super.implementation(options: options); } 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/src/v4/webview_platform_test.dart index 474236d057f5..eacbab968eb6 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/src/v4/webview_platform_test.dart @@ -76,7 +76,9 @@ void main() { expect( () => webViewPlatform.createWebSettingsDelegate( - userAgent: const WebSetting.absent()), + options: const WebSettingsDelegateCreationParams( + userAgent: WebSetting.absent()), + ), throwsUnimplementedError, ); }); 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 index 573b7b8aafba..67016c3fec56 100644 --- 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 @@ -71,25 +71,10 @@ class MockWebViewPlatform extends _i1.Mock implements _i7.WebViewPlatform { returnValue: _FakeJavaScriptMessage_2()) as _i4.JavaScriptMessage); @override _i4.WebSettingsDelegate createWebSettingsDelegate( - {bool? allowsInlineMediaPlayback, - bool? debuggingEnabled, - bool? gestureNavigationEnabled, - bool? hasNavigationDelegate, - bool? hasProgressTracking, - _i4.JavaScriptMode? javaScriptMode, - _i4.WebSetting? userAgent, - bool? zoomEnabled}) => + {_i4.WebSettingsDelegateCreationParams? options}) => (super.noSuchMethod( - Invocation.method(#createWebSettingsDelegate, [], { - #allowsInlineMediaPlayback: allowsInlineMediaPlayback, - #debuggingEnabled: debuggingEnabled, - #gestureNavigationEnabled: gestureNavigationEnabled, - #hasNavigationDelegate: hasNavigationDelegate, - #hasProgressTracking: hasProgressTracking, - #javaScriptMode: javaScriptMode, - #userAgent: userAgent, - #zoomEnabled: zoomEnabled - }), + Invocation.method( + #createWebSettingsDelegate, [], {#options: options}), returnValue: _FakeWebSettingsDelegate_3()) as _i4.WebSettingsDelegate); @override From 9361b8c231fd9cf385224f7a0d55ddd2aef38ad9 Mon Sep 17 00:00:00 2001 From: "Bodhi Mulders (BeMacized)" Date: Mon, 11 Apr 2022 15:17:27 +0200 Subject: [PATCH 11/31] Process PR feedback --- .../lib/src/v4/types/load_request_params.dart | 41 ++----------------- .../lib/src/v4/types/web_resource_error.dart | 5 ++- .../src/v4/types/web_settings_delegate.dart | 6 +-- ...web_settings_delegate_creation_params.dart | 4 +- .../v4/webview_controller_delegate_test.dart | 1 + 5 files changed, 13 insertions(+), 44 deletions(-) diff --git a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/load_request_params.dart b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/load_request_params.dart index da3f722d44d4..cd78543cefe0 100644 --- a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/load_request_params.dart +++ b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/load_request_params.dart @@ -3,6 +3,7 @@ // found in the LICENSE file. import 'dart:typed_data'; +import 'package:flutter/foundation.dart'; import 'package:webview_flutter_platform_interface/src/v4/webview_controller_delegate.dart'; /// Defines the supported HTTP methods for loading a page in @@ -30,43 +31,6 @@ extension LoadRequestMethodExtensions on LoadRequestMethod { /// Defines the parameters that can be used to load a page with the [WebViewControllerDelegate]. /// -/// Platform specific implementations can add additional fields by extending this -/// class and provide a factory method that takes the -/// [LoadRequestParams] as a parameter. -/// -/// {@tool sample} -/// This example demonstrates how to extend the [LoadRequestParams] to -/// provide additional platform specific parameters. -/// -/// Note that the additional parameters should always accept `null` or have a -/// default value to prevent breaking changes. -/// -/// ```dart -/// class AndroidLoadRequestParamsDelegate extends LoadRequestParamsDelegate { -/// AndroidLoadRequestParamsDelegate._( -/// LoadRequestParamsDelegate loadRequestParams, -/// this.historyUrl, -/// ) : super( -/// uri: loadRequestParams.uri, -/// method: loadRequestParams.method, -/// headers: loadRequestParams.headers, -/// body: loadRequestParams.body, -/// ); -/// -/// factory AndroidLoadRequestParamsDelegate.fromLoadRequestParamsDelegate( -/// LoadRequestParamsDelegate loadRequestParams, { -/// Uri? historyUrl, -/// }) { -/// return AndroidLoadRequestParamsDelegate._( -/// loadRequestParams: loadRequestParams, -/// historyUrl: historyUrl, -/// ); -/// } -/// -/// final Uri? historyUrl; -/// } -/// ``` -/// {@end-tool} /// Platform specific implementations can add additional fields by extending /// this class. /// @@ -95,9 +59,10 @@ extension LoadRequestMethodExtensions on LoadRequestMethod { /// } /// ``` /// {@end-tool} +@immutable class LoadRequestParams { /// Used by the platform implementation to create a new [LoadRequestParams]. - LoadRequestParams({ + const LoadRequestParams({ required this.uri, required this.method, required this.headers, diff --git a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/web_resource_error.dart b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/web_resource_error.dart index 8bbb1d40d565..c57570c1c1a3 100644 --- a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/web_resource_error.dart +++ b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/web_resource_error.dart @@ -2,6 +2,8 @@ // 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. @@ -95,9 +97,10 @@ enum WebResourceErrorType { /// } /// ``` /// {@end-tool} +@immutable class WebResourceError { /// Used by the platform implementation to create a new [WebResourceError]. - WebResourceError({ + const WebResourceError({ required this.errorCode, required this.description, this.errorType, diff --git a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/web_settings_delegate.dart b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/web_settings_delegate.dart index 55f74fd25ee8..073a35f2e89f 100644 --- a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/web_settings_delegate.dart +++ b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/web_settings_delegate.dart @@ -65,7 +65,7 @@ class WebSetting { } @override - int get hashCode => hashValues(_value, isPresent); + int get hashCode => Object.hash(_value, isPresent); } /// Defines the parameters to configure a [WebViewPlatform]. @@ -147,9 +147,9 @@ class WebSettingsDelegate extends PlatformInterface { static final Object _token = Object(); - /// Whether to play HTML5 videos inline or use the native full-screen controller on iOS. + /// Whether to play HTML5 videos inline or use the native full-screen controller on platforms that provide this functionality. /// - /// This will have no effect on Android. + /// This will be ignored on platforms that don't support it (such as Android). final bool? allowsInlineMediaPlayback; /// Whether to enable the platform's webview content debugging tools. diff --git a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/web_settings_delegate_creation_params.dart b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/web_settings_delegate_creation_params.dart index 188180592e14..2bdaa8fb8625 100644 --- a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/web_settings_delegate_creation_params.dart +++ b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/web_settings_delegate_creation_params.dart @@ -24,9 +24,9 @@ class WebSettingsDelegateCreationParams { /// See also [WebView.userAgent]. final WebSetting userAgent; - /// Whether to play HTML5 videos inline or use the native full-screen controller on iOS. + /// Whether to play HTML5 videos inline or use the native full-screen controller on platforms that provide this functionality. /// - /// This will have no effect on Android. + /// This will be ignored on platforms that don't support it (such as Android). final bool? allowsInlineMediaPlayback; /// Whether to enable the platform's webview content debugging tools. diff --git a/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/webview_controller_delegate_test.dart b/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/webview_controller_delegate_test.dart index 0d06f9fa6f9b..9c8ec0731e4c 100644 --- a/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/webview_controller_delegate_test.dart +++ b/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/webview_controller_delegate_test.dart @@ -346,6 +346,7 @@ class ExtendsWebViewControllerDelegate extends WebViewControllerDelegate { ExtendsWebViewControllerDelegate() : super.implementation(); } +// ignore: must_be_immutable class MockLoadRequestParamsDelegate extends Mock with //ignore: prefer_mixin From fd81633ae191e163d8f0f1dec16080a9df93e51b Mon Sep 17 00:00:00 2001 From: "Bodhi Mulders (BeMacized)" Date: Mon, 11 Apr 2022 15:24:31 +0200 Subject: [PATCH 12/31] Add missing license block --- .../src/v4/types/web_settings_delegate_creation_params.dart | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/web_settings_delegate_creation_params.dart b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/web_settings_delegate_creation_params.dart index 2bdaa8fb8625..bfd1fe8442c6 100644 --- a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/web_settings_delegate_creation_params.dart +++ b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/web_settings_delegate_creation_params.dart @@ -1,3 +1,7 @@ +// 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 'javascript_mode.dart'; import 'web_settings_delegate.dart'; From 3936ff58808622864b2304b253b061327083d06a Mon Sep 17 00:00:00 2001 From: "Bodhi Mulders (BeMacized)" Date: Tue, 12 Apr 2022 09:04:26 +0200 Subject: [PATCH 13/31] Add missing comments --- .../lib/src/v4/webview_platform.dart | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/webview_platform.dart b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/webview_platform.dart index 9fbfff74587c..aa741ccae30a 100644 --- a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/webview_platform.dart +++ b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/webview_platform.dart @@ -39,12 +39,18 @@ abstract class WebViewPlatform extends PlatformInterface { } /// Creates a new [WebViewCookieManagerDelegate]. + /// + /// This function should only be called by the app-facing plugin. + /// Look at using [WebViewCookieManager] in `webview_flutter` instead. WebViewCookieManagerDelegate createCookieManagerDelegate() { throw UnimplementedError( 'createCookieManagerDelegate is not implemented on the current platform.'); } /// Creates a new [NavigationCallbackHandlerDelegate]. + /// + /// This function should only be called by the app-facing plugin. + /// Look at using [NavigationCallbackHandler] in `webview_flutter` instead. NavigationCallbackHandlerDelegate createNavigationCallbackHandlerDelegate() { throw UnimplementedError( 'createNavigationCallbackHandlerDelegate is not implemented on the current platform.'); @@ -57,6 +63,9 @@ abstract class WebViewPlatform extends PlatformInterface { } /// Create a new [WebSettingsDelegate]. + /// + /// This function should only be called by the app-facing plugin. + /// Look at using [WebSettings] in `webview_flutter` instead. WebSettingsDelegate createWebSettingsDelegate({ required WebSettingsDelegateCreationParams options, }) { @@ -65,6 +74,9 @@ abstract class WebViewPlatform extends PlatformInterface { } /// Create a new [WebViewControllerDelegate]. + /// + /// This function should only be called by the app-facing plugin. + /// Look at using [WebViewController] in `webview_flutter` instead. WebViewControllerDelegate createWebViewControllerDelegate( WebViewControllerCreationParams params) { throw UnimplementedError( @@ -72,6 +84,9 @@ abstract class WebViewPlatform extends PlatformInterface { } /// Create a new [WebViewWidgetDelegate]. + /// + /// This function should only be called by the app-facing plugin. + /// Look at using [WebViewWidget] in `webview_flutter` instead. WebViewWidgetDelegate createWebViewWidgetDelegate({ Key? key, required WebViewControllerDelegate controller, From 405219caf8f3d72e82c7f15e022e74de320f9323 Mon Sep 17 00:00:00 2001 From: Maurits van Beusekom Date: Tue, 12 Apr 2022 09:41:50 +0200 Subject: [PATCH 14/31] Applied feedback on pull requests. --- ...dart => navigation_callback_delegate.dart} | 19 +++++++-------- .../lib/src/v4/types/javascript_message.dart | 4 ++-- .../lib/src/v4/types/load_request_params.dart | 4 ++-- .../lib/src/v4/types/web_resource_error.dart | 4 ++-- .../webview_controller_creation_params.dart | 5 ++-- .../src/v4/webview_controller_delegate.dart | 4 ++-- .../lib/src/v4/webview_platform.dart | 6 ++--- ...gation_callback_handler_delegate_test.dart | 24 +++++++++---------- .../v4/webview_controller_delegate_test.dart | 4 ++-- 9 files changed, 37 insertions(+), 37 deletions(-) rename packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/{navigation_callback_handler_delegate.dart => navigation_callback_delegate.dart} (80%) diff --git a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/navigation_callback_handler_delegate.dart b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/navigation_callback_delegate.dart similarity index 80% rename from packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/navigation_callback_handler_delegate.dart rename to packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/navigation_callback_delegate.dart index 9874074deb19..5e4d2549af74 100644 --- a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/navigation_callback_handler_delegate.dart +++ b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/navigation_callback_delegate.dart @@ -9,27 +9,26 @@ import 'package:plugin_platform_interface/plugin_platform_interface.dart'; import 'webview_platform.dart'; -/// Interface for callbacks made by [NavigationCallbackHandlerDelegate]. +/// An interface defining navigation events that occur on the native platform. /// -/// The webview plugin implements this class, and passes an instance to the -/// [NavigationCallbackHandlerDelegate]. -/// [NavigationCallbackHandlerDelegate] is notifying this handler on events that -/// happened on the platform's webview. -abstract class NavigationCallbackHandlerDelegate extends PlatformInterface { +/// The [WebViewControllerDelegate] is notifying this handler on events that +/// happened on the platform's webview. Platform implementations should +/// implement this class and pass an instance to the[WebViewControllerDelegate]. +abstract class NavigationCallbackDelegate extends PlatformInterface { /// Creates a new [NavigationCallbacksHandlerDelegate] - factory NavigationCallbackHandlerDelegate() { - final NavigationCallbackHandlerDelegate callbackHandlerDelegate = + factory NavigationCallbackDelegate() { + final NavigationCallbackDelegate callbackHandlerDelegate = WebViewPlatform.instance!.createNavigationCallbackHandlerDelegate(); PlatformInterface.verify(callbackHandlerDelegate, _token); return callbackHandlerDelegate; } - /// Used by the platform implementation to create a new [NavigationCallbackHandlerDelegate]. + /// Used by the platform implementation to create a new [NavigationCallbackDelegate]. /// /// Should only be used by platform implementations because they can't extend /// a class that only contains a factory constructor. @protected - NavigationCallbackHandlerDelegate.implementation() : super(token: _token); + NavigationCallbackDelegate.implementation() : super(token: _token); static final Object _token = Object(); diff --git a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/javascript_message.dart b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/javascript_message.dart index bda7827a96e7..9d70f4b8026c 100644 --- a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/javascript_message.dart +++ b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/javascript_message.dart @@ -17,8 +17,8 @@ import '../webview_platform.dart'; /// This example demonstrates how to extend the [JavaScriptMessage] to /// provide additional platform specific parameters. /// -/// Note that the additional parameters should always accept `null` or have a -/// default value to prevent breaking changes. +/// When extending [JavaScriptMessage] additional parameters should always +/// accept `null` or have a default value to prevent breaking changes. /// /// ```dart /// class WKScriptMessage extends JavaScriptMessage { diff --git a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/load_request_params.dart b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/load_request_params.dart index cd78543cefe0..aebc5806f9d7 100644 --- a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/load_request_params.dart +++ b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/load_request_params.dart @@ -38,8 +38,8 @@ extension LoadRequestMethodExtensions on LoadRequestMethod { /// This example demonstrates how to extend the [LoadRequestParams] to /// provide additional platform specific parameters. /// -/// Note that the additional parameters should always accept `null` or have a -/// default value to prevent breaking changes. +/// When extending [LoadRequestParams] additional parameters should always +/// accept `null` or have a default value to prevent breaking changes. /// /// ```dart /// class AndroidLoadRequestParamsDelegate extends LoadRequestParamsDelegate { diff --git a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/web_resource_error.dart b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/web_resource_error.dart index c57570c1c1a3..bec237cb1c8f 100644 --- a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/web_resource_error.dart +++ b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/web_resource_error.dart @@ -77,8 +77,8 @@ enum WebResourceErrorType { /// This example demonstrates how to extend the [WebResourceError] to /// provide additional platform specific parameters. /// -/// Note that the additional parameters should always accept `null` or have a -/// default value to prevent breaking changes. +/// When extending [WebResourceError] additional parameters should always +/// accept `null` or have a default value to prevent breaking changes. /// /// ```dart /// class IOSWebResourceError extends WebResourceError { diff --git a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/webview_controller_creation_params.dart b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/webview_controller_creation_params.dart index 6791ac369ba5..4f56e5409dd7 100644 --- a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/webview_controller_creation_params.dart +++ b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/webview_controller_creation_params.dart @@ -11,8 +11,9 @@ /// This example demonstrates how to extend the [WebViewControllerCreationParams] to /// provide additional platform specific parameters. /// -/// Note that the additional parameters should always accept `null` or have a -/// default value to prevent breaking changes. +/// When extending [WebViewControllerCreationParams] additional parameters +/// should always accept `null` or have a default value to prevent breaking +/// changes. /// /// ```dart /// class IOSWebViewControllerCreationParams extends WebViewControllerCreationParams { diff --git a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/webview_controller_delegate.dart b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/webview_controller_delegate.dart index 7797bbede171..a54aba8b68e6 100644 --- a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/webview_controller_delegate.dart +++ b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/webview_controller_delegate.dart @@ -7,7 +7,7 @@ import 'dart:ui'; import 'package:flutter/foundation.dart'; import 'package:plugin_platform_interface/plugin_platform_interface.dart'; -import 'package:webview_flutter_platform_interface/src/v4/navigation_callback_handler_delegate.dart'; +import 'package:webview_flutter_platform_interface/src/v4/navigation_callback_delegate.dart'; import 'package:webview_flutter_platform_interface/src/v4/types/load_request_params.dart'; import 'types/types.dart'; @@ -163,7 +163,7 @@ abstract class WebViewControllerDelegate extends PlatformInterface { /// Sets the [NavigationCallbackHandler] containing the callback methods that /// are called during navigation events. Future setNavigationCallbackHandler( - NavigationCallbackHandlerDelegate handler) { + NavigationCallbackDelegate handler) { throw UnimplementedError( 'setNavigationCallbackHandler is not implemented on the current platform'); } diff --git a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/webview_platform.dart b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/webview_platform.dart index aa741ccae30a..edf14f53b9de 100644 --- a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/webview_platform.dart +++ b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/webview_platform.dart @@ -8,7 +8,7 @@ import 'package:plugin_platform_interface/plugin_platform_interface.dart'; import 'package:webview_flutter_platform_interface/src/v4/types/types.dart'; import 'package:webview_flutter_platform_interface/src/v4/webview_widget_delegate.dart'; -import 'navigation_callback_handler_delegate.dart'; +import 'navigation_callback_delegate.dart'; import 'webview_controller_delegate.dart'; import 'webview_cookie_manager_delegate.dart'; @@ -47,11 +47,11 @@ abstract class WebViewPlatform extends PlatformInterface { 'createCookieManagerDelegate is not implemented on the current platform.'); } - /// Creates a new [NavigationCallbackHandlerDelegate]. + /// Creates a new [NavigationCallbackDelegate]. /// /// This function should only be called by the app-facing plugin. /// Look at using [NavigationCallbackHandler] in `webview_flutter` instead. - NavigationCallbackHandlerDelegate createNavigationCallbackHandlerDelegate() { + NavigationCallbackDelegate createNavigationCallbackHandlerDelegate() { throw UnimplementedError( 'createNavigationCallbackHandlerDelegate is not implemented on the current platform.'); } diff --git a/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/navigation_callback_handler_delegate_test.dart b/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/navigation_callback_handler_delegate_test.dart index 7f266666e379..712f88f8d693 100644 --- a/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/navigation_callback_handler_delegate_test.dart +++ b/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/navigation_callback_handler_delegate_test.dart @@ -5,7 +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/src/v4/navigation_callback_handler_delegate.dart'; +import 'package:webview_flutter_platform_interface/src/v4/navigation_callback_delegate.dart'; import 'package:webview_flutter_platform_interface/src/v4/webview_platform.dart'; import 'webview_platform_test.mocks.dart'; @@ -20,7 +20,7 @@ void main() { .thenReturn(ImplementsNavigationCallbackHandlerDelegate()); expect(() { - NavigationCallbackHandlerDelegate(); + NavigationCallbackDelegate(); }, throwsNoSuchMethodError); }); @@ -28,21 +28,21 @@ void main() { when(WebViewPlatform.instance!.createNavigationCallbackHandlerDelegate()) .thenReturn(ExtendsNavigationCallbackHandlerDelegate()); - expect(NavigationCallbackHandlerDelegate(), isNotNull); + expect(NavigationCallbackDelegate(), isNotNull); }); test('Can be mocked with `implements`', () { when(WebViewPlatform.instance!.createNavigationCallbackHandlerDelegate()) .thenReturn(MockNavigationCallbackHandlerDelegate()); - expect(NavigationCallbackHandlerDelegate(), isNotNull); + expect(NavigationCallbackDelegate(), isNotNull); }); test( // ignore: lines_longer_than_80_chars 'Default implementation of setOnNavigationRequest should throw unimplemented error', () { - final NavigationCallbackHandlerDelegate callbackHandler = + final NavigationCallbackDelegate callbackHandler = ExtendsNavigationCallbackHandlerDelegate(); expect( @@ -56,7 +56,7 @@ void main() { // ignore: lines_longer_than_80_chars 'Default implementation of setOnPageStarted should throw unimplemented error', () { - final NavigationCallbackHandlerDelegate callbackHandler = + final NavigationCallbackDelegate callbackHandler = ExtendsNavigationCallbackHandlerDelegate(); expect( @@ -69,7 +69,7 @@ void main() { // ignore: lines_longer_than_80_chars 'Default implementation of setOnPageFinished should throw unimplemented error', () { - final NavigationCallbackHandlerDelegate callbackHandler = + final NavigationCallbackDelegate callbackHandler = ExtendsNavigationCallbackHandlerDelegate(); expect( @@ -82,7 +82,7 @@ void main() { // ignore: lines_longer_than_80_chars 'Default implementation of setOnProgress should throw unimplemented error', () { - final NavigationCallbackHandlerDelegate callbackHandler = + final NavigationCallbackDelegate callbackHandler = ExtendsNavigationCallbackHandlerDelegate(); expect( @@ -95,7 +95,7 @@ void main() { // ignore: lines_longer_than_80_chars 'Default implementation of setOnWebResourceError should throw unimplemented error', () { - final NavigationCallbackHandlerDelegate callbackHandler = + final NavigationCallbackDelegate callbackHandler = ExtendsNavigationCallbackHandlerDelegate(); expect( @@ -111,7 +111,7 @@ class MockWebViewPlatformWithMixin extends MockWebViewPlatform MockPlatformInterfaceMixin {} class ImplementsNavigationCallbackHandlerDelegate - implements NavigationCallbackHandlerDelegate { + implements NavigationCallbackDelegate { @override dynamic noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation); } @@ -121,9 +121,9 @@ class MockNavigationCallbackHandlerDelegate extends Mock // ignore: prefer_mixin MockPlatformInterfaceMixin implements - NavigationCallbackHandlerDelegate {} + NavigationCallbackDelegate {} class ExtendsNavigationCallbackHandlerDelegate - extends NavigationCallbackHandlerDelegate { + extends NavigationCallbackDelegate { ExtendsNavigationCallbackHandlerDelegate() : super.implementation(); } diff --git a/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/webview_controller_delegate_test.dart b/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/webview_controller_delegate_test.dart index 9c8ec0731e4c..a26df83de2e7 100644 --- a/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/webview_controller_delegate_test.dart +++ b/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/webview_controller_delegate_test.dart @@ -6,14 +6,14 @@ import 'package:flutter_test/flutter_test.dart'; 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/src/v4/navigation_callback_handler_delegate.dart'; +import 'package:webview_flutter_platform_interface/src/v4/navigation_callback_delegate.dart'; import 'package:webview_flutter_platform_interface/src/v4/webview_controller_delegate.dart'; import 'package:webview_flutter_platform_interface/src/v4/webview_platform.dart'; import 'navigation_callback_handler_delegate_test.dart'; import 'webview_platform_test.mocks.dart'; -@GenerateMocks([NavigationCallbackHandlerDelegate]) +@GenerateMocks([NavigationCallbackDelegate]) void main() { setUp(() { WebViewPlatform.instance = MockWebViewPlatformWithMixin(); From 8495c24ef6136780c014185c8ec33fe95a5b66f6 Mon Sep 17 00:00:00 2001 From: Maurits van Beusekom Date: Tue, 12 Apr 2022 09:48:32 +0200 Subject: [PATCH 15/31] Fixed formatting --- .../lib/src/v4/types/javascript_message.dart | 2 +- .../lib/src/v4/types/load_request_params.dart | 2 +- .../lib/src/v4/types/web_resource_error.dart | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/javascript_message.dart b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/javascript_message.dart index 9d70f4b8026c..e0b19ad674c1 100644 --- a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/javascript_message.dart +++ b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/javascript_message.dart @@ -17,7 +17,7 @@ import '../webview_platform.dart'; /// This example demonstrates how to extend the [JavaScriptMessage] to /// provide additional platform specific parameters. /// -/// When extending [JavaScriptMessage] additional parameters should always +/// When extending [JavaScriptMessage] additional parameters should always /// accept `null` or have a default value to prevent breaking changes. /// /// ```dart diff --git a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/load_request_params.dart b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/load_request_params.dart index aebc5806f9d7..1191be7a6a65 100644 --- a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/load_request_params.dart +++ b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/load_request_params.dart @@ -38,7 +38,7 @@ extension LoadRequestMethodExtensions on LoadRequestMethod { /// This example demonstrates how to extend the [LoadRequestParams] to /// provide additional platform specific parameters. /// -/// When extending [LoadRequestParams] additional parameters should always +/// When extending [LoadRequestParams] additional parameters should always /// accept `null` or have a default value to prevent breaking changes. /// /// ```dart diff --git a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/web_resource_error.dart b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/web_resource_error.dart index bec237cb1c8f..deccb5cb26d9 100644 --- a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/web_resource_error.dart +++ b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/web_resource_error.dart @@ -77,7 +77,7 @@ enum WebResourceErrorType { /// This example demonstrates how to extend the [WebResourceError] to /// provide additional platform specific parameters. /// -/// When extending [WebResourceError] additional parameters should always +/// When extending [WebResourceError] additional parameters should always /// accept `null` or have a default value to prevent breaking changes. /// /// ```dart From c7726548e23ce05521ab4de55e6e64088be819bc Mon Sep 17 00:00:00 2001 From: Maurits van Beusekom Date: Tue, 12 Apr 2022 09:52:55 +0200 Subject: [PATCH 16/31] Regenerate mock classes after rename --- ...=> navigation_callback_delegate_test.dart} | 24 +++++++++---------- .../v4/webview_controller_delegate_test.dart | 4 ++-- ...ebview_controller_delegate_test.mocks.dart | 15 ++++++------ .../src/v4/webview_platform_test.mocks.dart | 19 ++++++++------- 4 files changed, 32 insertions(+), 30 deletions(-) rename packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/{navigation_callback_handler_delegate_test.dart => navigation_callback_delegate_test.dart} (83%) diff --git a/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/navigation_callback_handler_delegate_test.dart b/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/navigation_callback_delegate_test.dart similarity index 83% rename from packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/navigation_callback_handler_delegate_test.dart rename to packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/navigation_callback_delegate_test.dart index 712f88f8d693..530d6c199042 100644 --- a/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/navigation_callback_handler_delegate_test.dart +++ b/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/navigation_callback_delegate_test.dart @@ -17,7 +17,7 @@ void main() { test('Cannot be implemented with `implements`', () { when(WebViewPlatform.instance!.createNavigationCallbackHandlerDelegate()) - .thenReturn(ImplementsNavigationCallbackHandlerDelegate()); + .thenReturn(ImplementsNavigationCallbackDelegate()); expect(() { NavigationCallbackDelegate(); @@ -26,14 +26,14 @@ void main() { test('Can be extended', () { when(WebViewPlatform.instance!.createNavigationCallbackHandlerDelegate()) - .thenReturn(ExtendsNavigationCallbackHandlerDelegate()); + .thenReturn(ExtendsNavigationCallbackDelegate()); expect(NavigationCallbackDelegate(), isNotNull); }); test('Can be mocked with `implements`', () { when(WebViewPlatform.instance!.createNavigationCallbackHandlerDelegate()) - .thenReturn(MockNavigationCallbackHandlerDelegate()); + .thenReturn(MockNavigationCallbackDelegate()); expect(NavigationCallbackDelegate(), isNotNull); }); @@ -43,7 +43,7 @@ void main() { 'Default implementation of setOnNavigationRequest should throw unimplemented error', () { final NavigationCallbackDelegate callbackHandler = - ExtendsNavigationCallbackHandlerDelegate(); + ExtendsNavigationCallbackDelegate(); expect( () => callbackHandler.setOnNavigationRequest( @@ -57,7 +57,7 @@ void main() { 'Default implementation of setOnPageStarted should throw unimplemented error', () { final NavigationCallbackDelegate callbackHandler = - ExtendsNavigationCallbackHandlerDelegate(); + ExtendsNavigationCallbackDelegate(); expect( () => callbackHandler.setOnPageStarted((String url) {}), @@ -70,7 +70,7 @@ void main() { 'Default implementation of setOnPageFinished should throw unimplemented error', () { final NavigationCallbackDelegate callbackHandler = - ExtendsNavigationCallbackHandlerDelegate(); + ExtendsNavigationCallbackDelegate(); expect( () => callbackHandler.setOnPageFinished((String url) {}), @@ -83,7 +83,7 @@ void main() { 'Default implementation of setOnProgress should throw unimplemented error', () { final NavigationCallbackDelegate callbackHandler = - ExtendsNavigationCallbackHandlerDelegate(); + ExtendsNavigationCallbackDelegate(); expect( () => callbackHandler.setOnProgress((int progress) {}), @@ -96,7 +96,7 @@ void main() { 'Default implementation of setOnWebResourceError should throw unimplemented error', () { final NavigationCallbackDelegate callbackHandler = - ExtendsNavigationCallbackHandlerDelegate(); + ExtendsNavigationCallbackDelegate(); expect( () => callbackHandler.setOnWebResourceError((WebResourceError error) {}), @@ -110,20 +110,20 @@ class MockWebViewPlatformWithMixin extends MockWebViewPlatform // ignore: prefer_mixin MockPlatformInterfaceMixin {} -class ImplementsNavigationCallbackHandlerDelegate +class ImplementsNavigationCallbackDelegate implements NavigationCallbackDelegate { @override dynamic noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation); } -class MockNavigationCallbackHandlerDelegate extends Mock +class MockNavigationCallbackDelegate extends Mock with // ignore: prefer_mixin MockPlatformInterfaceMixin implements NavigationCallbackDelegate {} -class ExtendsNavigationCallbackHandlerDelegate +class ExtendsNavigationCallbackDelegate extends NavigationCallbackDelegate { - ExtendsNavigationCallbackHandlerDelegate() : super.implementation(); + ExtendsNavigationCallbackDelegate() : super.implementation(); } diff --git a/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/webview_controller_delegate_test.dart b/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/webview_controller_delegate_test.dart index a26df83de2e7..694c8c4471c7 100644 --- a/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/webview_controller_delegate_test.dart +++ b/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/webview_controller_delegate_test.dart @@ -10,7 +10,7 @@ import 'package:webview_flutter_platform_interface/src/v4/navigation_callback_de import 'package:webview_flutter_platform_interface/src/v4/webview_controller_delegate.dart'; import 'package:webview_flutter_platform_interface/src/v4/webview_platform.dart'; -import 'navigation_callback_handler_delegate_test.dart'; +import 'navigation_callback_delegate_test.dart'; import 'webview_platform_test.mocks.dart'; @GenerateMocks([NavigationCallbackDelegate]) @@ -209,7 +209,7 @@ void main() { expect( () => controller.setNavigationCallbackHandler( - MockNavigationCallbackHandlerDelegate()), + MockNavigationCallbackDelegate()), throwsUnimplementedError, ); }, diff --git a/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/webview_controller_delegate_test.mocks.dart b/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/webview_controller_delegate_test.mocks.dart index 2435e5169914..cffaa64964e7 100644 --- a/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/webview_controller_delegate_test.mocks.dart +++ b/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/webview_controller_delegate_test.mocks.dart @@ -1,16 +1,15 @@ -// Mocks generated by Mockito 5.1.0 from annotations +// Mocks generated by Mockito 5.0.16 from annotations // in webview_flutter_platform_interface/test/src/v4/webview_controller_delegate_test.dart. // Do not manually edit this file. import 'dart:async' as _i3; import 'package:mockito/mockito.dart' as _i1; -import 'package:webview_flutter_platform_interface/src/v4/navigation_callback_handler_delegate.dart' +import 'package:webview_flutter_platform_interface/src/v4/navigation_callback_delegate.dart' as _i2; import 'package:webview_flutter_platform_interface/src/v4/webview_platform.dart' as _i4; -// ignore_for_file: type=lint // ignore_for_file: avoid_redundant_argument_values // ignore_for_file: avoid_setters_without_getters // ignore_for_file: comment_references @@ -20,12 +19,12 @@ import 'package:webview_flutter_platform_interface/src/v4/webview_platform.dart' // ignore_for_file: unnecessary_parenthesis // ignore_for_file: camel_case_types -/// A class which mocks [NavigationCallbackHandlerDelegate]. +/// A class which mocks [NavigationCallbackDelegate]. /// /// See the documentation for Mockito's code generation for more information. -class MockNavigationCallbackHandlerDelegate extends _i1.Mock - implements _i2.NavigationCallbackHandlerDelegate { - MockNavigationCallbackHandlerDelegate() { +class MockNavigationCallbackDelegate extends _i1.Mock + implements _i2.NavigationCallbackDelegate { + MockNavigationCallbackDelegate() { _i1.throwOnMissingStub(this); } @@ -60,4 +59,6 @@ class MockNavigationCallbackHandlerDelegate extends _i1.Mock Invocation.method(#setOnWebResourceError, [onWebResourceError]), returnValue: Future.value(), returnValueForMissingStub: Future.value()) as _i3.Future); + @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 index 67016c3fec56..1fe5bd94133d 100644 --- 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 @@ -1,11 +1,11 @@ -// Mocks generated by Mockito 5.1.0 from annotations +// 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:flutter/foundation.dart' as _i8; import 'package:flutter/gestures.dart' as _i9; import 'package:mockito/mockito.dart' as _i1; -import 'package:webview_flutter_platform_interface/src/v4/navigation_callback_handler_delegate.dart' +import 'package:webview_flutter_platform_interface/src/v4/navigation_callback_delegate.dart' as _i3; import 'package:webview_flutter_platform_interface/src/v4/types/types.dart' as _i4; @@ -18,7 +18,6 @@ import 'package:webview_flutter_platform_interface/src/v4/webview_platform.dart' import 'package:webview_flutter_platform_interface/src/v4/webview_widget_delegate.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 @@ -31,8 +30,8 @@ import 'package:webview_flutter_platform_interface/src/v4/webview_widget_delegat class _FakeWebViewCookieManagerDelegate_0 extends _i1.Fake implements _i2.WebViewCookieManagerDelegate {} -class _FakeNavigationCallbackHandlerDelegate_1 extends _i1.Fake - implements _i3.NavigationCallbackHandlerDelegate {} +class _FakeNavigationCallbackDelegate_1 extends _i1.Fake + implements _i3.NavigationCallbackDelegate {} class _FakeJavaScriptMessage_2 extends _i1.Fake implements _i4.JavaScriptMessage {} @@ -60,11 +59,11 @@ class MockWebViewPlatform extends _i1.Mock implements _i7.WebViewPlatform { returnValue: _FakeWebViewCookieManagerDelegate_0()) as _i2.WebViewCookieManagerDelegate); @override - _i3.NavigationCallbackHandlerDelegate - createNavigationCallbackHandlerDelegate() => (super.noSuchMethod( + _i3.NavigationCallbackDelegate createNavigationCallbackHandlerDelegate() => + (super.noSuchMethod( Invocation.method(#createNavigationCallbackHandlerDelegate, []), - returnValue: _FakeNavigationCallbackHandlerDelegate_1()) - as _i3.NavigationCallbackHandlerDelegate); + returnValue: _FakeNavigationCallbackDelegate_1()) + as _i3.NavigationCallbackDelegate); @override _i4.JavaScriptMessage createJavaScriptMessage(String? message) => (super .noSuchMethod(Invocation.method(#createJavaScriptMessage, [message]), @@ -98,4 +97,6 @@ class MockWebViewPlatform extends _i1.Mock implements _i7.WebViewPlatform { }), returnValue: _FakeWebViewWidgetDelegate_5()) as _i6.WebViewWidgetDelegate); + @override + String toString() => super.toString(); } From f42f02258436429b2692aab034b8c5df1fded548 Mon Sep 17 00:00:00 2001 From: Maurits van Beusekom Date: Tue, 12 Apr 2022 09:55:21 +0200 Subject: [PATCH 17/31] Fixed formatting --- .../test/src/v4/navigation_callback_delegate_test.dart | 3 +-- .../test/src/v4/webview_controller_delegate_test.dart | 4 ++-- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/navigation_callback_delegate_test.dart b/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/navigation_callback_delegate_test.dart index 530d6c199042..798eb4bfa02b 100644 --- a/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/navigation_callback_delegate_test.dart +++ b/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/navigation_callback_delegate_test.dart @@ -123,7 +123,6 @@ class MockNavigationCallbackDelegate extends Mock implements NavigationCallbackDelegate {} -class ExtendsNavigationCallbackDelegate - extends NavigationCallbackDelegate { +class ExtendsNavigationCallbackDelegate extends NavigationCallbackDelegate { ExtendsNavigationCallbackDelegate() : super.implementation(); } diff --git a/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/webview_controller_delegate_test.dart b/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/webview_controller_delegate_test.dart index 694c8c4471c7..b393b276d378 100644 --- a/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/webview_controller_delegate_test.dart +++ b/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/webview_controller_delegate_test.dart @@ -208,8 +208,8 @@ void main() { ExtendsWebViewControllerDelegate(); expect( - () => controller.setNavigationCallbackHandler( - MockNavigationCallbackDelegate()), + () => controller + .setNavigationCallbackHandler(MockNavigationCallbackDelegate()), throwsUnimplementedError, ); }, From dca96f07b2f95add924e2ec611be925017807b76 Mon Sep 17 00:00:00 2001 From: Maurits van Beusekom Date: Wed, 13 Apr 2022 09:56:51 +0200 Subject: [PATCH 18/31] Removed WebSettings object. Added individual setters for all settings defined in the `WebSettings` class to the `WebViewControllerDelegate` and removed the `WebViewControllerDelegate.updateSettings` method as it became obsolete. --- .../lib/src/v4/types/types.dart | 3 +- .../lib/src/v4/types/web_setting.dart | 65 ++++++ .../src/v4/types/web_settings_delegate.dart | 185 ------------------ ...web_settings_delegate_creation_params.dart | 51 ----- .../src/v4/webview_controller_delegate.dart | 45 ++++- .../lib/src/v4/webview_platform.dart | 11 -- .../test/src/v4/types/web_setting_test.dart | 26 +++ .../v4/types/web_settings_delegate_test.dart | 104 ---------- .../v4/webview_controller_delegate_test.dart | 99 ++++++++-- .../test/src/v4/webview_platform_test.dart | 15 -- .../src/v4/webview_platform_test.mocks.dart | 19 +- 11 files changed, 211 insertions(+), 412 deletions(-) create mode 100644 packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/web_setting.dart delete mode 100644 packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/web_settings_delegate.dart delete mode 100644 packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/web_settings_delegate_creation_params.dart create mode 100644 packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/types/web_setting_test.dart delete mode 100644 packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/types/web_settings_delegate_test.dart diff --git a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/types.dart b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/types.dart index cd80a1ea44be..0e30dc429079 100644 --- a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/types.dart +++ b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/types.dart @@ -6,7 +6,6 @@ export 'javascript_message.dart'; export 'javascript_mode.dart'; export 'load_request_params.dart'; export 'web_resource_error.dart'; -export 'web_settings_delegate.dart'; -export 'web_settings_delegate_creation_params.dart'; +export 'web_setting.dart'; export 'webview_controller_creation_params.dart'; export 'webview_cookie.dart'; diff --git a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/web_setting.dart b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/web_setting.dart new file mode 100644 index 000000000000..5c5f25c7c142 --- /dev/null +++ b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/web_setting.dart @@ -0,0 +1,65 @@ +// 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/widgets.dart'; + + +/// A single setting for configuring a WebViewPlatform which may be absent. +@immutable +class WebSetting { + /// Constructs an absent setting instance. + /// + /// The [isPresent] field for the instance will be false. + /// + /// Accessing [value] for an absent instance will throw. + const WebSetting.absent() + : _value = null, + isPresent = false; + + /// Constructs a setting of the given `value`. + /// + /// The [isPresent] field for the instance will be true. + const WebSetting.of(T value) + : _value = value, + isPresent = true; + + final T? _value; + + /// The setting's value. + /// + /// Throws if [WebSetting.isPresent] is false. + T get value { + if (!isPresent) { + throw StateError('Cannot access a value of an absent WebSetting'); + } + assert(isPresent); + // The intention of this getter is to return T whether it is nullable or + // not whereas _value is of type T? since _value can be null even when + // T is not nullable (when isPresent == false). + // + // We promote _value to T using `as T` instead of `!` operator to handle + // the case when _value is legitimately null (and T is a nullable type). + // `!` operator would always throw if _value is null. + return _value as T; + } + + /// True when this web setting instance contains a value. + /// + /// When false the [WebSetting.value] getter throws. + final bool isPresent; + + @override + bool operator ==(Object other) { + if (other.runtimeType != runtimeType) { + return false; + } + + return other is WebSetting && + other.isPresent == isPresent && + other._value == _value; + } + + @override + int get hashCode => Object.hash(_value, isPresent); +} diff --git a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/web_settings_delegate.dart b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/web_settings_delegate.dart deleted file mode 100644 index 073a35f2e89f..000000000000 --- a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/web_settings_delegate.dart +++ /dev/null @@ -1,185 +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/widgets.dart'; -import 'package:plugin_platform_interface/plugin_platform_interface.dart'; - -import '../webview_platform.dart'; -import 'javascript_mode.dart'; -import 'web_settings_delegate_creation_params.dart'; - -/// A single setting for configuring a WebViewPlatform which may be absent. -@immutable -class WebSetting { - /// Constructs an absent setting instance. - /// - /// The [isPresent] field for the instance will be false. - /// - /// Accessing [value] for an absent instance will throw. - const WebSetting.absent() - : _value = null, - isPresent = false; - - /// Constructs a setting of the given `value`. - /// - /// The [isPresent] field for the instance will be true. - const WebSetting.of(T value) - : _value = value, - isPresent = true; - - final T? _value; - - /// The setting's value. - /// - /// Throws if [WebSetting.isPresent] is false. - T get value { - if (!isPresent) { - throw StateError('Cannot access a value of an absent WebSetting'); - } - assert(isPresent); - // The intention of this getter is to return T whether it is nullable or - // not whereas _value is of type T? since _value can be null even when - // T is not nullable (when isPresent == false). - // - // We promote _value to T using `as T` instead of `!` operator to handle - // the case when _value is legitimately null (and T is a nullable type). - // `!` operator would always throw if _value is null. - return _value as T; - } - - /// True when this web setting instance contains a value. - /// - /// When false the [WebSetting.value] getter throws. - final bool isPresent; - - @override - bool operator ==(Object other) { - if (other.runtimeType != runtimeType) { - return false; - } - - return other is WebSetting && - other.isPresent == isPresent && - other._value == _value; - } - - @override - int get hashCode => Object.hash(_value, isPresent); -} - -/// Defines the parameters to configure a [WebViewPlatform]. -/// -/// Initial settings are passed as part of [CreationParams], settings updates -/// are sent with [WebViewPlatformController#updateSettings]. -/// -/// Platform specific implementations can add additional fields by extending this -/// class and provide a factory method that takes the -/// [WebSettingsDelegate] as a parameter. -/// -/// {@tool sample} -/// This example demonstrates how to extend the [WebSettingsDelegate] to -/// provide additional platform specific parameters. -/// -/// Note that the additional parameters should always accept `null` or have a -/// default value to prevent breaking changes. -/// -/// ```dart -/// class AndroidWebSettingsDelegate extends WebSettingsDelegate { -/// AndroidWebSettingsDelegate._( -/// WebSettingsDelegate webSettingsDelegate, -/// this.historyUrl, -/// ) : super( -/// allowsInlineMediaPlayback: webSettingsDelegate.allowsInlineMediaPlayback, -/// debuggingEnabled: webSettingsDelegate.debuggingEnabled, -/// gestureNavigationEnabled: webSettingsDelegate.gestureNavigationEnabled, -/// hasNavigationDelegate: webSettingsDelegate.hasNavigationDelegate, -/// hasProgressTracking: webSettingsDelegate.hasProgressTracking, -/// javaScriptMode: webSettingsDelegate.javaScriptMode, -/// userAgent: webSettingsDelegate.userAgent, -/// zoomEnabled: webSettingsDelegate.zoomEnabled, -/// ); -/// -/// factory AndroidWebSettingsDelegate.fromWebSettingsDelegate( -/// WebSettingsDelegate webSettings, { -/// Uri? historyUrl, -/// }) { -/// return AndroidWebSettingsDelegate._( -/// webSettings: webSettings, -/// historyUrl: historyUrl, -/// ); -/// } -/// -/// final Uri? historyUrl; -/// } -/// ``` -/// {@end-tool} -class WebSettingsDelegate extends PlatformInterface { - /// Construct an instance with initial settings. - /// - /// Future setting changes can be sent with [WebViewPlatformController#updateSettings]. - factory WebSettingsDelegate({ - required WebSettingsDelegateCreationParams options, - }) { - final WebSettingsDelegate webSettingsDelegate = - WebViewPlatform.instance!.createWebSettingsDelegate( - options: options, - ); - PlatformInterface.verify(webSettingsDelegate, _token); - return webSettingsDelegate; - } - - /// Used by the platform implementation to create a new - /// [WebSettingsDelegate]. - /// - /// Should only be used by platform implementations because they can't extend - /// a class that only contains a factory constructor. - @protected - WebSettingsDelegate.implementation({ - required WebSettingsDelegateCreationParams options, - }) : allowsInlineMediaPlayback = options.allowsInlineMediaPlayback, - userAgent = options.userAgent, - debuggingEnabled = options.debuggingEnabled, - gestureNavigationEnabled = options.gestureNavigationEnabled, - javaScriptMode = options.javaScriptMode, - zoomEnabled = options.zoomEnabled, - super(token: _token); - - static final Object _token = Object(); - - /// Whether to play HTML5 videos inline or use the native full-screen controller on platforms that provide this functionality. - /// - /// This will be ignored on platforms that don't support it (such as Android). - final bool? allowsInlineMediaPlayback; - - /// Whether to enable the platform's webview content debugging tools. - /// - /// See also: [WebView.debuggingEnabled]. - final bool? debuggingEnabled; - - /// Whether to allow swipe based navigation on supported platforms. - /// - /// See also: [WebView.gestureNavigationEnabled] - final bool? gestureNavigationEnabled; - - /// The JavaScript execution mode to be used by the webview. - final JavaScriptMode? javaScriptMode; - - /// The value used for the HTTP `User-Agent:` request header. - /// - /// If [userAgent.value] is null the platform's default user agent should be used. - /// - /// An absent value ([userAgent.isPresent] is false) represents no change to this setting from the - /// last time it was set. - /// - /// See also [WebView.userAgent]. - final WebSetting userAgent; - - /// Sets whether the WebView should support zooming using its on-screen zoom controls and gestures. - final bool? zoomEnabled; - - @override - String toString() { - return 'WebSettings(javaScriptMode: $javaScriptMode, debuggingEnabled: $debuggingEnabled, gestureNavigationEnabled: $gestureNavigationEnabled, userAgent: $userAgent, allowsInlineMediaPlayback: $allowsInlineMediaPlayback)'; - } -} diff --git a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/web_settings_delegate_creation_params.dart b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/web_settings_delegate_creation_params.dart deleted file mode 100644 index bfd1fe8442c6..000000000000 --- a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/web_settings_delegate_creation_params.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 'javascript_mode.dart'; -import 'web_settings_delegate.dart'; - -/// Parameters object for creating a [WebSettingsDelegate] object. -/// See more at [WebViewPlatform.createWebSettingsDelegate]. -class WebSettingsDelegateCreationParams { - /// Constructs a new [WebSettingsDelegateCreationParams] object. - const WebSettingsDelegateCreationParams({ - required this.userAgent, - this.allowsInlineMediaPlayback, - this.debuggingEnabled, - this.gestureNavigationEnabled, - this.javaScriptMode, - this.zoomEnabled, - }); - - /// The value used for the HTTP `User-Agent:` request header. - /// - /// If [userAgent.value] is null the platform's default user agent should be used. - /// - /// An absent value ([userAgent.isPresent] is false) represents no change to this setting from the - /// last time it was set. - /// - /// See also [WebView.userAgent]. - final WebSetting userAgent; - - /// Whether to play HTML5 videos inline or use the native full-screen controller on platforms that provide this functionality. - /// - /// This will be ignored on platforms that don't support it (such as Android). - final bool? allowsInlineMediaPlayback; - - /// Whether to enable the platform's webview content debugging tools. - /// - /// See also: [WebView.debuggingEnabled]. - final bool? debuggingEnabled; - - /// Whether to allow swipe based navigation on supported platforms. - /// - /// See also: [WebView.gestureNavigationEnabled] - final bool? gestureNavigationEnabled; - - /// The JavaScript execution mode to be used by the webview. - final JavaScriptMode? javaScriptMode; - - /// Sets whether the WebView should support zooming using its on-screen zoom controls and gestures. - final bool? zoomEnabled; -} diff --git a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/webview_controller_delegate.dart b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/webview_controller_delegate.dart index a54aba8b68e6..729eec92347b 100644 --- a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/webview_controller_delegate.dart +++ b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/webview_controller_delegate.dart @@ -96,15 +96,6 @@ abstract class WebViewControllerDelegate extends PlatformInterface { 'loadRequest is not implemented on the current platform'); } - /// Updates the webview settings. - /// - /// Any non null field in `settings` will be set as the new setting value. - /// All null fields in `settings` are ignored. - Future updateSettings(WebSettingsDelegate setting) { - throw UnimplementedError( - 'updateSettings is not implemented on the current platform'); - } - /// Accessor to the current URL that the WebView is displaying. /// /// If no URL was ever loaded, returns `null`. @@ -234,11 +225,47 @@ abstract class WebViewControllerDelegate extends PlatformInterface { 'getScrollPosition is not implemented on the current platform'); } + /// Wether to enable the platform's webview content debugging tools. + Future enableDebugging(bool enabled) { + throw UnimplementedError( + 'enableDebugging is not implemented on the current platform'); + } + + /// Wether to allow swipe based navigation on supported platforms. + Future enableGestureNavigation(bool enabled) { + throw UnimplementedError( + 'enableGestureNavigation is not implemented on the current platform'); + } + + /// Whether to support zooming using its on-screen zoom controls and gestures. + Future enableZoom(bool enabled) { + throw UnimplementedError( + 'enableZoom is not implemented on the current platform'); + } + /// Set the current background color of this view. Future setBackgroundColor(Color color) { throw UnimplementedError( 'setBackgroundColor is not implemented on the current platform'); } + + /// Sets the JavaScript execution mode to be used by the webview. + Future setJavaScriptMode(JavaScriptMode javaScriptMode) { + throw UnimplementedError( + 'setJavaScriptMode is not implemented on the current platform'); + } + + /// Sets the value used for the HTTP `User-Agent:` request header. + /// + /// If [userAgent.value] is null the platform's default user agent should be + /// used. + /// + /// An absent value ([userAgent.isPresent] is false) represents no change to + /// this setting from the last time it was set. + Future setUserAgent(WebSetting userAgent) { + throw UnimplementedError( + 'setUserAgent is not implemented on the current platform'); + } } /// Describes the parameters necessary for registering a JavaScript channel. diff --git a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/webview_platform.dart b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/webview_platform.dart index edf14f53b9de..9e96ab573198 100644 --- a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/webview_platform.dart +++ b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/webview_platform.dart @@ -62,17 +62,6 @@ abstract class WebViewPlatform extends PlatformInterface { 'createJavaScriptMessage is not implemented on the current platform.'); } - /// Create a new [WebSettingsDelegate]. - /// - /// This function should only be called by the app-facing plugin. - /// Look at using [WebSettings] in `webview_flutter` instead. - WebSettingsDelegate createWebSettingsDelegate({ - required WebSettingsDelegateCreationParams options, - }) { - throw UnimplementedError( - 'createWebSettingsDelegate is not implemented on the current platform.'); - } - /// Create a new [WebViewControllerDelegate]. /// /// This function should only be called by the app-facing plugin. diff --git a/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/types/web_setting_test.dart b/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/types/web_setting_test.dart new file mode 100644 index 000000000000..a35aa6358736 --- /dev/null +++ b/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/types/web_setting_test.dart @@ -0,0 +1,26 @@ +// 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_test/flutter_test.dart'; +import 'package:webview_flutter_platform_interface/src/v4/webview_platform.dart'; + +void main() { + TestWidgetsFlutterBinding.ensureInitialized(); + + test('absent should initialize isPresent to false', () { + const WebSetting absent = WebSetting.absent(); + expect(absent.isPresent, isFalse); + }); + + test('Cannot access value of absent setting', () { + const WebSetting absent = WebSetting.absent(); + expect(() => absent.value, throwsA(isA())); + }); + + test('Setting should return value it is initialized with', () { + const WebSetting setting = WebSetting.of('Test value'); + expect(setting.isPresent, isTrue); + expect(setting.value, 'Test value'); + }); +} diff --git a/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/types/web_settings_delegate_test.dart b/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/types/web_settings_delegate_test.dart deleted file mode 100644 index fcaafa374f21..000000000000 --- a/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/types/web_settings_delegate_test.dart +++ /dev/null @@ -1,104 +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_test/flutter_test.dart'; -import 'package:mockito/mockito.dart'; -import 'package:plugin_platform_interface/plugin_platform_interface.dart'; -import 'package:webview_flutter_platform_interface/src/v4/webview_platform.dart'; - -import '../webview_platform_test.mocks.dart'; - -void main() { - TestWidgetsFlutterBinding.ensureInitialized(); - - group('WebSetting', () { - test('absent should initialize isPresent to false', () { - const WebSetting absent = WebSetting.absent(); - expect(absent.isPresent, isFalse); - }); - - test('Cannot access value of absent setting', () { - const WebSetting absent = WebSetting.absent(); - expect(() => absent.value, throwsA(isA())); - }); - - test('Setting should return value it is initialized with', () { - const WebSetting setting = WebSetting.of('Test value'); - expect(setting.isPresent, isTrue); - expect(setting.value, 'Test value'); - }); - }); - - group('WebSettingsDelegate', () { - setUp(() { - WebViewPlatform.instance = MockWebViewPlatformWithMixin(); - }); - - test('Cannot be implemented with `implements`', () { - const WebSetting absentSetting = WebSetting.absent(); - when(WebViewPlatform.instance!.createWebSettingsDelegate( - options: const WebSettingsDelegateCreationParams( - userAgent: absentSetting, - ), - )).thenReturn(ImplementsWebSettingsDelegate()); - - expect(() { - WebSettingsDelegate( - options: const WebSettingsDelegateCreationParams( - userAgent: absentSetting, - ), - ); - }, throwsNoSuchMethodError); - }); - - test('Can be extended', () { - const WebSetting absentSetting = WebSetting.absent(); - const WebSettingsDelegateCreationParams options = - WebSettingsDelegateCreationParams( - userAgent: absentSetting, - ); - when(WebViewPlatform.instance!.createWebSettingsDelegate( - options: options, - )).thenReturn(ExtendsWebSettingsDelegate(options: options)); - - expect(WebSettingsDelegate(options: options), isNotNull); - }); - - test('Can be mocked with `implements`', () { - const WebSetting absentSetting = WebSetting.absent(); - const WebSettingsDelegateCreationParams options = - WebSettingsDelegateCreationParams( - userAgent: absentSetting, - ); - when(WebViewPlatform.instance! - .createWebSettingsDelegate(options: options)) - .thenReturn(MockWebSettingsDelegate()); - - expect(WebSettingsDelegate(options: options), isNotNull); - }); - }); -} - -class MockWebViewPlatformWithMixin extends MockWebViewPlatform - with - // ignore: prefer_mixin - MockPlatformInterfaceMixin {} - -class ImplementsWebSettingsDelegate implements WebSettingsDelegate { - @override - dynamic noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation); -} - -class MockWebSettingsDelegate extends Mock - with - // ignore: prefer_mixin - MockPlatformInterfaceMixin - implements - WebSettingsDelegate {} - -class ExtendsWebSettingsDelegate extends WebSettingsDelegate { - ExtendsWebSettingsDelegate({ - required WebSettingsDelegateCreationParams options, - }) : super.implementation(options: options); -} diff --git a/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/webview_controller_delegate_test.dart b/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/webview_controller_delegate_test.dart index b393b276d378..8f83d659cf09 100644 --- a/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/webview_controller_delegate_test.dart +++ b/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/webview_controller_delegate_test.dart @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:mockito/annotations.dart'; import 'package:mockito/mockito.dart'; @@ -99,19 +100,6 @@ void main() { ); }); - test( - // ignore: lines_longer_than_80_chars - 'Default implementation of updateSettings should throw unimplemented error', - () { - final WebViewControllerDelegate controller = - ExtendsWebViewControllerDelegate(); - - expect( - () => controller.updateSettings(MockWebSettingsDelegate()), - throwsUnimplementedError, - ); - }); - test( // ignore: lines_longer_than_80_chars 'Default implementation of currentUrl should throw unimplemented error', @@ -323,6 +311,84 @@ void main() { throwsUnimplementedError, ); }); + + test( + // ignore: lines_longer_than_80_chars + 'Default implementation of enableDebugging should throw unimplemented error', + () { + final WebViewControllerDelegate controller = + ExtendsWebViewControllerDelegate(); + + expect( + () => controller.enableDebugging(true), + throwsUnimplementedError, + ); + }); + + test( + // ignore: lines_longer_than_80_chars + 'Default implementation of enableGestureNavigation should throw unimplemented error', + () { + final WebViewControllerDelegate controller = + ExtendsWebViewControllerDelegate(); + + expect( + () => controller.enableGestureNavigation(true), + throwsUnimplementedError, + ); + }); + + test( + // ignore: lines_longer_than_80_chars + 'Default implementation of enableZoom should throw unimplemented error', + () { + final WebViewControllerDelegate controller = + ExtendsWebViewControllerDelegate(); + + expect( + () => controller.enableZoom(true), + throwsUnimplementedError, + ); + }); + + test( + // ignore: lines_longer_than_80_chars + 'Default implementation of setBackgroundColor should throw unimplemented error', + () { + final WebViewControllerDelegate controller = + ExtendsWebViewControllerDelegate(); + + expect( + () => controller.setBackgroundColor(Colors.blue), + throwsUnimplementedError, + ); + }); + + test( + // ignore: lines_longer_than_80_chars + 'Default implementation of setJavaScriptMode should throw unimplemented error', + () { + final WebViewControllerDelegate controller = + ExtendsWebViewControllerDelegate(); + + expect( + () => controller.setJavaScriptMode(JavaScriptMode.disabled), + throwsUnimplementedError, + ); + }); + + test( + // ignore: lines_longer_than_80_chars + 'Default implementation of setUserAgent should throw unimplemented error', + () { + final WebViewControllerDelegate controller = + ExtendsWebViewControllerDelegate(); + + expect( + () => controller.setUserAgent(const WebSetting.absent()), + throwsUnimplementedError, + ); + }); } class MockWebViewPlatformWithMixin extends MockWebViewPlatform @@ -353,10 +419,3 @@ class MockLoadRequestParamsDelegate extends Mock MockPlatformInterfaceMixin implements LoadRequestParams {} - -class MockWebSettingsDelegate extends Mock - with - //ignore: prefer_mixin - MockPlatformInterfaceMixin - implements - WebSettingsDelegate {} 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/src/v4/webview_platform_test.dart index eacbab968eb6..2233415060f4 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/src/v4/webview_platform_test.dart @@ -68,21 +68,6 @@ void main() { ); }); - test( - // ignore: lines_longer_than_80_chars - 'Default implementation of createWebSettingsDelegate should throw unimplemented error', - () { - final WebViewPlatform webViewPlatform = ExtendsWebViewPlatform(); - - expect( - () => webViewPlatform.createWebSettingsDelegate( - options: const WebSettingsDelegateCreationParams( - userAgent: WebSetting.absent()), - ), - throwsUnimplementedError, - ); - }); - test( // ignore: lines_longer_than_80_chars 'Default implementation of createWebViewControllerDelegate should throw unimplemented error', 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 index 1fe5bd94133d..8cfe6e8f7bf7 100644 --- 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 @@ -36,13 +36,10 @@ class _FakeNavigationCallbackDelegate_1 extends _i1.Fake class _FakeJavaScriptMessage_2 extends _i1.Fake implements _i4.JavaScriptMessage {} -class _FakeWebSettingsDelegate_3 extends _i1.Fake - implements _i4.WebSettingsDelegate {} - -class _FakeWebViewControllerDelegate_4 extends _i1.Fake +class _FakeWebViewControllerDelegate_3 extends _i1.Fake implements _i5.WebViewControllerDelegate {} -class _FakeWebViewWidgetDelegate_5 extends _i1.Fake +class _FakeWebViewWidgetDelegate_4 extends _i1.Fake implements _i6.WebViewWidgetDelegate {} /// A class which mocks [WebViewPlatform]. @@ -69,19 +66,11 @@ class MockWebViewPlatform extends _i1.Mock implements _i7.WebViewPlatform { .noSuchMethod(Invocation.method(#createJavaScriptMessage, [message]), returnValue: _FakeJavaScriptMessage_2()) as _i4.JavaScriptMessage); @override - _i4.WebSettingsDelegate createWebSettingsDelegate( - {_i4.WebSettingsDelegateCreationParams? options}) => - (super.noSuchMethod( - Invocation.method( - #createWebSettingsDelegate, [], {#options: options}), - returnValue: _FakeWebSettingsDelegate_3()) - as _i4.WebSettingsDelegate); - @override _i5.WebViewControllerDelegate createWebViewControllerDelegate( _i4.WebViewControllerCreationParams? params) => (super.noSuchMethod( Invocation.method(#createWebViewControllerDelegate, [params]), - returnValue: _FakeWebViewControllerDelegate_4()) + returnValue: _FakeWebViewControllerDelegate_3()) as _i5.WebViewControllerDelegate); @override _i6.WebViewWidgetDelegate createWebViewWidgetDelegate( @@ -95,7 +84,7 @@ class MockWebViewPlatform extends _i1.Mock implements _i7.WebViewPlatform { #controller: controller, #gestureRecognizers: gestureRecognizers }), - returnValue: _FakeWebViewWidgetDelegate_5()) + returnValue: _FakeWebViewWidgetDelegate_4()) as _i6.WebViewWidgetDelegate); @override String toString() => super.toString(); From 221e386d6a4fabcfe12de8e1241e654d6fed8118 Mon Sep 17 00:00:00 2001 From: Maurits van Beusekom Date: Wed, 13 Apr 2022 10:02:55 +0200 Subject: [PATCH 19/31] Fixed formatting --- .../lib/src/v4/types/web_setting.dart | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/web_setting.dart b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/web_setting.dart index 5c5f25c7c142..abd17a405215 100644 --- a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/web_setting.dart +++ b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/web_setting.dart @@ -4,7 +4,6 @@ import 'package:flutter/widgets.dart'; - /// A single setting for configuring a WebViewPlatform which may be absent. @immutable class WebSetting { From 9760d52a2e98b9a7e8c3a2562aaf1c959e835134 Mon Sep 17 00:00:00 2001 From: Maurits van Beusekom Date: Wed, 13 Apr 2022 10:13:15 +0200 Subject: [PATCH 20/31] Bump version number --- .../webview_flutter_platform_interface/CHANGELOG.md | 4 ++++ .../webview_flutter_platform_interface/pubspec.yaml | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/packages/webview_flutter/webview_flutter_platform_interface/CHANGELOG.md b/packages/webview_flutter/webview_flutter_platform_interface/CHANGELOG.md index 500bee7d2622..85fa3af3910c 100644 --- a/packages/webview_flutter/webview_flutter_platform_interface/CHANGELOG.md +++ b/packages/webview_flutter/webview_flutter_platform_interface/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.9.0 + +* Adds the first iteration of the v4 webview_flutter interface implementation. + ## 1.8.1 * Update to use the `verify` method introduced in platform_plugin_interface 2.1.0. diff --git a/packages/webview_flutter/webview_flutter_platform_interface/pubspec.yaml b/packages/webview_flutter/webview_flutter_platform_interface/pubspec.yaml index 113579e8bcb8..be39558dfd29 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 @@ repository: https://github.com/flutter/plugins/tree/main/packages/webview_flutte 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.8.1 +version: 1.9.0 environment: sdk: ">=2.12.0 <3.0.0" From b13b4ddb931e742bb095b18bc4d45f4e3251cc84 Mon Sep 17 00:00:00 2001 From: Maurits van Beusekom Date: Wed, 13 Apr 2022 10:19:23 +0200 Subject: [PATCH 21/31] Added dependency on meta package --- .../webview_flutter_platform_interface/pubspec.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/webview_flutter/webview_flutter_platform_interface/pubspec.yaml b/packages/webview_flutter/webview_flutter_platform_interface/pubspec.yaml index be39558dfd29..b1dde57ef2c1 100644 --- a/packages/webview_flutter/webview_flutter_platform_interface/pubspec.yaml +++ b/packages/webview_flutter/webview_flutter_platform_interface/pubspec.yaml @@ -13,6 +13,7 @@ environment: dependencies: flutter: sdk: flutter + meta: ^1.7.0 plugin_platform_interface: ^2.1.0 dev_dependencies: From 46bca5f733ae5346a66c22d9963ccbca3841a569 Mon Sep 17 00:00:00 2001 From: Maurits van Beusekom Date: Thu, 14 Apr 2022 11:16:14 +0200 Subject: [PATCH 22/31] Applied feedback from review --- .../src/v4/navigation_callback_delegate.dart | 32 ++++----- .../lib/src/v4/types/javascript_message.dart | 37 ++++------- .../lib/src/v4/types/load_request_params.dart | 34 +++++----- .../navigation_callback_creation_params.dart | 31 +++++++++ .../lib/src/v4/types/types.dart | 4 +- .../lib/src/v4/types/web_resource_error.dart | 26 ++++---- .../lib/src/v4/types/web_setting.dart | 64 ------------------ .../lib/src/v4/types/webview_cookie.dart | 16 +---- ...ebview_cookie_manager_creation_params.dart | 31 +++++++++ .../types/webview_widget_creation_params.dart | 65 ++++++++++++++++++ .../src/v4/webview_controller_delegate.dart | 22 ++++--- .../v4/webview_cookie_manager_delegate.dart | 11 +++- .../lib/src/v4/webview_platform.dart | 30 ++++----- .../lib/src/v4/webview_widget_delegate.dart | 62 ++--------------- .../pubspec.yaml | 1 - .../v4/navigation_callback_delegate_test.dart | 55 +++++++++------- .../test/src/v4/types/web_setting_test.dart | 26 -------- .../v4/webview_controller_delegate_test.dart | 66 ++++++++++--------- ...ebview_controller_delegate_test.mocks.dart | 40 ++++++----- .../test/src/v4/webview_platform_test.dart | 28 ++++++-- .../src/v4/webview_platform_test.mocks.dart | 65 ++++++++---------- .../src/v4/webview_widget_delegate_test.dart | 28 ++++---- 22 files changed, 379 insertions(+), 395 deletions(-) create mode 100644 packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/navigation_callback_creation_params.dart delete mode 100644 packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/web_setting.dart create mode 100644 packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/webview_cookie_manager_creation_params.dart create mode 100644 packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/webview_widget_creation_params.dart delete mode 100644 packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/types/web_setting_test.dart diff --git a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/navigation_callback_delegate.dart b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/navigation_callback_delegate.dart index 5e4d2549af74..aec182f72226 100644 --- a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/navigation_callback_delegate.dart +++ b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/navigation_callback_delegate.dart @@ -11,16 +11,16 @@ import 'webview_platform.dart'; /// An interface defining navigation events that occur on the native platform. /// -/// The [WebViewControllerDelegate] is notifying this handler on events that +/// The [WebViewControllerDelegate] is notifying this delegate on events that /// happened on the platform's webview. Platform implementations should /// implement this class and pass an instance to the[WebViewControllerDelegate]. abstract class NavigationCallbackDelegate extends PlatformInterface { - /// Creates a new [NavigationCallbacksHandlerDelegate] - factory NavigationCallbackDelegate() { - final NavigationCallbackDelegate callbackHandlerDelegate = - WebViewPlatform.instance!.createNavigationCallbackHandlerDelegate(); - PlatformInterface.verify(callbackHandlerDelegate, _token); - return callbackHandlerDelegate; + /// Creates a new [NavigationCallbackDelegate] + factory NavigationCallbackDelegate(NavigationCallbackCreationParams params) { + final NavigationCallbackDelegate callbackDelegate = + WebViewPlatform.instance!.createNavigationCallbackDelegate(params); + PlatformInterface.verify(callbackDelegate, _token); + return callbackDelegate; } /// Used by the platform implementation to create a new [NavigationCallbackDelegate]. @@ -28,15 +28,18 @@ abstract class NavigationCallbackDelegate extends PlatformInterface { /// Should only be used by platform implementations because they can't extend /// a class that only contains a factory constructor. @protected - NavigationCallbackDelegate.implementation() : super(token: _token); + NavigationCallbackDelegate.implementation(this.params) : super(token: _token); static final Object _token = Object(); + /// The parameters used to initialize the [NavigationCallbackDelegate]. + final NavigationCallbackCreationParams params; + /// Invoked when a navigation request is pending. /// - /// See [WebViewControllerDelegate.setNavigationCallbackHandler]. + /// See [WebViewControllerDelegate.setNavigationCallbackDelegate]. Future setOnNavigationRequest( - void Function({required String url, required bool isForMainFrame}) + FutureOr Function({required String url, required bool isForMainFrame}) onNavigationRequest, ) { throw UnimplementedError( @@ -45,7 +48,7 @@ abstract class NavigationCallbackDelegate extends PlatformInterface { /// Invoked when a page has started loading. /// - /// See [WebViewControllerDelegate.setNavigationCallbackHandler]. + /// See [WebViewControllerDelegate.setNavigationCallbackDelegate]. Future setOnPageStarted( void Function(String url) onPageStarted, ) { @@ -55,7 +58,7 @@ abstract class NavigationCallbackDelegate extends PlatformInterface { /// Invoked when a page has finished loading. /// - /// See [WebViewControllerDelegate.setNavigationCallbackHandler]. + /// See [WebViewControllerDelegate.setNavigationCallbackDelegate]. Future setOnPageFinished( void Function(String url) onPageFinished, ) { @@ -65,8 +68,7 @@ abstract class NavigationCallbackDelegate extends PlatformInterface { /// Invoked when a page is loading to report the progress. /// - /// Only works when [WebSettings.hasProgressTracking] is set to `true`. - /// See [WebViewControllerDelegate.setNavigationCallbackHandler]. + /// See [WebViewControllerDelegate.setNavigationCallbackDelegate]. Future setOnProgress( void Function(int progress) onProgress, ) { @@ -76,7 +78,7 @@ abstract class NavigationCallbackDelegate extends PlatformInterface { /// Invoked when a resource loading error occurred. /// - /// See [WebViewControllerDelegate.setNavigationCallbackHandler]. + /// See [WebViewControllerDelegate.setNavigationCallbackDelegate]. Future setOnWebResourceError( void Function(WebResourceError error) onWebResourceError, ) { diff --git a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/javascript_message.dart b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/javascript_message.dart index e0b19ad674c1..0989aab52fa3 100644 --- a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/javascript_message.dart +++ b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/javascript_message.dart @@ -3,9 +3,6 @@ // found in the LICENSE file. import 'package:flutter/foundation.dart'; -import 'package:plugin_platform_interface/plugin_platform_interface.dart'; - -import '../webview_platform.dart'; /// A message that was sent by JavaScript code running in a [WebView]. /// @@ -21,18 +18,19 @@ import '../webview_platform.dart'; /// accept `null` or have a default value to prevent breaking changes. /// /// ```dart -/// class WKScriptMessage extends JavaScriptMessage { -/// WKScriptMessage._( +/// @immutable +/// class WKWebViewScriptMessage extends JavaScriptMessage { +/// WKWebViewScriptMessage._( /// JavaScriptMessage javaScriptMessage, /// this.extraData, /// ) : super(javaScriptMessage.message); /// -/// factory WKScriptMessage.fromJavaScriptMessage( -/// JavaScriptMessage javaScriptMessage, +/// factory WKWebViewScriptMessage.fromJavaScripMessage( +/// JavaScriptMessage javaScripMessage, { /// String? extraData, /// }) { -/// return WKScriptMessage._( -/// javaScriptMessage: javaScriptMessage, +/// return WKWebViewScriptMessage._( +/// javaScriptMessage, /// extraData: extraData, /// ); /// } @@ -42,24 +40,11 @@ import '../webview_platform.dart'; /// ``` /// {@end-tool} @immutable -class JavaScriptMessage extends PlatformInterface { +class JavaScriptMessage { /// Creates a new JavaScript message object. - factory JavaScriptMessage(String message) { - final JavaScriptMessage javaScriptMessage = - WebViewPlatform.instance!.createJavaScriptMessage(message); - PlatformInterface.verify(javaScriptMessage, _token); - return javaScriptMessage; - } - - /// Used by the platform implementation to create a new - /// [JavaScriptMessage]. - /// - /// Should only be used by platform implementations because they can't extend - /// a class that only contains a factory constructor. - @protected - JavaScriptMessage.implementation(this.message) : super(token: _token); - - static final Object _token = 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/v4/types/load_request_params.dart b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/load_request_params.dart index 1191be7a6a65..ce6f7f6c9758 100644 --- a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/load_request_params.dart +++ b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/load_request_params.dart @@ -6,8 +6,7 @@ import 'dart:typed_data'; import 'package:flutter/foundation.dart'; import 'package:webview_flutter_platform_interface/src/v4/webview_controller_delegate.dart'; -/// Defines the supported HTTP methods for loading a page in -/// [WebViewControllerDelegate]. +/// Defines the supported HTTP methods for loading a page in [WebViewControllerDelegate]. enum LoadRequestMethod { /// HTTP GET method. get, @@ -42,19 +41,24 @@ extension LoadRequestMethodExtensions on LoadRequestMethod { /// accept `null` or have a default value to prevent breaking changes. /// /// ```dart -/// class AndroidLoadRequestParamsDelegate extends LoadRequestParamsDelegate { -/// AndroidLoadRequestParamsDelegate({ -/// required Uri uri, -/// required LoadRequestMethod method, -/// required Map headers, -/// Uint8List? body, +/// class AndroidLoadRequestParams extends LoadRequestParams { +/// AndroidLoadRequestParams._({ +/// required LoadRequestParams params, /// this.historyUrl, /// }) : super( -/// uri: uri, -/// method: method, -/// body: body, +/// uri: params.uri, +/// method: params.method, +/// body: params.body, +/// headers: params.headers, /// ); /// +/// factory AndroidLoadRequestParams.fromLoadRequestParams( +/// LoadRequestParams params, { +/// Uri? historyUrl, +/// }) { +/// return AndroidLoadRequestParams._(params, historyUrl: historyUrl); +/// } +/// /// final Uri? historyUrl; /// } /// ``` @@ -80,12 +84,4 @@ class LoadRequestParams { /// HTTP body for the request. final Uint8List? body; - - /// Serializes the [WebViewRequest] to JSON. - Map toJson() => { - 'uri': uri.toString(), - 'method': method.serialize(), - 'headers': headers, - 'body': body, - }; } diff --git a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/navigation_callback_creation_params.dart b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/navigation_callback_creation_params.dart new file mode 100644 index 000000000000..87bb147aa3bd --- /dev/null +++ b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/navigation_callback_creation_params.dart @@ -0,0 +1,31 @@ +// 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. + +/// Object specifying creation parameters for creating a [NavigationCallbackDelegate]. +/// +/// Platform specific implementations can add additional fields by extending +/// this class. +/// +/// {@tool sample} +/// This example demonstrates how to extend the [NavigationCallbackCreationParams] to +/// provide additional platform specific parameters. +/// +/// When extending [NavigationCallbackCreationParams] additional +/// parameters should always accept `null` or have a default value to prevent +/// breaking changes. +/// +/// ```dart +/// class AndroidNavigationCallbackCreationParams extends NavigationCallbackCreationParams { +/// AndroidNavigationCallbackCreationParams({ +/// this.filter, +/// }) : super(); +/// +/// final String? filter; +/// } +/// ``` +/// {@end-tool} +class NavigationCallbackCreationParams { + /// Used by the platform implementation to create a new [NavigationCallbackDelegate]. + NavigationCallbackCreationParams(); +} diff --git a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/types.dart b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/types.dart index 0e30dc429079..1ea3c213aca9 100644 --- a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/types.dart +++ b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/types.dart @@ -5,7 +5,9 @@ export 'javascript_message.dart'; export 'javascript_mode.dart'; export 'load_request_params.dart'; +export 'navigation_callback_creation_params.dart'; export 'web_resource_error.dart'; -export 'web_setting.dart'; export 'webview_controller_creation_params.dart'; export 'webview_cookie.dart'; +export 'webview_cookie_manager_creation_params.dart'; +export 'webview_widget_creation_params.dart'; diff --git a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/web_resource_error.dart b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/web_resource_error.dart index deccb5cb26d9..ea2e2a1d36c9 100644 --- a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/web_resource_error.dart +++ b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/web_resource_error.dart @@ -67,8 +67,7 @@ enum WebResourceErrorType { javaScriptResultTypeIsUnsupported, } -/// Error returned in `WebView.onWebResourceError` when a web resource loading -/// error has occurred. +/// Error returned in `WebView.onWebResourceError` when a web resource loading error has occurred. /// /// Platform specific implementations can add additional fields by extending /// this class. @@ -82,16 +81,19 @@ enum WebResourceErrorType { /// /// ```dart /// class IOSWebResourceError extends WebResourceError { -/// IOSWebResourceError({ -/// required int errorCode, -/// required String description, -/// WebResourceErrorType? errorType, -/// this.domain, -/// }) : super( -/// errorCode: errorCode, -/// description: description, -/// errorType: errorType, -/// ); +/// 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; /// } diff --git a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/web_setting.dart b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/web_setting.dart deleted file mode 100644 index abd17a405215..000000000000 --- a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/web_setting.dart +++ /dev/null @@ -1,64 +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/widgets.dart'; - -/// A single setting for configuring a WebViewPlatform which may be absent. -@immutable -class WebSetting { - /// Constructs an absent setting instance. - /// - /// The [isPresent] field for the instance will be false. - /// - /// Accessing [value] for an absent instance will throw. - const WebSetting.absent() - : _value = null, - isPresent = false; - - /// Constructs a setting of the given `value`. - /// - /// The [isPresent] field for the instance will be true. - const WebSetting.of(T value) - : _value = value, - isPresent = true; - - final T? _value; - - /// The setting's value. - /// - /// Throws if [WebSetting.isPresent] is false. - T get value { - if (!isPresent) { - throw StateError('Cannot access a value of an absent WebSetting'); - } - assert(isPresent); - // The intention of this getter is to return T whether it is nullable or - // not whereas _value is of type T? since _value can be null even when - // T is not nullable (when isPresent == false). - // - // We promote _value to T using `as T` instead of `!` operator to handle - // the case when _value is legitimately null (and T is a nullable type). - // `!` operator would always throw if _value is null. - return _value as T; - } - - /// True when this web setting instance contains a value. - /// - /// When false the [WebSetting.value] getter throws. - final bool isPresent; - - @override - bool operator ==(Object other) { - if (other.runtimeType != runtimeType) { - return false; - } - - return other is WebSetting && - other.isPresent == isPresent && - other._value == _value; - } - - @override - int get hashCode => Object.hash(_value, isPresent); -} diff --git a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/webview_cookie.dart b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/webview_cookie.dart index 868f8d547209..7f56a312049f 100644 --- a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/webview_cookie.dart +++ b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/webview_cookie.dart @@ -2,11 +2,9 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -import 'package:meta/meta.dart'; +import 'package:flutter/foundation.dart'; -/// A cookie that can be set globally for all web views -/// using [WebViewCookieManagerPlatform]. -@sealed +/// A cookie that can be set globally for all web views using [WebViewCookieManagerPlatform]. @immutable class WebViewCookie { /// Creates a new [WebViewCookieDelegate] @@ -40,14 +38,4 @@ class WebViewCookie { /// 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. - Map toJson() { - return { - 'name': name, - 'value': value, - 'domain': domain, - 'path': path - }; - } } diff --git a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/webview_cookie_manager_creation_params.dart b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/webview_cookie_manager_creation_params.dart new file mode 100644 index 000000000000..e64f7cb40043 --- /dev/null +++ b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/webview_cookie_manager_creation_params.dart @@ -0,0 +1,31 @@ +// 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. + +/// Object specifying creation parameters for creating a [WebViewCookieManagerDelegate]. +/// +/// Platform specific implementations can add additional fields by extending +/// this class. +/// +/// {@tool sample} +/// This example demonstrates how to extend the [WebViewCookieManagerCreationParams] to +/// provide additional platform specific parameters. +/// +/// When extending [WebViewCookieManagerCreationParams] additional +/// parameters should always accept `null` or have a default value to prevent +/// breaking changes. +/// +/// ```dart +/// class WKWebViewCookieManagerCreationParams extends WebViewCookieManagerCreationParams { +/// WKWebViewCookieManagerCreationParams({ +/// this.uri, +/// }) : super(); +/// +/// final Uri? uri; +/// } +/// ``` +/// {@end-tool} +class WebViewCookieManagerCreationParams { + /// Used by the platform implementation to create a new [WebViewCookieManagerDelegate]. + WebViewCookieManagerCreationParams(); +} diff --git a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/webview_widget_creation_params.dart b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/webview_widget_creation_params.dart new file mode 100644 index 000000000000..9562ca0c7fa9 --- /dev/null +++ b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/webview_widget_creation_params.dart @@ -0,0 +1,65 @@ +// 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'; +import 'package:flutter/gestures.dart'; + +import '../webview_controller_delegate.dart'; + +/// Object specifying creation parameters for creating a [WebViewWidgetDelegate]. +/// +/// Platform specific implementations can add additional fields by extending +/// this class. +/// +/// {@tool sample} +/// This example demonstrates how to extend the [WebViewWidgetCreationParams] to +/// provide additional platform specific parameters. +/// +/// When extending [WebViewWidgetCreationParams] additional parameters +/// should always accept `null` or have a default value to prevent breaking +/// changes. +/// +/// ```dart +/// class WKWebViewWidgetCreationParams extends WebViewWidgetCreationParams { +/// WKWebViewWidgetCreationParams({ +/// this.domain, +/// }) : super(); +/// +/// final String? domain; +/// } +/// ``` +/// {@end-tool} +@immutable +class WebViewWidgetCreationParams { + /// Used by the platform implementation to create a new [WebViewWidgetDelegate]. + const WebViewWidgetCreationParams({ + this.key, + required this.controller, + this.gestureRecognizers, + }); + + /// Controls how one widget replaces another widget in the tree. + /// + /// See also: + /// + /// * The discussions at [Key] and [GlobalKey]. + final Key? key; + + /// The [WebViewControllerDelegate] that allows controlling the native web + /// view. + final WebViewControllerDelegate controller; + + /// The `gestureRecognizers` specifies which gestures should be consumed by the + /// web view. + /// + /// It is possible for other gesture recognizers to be competing with the web + /// view on pointer events, e.g if the web view is inside a [ListView] the + /// [ListView] will want to handle vertical drags. The web view will claim + /// gestures that are recognized by any of the recognizers on this list. + /// + /// When `gestureRecognizers` is empty or null, the web view will only handle + /// pointer events for gestures that were not claimed by any other gesture + /// recognizer. + final Set>? gestureRecognizers; +} diff --git a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/webview_controller_delegate.dart b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/webview_controller_delegate.dart index 729eec92347b..dd3ad884219f 100644 --- a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/webview_controller_delegate.dart +++ b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/webview_controller_delegate.dart @@ -30,16 +30,18 @@ abstract class WebViewControllerDelegate extends PlatformInterface { return webViewControllerDelegate; } - /// Used by the platform implementation to create a new - /// [WebViewControllerDelegate]. + /// Used by the platform implementation to create a new [WebViewControllerDelegate]. /// /// Should only be used by platform implementations because they can't extend /// a class that only contains a factory constructor. @protected - WebViewControllerDelegate.implementation() : super(token: _token); + WebViewControllerDelegate.implementation(this.params) : super(token: _token); static final Object _token = Object(); + /// The parameters used to initialize the [WebViewControllerDelegate]. + final WebViewControllerCreationParams params; + /// Loads the file located on the specified [absoluteFilePath]. /// /// The [absoluteFilePath] parameter should contain the absolute path to the @@ -151,12 +153,12 @@ abstract class WebViewControllerDelegate extends PlatformInterface { 'clearCache is not implemented on the current platform'); } - /// Sets the [NavigationCallbackHandler] containing the callback methods that + /// Sets the [NavigationCallbackDelegate] containing the callback methods that /// are called during navigation events. - Future setNavigationCallbackHandler( + Future setNavigationCallbackDelegate( NavigationCallbackDelegate handler) { throw UnimplementedError( - 'setNavigationCallbackHandler is not implemented on the current platform'); + 'setNavigationCallbackDelegate is not implemented on the current platform'); } /// Runs the given JavaScript in the context of the current page. @@ -225,19 +227,19 @@ abstract class WebViewControllerDelegate extends PlatformInterface { 'getScrollPosition is not implemented on the current platform'); } - /// Wether to enable the platform's webview content debugging tools. + /// Whether to enable the platform's webview content debugging tools. Future enableDebugging(bool enabled) { throw UnimplementedError( 'enableDebugging is not implemented on the current platform'); } - /// Wether to allow swipe based navigation on supported platforms. + /// Whether to allow swipe based navigation on supported platforms. Future enableGestureNavigation(bool enabled) { throw UnimplementedError( 'enableGestureNavigation is not implemented on the current platform'); } - /// Whether to support zooming using its on-screen zoom controls and gestures. + /// Whhether to support zooming using its on-screen zoom controls and gestures. Future enableZoom(bool enabled) { throw UnimplementedError( 'enableZoom is not implemented on the current platform'); @@ -262,7 +264,7 @@ abstract class WebViewControllerDelegate extends PlatformInterface { /// /// An absent value ([userAgent.isPresent] is false) represents no change to /// this setting from the last time it was set. - Future setUserAgent(WebSetting userAgent) { + Future setUserAgent(String? userAgent) { throw UnimplementedError( 'setUserAgent is not implemented on the current platform'); } diff --git a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/webview_cookie_manager_delegate.dart b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/webview_cookie_manager_delegate.dart index 9e0597c32648..4126cd6a4bad 100644 --- a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/webview_cookie_manager_delegate.dart +++ b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/webview_cookie_manager_delegate.dart @@ -18,9 +18,10 @@ import 'webview_platform.dart'; /// [WebViewCookieManagerDelegate] methods. abstract class WebViewCookieManagerDelegate extends PlatformInterface { /// Creates a new [WebViewCookieManagerDelegate] - factory WebViewCookieManagerDelegate() { + factory WebViewCookieManagerDelegate( + WebViewCookieManagerCreationParams params) { final WebViewCookieManagerDelegate cookieManagerDelegate = - WebViewPlatform.instance!.createCookieManagerDelegate(); + WebViewPlatform.instance!.createCookieManagerDelegate(params); PlatformInterface.verify(cookieManagerDelegate, _token); return cookieManagerDelegate; } @@ -31,10 +32,14 @@ abstract class WebViewCookieManagerDelegate extends PlatformInterface { /// Should only be used by platform implementations because they can't extend /// a class that only contains a factory constructor. @protected - WebViewCookieManagerDelegate.implementation() : super(token: _token); + WebViewCookieManagerDelegate.implementation(this.params) + : super(token: _token); static final Object _token = Object(); + /// The parameters used to initialize the [WebViewCookieManagerDelegate]. + final WebViewCookieManagerCreationParams params; + /// Clears all cookies for all [WebView] instances. /// /// Returns true if cookies were present before clearing, else false. diff --git a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/webview_platform.dart b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/webview_platform.dart index 9e96ab573198..5489781bf8d6 100644 --- a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/webview_platform.dart +++ b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/webview_platform.dart @@ -2,10 +2,9 @@ // 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'; -import 'package:flutter/gestures.dart'; import 'package:plugin_platform_interface/plugin_platform_interface.dart'; import 'package:webview_flutter_platform_interface/src/v4/types/types.dart'; +import 'package:webview_flutter_platform_interface/src/v4/types/webview_widget_creation_params.dart'; import 'package:webview_flutter_platform_interface/src/v4/webview_widget_delegate.dart'; import 'navigation_callback_delegate.dart'; @@ -42,7 +41,9 @@ abstract class WebViewPlatform extends PlatformInterface { /// /// This function should only be called by the app-facing plugin. /// Look at using [WebViewCookieManager] in `webview_flutter` instead. - WebViewCookieManagerDelegate createCookieManagerDelegate() { + WebViewCookieManagerDelegate createCookieManagerDelegate( + WebViewCookieManagerCreationParams params, + ) { throw UnimplementedError( 'createCookieManagerDelegate is not implemented on the current platform.'); } @@ -51,15 +52,11 @@ abstract class WebViewPlatform extends PlatformInterface { /// /// This function should only be called by the app-facing plugin. /// Look at using [NavigationCallbackHandler] in `webview_flutter` instead. - NavigationCallbackDelegate createNavigationCallbackHandlerDelegate() { + NavigationCallbackDelegate createNavigationCallbackDelegate( + NavigationCallbackCreationParams params, + ) { throw UnimplementedError( - 'createNavigationCallbackHandlerDelegate is not implemented on the current platform.'); - } - - /// Create a new [JavaScriptMessage]. - JavaScriptMessage createJavaScriptMessage(String message) { - throw UnimplementedError( - 'createJavaScriptMessage is not implemented on the current platform.'); + 'createNavigationCallbackDelegate is not implemented on the current platform.'); } /// Create a new [WebViewControllerDelegate]. @@ -67,7 +64,8 @@ abstract class WebViewPlatform extends PlatformInterface { /// This function should only be called by the app-facing plugin. /// Look at using [WebViewController] in `webview_flutter` instead. WebViewControllerDelegate createWebViewControllerDelegate( - WebViewControllerCreationParams params) { + WebViewControllerCreationParams params, + ) { throw UnimplementedError( 'createWebViewControllerDelegate is not implemented on the current platform.'); } @@ -76,11 +74,9 @@ abstract class WebViewPlatform extends PlatformInterface { /// /// This function should only be called by the app-facing plugin. /// Look at using [WebViewWidget] in `webview_flutter` instead. - WebViewWidgetDelegate createWebViewWidgetDelegate({ - Key? key, - required WebViewControllerDelegate controller, - Set>? gestureRecognizers, - }) { + WebViewWidgetDelegate createWebViewWidgetDelegate( + WebViewWidgetCreationParams params, + ) { throw UnimplementedError( 'createWebViewWidgetDelegate is not implemented on the current platform.'); } diff --git a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/webview_widget_delegate.dart b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/webview_widget_delegate.dart index 0ed5d76140d7..80a48ff6665b 100644 --- a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/webview_widget_delegate.dart +++ b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/webview_widget_delegate.dart @@ -3,27 +3,17 @@ // found in the LICENSE file. import 'package:flutter/foundation.dart'; -import 'package:flutter/gestures.dart'; import 'package:flutter/widgets.dart'; import 'package:plugin_platform_interface/plugin_platform_interface.dart'; -import 'package:webview_flutter_platform_interface/src/v4/webview_controller_delegate.dart'; import 'webview_platform.dart'; /// Interface for a platform implementation of a web view widget. abstract class WebViewWidgetDelegate extends PlatformInterface { /// Creates a new [WebViewWidgetDelegate] - factory WebViewWidgetDelegate({ - Key? key, - required WebViewControllerDelegate controller, - Set>? gestureRecognizers, - }) { + factory WebViewWidgetDelegate(WebViewWidgetCreationParams params) { final WebViewWidgetDelegate webViewWidgetDelegate = - WebViewPlatform.instance!.createWebViewWidgetDelegate( - key: key, - controller: controller, - gestureRecognizers: gestureRecognizers, - ); + WebViewPlatform.instance!.createWebViewWidgetDelegate(params); PlatformInterface.verify(webViewWidgetDelegate, _token); return webViewWidgetDelegate; } @@ -34,54 +24,12 @@ abstract class WebViewWidgetDelegate extends PlatformInterface { /// Should only be used by platform implementations because they can't extend /// a class that only contains a factory constructor. @protected - WebViewWidgetDelegate.implementation({ - this.key, - required this.controller, - this.gestureRecognizers, - }) : super(token: _token); + WebViewWidgetDelegate.implementation(this.params) : super(token: _token); static final Object _token = Object(); - /// Controls how one widget replaces another widget in the tree. - /// - /// If the [runtimeType] and [key] properties of the two widgets are - /// [operator==], respectively, then the new widget replaces the old widget by - /// updating the underlying element (i.e., by calling [Element.update] with the - /// new widget). Otherwise, the old element is removed from the tree, the new - /// widget is inflated into an element, and the new element is inserted into the - /// tree. - /// - /// In addition, using a [GlobalKey] as the widget's [key] allows the element - /// to be moved around the tree (changing parent) without losing state. When a - /// new widget is found (its key and type do not match a previous widget in - /// the same location), but there was a widget with that same global key - /// elsewhere in the tree in the previous frame, then that widget's element is - /// moved to the new location. - /// - /// Generally, a widget that is the only child of another widget does not need - /// an explicit key. - /// - /// See also: - /// - /// * The discussions at [Key] and [GlobalKey]. - final Key? key; - - /// The [WebViewControllerDelegate] that allows controlling the native web - /// view. - final WebViewControllerDelegate controller; - - /// The `gestureRecognizers` specifies which gestures should be consumed by the - /// web view. - /// - /// It is possible for other gesture recognizers to be competing with the web - /// view on pointer events, e.g if the web view is inside a [ListView] the - /// [ListView] will want to handle vertical drags. The web view will claim - /// gestures that are recognized by any of the recognizers on this list. - /// - /// When `gestureRecognizers` is empty or null, the web view will only handle - /// pointer events for gestures that were not claimed by any other gesture - /// recognizer. - final Set>? gestureRecognizers; + /// The parameters used to initialize the [WebViewWidgetDelegate]. + final WebViewWidgetCreationParams params; /// Builds a new WebView. /// diff --git a/packages/webview_flutter/webview_flutter_platform_interface/pubspec.yaml b/packages/webview_flutter/webview_flutter_platform_interface/pubspec.yaml index c339a0f4a2ce..23e53f2fd7da 100644 --- a/packages/webview_flutter/webview_flutter_platform_interface/pubspec.yaml +++ b/packages/webview_flutter/webview_flutter_platform_interface/pubspec.yaml @@ -13,7 +13,6 @@ environment: dependencies: flutter: sdk: flutter - meta: ^1.7.0 plugin_platform_interface: ^2.1.0 dev_dependencies: diff --git a/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/navigation_callback_delegate_test.dart b/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/navigation_callback_delegate_test.dart index 798eb4bfa02b..c86516a0779f 100644 --- a/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/navigation_callback_delegate_test.dart +++ b/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/navigation_callback_delegate_test.dart @@ -16,38 +16,44 @@ void main() { }); test('Cannot be implemented with `implements`', () { - when(WebViewPlatform.instance!.createNavigationCallbackHandlerDelegate()) + final NavigationCallbackCreationParams params = + NavigationCallbackCreationParams(); + when(WebViewPlatform.instance!.createNavigationCallbackDelegate(params)) .thenReturn(ImplementsNavigationCallbackDelegate()); expect(() { - NavigationCallbackDelegate(); + NavigationCallbackDelegate(params); }, throwsNoSuchMethodError); }); test('Can be extended', () { - when(WebViewPlatform.instance!.createNavigationCallbackHandlerDelegate()) - .thenReturn(ExtendsNavigationCallbackDelegate()); + final NavigationCallbackCreationParams params = + NavigationCallbackCreationParams(); + when(WebViewPlatform.instance!.createNavigationCallbackDelegate(params)) + .thenReturn(ExtendsNavigationCallbackDelegate(params)); - expect(NavigationCallbackDelegate(), isNotNull); + expect(NavigationCallbackDelegate(params), isNotNull); }); test('Can be mocked with `implements`', () { - when(WebViewPlatform.instance!.createNavigationCallbackHandlerDelegate()) + final NavigationCallbackCreationParams params = + NavigationCallbackCreationParams(); + when(WebViewPlatform.instance!.createNavigationCallbackDelegate(params)) .thenReturn(MockNavigationCallbackDelegate()); - expect(NavigationCallbackDelegate(), isNotNull); + expect(NavigationCallbackDelegate(params), isNotNull); }); test( // ignore: lines_longer_than_80_chars 'Default implementation of setOnNavigationRequest should throw unimplemented error', () { - final NavigationCallbackDelegate callbackHandler = - ExtendsNavigationCallbackDelegate(); + final NavigationCallbackDelegate callbackDelegate = + ExtendsNavigationCallbackDelegate(NavigationCallbackCreationParams()); expect( - () => callbackHandler.setOnNavigationRequest( - ({required bool isForMainFrame, required String url}) {}), + () => callbackDelegate.setOnNavigationRequest( + ({required bool isForMainFrame, required String url}) => true), throwsUnimplementedError, ); }); @@ -56,11 +62,11 @@ void main() { // ignore: lines_longer_than_80_chars 'Default implementation of setOnPageStarted should throw unimplemented error', () { - final NavigationCallbackDelegate callbackHandler = - ExtendsNavigationCallbackDelegate(); + final NavigationCallbackDelegate callbackDelegate = + ExtendsNavigationCallbackDelegate(NavigationCallbackCreationParams()); expect( - () => callbackHandler.setOnPageStarted((String url) {}), + () => callbackDelegate.setOnPageStarted((String url) {}), throwsUnimplementedError, ); }); @@ -69,11 +75,11 @@ void main() { // ignore: lines_longer_than_80_chars 'Default implementation of setOnPageFinished should throw unimplemented error', () { - final NavigationCallbackDelegate callbackHandler = - ExtendsNavigationCallbackDelegate(); + final NavigationCallbackDelegate callbackDelegate = + ExtendsNavigationCallbackDelegate(NavigationCallbackCreationParams()); expect( - () => callbackHandler.setOnPageFinished((String url) {}), + () => callbackDelegate.setOnPageFinished((String url) {}), throwsUnimplementedError, ); }); @@ -82,11 +88,11 @@ void main() { // ignore: lines_longer_than_80_chars 'Default implementation of setOnProgress should throw unimplemented error', () { - final NavigationCallbackDelegate callbackHandler = - ExtendsNavigationCallbackDelegate(); + final NavigationCallbackDelegate callbackDelegate = + ExtendsNavigationCallbackDelegate(NavigationCallbackCreationParams()); expect( - () => callbackHandler.setOnProgress((int progress) {}), + () => callbackDelegate.setOnProgress((int progress) {}), throwsUnimplementedError, ); }); @@ -95,11 +101,11 @@ void main() { // ignore: lines_longer_than_80_chars 'Default implementation of setOnWebResourceError should throw unimplemented error', () { - final NavigationCallbackDelegate callbackHandler = - ExtendsNavigationCallbackDelegate(); + final NavigationCallbackDelegate callbackDelegate = + ExtendsNavigationCallbackDelegate(NavigationCallbackCreationParams()); expect( - () => callbackHandler.setOnWebResourceError((WebResourceError error) {}), + () => callbackDelegate.setOnWebResourceError((WebResourceError error) {}), throwsUnimplementedError, ); }); @@ -124,5 +130,6 @@ class MockNavigationCallbackDelegate extends Mock NavigationCallbackDelegate {} class ExtendsNavigationCallbackDelegate extends NavigationCallbackDelegate { - ExtendsNavigationCallbackDelegate() : super.implementation(); + ExtendsNavigationCallbackDelegate(NavigationCallbackCreationParams params) + : super.implementation(params); } diff --git a/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/types/web_setting_test.dart b/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/types/web_setting_test.dart deleted file mode 100644 index a35aa6358736..000000000000 --- a/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/types/web_setting_test.dart +++ /dev/null @@ -1,26 +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_test/flutter_test.dart'; -import 'package:webview_flutter_platform_interface/src/v4/webview_platform.dart'; - -void main() { - TestWidgetsFlutterBinding.ensureInitialized(); - - test('absent should initialize isPresent to false', () { - const WebSetting absent = WebSetting.absent(); - expect(absent.isPresent, isFalse); - }); - - test('Cannot access value of absent setting', () { - const WebSetting absent = WebSetting.absent(); - expect(() => absent.value, throwsA(isA())); - }); - - test('Setting should return value it is initialized with', () { - const WebSetting setting = WebSetting.of('Test value'); - expect(setting.isPresent, isTrue); - expect(setting.value, 'Test value'); - }); -} diff --git a/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/webview_controller_delegate_test.dart b/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/webview_controller_delegate_test.dart index 8f83d659cf09..5a8e8346d0e2 100644 --- a/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/webview_controller_delegate_test.dart +++ b/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/webview_controller_delegate_test.dart @@ -31,12 +31,13 @@ void main() { }); test('Can be extended', () { + final WebViewControllerCreationParams params = + WebViewControllerCreationParams(); when((WebViewPlatform.instance! as MockWebViewPlatform) .createWebViewControllerDelegate(any)) - .thenReturn(ExtendsWebViewControllerDelegate()); + .thenReturn(ExtendsWebViewControllerDelegate(params)); - expect(WebViewControllerDelegate(WebViewControllerCreationParams()), - isNotNull); + expect(WebViewControllerDelegate(params), isNotNull); }); test('Can be mocked with `implements`', () { @@ -53,7 +54,7 @@ void main() { 'Default implementation of loadFile should throw unimplemented error', () { final WebViewControllerDelegate controller = - ExtendsWebViewControllerDelegate(); + ExtendsWebViewControllerDelegate(WebViewControllerCreationParams()); expect( () => controller.loadFile(''), @@ -66,7 +67,7 @@ void main() { 'Default implementation of loadFlutterAsset should throw unimplemented error', () { final WebViewControllerDelegate controller = - ExtendsWebViewControllerDelegate(); + ExtendsWebViewControllerDelegate(WebViewControllerCreationParams()); expect( () => controller.loadFlutterAsset(''), @@ -79,7 +80,7 @@ void main() { 'Default implementation of loadHtmlString should throw unimplemented error', () { final WebViewControllerDelegate controller = - ExtendsWebViewControllerDelegate(); + ExtendsWebViewControllerDelegate(WebViewControllerCreationParams()); expect( () => controller.loadHtmlString(''), @@ -92,7 +93,7 @@ void main() { 'Default implementation of loadRequest should throw unimplemented error', () { final WebViewControllerDelegate controller = - ExtendsWebViewControllerDelegate(); + ExtendsWebViewControllerDelegate(WebViewControllerCreationParams()); expect( () => controller.loadRequest(MockLoadRequestParamsDelegate()), @@ -105,7 +106,7 @@ void main() { 'Default implementation of currentUrl should throw unimplemented error', () { final WebViewControllerDelegate controller = - ExtendsWebViewControllerDelegate(); + ExtendsWebViewControllerDelegate(WebViewControllerCreationParams()); expect( () => controller.currentUrl(), @@ -118,7 +119,7 @@ void main() { 'Default implementation of canGoBack should throw unimplemented error', () { final WebViewControllerDelegate controller = - ExtendsWebViewControllerDelegate(); + ExtendsWebViewControllerDelegate(WebViewControllerCreationParams()); expect( () => controller.canGoBack(), @@ -131,7 +132,7 @@ void main() { 'Default implementation of canGoForward should throw unimplemented error', () { final WebViewControllerDelegate controller = - ExtendsWebViewControllerDelegate(); + ExtendsWebViewControllerDelegate(WebViewControllerCreationParams()); expect( () => controller.canGoForward(), @@ -143,7 +144,7 @@ void main() { // ignore: lines_longer_than_80_chars 'Default implementation of goBack should throw unimplemented error', () { final WebViewControllerDelegate controller = - ExtendsWebViewControllerDelegate(); + ExtendsWebViewControllerDelegate(WebViewControllerCreationParams()); expect( () => controller.goBack(), @@ -156,7 +157,7 @@ void main() { 'Default implementation of goForward should throw unimplemented error', () { final WebViewControllerDelegate controller = - ExtendsWebViewControllerDelegate(); + ExtendsWebViewControllerDelegate(WebViewControllerCreationParams()); expect( () => controller.goForward(), @@ -168,7 +169,7 @@ void main() { // ignore: lines_longer_than_80_chars 'Default implementation of reload should throw unimplemented error', () { final WebViewControllerDelegate controller = - ExtendsWebViewControllerDelegate(); + ExtendsWebViewControllerDelegate(WebViewControllerCreationParams()); expect( () => controller.reload(), @@ -181,7 +182,7 @@ void main() { 'Default implementation of clearCache should throw unimplemented error', () { final WebViewControllerDelegate controller = - ExtendsWebViewControllerDelegate(); + ExtendsWebViewControllerDelegate(WebViewControllerCreationParams()); expect( () => controller.clearCache(), @@ -193,11 +194,11 @@ void main() { 'Default implementation of the setNavigationCallback should throw unimplemented error', () { final WebViewControllerDelegate controller = - ExtendsWebViewControllerDelegate(); + ExtendsWebViewControllerDelegate(WebViewControllerCreationParams()); expect( () => controller - .setNavigationCallbackHandler(MockNavigationCallbackDelegate()), + .setNavigationCallbackDelegate(MockNavigationCallbackDelegate()), throwsUnimplementedError, ); }, @@ -208,7 +209,7 @@ void main() { 'Default implementation of runJavaScript should throw unimplemented error', () { final WebViewControllerDelegate controller = - ExtendsWebViewControllerDelegate(); + ExtendsWebViewControllerDelegate(WebViewControllerCreationParams()); expect( () => controller.runJavaScript('javaScript'), @@ -221,7 +222,7 @@ void main() { 'Default implementation of runJavaScriptReturningResult should throw unimplemented error', () { final WebViewControllerDelegate controller = - ExtendsWebViewControllerDelegate(); + ExtendsWebViewControllerDelegate(WebViewControllerCreationParams()); expect( () => controller.runJavaScriptReturningResult('javaScript'), @@ -234,7 +235,7 @@ void main() { 'Default implementation of addJavaScriptChannel should throw unimplemented error', () { final WebViewControllerDelegate controller = - ExtendsWebViewControllerDelegate(); + ExtendsWebViewControllerDelegate(WebViewControllerCreationParams()); expect( () => controller.addJavaScriptChannel( @@ -252,7 +253,7 @@ void main() { 'Default implementation of removeJavaScriptChannel should throw unimplemented error', () { final WebViewControllerDelegate controller = - ExtendsWebViewControllerDelegate(); + ExtendsWebViewControllerDelegate(WebViewControllerCreationParams()); expect( () => controller.removeJavaScriptChannel('test'), @@ -265,7 +266,7 @@ void main() { 'Default implementation of getTitle should throw unimplemented error', () { final WebViewControllerDelegate controller = - ExtendsWebViewControllerDelegate(); + ExtendsWebViewControllerDelegate(WebViewControllerCreationParams()); expect( () => controller.getTitle(), @@ -278,7 +279,7 @@ void main() { 'Default implementation of scrollTo should throw unimplemented error', () { final WebViewControllerDelegate controller = - ExtendsWebViewControllerDelegate(); + ExtendsWebViewControllerDelegate(WebViewControllerCreationParams()); expect( () => controller.scrollTo(0, 0), @@ -291,7 +292,7 @@ void main() { 'Default implementation of scrollBy should throw unimplemented error', () { final WebViewControllerDelegate controller = - ExtendsWebViewControllerDelegate(); + ExtendsWebViewControllerDelegate(WebViewControllerCreationParams()); expect( () => controller.scrollBy(0, 0), @@ -304,7 +305,7 @@ void main() { 'Default implementation of getScrollPosition should throw unimplemented error', () { final WebViewControllerDelegate controller = - ExtendsWebViewControllerDelegate(); + ExtendsWebViewControllerDelegate(WebViewControllerCreationParams()); expect( () => controller.getScrollPosition(), @@ -317,7 +318,7 @@ void main() { 'Default implementation of enableDebugging should throw unimplemented error', () { final WebViewControllerDelegate controller = - ExtendsWebViewControllerDelegate(); + ExtendsWebViewControllerDelegate(WebViewControllerCreationParams()); expect( () => controller.enableDebugging(true), @@ -330,7 +331,7 @@ void main() { 'Default implementation of enableGestureNavigation should throw unimplemented error', () { final WebViewControllerDelegate controller = - ExtendsWebViewControllerDelegate(); + ExtendsWebViewControllerDelegate(WebViewControllerCreationParams()); expect( () => controller.enableGestureNavigation(true), @@ -343,7 +344,7 @@ void main() { 'Default implementation of enableZoom should throw unimplemented error', () { final WebViewControllerDelegate controller = - ExtendsWebViewControllerDelegate(); + ExtendsWebViewControllerDelegate(WebViewControllerCreationParams()); expect( () => controller.enableZoom(true), @@ -356,7 +357,7 @@ void main() { 'Default implementation of setBackgroundColor should throw unimplemented error', () { final WebViewControllerDelegate controller = - ExtendsWebViewControllerDelegate(); + ExtendsWebViewControllerDelegate(WebViewControllerCreationParams()); expect( () => controller.setBackgroundColor(Colors.blue), @@ -369,7 +370,7 @@ void main() { 'Default implementation of setJavaScriptMode should throw unimplemented error', () { final WebViewControllerDelegate controller = - ExtendsWebViewControllerDelegate(); + ExtendsWebViewControllerDelegate(WebViewControllerCreationParams()); expect( () => controller.setJavaScriptMode(JavaScriptMode.disabled), @@ -382,10 +383,10 @@ void main() { 'Default implementation of setUserAgent should throw unimplemented error', () { final WebViewControllerDelegate controller = - ExtendsWebViewControllerDelegate(); + ExtendsWebViewControllerDelegate(WebViewControllerCreationParams()); expect( - () => controller.setUserAgent(const WebSetting.absent()), + () => controller.setUserAgent(null), throwsUnimplementedError, ); }); @@ -409,7 +410,8 @@ class MockWebViewControllerDelegate extends Mock WebViewControllerDelegate {} class ExtendsWebViewControllerDelegate extends WebViewControllerDelegate { - ExtendsWebViewControllerDelegate() : super.implementation(); + ExtendsWebViewControllerDelegate(WebViewControllerCreationParams params) + : super.implementation(params); } // ignore: must_be_immutable diff --git a/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/webview_controller_delegate_test.mocks.dart b/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/webview_controller_delegate_test.mocks.dart index cffaa64964e7..5ec5904badbc 100644 --- a/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/webview_controller_delegate_test.mocks.dart +++ b/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/webview_controller_delegate_test.mocks.dart @@ -2,13 +2,13 @@ // in webview_flutter_platform_interface/test/src/v4/webview_controller_delegate_test.dart. // Do not manually edit this file. -import 'dart:async' as _i3; +import 'dart:async' as _i4; import 'package:mockito/mockito.dart' as _i1; import 'package:webview_flutter_platform_interface/src/v4/navigation_callback_delegate.dart' - as _i2; + as _i3; import 'package:webview_flutter_platform_interface/src/v4/webview_platform.dart' - as _i4; + as _i2; // ignore_for_file: avoid_redundant_argument_values // ignore_for_file: avoid_setters_without_getters @@ -19,46 +19,54 @@ import 'package:webview_flutter_platform_interface/src/v4/webview_platform.dart' // ignore_for_file: unnecessary_parenthesis // ignore_for_file: camel_case_types +class _FakeNavigationCallbackCreationParams_0 extends _i1.Fake + implements _i2.NavigationCallbackCreationParams {} + /// A class which mocks [NavigationCallbackDelegate]. /// /// See the documentation for Mockito's code generation for more information. class MockNavigationCallbackDelegate extends _i1.Mock - implements _i2.NavigationCallbackDelegate { + implements _i3.NavigationCallbackDelegate { MockNavigationCallbackDelegate() { _i1.throwOnMissingStub(this); } @override - _i3.Future setOnNavigationRequest( - void Function({bool isForMainFrame, String url})? + _i2.NavigationCallbackCreationParams get params => + (super.noSuchMethod(Invocation.getter(#params), + returnValue: _FakeNavigationCallbackCreationParams_0()) + as _i2.NavigationCallbackCreationParams); + @override + _i4.Future setOnNavigationRequest( + _i4.FutureOr Function({bool isForMainFrame, String url})? onNavigationRequest) => (super.noSuchMethod( Invocation.method(#setOnNavigationRequest, [onNavigationRequest]), returnValue: Future.value(), - returnValueForMissingStub: Future.value()) as _i3.Future); + returnValueForMissingStub: Future.value()) as _i4.Future); @override - _i3.Future setOnPageStarted(void Function(String)? onPageStarted) => + _i4.Future setOnPageStarted(void Function(String)? onPageStarted) => (super.noSuchMethod(Invocation.method(#setOnPageStarted, [onPageStarted]), returnValue: Future.value(), - returnValueForMissingStub: Future.value()) as _i3.Future); + returnValueForMissingStub: Future.value()) as _i4.Future); @override - _i3.Future setOnPageFinished(void Function(String)? onPageFinished) => + _i4.Future setOnPageFinished(void Function(String)? onPageFinished) => (super.noSuchMethod( Invocation.method(#setOnPageFinished, [onPageFinished]), returnValue: Future.value(), - returnValueForMissingStub: Future.value()) as _i3.Future); + returnValueForMissingStub: Future.value()) as _i4.Future); @override - _i3.Future setOnProgress(void Function(int)? onProgress) => + _i4.Future setOnProgress(void Function(int)? onProgress) => (super.noSuchMethod(Invocation.method(#setOnProgress, [onProgress]), returnValue: Future.value(), - returnValueForMissingStub: Future.value()) as _i3.Future); + returnValueForMissingStub: Future.value()) as _i4.Future); @override - _i3.Future setOnWebResourceError( - void Function(_i4.WebResourceError)? onWebResourceError) => + _i4.Future setOnWebResourceError( + void Function(_i2.WebResourceError)? onWebResourceError) => (super.noSuchMethod( Invocation.method(#setOnWebResourceError, [onWebResourceError]), returnValue: Future.value(), - returnValueForMissingStub: Future.value()) as _i3.Future); + returnValueForMissingStub: Future.value()) as _i4.Future); @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/src/v4/webview_platform_test.dart index 2233415060f4..d8a15cccb51d 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/src/v4/webview_platform_test.dart @@ -4,7 +4,9 @@ import 'package:flutter_test/flutter_test.dart'; 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/src/v4/webview_controller_delegate.dart'; import 'package:webview_flutter_platform_interface/src/v4/webview_platform.dart'; import 'webview_platform_test.mocks.dart'; @@ -39,7 +41,8 @@ void main() { final WebViewPlatform webViewPlatform = ExtendsWebViewPlatform(); expect( - webViewPlatform.createCookieManagerDelegate, + () => webViewPlatform + .createCookieManagerDelegate(WebViewCookieManagerCreationParams()), throwsUnimplementedError, ); }); @@ -51,32 +54,36 @@ void main() { final WebViewPlatform webViewPlatform = ExtendsWebViewPlatform(); expect( - () => webViewPlatform.createNavigationCallbackHandlerDelegate(), + () => webViewPlatform + .createNavigationCallbackDelegate(NavigationCallbackCreationParams()), throwsUnimplementedError, ); }); test( // ignore: lines_longer_than_80_chars - 'Default implementation of createJavaScriptMessage should throw unimplemented error', + 'Default implementation of createWebViewControllerDelegate should throw unimplemented error', () { final WebViewPlatform webViewPlatform = ExtendsWebViewPlatform(); expect( - () => webViewPlatform.createJavaScriptMessage('0'), + () => webViewPlatform + .createWebViewControllerDelegate(WebViewControllerCreationParams()), throwsUnimplementedError, ); }); test( // ignore: lines_longer_than_80_chars - 'Default implementation of createWebViewControllerDelegate should throw unimplemented error', + 'Default implementation of createWebViewWidgetDelegate should throw unimplemented error', () { final WebViewPlatform webViewPlatform = ExtendsWebViewPlatform(); + final MockWebViewControllerDelegate controller = + MockWebViewControllerDelegate(); expect( - () => webViewPlatform - .createWebViewControllerDelegate(WebViewControllerCreationParams()), + () => webViewPlatform.createWebViewWidgetDelegate( + WebViewWidgetCreationParams(controller: controller)), throwsUnimplementedError, ); }); @@ -93,3 +100,10 @@ class MockWebViewPlatformWithMixin extends MockWebViewPlatform MockPlatformInterfaceMixin {} class ExtendsWebViewPlatform extends WebViewPlatform {} + +class MockWebViewControllerDelegate extends Mock + with + // ignore: prefer_mixin + MockPlatformInterfaceMixin + implements + WebViewControllerDelegate {} 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 index 8cfe6e8f7bf7..8739cafc517e 100644 --- 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 @@ -2,21 +2,21 @@ // in webview_flutter_platform_interface/test/src/v4/webview_platform_test.dart. // Do not manually edit this file. -import 'package:flutter/foundation.dart' as _i8; -import 'package:flutter/gestures.dart' as _i9; import 'package:mockito/mockito.dart' as _i1; import 'package:webview_flutter_platform_interface/src/v4/navigation_callback_delegate.dart' as _i3; import 'package:webview_flutter_platform_interface/src/v4/types/types.dart' - as _i4; + as _i7; +import 'package:webview_flutter_platform_interface/src/v4/types/webview_widget_creation_params.dart' + as _i8; import 'package:webview_flutter_platform_interface/src/v4/webview_controller_delegate.dart' - as _i5; + as _i4; import 'package:webview_flutter_platform_interface/src/v4/webview_cookie_manager_delegate.dart' as _i2; import 'package:webview_flutter_platform_interface/src/v4/webview_platform.dart' - as _i7; -import 'package:webview_flutter_platform_interface/src/v4/webview_widget_delegate.dart' as _i6; +import 'package:webview_flutter_platform_interface/src/v4/webview_widget_delegate.dart' + as _i5; // ignore_for_file: avoid_redundant_argument_values // ignore_for_file: avoid_setters_without_getters @@ -33,59 +33,48 @@ class _FakeWebViewCookieManagerDelegate_0 extends _i1.Fake class _FakeNavigationCallbackDelegate_1 extends _i1.Fake implements _i3.NavigationCallbackDelegate {} -class _FakeJavaScriptMessage_2 extends _i1.Fake - implements _i4.JavaScriptMessage {} - -class _FakeWebViewControllerDelegate_3 extends _i1.Fake - implements _i5.WebViewControllerDelegate {} +class _FakeWebViewControllerDelegate_2 extends _i1.Fake + implements _i4.WebViewControllerDelegate {} -class _FakeWebViewWidgetDelegate_4 extends _i1.Fake - implements _i6.WebViewWidgetDelegate {} +class _FakeWebViewWidgetDelegate_3 extends _i1.Fake + implements _i5.WebViewWidgetDelegate {} /// A class which mocks [WebViewPlatform]. /// /// See the documentation for Mockito's code generation for more information. -class MockWebViewPlatform extends _i1.Mock implements _i7.WebViewPlatform { +class MockWebViewPlatform extends _i1.Mock implements _i6.WebViewPlatform { MockWebViewPlatform() { _i1.throwOnMissingStub(this); } @override - _i2.WebViewCookieManagerDelegate createCookieManagerDelegate() => - (super.noSuchMethod(Invocation.method(#createCookieManagerDelegate, []), + _i2.WebViewCookieManagerDelegate createCookieManagerDelegate( + _i7.WebViewCookieManagerCreationParams? params) => + (super.noSuchMethod( + Invocation.method(#createCookieManagerDelegate, [params]), returnValue: _FakeWebViewCookieManagerDelegate_0()) as _i2.WebViewCookieManagerDelegate); @override - _i3.NavigationCallbackDelegate createNavigationCallbackHandlerDelegate() => + _i3.NavigationCallbackDelegate createNavigationCallbackDelegate( + _i7.NavigationCallbackCreationParams? params) => (super.noSuchMethod( - Invocation.method(#createNavigationCallbackHandlerDelegate, []), + Invocation.method(#createNavigationCallbackDelegate, [params]), returnValue: _FakeNavigationCallbackDelegate_1()) as _i3.NavigationCallbackDelegate); @override - _i4.JavaScriptMessage createJavaScriptMessage(String? message) => (super - .noSuchMethod(Invocation.method(#createJavaScriptMessage, [message]), - returnValue: _FakeJavaScriptMessage_2()) as _i4.JavaScriptMessage); - @override - _i5.WebViewControllerDelegate createWebViewControllerDelegate( - _i4.WebViewControllerCreationParams? params) => + _i4.WebViewControllerDelegate createWebViewControllerDelegate( + _i7.WebViewControllerCreationParams? params) => (super.noSuchMethod( Invocation.method(#createWebViewControllerDelegate, [params]), - returnValue: _FakeWebViewControllerDelegate_3()) - as _i5.WebViewControllerDelegate); + returnValue: _FakeWebViewControllerDelegate_2()) + as _i4.WebViewControllerDelegate); @override - _i6.WebViewWidgetDelegate createWebViewWidgetDelegate( - {_i8.Key? key, - _i5.WebViewControllerDelegate? controller, - Set<_i8.Factory<_i9.OneSequenceGestureRecognizer>>? - gestureRecognizers}) => + _i5.WebViewWidgetDelegate createWebViewWidgetDelegate( + _i8.WebViewWidgetCreationParams? params) => (super.noSuchMethod( - Invocation.method(#createWebViewWidgetDelegate, [], { - #key: key, - #controller: controller, - #gestureRecognizers: gestureRecognizers - }), - returnValue: _FakeWebViewWidgetDelegate_4()) - as _i6.WebViewWidgetDelegate); + Invocation.method(#createWebViewWidgetDelegate, [params]), + returnValue: _FakeWebViewWidgetDelegate_3()) + as _i5.WebViewWidgetDelegate); @override String toString() => super.toString(); } diff --git a/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/webview_widget_delegate_test.dart b/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/webview_widget_delegate_test.dart index b68cf7916a8e..d6ce55a3493f 100644 --- a/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/webview_widget_delegate_test.dart +++ b/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/webview_widget_delegate_test.dart @@ -20,33 +20,36 @@ void main() { test('Cannot be implemented with `implements`', () { final MockWebViewControllerDelegate controller = MockWebViewControllerDelegate(); - when(WebViewPlatform.instance! - .createWebViewWidgetDelegate(controller: controller)) + final WebViewWidgetCreationParams params = + WebViewWidgetCreationParams(controller: controller); + when(WebViewPlatform.instance!.createWebViewWidgetDelegate(params)) .thenReturn(ImplementsWebViewWidgetDelegate()); expect(() { - WebViewWidgetDelegate(controller: controller); + WebViewWidgetDelegate(params); }, throwsNoSuchMethodError); }); test('Can be extended', () { final MockWebViewControllerDelegate controller = MockWebViewControllerDelegate(); - when(WebViewPlatform.instance! - .createWebViewWidgetDelegate(controller: controller)) - .thenReturn(ExtendsWebViewWidgetDelegate(controller: controller)); + final WebViewWidgetCreationParams params = + WebViewWidgetCreationParams(controller: controller); + when(WebViewPlatform.instance!.createWebViewWidgetDelegate(params)) + .thenReturn(ExtendsWebViewWidgetDelegate(params)); - expect(WebViewWidgetDelegate(controller: controller), isNotNull); + expect(WebViewWidgetDelegate(params), isNotNull); }); test('Can be mocked with `implements`', () { final MockWebViewControllerDelegate controller = MockWebViewControllerDelegate(); - when(WebViewPlatform.instance! - .createWebViewWidgetDelegate(controller: controller)) + final WebViewWidgetCreationParams params = + WebViewWidgetCreationParams(controller: controller); + when(WebViewPlatform.instance!.createWebViewWidgetDelegate(params)) .thenReturn(MockWebViewWidgetDelegate()); - expect(WebViewWidgetDelegate(controller: controller), isNotNull); + expect(WebViewWidgetDelegate(params), isNotNull); }); } @@ -68,9 +71,8 @@ class MockWebViewWidgetDelegate extends Mock WebViewWidgetDelegate {} class ExtendsWebViewWidgetDelegate extends WebViewWidgetDelegate { - ExtendsWebViewWidgetDelegate({ - required MockWebViewControllerDelegate controller, - }) : super.implementation(controller: controller); + ExtendsWebViewWidgetDelegate(WebViewWidgetCreationParams params) + : super.implementation(params); @override Widget build(BuildContext context) { From fa54703d11c364d2bf045ceeca3ce00306ffea26 Mon Sep 17 00:00:00 2001 From: Maurits van Beusekom Date: Thu, 14 Apr 2022 13:49:22 +0200 Subject: [PATCH 23/31] Rearrange folder structure to allow easier migration final version --- .../src}/navigation_callback_delegate.dart | 0 .../v4 => v4/src}/types/javascript_message.dart | 0 .../v4 => v4/src}/types/javascript_mode.dart | 0 .../v4 => v4/src}/types/load_request_params.dart | 3 ++- .../navigation_callback_creation_params.dart | 0 .../lib/{src/v4 => v4/src}/types/types.dart | 0 .../v4 => v4/src}/types/web_resource_error.dart | 0 .../webview_controller_creation_params.dart | 0 .../{src/v4 => v4/src}/types/webview_cookie.dart | 0 .../webview_cookie_manager_creation_params.dart | 0 .../types/webview_widget_creation_params.dart | 0 .../src}/webview_controller_delegate.dart | 3 +-- .../src}/webview_cookie_manager_delegate.dart | 0 .../lib/{src/v4 => v4/src}/webview_platform.dart | 5 ++--- .../v4 => v4/src}/webview_widget_delegate.dart | 0 .../v4/webview_flutter_platform_interface.dart | 10 ++++++++++ .../v4/navigation_callback_delegate_test.dart | 4 ++-- .../src/v4/webview_controller_delegate_test.dart | 6 +++--- .../webview_controller_delegate_test.mocks.dart | 4 ++-- .../test/src/v4/webview_platform_test.dart | 4 ++-- .../test/src/v4/webview_platform_test.mocks.dart | 16 +++++++--------- .../src/v4/webview_widget_delegate_test.dart | 6 +++--- 22 files changed, 34 insertions(+), 27 deletions(-) rename packages/webview_flutter/webview_flutter_platform_interface/lib/{src/v4 => v4/src}/navigation_callback_delegate.dart (100%) rename packages/webview_flutter/webview_flutter_platform_interface/lib/{src/v4 => v4/src}/types/javascript_message.dart (100%) rename packages/webview_flutter/webview_flutter_platform_interface/lib/{src/v4 => v4/src}/types/javascript_mode.dart (100%) rename packages/webview_flutter/webview_flutter_platform_interface/lib/{src/v4 => v4/src}/types/load_request_params.dart (96%) rename packages/webview_flutter/webview_flutter_platform_interface/lib/{src/v4 => v4/src}/types/navigation_callback_creation_params.dart (100%) rename packages/webview_flutter/webview_flutter_platform_interface/lib/{src/v4 => v4/src}/types/types.dart (100%) rename packages/webview_flutter/webview_flutter_platform_interface/lib/{src/v4 => v4/src}/types/web_resource_error.dart (100%) rename packages/webview_flutter/webview_flutter_platform_interface/lib/{src/v4 => v4/src}/types/webview_controller_creation_params.dart (100%) rename packages/webview_flutter/webview_flutter_platform_interface/lib/{src/v4 => v4/src}/types/webview_cookie.dart (100%) rename packages/webview_flutter/webview_flutter_platform_interface/lib/{src/v4 => v4/src}/types/webview_cookie_manager_creation_params.dart (100%) rename packages/webview_flutter/webview_flutter_platform_interface/lib/{src/v4 => v4/src}/types/webview_widget_creation_params.dart (100%) rename packages/webview_flutter/webview_flutter_platform_interface/lib/{src/v4 => v4/src}/webview_controller_delegate.dart (98%) rename packages/webview_flutter/webview_flutter_platform_interface/lib/{src/v4 => v4/src}/webview_cookie_manager_delegate.dart (100%) rename packages/webview_flutter/webview_flutter_platform_interface/lib/{src/v4 => v4/src}/webview_platform.dart (91%) rename packages/webview_flutter/webview_flutter_platform_interface/lib/{src/v4 => v4/src}/webview_widget_delegate.dart (100%) create mode 100644 packages/webview_flutter/webview_flutter_platform_interface/lib/v4/webview_flutter_platform_interface.dart diff --git a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/navigation_callback_delegate.dart b/packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/navigation_callback_delegate.dart similarity index 100% rename from packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/navigation_callback_delegate.dart rename to packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/navigation_callback_delegate.dart diff --git a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/javascript_message.dart b/packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/types/javascript_message.dart similarity index 100% rename from packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/javascript_message.dart rename to packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/types/javascript_message.dart diff --git a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/javascript_mode.dart b/packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/types/javascript_mode.dart similarity index 100% rename from packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/javascript_mode.dart rename to packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/types/javascript_mode.dart diff --git a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/load_request_params.dart b/packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/types/load_request_params.dart similarity index 96% rename from packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/load_request_params.dart rename to packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/types/load_request_params.dart index ce6f7f6c9758..b845582cc5f9 100644 --- a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/load_request_params.dart +++ b/packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/types/load_request_params.dart @@ -4,7 +4,8 @@ import 'dart:typed_data'; import 'package:flutter/foundation.dart'; -import 'package:webview_flutter_platform_interface/src/v4/webview_controller_delegate.dart'; + +import '../webview_controller_delegate.dart'; /// Defines the supported HTTP methods for loading a page in [WebViewControllerDelegate]. enum LoadRequestMethod { diff --git a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/navigation_callback_creation_params.dart b/packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/types/navigation_callback_creation_params.dart similarity index 100% rename from packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/navigation_callback_creation_params.dart rename to packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/types/navigation_callback_creation_params.dart diff --git a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/types.dart b/packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/types/types.dart similarity index 100% rename from packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/types.dart rename to packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/types/types.dart diff --git a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/web_resource_error.dart b/packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/types/web_resource_error.dart similarity index 100% rename from packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/web_resource_error.dart rename to packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/types/web_resource_error.dart diff --git a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/webview_controller_creation_params.dart b/packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/types/webview_controller_creation_params.dart similarity index 100% rename from packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/webview_controller_creation_params.dart rename to packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/types/webview_controller_creation_params.dart diff --git a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/webview_cookie.dart b/packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/types/webview_cookie.dart similarity index 100% rename from packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/webview_cookie.dart rename to packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/types/webview_cookie.dart diff --git a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/webview_cookie_manager_creation_params.dart b/packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/types/webview_cookie_manager_creation_params.dart similarity index 100% rename from packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/webview_cookie_manager_creation_params.dart rename to packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/types/webview_cookie_manager_creation_params.dart diff --git a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/webview_widget_creation_params.dart b/packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/types/webview_widget_creation_params.dart similarity index 100% rename from packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/types/webview_widget_creation_params.dart rename to packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/types/webview_widget_creation_params.dart diff --git a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/webview_controller_delegate.dart b/packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/webview_controller_delegate.dart similarity index 98% rename from packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/webview_controller_delegate.dart rename to packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/webview_controller_delegate.dart index dd3ad884219f..7d433856aa82 100644 --- a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/webview_controller_delegate.dart +++ b/packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/webview_controller_delegate.dart @@ -7,9 +7,8 @@ import 'dart:ui'; import 'package:flutter/foundation.dart'; import 'package:plugin_platform_interface/plugin_platform_interface.dart'; -import 'package:webview_flutter_platform_interface/src/v4/navigation_callback_delegate.dart'; -import 'package:webview_flutter_platform_interface/src/v4/types/load_request_params.dart'; +import 'navigation_callback_delegate.dart'; import 'types/types.dart'; import 'webview_platform.dart'; diff --git a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/webview_cookie_manager_delegate.dart b/packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/webview_cookie_manager_delegate.dart similarity index 100% rename from packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/webview_cookie_manager_delegate.dart rename to packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/webview_cookie_manager_delegate.dart diff --git a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/webview_platform.dart b/packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/webview_platform.dart similarity index 91% rename from packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/webview_platform.dart rename to packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/webview_platform.dart index 5489781bf8d6..29708de70c83 100644 --- a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/webview_platform.dart +++ b/packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/webview_platform.dart @@ -3,13 +3,12 @@ // found in the LICENSE file. import 'package:plugin_platform_interface/plugin_platform_interface.dart'; -import 'package:webview_flutter_platform_interface/src/v4/types/types.dart'; -import 'package:webview_flutter_platform_interface/src/v4/types/webview_widget_creation_params.dart'; -import 'package:webview_flutter_platform_interface/src/v4/webview_widget_delegate.dart'; import 'navigation_callback_delegate.dart'; +import 'types/types.dart'; import 'webview_controller_delegate.dart'; import 'webview_cookie_manager_delegate.dart'; +import 'webview_widget_delegate.dart'; export 'types/types.dart'; diff --git a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/webview_widget_delegate.dart b/packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/webview_widget_delegate.dart similarity index 100% rename from packages/webview_flutter/webview_flutter_platform_interface/lib/src/v4/webview_widget_delegate.dart rename to packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/webview_widget_delegate.dart 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 new file mode 100644 index 000000000000..db065a80dbf5 --- /dev/null +++ b/packages/webview_flutter/webview_flutter_platform_interface/lib/v4/webview_flutter_platform_interface.dart @@ -0,0 +1,10 @@ +// 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/navigation_callback_delegate.dart'; +export 'src/types/types.dart'; +export 'src/webview_controller_delegate.dart'; +export 'src/webview_cookie_manager_delegate.dart'; +export 'src/webview_platform.dart'; +export 'src/webview_widget_delegate.dart'; diff --git a/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/navigation_callback_delegate_test.dart b/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/navigation_callback_delegate_test.dart index c86516a0779f..43c99d9c5cfd 100644 --- a/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/navigation_callback_delegate_test.dart +++ b/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/navigation_callback_delegate_test.dart @@ -5,8 +5,8 @@ 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/src/v4/navigation_callback_delegate.dart'; -import 'package:webview_flutter_platform_interface/src/v4/webview_platform.dart'; +import 'package:webview_flutter_platform_interface/v4/src/navigation_callback_delegate.dart'; +import 'package:webview_flutter_platform_interface/v4/src/webview_platform.dart'; import 'webview_platform_test.mocks.dart'; diff --git a/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/webview_controller_delegate_test.dart b/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/webview_controller_delegate_test.dart index 5a8e8346d0e2..774b81746cb9 100644 --- a/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/webview_controller_delegate_test.dart +++ b/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/webview_controller_delegate_test.dart @@ -7,9 +7,9 @@ import 'package:flutter_test/flutter_test.dart'; 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/src/v4/navigation_callback_delegate.dart'; -import 'package:webview_flutter_platform_interface/src/v4/webview_controller_delegate.dart'; -import 'package:webview_flutter_platform_interface/src/v4/webview_platform.dart'; +import 'package:webview_flutter_platform_interface/v4/src/navigation_callback_delegate.dart'; +import 'package:webview_flutter_platform_interface/v4/src/webview_controller_delegate.dart'; +import 'package:webview_flutter_platform_interface/v4/src/webview_platform.dart'; import 'navigation_callback_delegate_test.dart'; import 'webview_platform_test.mocks.dart'; diff --git a/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/webview_controller_delegate_test.mocks.dart b/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/webview_controller_delegate_test.mocks.dart index 5ec5904badbc..47e0071d1a5e 100644 --- a/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/webview_controller_delegate_test.mocks.dart +++ b/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/webview_controller_delegate_test.mocks.dart @@ -5,9 +5,9 @@ import 'dart:async' as _i4; import 'package:mockito/mockito.dart' as _i1; -import 'package:webview_flutter_platform_interface/src/v4/navigation_callback_delegate.dart' +import 'package:webview_flutter_platform_interface/v4/src/navigation_callback_delegate.dart' as _i3; -import 'package:webview_flutter_platform_interface/src/v4/webview_platform.dart' +import 'package:webview_flutter_platform_interface/v4/src/webview_platform.dart' as _i2; // ignore_for_file: avoid_redundant_argument_values 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/src/v4/webview_platform_test.dart index d8a15cccb51d..6f3d2957af10 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/src/v4/webview_platform_test.dart @@ -6,8 +6,8 @@ import 'package:flutter_test/flutter_test.dart'; 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/src/v4/webview_controller_delegate.dart'; -import 'package:webview_flutter_platform_interface/src/v4/webview_platform.dart'; +import 'package:webview_flutter_platform_interface/v4/src/webview_controller_delegate.dart'; +import 'package:webview_flutter_platform_interface/v4/src/webview_platform.dart'; import 'webview_platform_test.mocks.dart'; 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 index 8739cafc517e..0a6ab677c1e2 100644 --- 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 @@ -3,19 +3,17 @@ // Do not manually edit this file. import 'package:mockito/mockito.dart' as _i1; -import 'package:webview_flutter_platform_interface/src/v4/navigation_callback_delegate.dart' +import 'package:webview_flutter_platform_interface/v4/src/navigation_callback_delegate.dart' as _i3; -import 'package:webview_flutter_platform_interface/src/v4/types/types.dart' +import 'package:webview_flutter_platform_interface/v4/src/types/types.dart' as _i7; -import 'package:webview_flutter_platform_interface/src/v4/types/webview_widget_creation_params.dart' - as _i8; -import 'package:webview_flutter_platform_interface/src/v4/webview_controller_delegate.dart' +import 'package:webview_flutter_platform_interface/v4/src/webview_controller_delegate.dart' as _i4; -import 'package:webview_flutter_platform_interface/src/v4/webview_cookie_manager_delegate.dart' +import 'package:webview_flutter_platform_interface/v4/src/webview_cookie_manager_delegate.dart' as _i2; -import 'package:webview_flutter_platform_interface/src/v4/webview_platform.dart' +import 'package:webview_flutter_platform_interface/v4/src/webview_platform.dart' as _i6; -import 'package:webview_flutter_platform_interface/src/v4/webview_widget_delegate.dart' +import 'package:webview_flutter_platform_interface/v4/src/webview_widget_delegate.dart' as _i5; // ignore_for_file: avoid_redundant_argument_values @@ -70,7 +68,7 @@ class MockWebViewPlatform extends _i1.Mock implements _i6.WebViewPlatform { as _i4.WebViewControllerDelegate); @override _i5.WebViewWidgetDelegate createWebViewWidgetDelegate( - _i8.WebViewWidgetCreationParams? params) => + _i7.WebViewWidgetCreationParams? params) => (super.noSuchMethod( Invocation.method(#createWebViewWidgetDelegate, [params]), returnValue: _FakeWebViewWidgetDelegate_3()) diff --git a/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/webview_widget_delegate_test.dart b/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/webview_widget_delegate_test.dart index d6ce55a3493f..eb529ac556c1 100644 --- a/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/webview_widget_delegate_test.dart +++ b/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/webview_widget_delegate_test.dart @@ -6,9 +6,9 @@ import 'package:flutter/widgets.dart'; 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/src/v4/webview_controller_delegate.dart'; -import 'package:webview_flutter_platform_interface/src/v4/webview_platform.dart'; -import 'package:webview_flutter_platform_interface/src/v4/webview_widget_delegate.dart'; +import 'package:webview_flutter_platform_interface/v4/src/webview_controller_delegate.dart'; +import 'package:webview_flutter_platform_interface/v4/src/webview_platform.dart'; +import 'package:webview_flutter_platform_interface/v4/src/webview_widget_delegate.dart'; import 'webview_platform_test.mocks.dart'; From d065f9330b448921c2651456569dc3ebec49939d Mon Sep 17 00:00:00 2001 From: Maurits van Beusekom Date: Thu, 14 Apr 2022 15:01:25 +0200 Subject: [PATCH 24/31] Update example in documentation --- .../navigation_callback_creation_params.dart | 11 ++++++++++- .../webview_controller_creation_params.dart | 13 +++++++++++-- .../webview_cookie_manager_creation_params.dart | 13 +++++++++++-- .../types/webview_widget_creation_params.dart | 16 ++++++++++++++-- 4 files changed, 46 insertions(+), 7 deletions(-) diff --git a/packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/types/navigation_callback_creation_params.dart b/packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/types/navigation_callback_creation_params.dart index 87bb147aa3bd..92faa57b15a6 100644 --- a/packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/types/navigation_callback_creation_params.dart +++ b/packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/types/navigation_callback_creation_params.dart @@ -17,10 +17,19 @@ /// /// ```dart /// class AndroidNavigationCallbackCreationParams extends NavigationCallbackCreationParams { -/// AndroidNavigationCallbackCreationParams({ +/// AndroidNavigationCallbackCreationParams._( +/// // ignore: avoid_unused_constructor_parameters +/// NavigationCallbackCreationParams params, { /// this.filter, /// }) : super(); /// +/// factory AndroidNavigationCallbackCreationParams.fromNavigationCallbackCreationParams( +/// NavigationCallbackCreationParams params, { +/// String? filter, +/// }) { +/// return AndroidNavigationCallbackCreationParams._(params, filter: filter); +/// } +/// /// final String? filter; /// } /// ``` diff --git a/packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/types/webview_controller_creation_params.dart b/packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/types/webview_controller_creation_params.dart index 4f56e5409dd7..ec514339f70b 100644 --- a/packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/types/webview_controller_creation_params.dart +++ b/packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/types/webview_controller_creation_params.dart @@ -16,11 +16,20 @@ /// changes. /// /// ```dart -/// class IOSWebViewControllerCreationParams extends WebViewControllerCreationParams { -/// IOSWebViewControllerCreationParams({ +/// class WKWebViewControllerCreationParams +/// extends WebViewControllerCreationParams { +/// WKWebViewControllerCreationParams._( +/// WebViewControllerCreationParams params, { /// this.domain, /// }) : super(); /// +/// factory WKWebViewControllerCreationParams.fromWebViewControllerCreationParams( +/// WebViewControllerCreationParams params, { +/// String? domain, +/// }) { +/// return WKWebViewControllerCreationParams._(params, domain: domain); +/// } +/// /// final String? domain; /// } /// ``` diff --git a/packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/types/webview_cookie_manager_creation_params.dart b/packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/types/webview_cookie_manager_creation_params.dart index e64f7cb40043..b62713278205 100644 --- a/packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/types/webview_cookie_manager_creation_params.dart +++ b/packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/types/webview_cookie_manager_creation_params.dart @@ -16,11 +16,20 @@ /// breaking changes. /// /// ```dart -/// class WKWebViewCookieManagerCreationParams extends WebViewCookieManagerCreationParams { -/// WKWebViewCookieManagerCreationParams({ +/// class WKWebViewCookieManagerCreationParams +/// extends WebViewCookieManagerCreationParams { +/// WKWebViewCookieManagerCreationParams._( +/// WebViewCookieManagerCreationParams params, { /// this.uri, /// }) : super(); /// +/// factory WKWebViewCookieManagerCreationParams.fromWebViewCookieManagerCreationParams( +/// WebViewCookieManagerCreationParams params, { +/// Uri? uri, +/// }) { +/// return WKWebViewCookieManagerCreationParams._(params, uri: uri); +/// } +/// /// final Uri? uri; /// } /// ``` diff --git a/packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/types/webview_widget_creation_params.dart b/packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/types/webview_widget_creation_params.dart index 9562ca0c7fa9..941d9bc81808 100644 --- a/packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/types/webview_widget_creation_params.dart +++ b/packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/types/webview_widget_creation_params.dart @@ -22,9 +22,21 @@ import '../webview_controller_delegate.dart'; /// /// ```dart /// class WKWebViewWidgetCreationParams extends WebViewWidgetCreationParams { -/// WKWebViewWidgetCreationParams({ +/// WKWebViewWidgetCreationParams._( +/// WebViewWidgetCreationParams params, { /// this.domain, -/// }) : super(); +/// }) : super( +/// key: params.key, +/// controller: params.controller, +/// gestureRecognizers: params.gestureRecognizers, +/// ); +/// +/// factory WKWebViewWidgetCreationParams.fromWebViewWidgetCreationParams( +/// WebViewWidgetCreationParams params, { +/// String? domain, +/// }) { +/// return WKWebViewWidgetCreationParams._(params, domain: domain); +/// } /// /// final String? domain; /// } From 76b2a02fed529cab7e6046624223261248f93ad6 Mon Sep 17 00:00:00 2001 From: Maurits van Beusekom Date: Thu, 14 Apr 2022 16:14:52 +0200 Subject: [PATCH 25/31] Make ...CreationParams immutable --- .../navigation_callback_creation_params.dart | 6 +- .../webview_controller_creation_params.dart | 7 +- ...ebview_cookie_manager_creation_params.dart | 7 +- .../types/webview_widget_creation_params.dart | 2 + .../v4/navigation_callback_delegate_test.dart | 21 +++-- .../v4/webview_controller_delegate_test.dart | 84 ++++++++++++------- .../test/src/v4/webview_platform_test.dart | 12 +-- 7 files changed, 93 insertions(+), 46 deletions(-) diff --git a/packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/types/navigation_callback_creation_params.dart b/packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/types/navigation_callback_creation_params.dart index 92faa57b15a6..34a62bf78038 100644 --- a/packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/types/navigation_callback_creation_params.dart +++ b/packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/types/navigation_callback_creation_params.dart @@ -2,6 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +import 'package:flutter/material.dart'; + /// Object specifying creation parameters for creating a [NavigationCallbackDelegate]. /// /// Platform specific implementations can add additional fields by extending @@ -18,6 +20,7 @@ /// ```dart /// class AndroidNavigationCallbackCreationParams extends NavigationCallbackCreationParams { /// AndroidNavigationCallbackCreationParams._( +/// // This parameter prevents breaking changes later. /// // ignore: avoid_unused_constructor_parameters /// NavigationCallbackCreationParams params, { /// this.filter, @@ -34,7 +37,8 @@ /// } /// ``` /// {@end-tool} +@immutable class NavigationCallbackCreationParams { /// Used by the platform implementation to create a new [NavigationCallbackDelegate]. - NavigationCallbackCreationParams(); + const NavigationCallbackCreationParams(); } diff --git a/packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/types/webview_controller_creation_params.dart b/packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/types/webview_controller_creation_params.dart index ec514339f70b..cce3400c3bd3 100644 --- a/packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/types/webview_controller_creation_params.dart +++ b/packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/types/webview_controller_creation_params.dart @@ -2,6 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +import 'package:flutter/material.dart'; + /// Object specifying creation parameters for creating a [WebViewControllerDelegate]. /// /// Platform specific implementations can add additional fields by extending @@ -19,6 +21,8 @@ /// class WKWebViewControllerCreationParams /// extends WebViewControllerCreationParams { /// WKWebViewControllerCreationParams._( +/// // This parameter prevents breaking changes later. +/// // ignore: avoid_unused_constructor_parameters /// WebViewControllerCreationParams params, { /// this.domain, /// }) : super(); @@ -34,7 +38,8 @@ /// } /// ``` /// {@end-tool} +@immutable class WebViewControllerCreationParams { /// Used by the platform implementation to create a new [WebViewControllerCreationParams]. - WebViewControllerCreationParams(); + const WebViewControllerCreationParams(); } diff --git a/packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/types/webview_cookie_manager_creation_params.dart b/packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/types/webview_cookie_manager_creation_params.dart index b62713278205..f97291bf8700 100644 --- a/packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/types/webview_cookie_manager_creation_params.dart +++ b/packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/types/webview_cookie_manager_creation_params.dart @@ -2,6 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +import 'package:flutter/material.dart'; + /// Object specifying creation parameters for creating a [WebViewCookieManagerDelegate]. /// /// Platform specific implementations can add additional fields by extending @@ -19,6 +21,8 @@ /// class WKWebViewCookieManagerCreationParams /// extends WebViewCookieManagerCreationParams { /// WKWebViewCookieManagerCreationParams._( +/// // This parameter prevents breaking changes later. +/// // ignore: avoid_unused_constructor_parameters /// WebViewCookieManagerCreationParams params, { /// this.uri, /// }) : super(); @@ -34,7 +38,8 @@ /// } /// ``` /// {@end-tool} +@immutable class WebViewCookieManagerCreationParams { /// Used by the platform implementation to create a new [WebViewCookieManagerDelegate]. - WebViewCookieManagerCreationParams(); + const WebViewCookieManagerCreationParams(); } diff --git a/packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/types/webview_widget_creation_params.dart b/packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/types/webview_widget_creation_params.dart index 941d9bc81808..f6bbaf9a8b4d 100644 --- a/packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/types/webview_widget_creation_params.dart +++ b/packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/types/webview_widget_creation_params.dart @@ -23,6 +23,8 @@ import '../webview_controller_delegate.dart'; /// ```dart /// class WKWebViewWidgetCreationParams extends WebViewWidgetCreationParams { /// WKWebViewWidgetCreationParams._( +/// // This parameter prevents breaking changes later. +/// // ignore: avoid_unused_constructor_parameters /// WebViewWidgetCreationParams params, { /// this.domain, /// }) : super( diff --git a/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/navigation_callback_delegate_test.dart b/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/navigation_callback_delegate_test.dart index 43c99d9c5cfd..1dc5e150f51a 100644 --- a/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/navigation_callback_delegate_test.dart +++ b/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/navigation_callback_delegate_test.dart @@ -16,7 +16,7 @@ void main() { }); test('Cannot be implemented with `implements`', () { - final NavigationCallbackCreationParams params = + const NavigationCallbackCreationParams params = NavigationCallbackCreationParams(); when(WebViewPlatform.instance!.createNavigationCallbackDelegate(params)) .thenReturn(ImplementsNavigationCallbackDelegate()); @@ -27,7 +27,7 @@ void main() { }); test('Can be extended', () { - final NavigationCallbackCreationParams params = + const NavigationCallbackCreationParams params = NavigationCallbackCreationParams(); when(WebViewPlatform.instance!.createNavigationCallbackDelegate(params)) .thenReturn(ExtendsNavigationCallbackDelegate(params)); @@ -36,7 +36,7 @@ void main() { }); test('Can be mocked with `implements`', () { - final NavigationCallbackCreationParams params = + const NavigationCallbackCreationParams params = NavigationCallbackCreationParams(); when(WebViewPlatform.instance!.createNavigationCallbackDelegate(params)) .thenReturn(MockNavigationCallbackDelegate()); @@ -49,7 +49,8 @@ void main() { 'Default implementation of setOnNavigationRequest should throw unimplemented error', () { final NavigationCallbackDelegate callbackDelegate = - ExtendsNavigationCallbackDelegate(NavigationCallbackCreationParams()); + ExtendsNavigationCallbackDelegate( + const NavigationCallbackCreationParams()); expect( () => callbackDelegate.setOnNavigationRequest( @@ -63,7 +64,8 @@ void main() { 'Default implementation of setOnPageStarted should throw unimplemented error', () { final NavigationCallbackDelegate callbackDelegate = - ExtendsNavigationCallbackDelegate(NavigationCallbackCreationParams()); + ExtendsNavigationCallbackDelegate( + const NavigationCallbackCreationParams()); expect( () => callbackDelegate.setOnPageStarted((String url) {}), @@ -76,7 +78,8 @@ void main() { 'Default implementation of setOnPageFinished should throw unimplemented error', () { final NavigationCallbackDelegate callbackDelegate = - ExtendsNavigationCallbackDelegate(NavigationCallbackCreationParams()); + ExtendsNavigationCallbackDelegate( + const NavigationCallbackCreationParams()); expect( () => callbackDelegate.setOnPageFinished((String url) {}), @@ -89,7 +92,8 @@ void main() { 'Default implementation of setOnProgress should throw unimplemented error', () { final NavigationCallbackDelegate callbackDelegate = - ExtendsNavigationCallbackDelegate(NavigationCallbackCreationParams()); + ExtendsNavigationCallbackDelegate( + const NavigationCallbackCreationParams()); expect( () => callbackDelegate.setOnProgress((int progress) {}), @@ -102,7 +106,8 @@ void main() { 'Default implementation of setOnWebResourceError should throw unimplemented error', () { final NavigationCallbackDelegate callbackDelegate = - ExtendsNavigationCallbackDelegate(NavigationCallbackCreationParams()); + ExtendsNavigationCallbackDelegate( + const NavigationCallbackCreationParams()); expect( () => callbackDelegate.setOnWebResourceError((WebResourceError error) {}), diff --git a/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/webview_controller_delegate_test.dart b/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/webview_controller_delegate_test.dart index 774b81746cb9..927a36390f3a 100644 --- a/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/webview_controller_delegate_test.dart +++ b/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/webview_controller_delegate_test.dart @@ -26,12 +26,12 @@ void main() { .thenReturn(ImplementsWebViewControllerDelegate()); expect(() { - WebViewControllerDelegate(WebViewControllerCreationParams()); + WebViewControllerDelegate(const WebViewControllerCreationParams()); }, throwsNoSuchMethodError); }); test('Can be extended', () { - final WebViewControllerCreationParams params = + const WebViewControllerCreationParams params = WebViewControllerCreationParams(); when((WebViewPlatform.instance! as MockWebViewPlatform) .createWebViewControllerDelegate(any)) @@ -45,7 +45,7 @@ void main() { .createWebViewControllerDelegate(any)) .thenReturn(MockWebViewControllerDelegate()); - expect(WebViewControllerDelegate(WebViewControllerCreationParams()), + expect(WebViewControllerDelegate(const WebViewControllerCreationParams()), isNotNull); }); @@ -54,7 +54,8 @@ void main() { 'Default implementation of loadFile should throw unimplemented error', () { final WebViewControllerDelegate controller = - ExtendsWebViewControllerDelegate(WebViewControllerCreationParams()); + ExtendsWebViewControllerDelegate( + const WebViewControllerCreationParams()); expect( () => controller.loadFile(''), @@ -67,7 +68,8 @@ void main() { 'Default implementation of loadFlutterAsset should throw unimplemented error', () { final WebViewControllerDelegate controller = - ExtendsWebViewControllerDelegate(WebViewControllerCreationParams()); + ExtendsWebViewControllerDelegate( + const WebViewControllerCreationParams()); expect( () => controller.loadFlutterAsset(''), @@ -80,7 +82,8 @@ void main() { 'Default implementation of loadHtmlString should throw unimplemented error', () { final WebViewControllerDelegate controller = - ExtendsWebViewControllerDelegate(WebViewControllerCreationParams()); + ExtendsWebViewControllerDelegate( + const WebViewControllerCreationParams()); expect( () => controller.loadHtmlString(''), @@ -93,7 +96,8 @@ void main() { 'Default implementation of loadRequest should throw unimplemented error', () { final WebViewControllerDelegate controller = - ExtendsWebViewControllerDelegate(WebViewControllerCreationParams()); + ExtendsWebViewControllerDelegate( + const WebViewControllerCreationParams()); expect( () => controller.loadRequest(MockLoadRequestParamsDelegate()), @@ -106,7 +110,8 @@ void main() { 'Default implementation of currentUrl should throw unimplemented error', () { final WebViewControllerDelegate controller = - ExtendsWebViewControllerDelegate(WebViewControllerCreationParams()); + ExtendsWebViewControllerDelegate( + const WebViewControllerCreationParams()); expect( () => controller.currentUrl(), @@ -119,7 +124,8 @@ void main() { 'Default implementation of canGoBack should throw unimplemented error', () { final WebViewControllerDelegate controller = - ExtendsWebViewControllerDelegate(WebViewControllerCreationParams()); + ExtendsWebViewControllerDelegate( + const WebViewControllerCreationParams()); expect( () => controller.canGoBack(), @@ -132,7 +138,8 @@ void main() { 'Default implementation of canGoForward should throw unimplemented error', () { final WebViewControllerDelegate controller = - ExtendsWebViewControllerDelegate(WebViewControllerCreationParams()); + ExtendsWebViewControllerDelegate( + const WebViewControllerCreationParams()); expect( () => controller.canGoForward(), @@ -144,7 +151,8 @@ void main() { // ignore: lines_longer_than_80_chars 'Default implementation of goBack should throw unimplemented error', () { final WebViewControllerDelegate controller = - ExtendsWebViewControllerDelegate(WebViewControllerCreationParams()); + ExtendsWebViewControllerDelegate( + const WebViewControllerCreationParams()); expect( () => controller.goBack(), @@ -157,7 +165,8 @@ void main() { 'Default implementation of goForward should throw unimplemented error', () { final WebViewControllerDelegate controller = - ExtendsWebViewControllerDelegate(WebViewControllerCreationParams()); + ExtendsWebViewControllerDelegate( + const WebViewControllerCreationParams()); expect( () => controller.goForward(), @@ -169,7 +178,8 @@ void main() { // ignore: lines_longer_than_80_chars 'Default implementation of reload should throw unimplemented error', () { final WebViewControllerDelegate controller = - ExtendsWebViewControllerDelegate(WebViewControllerCreationParams()); + ExtendsWebViewControllerDelegate( + const WebViewControllerCreationParams()); expect( () => controller.reload(), @@ -182,7 +192,8 @@ void main() { 'Default implementation of clearCache should throw unimplemented error', () { final WebViewControllerDelegate controller = - ExtendsWebViewControllerDelegate(WebViewControllerCreationParams()); + ExtendsWebViewControllerDelegate( + const WebViewControllerCreationParams()); expect( () => controller.clearCache(), @@ -194,7 +205,8 @@ void main() { 'Default implementation of the setNavigationCallback should throw unimplemented error', () { final WebViewControllerDelegate controller = - ExtendsWebViewControllerDelegate(WebViewControllerCreationParams()); + ExtendsWebViewControllerDelegate( + const WebViewControllerCreationParams()); expect( () => controller @@ -209,7 +221,8 @@ void main() { 'Default implementation of runJavaScript should throw unimplemented error', () { final WebViewControllerDelegate controller = - ExtendsWebViewControllerDelegate(WebViewControllerCreationParams()); + ExtendsWebViewControllerDelegate( + const WebViewControllerCreationParams()); expect( () => controller.runJavaScript('javaScript'), @@ -222,7 +235,8 @@ void main() { 'Default implementation of runJavaScriptReturningResult should throw unimplemented error', () { final WebViewControllerDelegate controller = - ExtendsWebViewControllerDelegate(WebViewControllerCreationParams()); + ExtendsWebViewControllerDelegate( + const WebViewControllerCreationParams()); expect( () => controller.runJavaScriptReturningResult('javaScript'), @@ -235,7 +249,8 @@ void main() { 'Default implementation of addJavaScriptChannel should throw unimplemented error', () { final WebViewControllerDelegate controller = - ExtendsWebViewControllerDelegate(WebViewControllerCreationParams()); + ExtendsWebViewControllerDelegate( + const WebViewControllerCreationParams()); expect( () => controller.addJavaScriptChannel( @@ -253,7 +268,8 @@ void main() { 'Default implementation of removeJavaScriptChannel should throw unimplemented error', () { final WebViewControllerDelegate controller = - ExtendsWebViewControllerDelegate(WebViewControllerCreationParams()); + ExtendsWebViewControllerDelegate( + const WebViewControllerCreationParams()); expect( () => controller.removeJavaScriptChannel('test'), @@ -266,7 +282,8 @@ void main() { 'Default implementation of getTitle should throw unimplemented error', () { final WebViewControllerDelegate controller = - ExtendsWebViewControllerDelegate(WebViewControllerCreationParams()); + ExtendsWebViewControllerDelegate( + const WebViewControllerCreationParams()); expect( () => controller.getTitle(), @@ -279,7 +296,8 @@ void main() { 'Default implementation of scrollTo should throw unimplemented error', () { final WebViewControllerDelegate controller = - ExtendsWebViewControllerDelegate(WebViewControllerCreationParams()); + ExtendsWebViewControllerDelegate( + const WebViewControllerCreationParams()); expect( () => controller.scrollTo(0, 0), @@ -292,7 +310,8 @@ void main() { 'Default implementation of scrollBy should throw unimplemented error', () { final WebViewControllerDelegate controller = - ExtendsWebViewControllerDelegate(WebViewControllerCreationParams()); + ExtendsWebViewControllerDelegate( + const WebViewControllerCreationParams()); expect( () => controller.scrollBy(0, 0), @@ -305,7 +324,8 @@ void main() { 'Default implementation of getScrollPosition should throw unimplemented error', () { final WebViewControllerDelegate controller = - ExtendsWebViewControllerDelegate(WebViewControllerCreationParams()); + ExtendsWebViewControllerDelegate( + const WebViewControllerCreationParams()); expect( () => controller.getScrollPosition(), @@ -318,7 +338,8 @@ void main() { 'Default implementation of enableDebugging should throw unimplemented error', () { final WebViewControllerDelegate controller = - ExtendsWebViewControllerDelegate(WebViewControllerCreationParams()); + ExtendsWebViewControllerDelegate( + const WebViewControllerCreationParams()); expect( () => controller.enableDebugging(true), @@ -331,7 +352,8 @@ void main() { 'Default implementation of enableGestureNavigation should throw unimplemented error', () { final WebViewControllerDelegate controller = - ExtendsWebViewControllerDelegate(WebViewControllerCreationParams()); + ExtendsWebViewControllerDelegate( + const WebViewControllerCreationParams()); expect( () => controller.enableGestureNavigation(true), @@ -344,7 +366,8 @@ void main() { 'Default implementation of enableZoom should throw unimplemented error', () { final WebViewControllerDelegate controller = - ExtendsWebViewControllerDelegate(WebViewControllerCreationParams()); + ExtendsWebViewControllerDelegate( + const WebViewControllerCreationParams()); expect( () => controller.enableZoom(true), @@ -357,7 +380,8 @@ void main() { 'Default implementation of setBackgroundColor should throw unimplemented error', () { final WebViewControllerDelegate controller = - ExtendsWebViewControllerDelegate(WebViewControllerCreationParams()); + ExtendsWebViewControllerDelegate( + const WebViewControllerCreationParams()); expect( () => controller.setBackgroundColor(Colors.blue), @@ -370,7 +394,8 @@ void main() { 'Default implementation of setJavaScriptMode should throw unimplemented error', () { final WebViewControllerDelegate controller = - ExtendsWebViewControllerDelegate(WebViewControllerCreationParams()); + ExtendsWebViewControllerDelegate( + const WebViewControllerCreationParams()); expect( () => controller.setJavaScriptMode(JavaScriptMode.disabled), @@ -383,7 +408,8 @@ void main() { 'Default implementation of setUserAgent should throw unimplemented error', () { final WebViewControllerDelegate controller = - ExtendsWebViewControllerDelegate(WebViewControllerCreationParams()); + ExtendsWebViewControllerDelegate( + const WebViewControllerCreationParams()); expect( () => controller.setUserAgent(null), 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/src/v4/webview_platform_test.dart index 6f3d2957af10..9f473f3cb34a 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/src/v4/webview_platform_test.dart @@ -41,8 +41,8 @@ void main() { final WebViewPlatform webViewPlatform = ExtendsWebViewPlatform(); expect( - () => webViewPlatform - .createCookieManagerDelegate(WebViewCookieManagerCreationParams()), + () => webViewPlatform.createCookieManagerDelegate( + const WebViewCookieManagerCreationParams()), throwsUnimplementedError, ); }); @@ -54,8 +54,8 @@ void main() { final WebViewPlatform webViewPlatform = ExtendsWebViewPlatform(); expect( - () => webViewPlatform - .createNavigationCallbackDelegate(NavigationCallbackCreationParams()), + () => webViewPlatform.createNavigationCallbackDelegate( + const NavigationCallbackCreationParams()), throwsUnimplementedError, ); }); @@ -67,8 +67,8 @@ void main() { final WebViewPlatform webViewPlatform = ExtendsWebViewPlatform(); expect( - () => webViewPlatform - .createWebViewControllerDelegate(WebViewControllerCreationParams()), + () => webViewPlatform.createWebViewControllerDelegate( + const WebViewControllerCreationParams()), throwsUnimplementedError, ); }); From 4cc0f561f386f44201f683bea25ef25554f1d28d Mon Sep 17 00:00:00 2001 From: Maurits van Beusekom Date: Fri, 15 Apr 2022 14:15:22 +0200 Subject: [PATCH 26/31] Made JavaScriptChannelRegistry available --- .../v4/src/javascript_channel_registry.dart | 45 +++++++ .../lib/v4/src/types/javascript_channel.dart | 35 ++++++ .../lib/v4/src/types/types.dart | 1 + .../webview_flutter_platform_interface.dart | 1 + .../pubspec.yaml | 1 + .../v4/javascript_channel_registry_test.dart | 118 ++++++++++++++++++ 6 files changed, 201 insertions(+) create mode 100644 packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/javascript_channel_registry.dart create mode 100644 packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/types/javascript_channel.dart create mode 100644 packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/javascript_channel_registry_test.dart diff --git a/packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/javascript_channel_registry.dart b/packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/javascript_channel_registry.dart new file mode 100644 index 000000000000..49d1a6554568 --- /dev/null +++ b/packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/javascript_channel_registry.dart @@ -0,0 +1,45 @@ +// 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:meta/meta.dart'; + +import 'types/javascript_channel.dart'; +import 'types/javascript_message.dart'; + +/// Utility class for managing named JavaScript channels and forwarding incoming +/// messages on the correct channel. +@sealed +class JavaScriptChannelRegistry { + /// Constructs a [JavaScriptChannelRegistry] initializing it with the given + /// set of [JavaScriptChannel]s. + JavaScriptChannelRegistry(Set? channels) { + updateJavaScriptChannelsFromSet(channels); + } + + /// Maps a channel name to a channel. + final Map channels = {}; + + /// Invoked when a JavaScript channel message is received. + void onJavaScriptChannelMessage(String channel, String message) { + final JavaScriptChannel? javaScriptChannel = channels[channel]; + + if (javaScriptChannel == null) { + throw ArgumentError('No channel registered with name $channel.'); + } + + javaScriptChannel.onMessageReceived(JavaScriptMessage(message: message)); + } + + /// Updates the set of [JavaScriptChannel]s with the new set. + void updateJavaScriptChannelsFromSet(Set? channels) { + this.channels.clear(); + if (channels == null) { + return; + } + + for (final JavaScriptChannel channel in channels) { + this.channels[channel.name] = channel; + } + } +} diff --git a/packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/types/javascript_channel.dart b/packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/types/javascript_channel.dart new file mode 100644 index 000000000000..92e5a9911b04 --- /dev/null +++ b/packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/types/javascript_channel.dart @@ -0,0 +1,35 @@ +// 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 'javascript_message.dart'; + +/// Callback type for handling messages sent from JavaScript running in a web view. +typedef JavaScriptMessageHandler = void Function(JavaScriptMessage message); + +final RegExp _validChannelNames = RegExp(r'^[a-zA-Z_][a-zA-Z0-9_]*$'); + +/// A named channel for receiving messaged from JavaScript code running inside a web view. +class JavaScriptChannel { + /// Constructs a JavaScript channel. + /// + /// The parameters `name` and `onMessageReceived` must not be null. + JavaScriptChannel({ + required this.name, + required this.onMessageReceived, + }) : assert(name != null), + assert(onMessageReceived != null), + assert(_validChannelNames.hasMatch(name)); + + /// The channel's name. + /// + /// The name must start with a letter or underscore(_), followed by any + /// combination of alphabetic characters plus digits. + /// + /// Note that any JavaScript existing `window` property with this name will be + /// overriden. + final String name; + + /// A callback that's invoked when a message is received through the channel. + final JavaScriptMessageHandler onMessageReceived; +} diff --git a/packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/types/types.dart b/packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/types/types.dart index 1ea3c213aca9..bcd2c746c7d6 100644 --- a/packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/types/types.dart +++ b/packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/types/types.dart @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +export 'javascript_channel.dart'; export 'javascript_message.dart'; export 'javascript_mode.dart'; export 'load_request_params.dart'; 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 index db065a80dbf5..9cfcc7685f92 100644 --- 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 @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +export 'src/javascript_channel_registry.dart'; export 'src/navigation_callback_delegate.dart'; export 'src/types/types.dart'; export 'src/webview_controller_delegate.dart'; diff --git a/packages/webview_flutter/webview_flutter_platform_interface/pubspec.yaml b/packages/webview_flutter/webview_flutter_platform_interface/pubspec.yaml index 23e53f2fd7da..c339a0f4a2ce 100644 --- a/packages/webview_flutter/webview_flutter_platform_interface/pubspec.yaml +++ b/packages/webview_flutter/webview_flutter_platform_interface/pubspec.yaml @@ -13,6 +13,7 @@ environment: dependencies: flutter: sdk: flutter + meta: ^1.7.0 plugin_platform_interface: ^2.1.0 dev_dependencies: diff --git a/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/javascript_channel_registry_test.dart b/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/javascript_channel_registry_test.dart new file mode 100644 index 000000000000..60aaaf0dd700 --- /dev/null +++ b/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/javascript_channel_registry_test.dart @@ -0,0 +1,118 @@ +// 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_test/flutter_test.dart'; +import 'package:webview_flutter_platform_interface/v4/src/javaScript_channel_registry.dart'; +import 'package:webview_flutter_platform_interface/v4/src/types/types.dart'; + +void main() { + final Map _log = {}; + final Set _channels = { + JavaScriptChannel( + name: 'js_channel_1', + onMessageReceived: (JavaScriptMessage message) => + _log['js_channel_1'] = message.message, + ), + JavaScriptChannel( + name: 'js_channel_2', + onMessageReceived: (JavaScriptMessage message) => + _log['js_channel_2'] = message.message, + ), + JavaScriptChannel( + name: 'js_channel_3', + onMessageReceived: (JavaScriptMessage message) => + _log['js_channel_3'] = message.message, + ), + }; + + tearDown(() { + _log.clear(); + }); + + test('ctor should initialize with channels.', () { + final JavaScriptChannelRegistry registry = + JavaScriptChannelRegistry(_channels); + + expect(registry.channels.length, 3); + for (final JavaScriptChannel channel in _channels) { + expect(registry.channels[channel.name], channel); + } + }); + + test('onJavaScriptChannelMessage should forward message on correct channel.', + () { + final JavaScriptChannelRegistry registry = + JavaScriptChannelRegistry(_channels); + + registry.onJavaScriptChannelMessage( + 'js_channel_2', + 'test message on channel 2', + ); + + expect( + _log, + containsPair( + 'js_channel_2', + 'test message on channel 2', + )); + }); + + test( + 'onJavaScriptChannelMessage should throw ArgumentError when message arrives on non-existing channel.', + () { + final JavaScriptChannelRegistry registry = + JavaScriptChannelRegistry(_channels); + + expect( + () => registry.onJavaScriptChannelMessage( + 'js_channel_4', + 'test message on channel 2', + ), + throwsA( + isA().having((ArgumentError error) => error.message, + 'message', 'No channel registered with name js_channel_4.'), + )); + }); + + test( + 'updateJavaScriptChannelsFromSet should clear all channels when null is supplied.', + () { + final JavaScriptChannelRegistry registry = + JavaScriptChannelRegistry(_channels); + + expect(registry.channels.length, 3); + + registry.updateJavaScriptChannelsFromSet(null); + + expect(registry.channels, isEmpty); + }); + + test('updateJavaScriptChannelsFromSet should update registry with new set.', + () { + final JavaScriptChannelRegistry registry = + JavaScriptChannelRegistry(_channels); + + expect(registry.channels.length, 3); + + final Set newChannels = { + JavaScriptChannel( + name: 'new_js_channel_1', + onMessageReceived: (JavaScriptMessage message) => + _log['new_js_channel_1'] = message.message, + ), + JavaScriptChannel( + name: 'new_js_channel_2', + onMessageReceived: (JavaScriptMessage message) => + _log['new_js_channel_2'] = message.message, + ), + }; + + registry.updateJavaScriptChannelsFromSet(newChannels); + + expect(registry.channels.length, 2); + for (final JavaScriptChannel channel in newChannels) { + expect(registry.channels[channel.name], channel); + } + }); +} From 44d7782ddbcc3b44ed6306ca759f2dff1ae38035 Mon Sep 17 00:00:00 2001 From: Maurits van Beusekom Date: Tue, 19 Apr 2022 11:17:50 +0200 Subject: [PATCH 27/31] Added PR feedback --- .../lib/v4/src/javascript_channel_registry.dart | 2 +- .../lib/v4/src/navigation_callback_delegate.dart | 2 +- .../lib/v4/src/types/javascript_message.dart | 2 +- .../lib/v4/src/types/web_resource_error.dart | 2 -- .../lib/v4/src/types/webview_widget_creation_params.dart | 6 +++--- .../lib/v4/src/webview_controller_delegate.dart | 1 - .../lib/v4/src/webview_platform.dart | 8 ++++---- .../test/src/v4/javascript_channel_registry_test.dart | 2 +- 8 files changed, 11 insertions(+), 14 deletions(-) diff --git a/packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/javascript_channel_registry.dart b/packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/javascript_channel_registry.dart index 49d1a6554568..84c7bde72b4e 100644 --- a/packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/javascript_channel_registry.dart +++ b/packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/javascript_channel_registry.dart @@ -31,7 +31,7 @@ class JavaScriptChannelRegistry { javaScriptChannel.onMessageReceived(JavaScriptMessage(message: message)); } - /// Updates the set of [JavaScriptChannel]s with the new set. + /// Replaces the set of [JavaScriptChannel]s with the new set. void updateJavaScriptChannelsFromSet(Set? channels) { this.channels.clear(); if (channels == null) { diff --git a/packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/navigation_callback_delegate.dart b/packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/navigation_callback_delegate.dart index aec182f72226..7344b7fa440a 100644 --- a/packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/navigation_callback_delegate.dart +++ b/packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/navigation_callback_delegate.dart @@ -13,7 +13,7 @@ import 'webview_platform.dart'; /// /// The [WebViewControllerDelegate] is notifying this delegate on events that /// happened on the platform's webview. Platform implementations should -/// implement this class and pass an instance to the[WebViewControllerDelegate]. +/// implement this class and pass an instance to the [WebViewControllerDelegate]. abstract class NavigationCallbackDelegate extends PlatformInterface { /// Creates a new [NavigationCallbackDelegate] factory NavigationCallbackDelegate(NavigationCallbackCreationParams params) { 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 index 0989aab52fa3..b37661a045a9 100644 --- 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 @@ -7,7 +7,7 @@ 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 provide a factory method that takes the +/// this class and providing a factory method that takes the /// [JavaScriptMessage] as a parameter. /// /// {@tool sample} 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 index ea2e2a1d36c9..465799472912 100644 --- 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 @@ -115,7 +115,5 @@ class WebResourceError { 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; } diff --git a/packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/types/webview_widget_creation_params.dart b/packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/types/webview_widget_creation_params.dart index f6bbaf9a8b4d..9b07a33412fb 100644 --- a/packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/types/webview_widget_creation_params.dart +++ b/packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/types/webview_widget_creation_params.dart @@ -50,7 +50,7 @@ class WebViewWidgetCreationParams { const WebViewWidgetCreationParams({ this.key, required this.controller, - this.gestureRecognizers, + this.gestureRecognizers = const >{}, }); /// Controls how one widget replaces another widget in the tree. @@ -72,8 +72,8 @@ class WebViewWidgetCreationParams { /// [ListView] will want to handle vertical drags. The web view will claim /// gestures that are recognized by any of the recognizers on this list. /// - /// When `gestureRecognizers` is empty or null, the web view will only handle + /// When `gestureRecognizers` is empty (default), the web view will only handle /// pointer events for gestures that were not claimed by any other gesture /// recognizer. - final Set>? gestureRecognizers; + final Set> gestureRecognizers; } diff --git a/packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/webview_controller_delegate.dart b/packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/webview_controller_delegate.dart index 7d433856aa82..1be226451087 100644 --- a/packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/webview_controller_delegate.dart +++ b/packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/webview_controller_delegate.dart @@ -146,7 +146,6 @@ abstract class WebViewControllerDelegate extends PlatformInterface { /// 2. [Cache API](https://developers.google.com/web/fundamentals/instant-and-offline/web-storage/cache-api) caches. /// These are not yet supported in iOS WkWebView. Service workers tend to use this cache. /// 3. Application cache. - /// 4. Local Storage. Future clearCache() { throw UnimplementedError( 'clearCache is not implemented on the current platform'); 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/v4/src/webview_platform.dart index 29708de70c83..e23ad2b03889 100644 --- a/packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/webview_platform.dart +++ b/packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/webview_platform.dart @@ -38,7 +38,7 @@ abstract class WebViewPlatform extends PlatformInterface { /// Creates a new [WebViewCookieManagerDelegate]. /// - /// This function should only be called by the app-facing plugin. + /// This function should only be called by the app-facing package. /// Look at using [WebViewCookieManager] in `webview_flutter` instead. WebViewCookieManagerDelegate createCookieManagerDelegate( WebViewCookieManagerCreationParams params, @@ -49,7 +49,7 @@ abstract class WebViewPlatform extends PlatformInterface { /// Creates a new [NavigationCallbackDelegate]. /// - /// This function should only be called by the app-facing plugin. + /// This function should only be called by the app-facing package. /// Look at using [NavigationCallbackHandler] in `webview_flutter` instead. NavigationCallbackDelegate createNavigationCallbackDelegate( NavigationCallbackCreationParams params, @@ -60,7 +60,7 @@ abstract class WebViewPlatform extends PlatformInterface { /// Create a new [WebViewControllerDelegate]. /// - /// This function should only be called by the app-facing plugin. + /// This function should only be called by the app-facing package. /// Look at using [WebViewController] in `webview_flutter` instead. WebViewControllerDelegate createWebViewControllerDelegate( WebViewControllerCreationParams params, @@ -71,7 +71,7 @@ abstract class WebViewPlatform extends PlatformInterface { /// Create a new [WebViewWidgetDelegate]. /// - /// This function should only be called by the app-facing plugin. + /// This function should only be called by the app-facing package. /// Look at using [WebViewWidget] in `webview_flutter` instead. WebViewWidgetDelegate createWebViewWidgetDelegate( WebViewWidgetCreationParams params, diff --git a/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/javascript_channel_registry_test.dart b/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/javascript_channel_registry_test.dart index 60aaaf0dd700..67c1676b2b43 100644 --- a/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/javascript_channel_registry_test.dart +++ b/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/javascript_channel_registry_test.dart @@ -3,7 +3,7 @@ // found in the LICENSE file. import 'package:flutter_test/flutter_test.dart'; -import 'package:webview_flutter_platform_interface/v4/src/javaScript_channel_registry.dart'; +import 'package:webview_flutter_platform_interface/v4/src/javascript_channel_registry.dart'; import 'package:webview_flutter_platform_interface/v4/src/types/types.dart'; void main() { From 789fd5a26c7d75198b864dfef3412a6a6d659237 Mon Sep 17 00:00:00 2001 From: Maurits van Beusekom Date: Wed, 20 Apr 2022 10:06:48 +0200 Subject: [PATCH 28/31] Added clearLocalStorage method and test --- .../lib/v4/src/webview_controller_delegate.dart | 6 ++++++ .../src/v4/webview_controller_delegate_test.dart | 14 ++++++++++++++ 2 files changed, 20 insertions(+) diff --git a/packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/webview_controller_delegate.dart b/packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/webview_controller_delegate.dart index 1be226451087..8e71c45b007c 100644 --- a/packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/webview_controller_delegate.dart +++ b/packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/webview_controller_delegate.dart @@ -151,6 +151,12 @@ abstract class WebViewControllerDelegate extends PlatformInterface { 'clearCache is not implemented on the current platform'); } + /// Clears the local storage used by the [WebView]. + Future clearLocalStorage() { + throw UnimplementedError( + 'clearLocalStorage is not implemented on the current platform'); + } + /// Sets the [NavigationCallbackDelegate] containing the callback methods that /// are called during navigation events. Future setNavigationCallbackDelegate( diff --git a/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/webview_controller_delegate_test.dart b/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/webview_controller_delegate_test.dart index 927a36390f3a..15bd129916ac 100644 --- a/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/webview_controller_delegate_test.dart +++ b/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/webview_controller_delegate_test.dart @@ -201,6 +201,20 @@ void main() { ); }); + test( + // ignore: lines_longer_than_80_chars + 'Default implementation of clearLocalStorage should throw unimplemented error', + () { + final WebViewControllerDelegate controller = + ExtendsWebViewControllerDelegate( + const WebViewControllerCreationParams()); + + expect( + () => controller.clearLocalStorage(), + throwsUnimplementedError, + ); + }); + test( 'Default implementation of the setNavigationCallback should throw unimplemented error', () { From ca99630aababb542fbe3c76f9b8a80b43047b0bb Mon Sep 17 00:00:00 2001 From: Maurits van Beusekom Date: Wed, 11 May 2022 09:10:07 +0200 Subject: [PATCH 29/31] Refactored 'Delegate' postfix according to latest discussion --- .../v4/src/javascript_channel_registry.dart | 45 ------ ...latform_navigation_callback_delegate.dart} | 21 +-- ....dart => platform_webview_controller.dart} | 21 ++- ...t => platform_webview_cookie_manager.dart} | 23 ++- ...gate.dart => platform_webview_widget.dart} | 17 +-- .../lib/v4/src/types/javascript_channel.dart | 35 ----- .../lib/v4/src/types/load_request_params.dart | 7 +- .../navigation_callback_creation_params.dart | 44 ------ ...ion_callback_delegate_creation_params.dart | 44 ++++++ ...bview_cookie_manager_creation_params.dart} | 20 +-- ...tform_webview_widget_creation_params.dart} | 24 +-- .../lib/v4/src/types/types.dart | 7 +- .../lib/v4/src/webview_platform.dart | 32 ++-- .../webview_flutter_platform_interface.dart | 9 +- .../v4/javascript_channel_registry_test.dart | 118 --------------- ...rm_navigation_callback_delegate_test.dart} | 75 +++++----- ... => platform_webview_controller_test.dart} | 140 +++++++++--------- ...atform_webview_controller_test.mocks.dart} | 23 +-- ...dart => platform_webview_widget_test.dart} | 32 ++-- .../test/src/v4/webview_platform_test.dart | 16 +- .../src/v4/webview_platform_test.mocks.dart | 70 ++++----- 21 files changed, 316 insertions(+), 507 deletions(-) delete mode 100644 packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/javascript_channel_registry.dart rename packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/{navigation_callback_delegate.dart => platform_navigation_callback_delegate.dart} (78%) rename packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/{webview_controller_delegate.dart => platform_webview_controller.dart} (93%) rename packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/{webview_cookie_manager_delegate.dart => platform_webview_cookie_manager.dart} (72%) rename packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/{webview_widget_delegate.dart => platform_webview_widget.dart} (66%) delete mode 100644 packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/types/javascript_channel.dart delete mode 100644 packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/types/navigation_callback_creation_params.dart create mode 100644 packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/types/platform_navigation_callback_delegate_creation_params.dart rename packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/types/{webview_cookie_manager_creation_params.dart => platform_webview_cookie_manager_creation_params.dart} (55%) rename packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/types/{webview_widget_creation_params.dart => platform_webview_widget_creation_params.dart} (73%) delete mode 100644 packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/javascript_channel_registry_test.dart rename packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/{navigation_callback_delegate_test.dart => platform_navigation_callback_delegate_test.dart} (52%) rename packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/{webview_controller_delegate_test.dart => platform_webview_controller_test.dart} (74%) rename packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/{webview_controller_delegate_test.mocks.dart => platform_webview_controller_test.mocks.dart} (75%) rename packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/{webview_widget_delegate_test.dart => platform_webview_widget_test.dart} (68%) diff --git a/packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/javascript_channel_registry.dart b/packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/javascript_channel_registry.dart deleted file mode 100644 index 84c7bde72b4e..000000000000 --- a/packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/javascript_channel_registry.dart +++ /dev/null @@ -1,45 +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:meta/meta.dart'; - -import 'types/javascript_channel.dart'; -import 'types/javascript_message.dart'; - -/// Utility class for managing named JavaScript channels and forwarding incoming -/// messages on the correct channel. -@sealed -class JavaScriptChannelRegistry { - /// Constructs a [JavaScriptChannelRegistry] initializing it with the given - /// set of [JavaScriptChannel]s. - JavaScriptChannelRegistry(Set? channels) { - updateJavaScriptChannelsFromSet(channels); - } - - /// Maps a channel name to a channel. - final Map channels = {}; - - /// Invoked when a JavaScript channel message is received. - void onJavaScriptChannelMessage(String channel, String message) { - final JavaScriptChannel? javaScriptChannel = channels[channel]; - - if (javaScriptChannel == null) { - throw ArgumentError('No channel registered with name $channel.'); - } - - javaScriptChannel.onMessageReceived(JavaScriptMessage(message: message)); - } - - /// Replaces the set of [JavaScriptChannel]s with the new set. - void updateJavaScriptChannelsFromSet(Set? channels) { - this.channels.clear(); - if (channels == null) { - return; - } - - for (final JavaScriptChannel channel in channels) { - this.channels[channel.name] = channel; - } - } -} diff --git a/packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/navigation_callback_delegate.dart b/packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/platform_navigation_callback_delegate.dart similarity index 78% rename from packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/navigation_callback_delegate.dart rename to packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/platform_navigation_callback_delegate.dart index 7344b7fa440a..3d306ce8b664 100644 --- a/packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/navigation_callback_delegate.dart +++ b/packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/platform_navigation_callback_delegate.dart @@ -14,26 +14,29 @@ import 'webview_platform.dart'; /// The [WebViewControllerDelegate] is notifying this delegate on events that /// happened on the platform's webview. Platform implementations should /// implement this class and pass an instance to the [WebViewControllerDelegate]. -abstract class NavigationCallbackDelegate extends PlatformInterface { - /// Creates a new [NavigationCallbackDelegate] - factory NavigationCallbackDelegate(NavigationCallbackCreationParams params) { - final NavigationCallbackDelegate callbackDelegate = - WebViewPlatform.instance!.createNavigationCallbackDelegate(params); +abstract class PlatformNavigationCallbackDelegate extends PlatformInterface { + /// Creates a new [PlatformNavigationCallbackDelegate] + factory PlatformNavigationCallbackDelegate( + PlatformNavigationCallbackDelegateCreationParams params) { + final PlatformNavigationCallbackDelegate callbackDelegate = WebViewPlatform + .instance! + .createPlatformNavigationCallbackDelegate(params); PlatformInterface.verify(callbackDelegate, _token); return callbackDelegate; } - /// Used by the platform implementation to create a new [NavigationCallbackDelegate]. + /// Used by the platform implementation to create a new [PlatformNavigationCallbackDelegate]. /// /// Should only be used by platform implementations because they can't extend /// a class that only contains a factory constructor. @protected - NavigationCallbackDelegate.implementation(this.params) : super(token: _token); + PlatformNavigationCallbackDelegate.implementation(this.params) + : super(token: _token); static final Object _token = Object(); - /// The parameters used to initialize the [NavigationCallbackDelegate]. - final NavigationCallbackCreationParams params; + /// The parameters used to initialize the [PlatformNavigationCallbackDelegate]. + final PlatformNavigationCallbackDelegateCreationParams params; /// Invoked when a navigation request is pending. /// diff --git a/packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/webview_controller_delegate.dart b/packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/platform_webview_controller.dart similarity index 93% rename from packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/webview_controller_delegate.dart rename to packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/platform_webview_controller.dart index 8e71c45b007c..8df014405566 100644 --- a/packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/webview_controller_delegate.dart +++ b/packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/platform_webview_controller.dart @@ -8,8 +8,7 @@ import 'dart:ui'; import 'package:flutter/foundation.dart'; import 'package:plugin_platform_interface/plugin_platform_interface.dart'; -import 'navigation_callback_delegate.dart'; -import 'types/types.dart'; +import 'platform_navigation_callback_delegate.dart'; import 'webview_platform.dart'; /// Interface for a platform implementation of a web view controller. @@ -20,25 +19,25 @@ import 'webview_platform.dart'; /// will get the default implementation, while platform implementations that /// `implements` this interface will be broken by newly added /// [WebViewCookieManagerDelegate] methods. -abstract class WebViewControllerDelegate extends PlatformInterface { - /// Creates a new [WebViewControllerDelegate] - factory WebViewControllerDelegate(WebViewControllerCreationParams params) { - final WebViewControllerDelegate webViewControllerDelegate = - WebViewPlatform.instance!.createWebViewControllerDelegate(params); +abstract class PlatformWebViewController extends PlatformInterface { + /// Creates a new [PlatformWebViewController] + factory PlatformWebViewController(WebViewControllerCreationParams params) { + final PlatformWebViewController webViewControllerDelegate = + WebViewPlatform.instance!.createPlatformWebViewController(params); PlatformInterface.verify(webViewControllerDelegate, _token); return webViewControllerDelegate; } - /// Used by the platform implementation to create a new [WebViewControllerDelegate]. + /// Used by the platform implementation to create a new [PlatformWebViewController]. /// /// Should only be used by platform implementations because they can't extend /// a class that only contains a factory constructor. @protected - WebViewControllerDelegate.implementation(this.params) : super(token: _token); + PlatformWebViewController.implementation(this.params) : super(token: _token); static final Object _token = Object(); - /// The parameters used to initialize the [WebViewControllerDelegate]. + /// The parameters used to initialize the [PlatformWebViewController]. final WebViewControllerCreationParams params; /// Loads the file located on the specified [absoluteFilePath]. @@ -160,7 +159,7 @@ abstract class WebViewControllerDelegate extends PlatformInterface { /// Sets the [NavigationCallbackDelegate] containing the callback methods that /// are called during navigation events. Future setNavigationCallbackDelegate( - NavigationCallbackDelegate handler) { + PlatformNavigationCallbackDelegate handler) { throw UnimplementedError( 'setNavigationCallbackDelegate is not implemented on the current platform'); } diff --git a/packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/webview_cookie_manager_delegate.dart b/packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/platform_webview_cookie_manager.dart similarity index 72% rename from packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/webview_cookie_manager_delegate.dart rename to packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/platform_webview_cookie_manager.dart index 4126cd6a4bad..9e981c9022c6 100644 --- a/packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/webview_cookie_manager_delegate.dart +++ b/packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/platform_webview_cookie_manager.dart @@ -5,7 +5,6 @@ import 'package:flutter/foundation.dart'; import 'package:plugin_platform_interface/plugin_platform_interface.dart'; -import 'types/types.dart'; import 'webview_platform.dart'; /// Interface for a platform implementation of a cookie manager. @@ -15,30 +14,30 @@ import 'webview_platform.dart'; /// changes. Extending this class (using `extends`) ensures that the subclass /// will get the default implementation, while platform implementations that /// `implements` this interface will be broken by newly added -/// [WebViewCookieManagerDelegate] methods. -abstract class WebViewCookieManagerDelegate extends PlatformInterface { - /// Creates a new [WebViewCookieManagerDelegate] - factory WebViewCookieManagerDelegate( - WebViewCookieManagerCreationParams params) { - final WebViewCookieManagerDelegate cookieManagerDelegate = - WebViewPlatform.instance!.createCookieManagerDelegate(params); +/// [PlatformWebViewCookieManager] methods. +abstract class PlatformWebViewCookieManager extends PlatformInterface { + /// Creates a new [PlatformWebViewCookieManager] + factory PlatformWebViewCookieManager( + PlatformWebViewCookieManagerCreationParams params) { + final PlatformWebViewCookieManager cookieManagerDelegate = + WebViewPlatform.instance!.createPlatformCookieManager(params); PlatformInterface.verify(cookieManagerDelegate, _token); return cookieManagerDelegate; } /// Used by the platform implementation to create a new - /// [WebViewCookieManagerDelegate]. + /// [PlatformWebViewCookieManager]. /// /// Should only be used by platform implementations because they can't extend /// a class that only contains a factory constructor. @protected - WebViewCookieManagerDelegate.implementation(this.params) + PlatformWebViewCookieManager.implementation(this.params) : super(token: _token); static final Object _token = Object(); - /// The parameters used to initialize the [WebViewCookieManagerDelegate]. - final WebViewCookieManagerCreationParams params; + /// The parameters used to initialize the [PlatformWebViewCookieManager]. + final PlatformWebViewCookieManagerCreationParams params; /// Clears all cookies for all [WebView] instances. /// diff --git a/packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/webview_widget_delegate.dart b/packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/platform_webview_widget.dart similarity index 66% rename from packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/webview_widget_delegate.dart rename to packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/platform_webview_widget.dart index 80a48ff6665b..6d4663ff287c 100644 --- a/packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/webview_widget_delegate.dart +++ b/packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/platform_webview_widget.dart @@ -2,34 +2,33 @@ // 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'; import 'package:flutter/widgets.dart'; import 'package:plugin_platform_interface/plugin_platform_interface.dart'; import 'webview_platform.dart'; /// Interface for a platform implementation of a web view widget. -abstract class WebViewWidgetDelegate extends PlatformInterface { - /// Creates a new [WebViewWidgetDelegate] - factory WebViewWidgetDelegate(WebViewWidgetCreationParams params) { - final WebViewWidgetDelegate webViewWidgetDelegate = +abstract class PlatformWebViewWidget extends PlatformInterface { + /// Creates a new [PlatformWebViewWidget] + factory PlatformWebViewWidget(PlatformWebViewWidgetCreationParams params) { + final PlatformWebViewWidget webViewWidgetDelegate = WebViewPlatform.instance!.createWebViewWidgetDelegate(params); PlatformInterface.verify(webViewWidgetDelegate, _token); return webViewWidgetDelegate; } /// Used by the platform implementation to create a new - /// [WebViewWidgetDelegate]. + /// [PlatformWebViewWidget]. /// /// Should only be used by platform implementations because they can't extend /// a class that only contains a factory constructor. @protected - WebViewWidgetDelegate.implementation(this.params) : super(token: _token); + PlatformWebViewWidget.implementation(this.params) : super(token: _token); static final Object _token = Object(); - /// The parameters used to initialize the [WebViewWidgetDelegate]. - final WebViewWidgetCreationParams params; + /// The parameters used to initialize the [PlatformWebViewWidget]. + final PlatformWebViewWidgetCreationParams params; /// Builds a new WebView. /// diff --git a/packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/types/javascript_channel.dart b/packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/types/javascript_channel.dart deleted file mode 100644 index 92e5a9911b04..000000000000 --- a/packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/types/javascript_channel.dart +++ /dev/null @@ -1,35 +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 'javascript_message.dart'; - -/// Callback type for handling messages sent from JavaScript running in a web view. -typedef JavaScriptMessageHandler = void Function(JavaScriptMessage message); - -final RegExp _validChannelNames = RegExp(r'^[a-zA-Z_][a-zA-Z0-9_]*$'); - -/// A named channel for receiving messaged from JavaScript code running inside a web view. -class JavaScriptChannel { - /// Constructs a JavaScript channel. - /// - /// The parameters `name` and `onMessageReceived` must not be null. - JavaScriptChannel({ - required this.name, - required this.onMessageReceived, - }) : assert(name != null), - assert(onMessageReceived != null), - assert(_validChannelNames.hasMatch(name)); - - /// The channel's name. - /// - /// The name must start with a letter or underscore(_), followed by any - /// combination of alphabetic characters plus digits. - /// - /// Note that any JavaScript existing `window` property with this name will be - /// overriden. - final String name; - - /// A callback that's invoked when a message is received through the channel. - final JavaScriptMessageHandler onMessageReceived; -} 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/v4/src/types/load_request_params.dart index b845582cc5f9..2da51f8dc19f 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/v4/src/types/load_request_params.dart @@ -3,11 +3,12 @@ // found in the LICENSE file. import 'dart:typed_data'; + import 'package:flutter/foundation.dart'; -import '../webview_controller_delegate.dart'; +import '../platform_webview_controller.dart'; -/// Defines the supported HTTP methods for loading a page in [WebViewControllerDelegate]. +/// Defines the supported HTTP methods for loading a page in [PlatformWebViewController]. enum LoadRequestMethod { /// HTTP GET method. get, @@ -29,7 +30,7 @@ extension LoadRequestMethodExtensions on LoadRequestMethod { } } -/// Defines the parameters that can be used to load a page with the [WebViewControllerDelegate]. +/// Defines the parameters that can be used to load a page with the [PlatformWebViewController]. /// /// Platform specific implementations can add additional fields by extending /// this class. diff --git a/packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/types/navigation_callback_creation_params.dart b/packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/types/navigation_callback_creation_params.dart deleted file mode 100644 index 34a62bf78038..000000000000 --- a/packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/types/navigation_callback_creation_params.dart +++ /dev/null @@ -1,44 +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/material.dart'; - -/// Object specifying creation parameters for creating a [NavigationCallbackDelegate]. -/// -/// Platform specific implementations can add additional fields by extending -/// this class. -/// -/// {@tool sample} -/// This example demonstrates how to extend the [NavigationCallbackCreationParams] to -/// provide additional platform specific parameters. -/// -/// When extending [NavigationCallbackCreationParams] additional -/// parameters should always accept `null` or have a default value to prevent -/// breaking changes. -/// -/// ```dart -/// class AndroidNavigationCallbackCreationParams extends NavigationCallbackCreationParams { -/// AndroidNavigationCallbackCreationParams._( -/// // This parameter prevents breaking changes later. -/// // ignore: avoid_unused_constructor_parameters -/// NavigationCallbackCreationParams params, { -/// this.filter, -/// }) : super(); -/// -/// factory AndroidNavigationCallbackCreationParams.fromNavigationCallbackCreationParams( -/// NavigationCallbackCreationParams params, { -/// String? filter, -/// }) { -/// return AndroidNavigationCallbackCreationParams._(params, filter: filter); -/// } -/// -/// final String? filter; -/// } -/// ``` -/// {@end-tool} -@immutable -class NavigationCallbackCreationParams { - /// Used by the platform implementation to create a new [NavigationCallbackDelegate]. - const NavigationCallbackCreationParams(); -} diff --git a/packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/types/platform_navigation_callback_delegate_creation_params.dart b/packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/types/platform_navigation_callback_delegate_creation_params.dart new file mode 100644 index 000000000000..023cc1c8e502 --- /dev/null +++ b/packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/types/platform_navigation_callback_delegate_creation_params.dart @@ -0,0 +1,44 @@ +// 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/material.dart'; + +/// Object specifying creation parameters for creating a [PlatformNavigationCallbackDelegate]. +/// +/// Platform specific implementations can add additional fields by extending +/// this class. +/// +/// {@tool sample} +/// This example demonstrates how to extend the [PlatformNavigationCallbackDelegateCreationParams] to +/// provide additional platform specific parameters. +/// +/// When extending [PlatformNavigationCallbackDelegateCreationParams] additional +/// parameters should always accept `null` or have a default value to prevent +/// breaking changes. +/// +/// ```dart +/// class AndroidNavigationCallbackDelegateCreationParams extends PlatformNavigationCallbackDelegateCreationParams { +/// AndroidNavigationCallbackDelegateCreationParams._( +/// // This parameter prevents breaking changes later. +/// // ignore: avoid_unused_constructor_parameters +/// PlatformNavigationCallbackDelegateCreationParams params, { +/// this.filter, +/// }) : super(); +/// +/// factory AndroidNavigationCallbackDelegateCreationParams.fromPlatformNavigationCallbackDelegateCreationParams( +/// PlatformNavigationCallbackDelegateCreationParams params, { +/// String? filter, +/// }) { +/// return AndroidNavigationCallbackDelegateCreationParams._(params, filter: filter); +/// } +/// +/// final String? filter; +/// } +/// ``` +/// {@end-tool} +@immutable +class PlatformNavigationCallbackDelegateCreationParams { + /// Used by the platform implementation to create a new [PlatformNavigationCallbackDelegate]. + const PlatformNavigationCallbackDelegateCreationParams(); +} diff --git a/packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/types/webview_cookie_manager_creation_params.dart b/packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/types/platform_webview_cookie_manager_creation_params.dart similarity index 55% rename from packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/types/webview_cookie_manager_creation_params.dart rename to packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/types/platform_webview_cookie_manager_creation_params.dart index f97291bf8700..e8c4938f649f 100644 --- a/packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/types/webview_cookie_manager_creation_params.dart +++ b/packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/types/platform_webview_cookie_manager_creation_params.dart @@ -4,31 +4,31 @@ import 'package:flutter/material.dart'; -/// Object specifying creation parameters for creating a [WebViewCookieManagerDelegate]. +/// Object specifying creation parameters for creating a [PlatformWebViewCookieManager]. /// /// Platform specific implementations can add additional fields by extending /// this class. /// /// {@tool sample} -/// This example demonstrates how to extend the [WebViewCookieManagerCreationParams] to +/// This example demonstrates how to extend the [PlatformWebViewCookieManagerCreationParams] to /// provide additional platform specific parameters. /// -/// When extending [WebViewCookieManagerCreationParams] additional +/// When extending [PlatformWebViewCookieManagerCreationParams] additional /// parameters should always accept `null` or have a default value to prevent /// breaking changes. /// /// ```dart /// class WKWebViewCookieManagerCreationParams -/// extends WebViewCookieManagerCreationParams { +/// extends PlatformWebViewCookieManagerCreationParams { /// WKWebViewCookieManagerCreationParams._( /// // This parameter prevents breaking changes later. /// // ignore: avoid_unused_constructor_parameters -/// WebViewCookieManagerCreationParams params, { +/// PlatformWebViewCookieManagerCreationParams params, { /// this.uri, /// }) : super(); /// -/// factory WKWebViewCookieManagerCreationParams.fromWebViewCookieManagerCreationParams( -/// WebViewCookieManagerCreationParams params, { +/// factory WKWebViewCookieManagerCreationParams.fromPlatformWebViewCookieManagerCreationParams( +/// PlatformWebViewCookieManagerCreationParams params, { /// Uri? uri, /// }) { /// return WKWebViewCookieManagerCreationParams._(params, uri: uri); @@ -39,7 +39,7 @@ import 'package:flutter/material.dart'; /// ``` /// {@end-tool} @immutable -class WebViewCookieManagerCreationParams { - /// Used by the platform implementation to create a new [WebViewCookieManagerDelegate]. - const WebViewCookieManagerCreationParams(); +class PlatformWebViewCookieManagerCreationParams { + /// Used by the platform implementation to create a new [PlatformWebViewCookieManagerDelegate]. + const PlatformWebViewCookieManagerCreationParams(); } diff --git a/packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/types/webview_widget_creation_params.dart b/packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/types/platform_webview_widget_creation_params.dart similarity index 73% rename from packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/types/webview_widget_creation_params.dart rename to packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/types/platform_webview_widget_creation_params.dart index 9b07a33412fb..abeae6e272c2 100644 --- a/packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/types/webview_widget_creation_params.dart +++ b/packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/types/platform_webview_widget_creation_params.dart @@ -5,7 +5,7 @@ import 'package:flutter/foundation.dart'; import 'package:flutter/gestures.dart'; -import '../webview_controller_delegate.dart'; +import '../platform_webview_controller.dart'; /// Object specifying creation parameters for creating a [WebViewWidgetDelegate]. /// @@ -13,19 +13,19 @@ import '../webview_controller_delegate.dart'; /// this class. /// /// {@tool sample} -/// This example demonstrates how to extend the [WebViewWidgetCreationParams] to +/// This example demonstrates how to extend the [PlatformWebViewWidgetCreationParams] to /// provide additional platform specific parameters. /// -/// When extending [WebViewWidgetCreationParams] additional parameters +/// When extending [PlatformWebViewWidgetCreationParams] additional parameters /// should always accept `null` or have a default value to prevent breaking /// changes. /// /// ```dart -/// class WKWebViewWidgetCreationParams extends WebViewWidgetCreationParams { +/// class WKWebViewWidgetCreationParams extends PlatformWebViewWidgetCreationParams { /// WKWebViewWidgetCreationParams._( /// // This parameter prevents breaking changes later. /// // ignore: avoid_unused_constructor_parameters -/// WebViewWidgetCreationParams params, { +/// PlatformWebViewWidgetCreationParams params, { /// this.domain, /// }) : super( /// key: params.key, @@ -33,8 +33,8 @@ import '../webview_controller_delegate.dart'; /// gestureRecognizers: params.gestureRecognizers, /// ); /// -/// factory WKWebViewWidgetCreationParams.fromWebViewWidgetCreationParams( -/// WebViewWidgetCreationParams params, { +/// factory WKWebViewWidgetCreationParams.fromPlatformWebViewWidgetCreationParams( +/// PlatformWebViewWidgetCreationParams params, { /// String? domain, /// }) { /// return WKWebViewWidgetCreationParams._(params, domain: domain); @@ -45,9 +45,9 @@ import '../webview_controller_delegate.dart'; /// ``` /// {@end-tool} @immutable -class WebViewWidgetCreationParams { - /// Used by the platform implementation to create a new [WebViewWidgetDelegate]. - const WebViewWidgetCreationParams({ +class PlatformWebViewWidgetCreationParams { + /// Used by the platform implementation to create a new [PlatformWebViewWidgetDelegate]. + const PlatformWebViewWidgetCreationParams({ this.key, required this.controller, this.gestureRecognizers = const >{}, @@ -60,9 +60,9 @@ class WebViewWidgetCreationParams { /// * The discussions at [Key] and [GlobalKey]. final Key? key; - /// The [WebViewControllerDelegate] that allows controlling the native web + /// The [PlatformWebViewController] that allows controlling the native web /// view. - final WebViewControllerDelegate controller; + final PlatformWebViewController controller; /// The `gestureRecognizers` specifies which gestures should be consumed by the /// web view. diff --git a/packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/types/types.dart b/packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/types/types.dart index bcd2c746c7d6..8a28afa6205a 100644 --- a/packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/types/types.dart +++ b/packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/types/types.dart @@ -2,13 +2,12 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -export 'javascript_channel.dart'; export 'javascript_message.dart'; export 'javascript_mode.dart'; export 'load_request_params.dart'; -export 'navigation_callback_creation_params.dart'; +export 'platform_navigation_callback_delegate_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_controller_creation_params.dart'; export 'webview_cookie.dart'; -export 'webview_cookie_manager_creation_params.dart'; -export 'webview_widget_creation_params.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/v4/src/webview_platform.dart index e23ad2b03889..8f64f5ad373d 100644 --- a/packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/webview_platform.dart +++ b/packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/webview_platform.dart @@ -4,11 +4,11 @@ import 'package:plugin_platform_interface/plugin_platform_interface.dart'; -import 'navigation_callback_delegate.dart'; +import 'platform_navigation_callback_delegate.dart'; +import 'platform_webview_controller.dart'; +import 'platform_webview_cookie_manager.dart'; +import 'platform_webview_widget.dart'; import 'types/types.dart'; -import 'webview_controller_delegate.dart'; -import 'webview_cookie_manager_delegate.dart'; -import 'webview_widget_delegate.dart'; export 'types/types.dart'; @@ -36,45 +36,45 @@ abstract class WebViewPlatform extends PlatformInterface { _instance = instance; } - /// Creates a new [WebViewCookieManagerDelegate]. + /// Creates a new [PlatformWebViewCookieManager]. /// /// This function should only be called by the app-facing package. /// Look at using [WebViewCookieManager] in `webview_flutter` instead. - WebViewCookieManagerDelegate createCookieManagerDelegate( - WebViewCookieManagerCreationParams params, + PlatformWebViewCookieManager createPlatformCookieManager( + PlatformWebViewCookieManagerCreationParams params, ) { throw UnimplementedError( 'createCookieManagerDelegate is not implemented on the current platform.'); } - /// Creates a new [NavigationCallbackDelegate]. + /// Creates a new [PlatformNavigationCallbackDelegate]. /// /// This function should only be called by the app-facing package. - /// Look at using [NavigationCallbackHandler] in `webview_flutter` instead. - NavigationCallbackDelegate createNavigationCallbackDelegate( - NavigationCallbackCreationParams params, + /// Look at using [PlatformNavigationCallbackDelegate] in `webview_flutter` instead. + PlatformNavigationCallbackDelegate createPlatformNavigationCallbackDelegate( + PlatformNavigationCallbackDelegateCreationParams params, ) { throw UnimplementedError( 'createNavigationCallbackDelegate is not implemented on the current platform.'); } - /// Create a new [WebViewControllerDelegate]. + /// Create a new [PlatformWebViewController]. /// /// This function should only be called by the app-facing package. /// Look at using [WebViewController] in `webview_flutter` instead. - WebViewControllerDelegate createWebViewControllerDelegate( + PlatformWebViewController createPlatformWebViewController( WebViewControllerCreationParams params, ) { throw UnimplementedError( 'createWebViewControllerDelegate is not implemented on the current platform.'); } - /// Create a new [WebViewWidgetDelegate]. + /// Create a new [PlatformWebViewWidget]. /// /// This function should only be called by the app-facing package. /// Look at using [WebViewWidget] in `webview_flutter` instead. - WebViewWidgetDelegate createWebViewWidgetDelegate( - WebViewWidgetCreationParams params, + PlatformWebViewWidget createWebViewWidgetDelegate( + PlatformWebViewWidgetCreationParams params, ) { throw UnimplementedError( 'createWebViewWidgetDelegate is not implemented on the current platform.'); 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 index 9cfcc7685f92..1897fe6b9116 100644 --- 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 @@ -2,10 +2,9 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -export 'src/javascript_channel_registry.dart'; -export 'src/navigation_callback_delegate.dart'; +export 'src/platform_navigation_callback_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_controller_delegate.dart'; -export 'src/webview_cookie_manager_delegate.dart'; export 'src/webview_platform.dart'; -export 'src/webview_widget_delegate.dart'; diff --git a/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/javascript_channel_registry_test.dart b/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/javascript_channel_registry_test.dart deleted file mode 100644 index 67c1676b2b43..000000000000 --- a/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/javascript_channel_registry_test.dart +++ /dev/null @@ -1,118 +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_test/flutter_test.dart'; -import 'package:webview_flutter_platform_interface/v4/src/javascript_channel_registry.dart'; -import 'package:webview_flutter_platform_interface/v4/src/types/types.dart'; - -void main() { - final Map _log = {}; - final Set _channels = { - JavaScriptChannel( - name: 'js_channel_1', - onMessageReceived: (JavaScriptMessage message) => - _log['js_channel_1'] = message.message, - ), - JavaScriptChannel( - name: 'js_channel_2', - onMessageReceived: (JavaScriptMessage message) => - _log['js_channel_2'] = message.message, - ), - JavaScriptChannel( - name: 'js_channel_3', - onMessageReceived: (JavaScriptMessage message) => - _log['js_channel_3'] = message.message, - ), - }; - - tearDown(() { - _log.clear(); - }); - - test('ctor should initialize with channels.', () { - final JavaScriptChannelRegistry registry = - JavaScriptChannelRegistry(_channels); - - expect(registry.channels.length, 3); - for (final JavaScriptChannel channel in _channels) { - expect(registry.channels[channel.name], channel); - } - }); - - test('onJavaScriptChannelMessage should forward message on correct channel.', - () { - final JavaScriptChannelRegistry registry = - JavaScriptChannelRegistry(_channels); - - registry.onJavaScriptChannelMessage( - 'js_channel_2', - 'test message on channel 2', - ); - - expect( - _log, - containsPair( - 'js_channel_2', - 'test message on channel 2', - )); - }); - - test( - 'onJavaScriptChannelMessage should throw ArgumentError when message arrives on non-existing channel.', - () { - final JavaScriptChannelRegistry registry = - JavaScriptChannelRegistry(_channels); - - expect( - () => registry.onJavaScriptChannelMessage( - 'js_channel_4', - 'test message on channel 2', - ), - throwsA( - isA().having((ArgumentError error) => error.message, - 'message', 'No channel registered with name js_channel_4.'), - )); - }); - - test( - 'updateJavaScriptChannelsFromSet should clear all channels when null is supplied.', - () { - final JavaScriptChannelRegistry registry = - JavaScriptChannelRegistry(_channels); - - expect(registry.channels.length, 3); - - registry.updateJavaScriptChannelsFromSet(null); - - expect(registry.channels, isEmpty); - }); - - test('updateJavaScriptChannelsFromSet should update registry with new set.', - () { - final JavaScriptChannelRegistry registry = - JavaScriptChannelRegistry(_channels); - - expect(registry.channels.length, 3); - - final Set newChannels = { - JavaScriptChannel( - name: 'new_js_channel_1', - onMessageReceived: (JavaScriptMessage message) => - _log['new_js_channel_1'] = message.message, - ), - JavaScriptChannel( - name: 'new_js_channel_2', - onMessageReceived: (JavaScriptMessage message) => - _log['new_js_channel_2'] = message.message, - ), - }; - - registry.updateJavaScriptChannelsFromSet(newChannels); - - expect(registry.channels.length, 2); - for (final JavaScriptChannel channel in newChannels) { - expect(registry.channels[channel.name], channel); - } - }); -} diff --git a/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/navigation_callback_delegate_test.dart b/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/platform_navigation_callback_delegate_test.dart similarity index 52% rename from packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/navigation_callback_delegate_test.dart rename to packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/platform_navigation_callback_delegate_test.dart index 1dc5e150f51a..b1342ba7136b 100644 --- a/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/navigation_callback_delegate_test.dart +++ b/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/platform_navigation_callback_delegate_test.dart @@ -5,7 +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/navigation_callback_delegate.dart'; +import 'package:webview_flutter_platform_interface/v4/src/platform_navigation_callback_delegate.dart'; import 'package:webview_flutter_platform_interface/v4/src/webview_platform.dart'; import 'webview_platform_test.mocks.dart'; @@ -16,41 +16,44 @@ void main() { }); test('Cannot be implemented with `implements`', () { - const NavigationCallbackCreationParams params = - NavigationCallbackCreationParams(); - when(WebViewPlatform.instance!.createNavigationCallbackDelegate(params)) - .thenReturn(ImplementsNavigationCallbackDelegate()); + const PlatformNavigationCallbackDelegateCreationParams params = + PlatformNavigationCallbackDelegateCreationParams(); + when(WebViewPlatform.instance! + .createPlatformNavigationCallbackDelegate(params)) + .thenReturn(ImplementsPlatformNavigationCallbackDelegate()); expect(() { - NavigationCallbackDelegate(params); + PlatformNavigationCallbackDelegate(params); }, throwsNoSuchMethodError); }); test('Can be extended', () { - const NavigationCallbackCreationParams params = - NavigationCallbackCreationParams(); - when(WebViewPlatform.instance!.createNavigationCallbackDelegate(params)) - .thenReturn(ExtendsNavigationCallbackDelegate(params)); + const PlatformNavigationCallbackDelegateCreationParams params = + PlatformNavigationCallbackDelegateCreationParams(); + when(WebViewPlatform.instance! + .createPlatformNavigationCallbackDelegate(params)) + .thenReturn(ExtendsPlatformNavigationCallbackDelegate(params)); - expect(NavigationCallbackDelegate(params), isNotNull); + expect(PlatformNavigationCallbackDelegate(params), isNotNull); }); test('Can be mocked with `implements`', () { - const NavigationCallbackCreationParams params = - NavigationCallbackCreationParams(); - when(WebViewPlatform.instance!.createNavigationCallbackDelegate(params)) + const PlatformNavigationCallbackDelegateCreationParams params = + PlatformNavigationCallbackDelegateCreationParams(); + when(WebViewPlatform.instance! + .createPlatformNavigationCallbackDelegate(params)) .thenReturn(MockNavigationCallbackDelegate()); - expect(NavigationCallbackDelegate(params), isNotNull); + expect(PlatformNavigationCallbackDelegate(params), isNotNull); }); test( // ignore: lines_longer_than_80_chars 'Default implementation of setOnNavigationRequest should throw unimplemented error', () { - final NavigationCallbackDelegate callbackDelegate = - ExtendsNavigationCallbackDelegate( - const NavigationCallbackCreationParams()); + final PlatformNavigationCallbackDelegate callbackDelegate = + ExtendsPlatformNavigationCallbackDelegate( + const PlatformNavigationCallbackDelegateCreationParams()); expect( () => callbackDelegate.setOnNavigationRequest( @@ -63,9 +66,9 @@ void main() { // ignore: lines_longer_than_80_chars 'Default implementation of setOnPageStarted should throw unimplemented error', () { - final NavigationCallbackDelegate callbackDelegate = - ExtendsNavigationCallbackDelegate( - const NavigationCallbackCreationParams()); + final PlatformNavigationCallbackDelegate callbackDelegate = + ExtendsPlatformNavigationCallbackDelegate( + const PlatformNavigationCallbackDelegateCreationParams()); expect( () => callbackDelegate.setOnPageStarted((String url) {}), @@ -77,9 +80,9 @@ void main() { // ignore: lines_longer_than_80_chars 'Default implementation of setOnPageFinished should throw unimplemented error', () { - final NavigationCallbackDelegate callbackDelegate = - ExtendsNavigationCallbackDelegate( - const NavigationCallbackCreationParams()); + final PlatformNavigationCallbackDelegate callbackDelegate = + ExtendsPlatformNavigationCallbackDelegate( + const PlatformNavigationCallbackDelegateCreationParams()); expect( () => callbackDelegate.setOnPageFinished((String url) {}), @@ -91,9 +94,9 @@ void main() { // ignore: lines_longer_than_80_chars 'Default implementation of setOnProgress should throw unimplemented error', () { - final NavigationCallbackDelegate callbackDelegate = - ExtendsNavigationCallbackDelegate( - const NavigationCallbackCreationParams()); + final PlatformNavigationCallbackDelegate callbackDelegate = + ExtendsPlatformNavigationCallbackDelegate( + const PlatformNavigationCallbackDelegateCreationParams()); expect( () => callbackDelegate.setOnProgress((int progress) {}), @@ -105,9 +108,9 @@ void main() { // ignore: lines_longer_than_80_chars 'Default implementation of setOnWebResourceError should throw unimplemented error', () { - final NavigationCallbackDelegate callbackDelegate = - ExtendsNavigationCallbackDelegate( - const NavigationCallbackCreationParams()); + final PlatformNavigationCallbackDelegate callbackDelegate = + ExtendsPlatformNavigationCallbackDelegate( + const PlatformNavigationCallbackDelegateCreationParams()); expect( () => callbackDelegate.setOnWebResourceError((WebResourceError error) {}), @@ -121,8 +124,8 @@ class MockWebViewPlatformWithMixin extends MockWebViewPlatform // ignore: prefer_mixin MockPlatformInterfaceMixin {} -class ImplementsNavigationCallbackDelegate - implements NavigationCallbackDelegate { +class ImplementsPlatformNavigationCallbackDelegate + implements PlatformNavigationCallbackDelegate { @override dynamic noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation); } @@ -132,9 +135,11 @@ class MockNavigationCallbackDelegate extends Mock // ignore: prefer_mixin MockPlatformInterfaceMixin implements - NavigationCallbackDelegate {} + PlatformNavigationCallbackDelegate {} -class ExtendsNavigationCallbackDelegate extends NavigationCallbackDelegate { - ExtendsNavigationCallbackDelegate(NavigationCallbackCreationParams params) +class ExtendsPlatformNavigationCallbackDelegate + extends PlatformNavigationCallbackDelegate { + ExtendsPlatformNavigationCallbackDelegate( + PlatformNavigationCallbackDelegateCreationParams params) : super.implementation(params); } diff --git a/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/webview_controller_delegate_test.dart b/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/platform_webview_controller_test.dart similarity index 74% rename from packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/webview_controller_delegate_test.dart rename to packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/platform_webview_controller_test.dart index 15bd129916ac..7170af94dd99 100644 --- a/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/webview_controller_delegate_test.dart +++ b/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/platform_webview_controller_test.dart @@ -7,14 +7,14 @@ import 'package:flutter_test/flutter_test.dart'; 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/navigation_callback_delegate.dart'; -import 'package:webview_flutter_platform_interface/v4/src/webview_controller_delegate.dart'; +import 'package:webview_flutter_platform_interface/v4/src/platform_navigation_callback_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 'navigation_callback_delegate_test.dart'; +import 'platform_navigation_callback_delegate_test.dart'; import 'webview_platform_test.mocks.dart'; -@GenerateMocks([NavigationCallbackDelegate]) +@GenerateMocks([PlatformNavigationCallbackDelegate]) void main() { setUp(() { WebViewPlatform.instance = MockWebViewPlatformWithMixin(); @@ -22,11 +22,11 @@ void main() { test('Cannot be implemented with `implements`', () { when((WebViewPlatform.instance! as MockWebViewPlatform) - .createWebViewControllerDelegate(any)) - .thenReturn(ImplementsWebViewControllerDelegate()); + .createPlatformWebViewController(any)) + .thenReturn(ImplementsPlatformWebViewController()); expect(() { - WebViewControllerDelegate(const WebViewControllerCreationParams()); + PlatformWebViewController(const WebViewControllerCreationParams()); }, throwsNoSuchMethodError); }); @@ -34,18 +34,18 @@ void main() { const WebViewControllerCreationParams params = WebViewControllerCreationParams(); when((WebViewPlatform.instance! as MockWebViewPlatform) - .createWebViewControllerDelegate(any)) - .thenReturn(ExtendsWebViewControllerDelegate(params)); + .createPlatformWebViewController(any)) + .thenReturn(ExtendsPlatformWebViewController(params)); - expect(WebViewControllerDelegate(params), isNotNull); + expect(PlatformWebViewController(params), isNotNull); }); test('Can be mocked with `implements`', () { when((WebViewPlatform.instance! as MockWebViewPlatform) - .createWebViewControllerDelegate(any)) + .createPlatformWebViewController(any)) .thenReturn(MockWebViewControllerDelegate()); - expect(WebViewControllerDelegate(const WebViewControllerCreationParams()), + expect(PlatformWebViewController(const WebViewControllerCreationParams()), isNotNull); }); @@ -53,8 +53,8 @@ void main() { // ignore: lines_longer_than_80_chars 'Default implementation of loadFile should throw unimplemented error', () { - final WebViewControllerDelegate controller = - ExtendsWebViewControllerDelegate( + final PlatformWebViewController controller = + ExtendsPlatformWebViewController( const WebViewControllerCreationParams()); expect( @@ -67,8 +67,8 @@ void main() { // ignore: lines_longer_than_80_chars 'Default implementation of loadFlutterAsset should throw unimplemented error', () { - final WebViewControllerDelegate controller = - ExtendsWebViewControllerDelegate( + final PlatformWebViewController controller = + ExtendsPlatformWebViewController( const WebViewControllerCreationParams()); expect( @@ -81,8 +81,8 @@ void main() { // ignore: lines_longer_than_80_chars 'Default implementation of loadHtmlString should throw unimplemented error', () { - final WebViewControllerDelegate controller = - ExtendsWebViewControllerDelegate( + final PlatformWebViewController controller = + ExtendsPlatformWebViewController( const WebViewControllerCreationParams()); expect( @@ -95,8 +95,8 @@ void main() { // ignore: lines_longer_than_80_chars 'Default implementation of loadRequest should throw unimplemented error', () { - final WebViewControllerDelegate controller = - ExtendsWebViewControllerDelegate( + final PlatformWebViewController controller = + ExtendsPlatformWebViewController( const WebViewControllerCreationParams()); expect( @@ -109,8 +109,8 @@ void main() { // ignore: lines_longer_than_80_chars 'Default implementation of currentUrl should throw unimplemented error', () { - final WebViewControllerDelegate controller = - ExtendsWebViewControllerDelegate( + final PlatformWebViewController controller = + ExtendsPlatformWebViewController( const WebViewControllerCreationParams()); expect( @@ -123,8 +123,8 @@ void main() { // ignore: lines_longer_than_80_chars 'Default implementation of canGoBack should throw unimplemented error', () { - final WebViewControllerDelegate controller = - ExtendsWebViewControllerDelegate( + final PlatformWebViewController controller = + ExtendsPlatformWebViewController( const WebViewControllerCreationParams()); expect( @@ -137,8 +137,8 @@ void main() { // ignore: lines_longer_than_80_chars 'Default implementation of canGoForward should throw unimplemented error', () { - final WebViewControllerDelegate controller = - ExtendsWebViewControllerDelegate( + final PlatformWebViewController controller = + ExtendsPlatformWebViewController( const WebViewControllerCreationParams()); expect( @@ -150,8 +150,8 @@ void main() { test( // ignore: lines_longer_than_80_chars 'Default implementation of goBack should throw unimplemented error', () { - final WebViewControllerDelegate controller = - ExtendsWebViewControllerDelegate( + final PlatformWebViewController controller = + ExtendsPlatformWebViewController( const WebViewControllerCreationParams()); expect( @@ -164,8 +164,8 @@ void main() { // ignore: lines_longer_than_80_chars 'Default implementation of goForward should throw unimplemented error', () { - final WebViewControllerDelegate controller = - ExtendsWebViewControllerDelegate( + final PlatformWebViewController controller = + ExtendsPlatformWebViewController( const WebViewControllerCreationParams()); expect( @@ -177,8 +177,8 @@ void main() { test( // ignore: lines_longer_than_80_chars 'Default implementation of reload should throw unimplemented error', () { - final WebViewControllerDelegate controller = - ExtendsWebViewControllerDelegate( + final PlatformWebViewController controller = + ExtendsPlatformWebViewController( const WebViewControllerCreationParams()); expect( @@ -191,8 +191,8 @@ void main() { // ignore: lines_longer_than_80_chars 'Default implementation of clearCache should throw unimplemented error', () { - final WebViewControllerDelegate controller = - ExtendsWebViewControllerDelegate( + final PlatformWebViewController controller = + ExtendsPlatformWebViewController( const WebViewControllerCreationParams()); expect( @@ -205,8 +205,8 @@ void main() { // ignore: lines_longer_than_80_chars 'Default implementation of clearLocalStorage should throw unimplemented error', () { - final WebViewControllerDelegate controller = - ExtendsWebViewControllerDelegate( + final PlatformWebViewController controller = + ExtendsPlatformWebViewController( const WebViewControllerCreationParams()); expect( @@ -218,8 +218,8 @@ void main() { test( 'Default implementation of the setNavigationCallback should throw unimplemented error', () { - final WebViewControllerDelegate controller = - ExtendsWebViewControllerDelegate( + final PlatformWebViewController controller = + ExtendsPlatformWebViewController( const WebViewControllerCreationParams()); expect( @@ -234,8 +234,8 @@ void main() { // ignore: lines_longer_than_80_chars 'Default implementation of runJavaScript should throw unimplemented error', () { - final WebViewControllerDelegate controller = - ExtendsWebViewControllerDelegate( + final PlatformWebViewController controller = + ExtendsPlatformWebViewController( const WebViewControllerCreationParams()); expect( @@ -248,8 +248,8 @@ void main() { // ignore: lines_longer_than_80_chars 'Default implementation of runJavaScriptReturningResult should throw unimplemented error', () { - final WebViewControllerDelegate controller = - ExtendsWebViewControllerDelegate( + final PlatformWebViewController controller = + ExtendsPlatformWebViewController( const WebViewControllerCreationParams()); expect( @@ -262,8 +262,8 @@ void main() { // ignore: lines_longer_than_80_chars 'Default implementation of addJavaScriptChannel should throw unimplemented error', () { - final WebViewControllerDelegate controller = - ExtendsWebViewControllerDelegate( + final PlatformWebViewController controller = + ExtendsPlatformWebViewController( const WebViewControllerCreationParams()); expect( @@ -281,8 +281,8 @@ void main() { // ignore: lines_longer_than_80_chars 'Default implementation of removeJavaScriptChannel should throw unimplemented error', () { - final WebViewControllerDelegate controller = - ExtendsWebViewControllerDelegate( + final PlatformWebViewController controller = + ExtendsPlatformWebViewController( const WebViewControllerCreationParams()); expect( @@ -295,8 +295,8 @@ void main() { // ignore: lines_longer_than_80_chars 'Default implementation of getTitle should throw unimplemented error', () { - final WebViewControllerDelegate controller = - ExtendsWebViewControllerDelegate( + final PlatformWebViewController controller = + ExtendsPlatformWebViewController( const WebViewControllerCreationParams()); expect( @@ -309,8 +309,8 @@ void main() { // ignore: lines_longer_than_80_chars 'Default implementation of scrollTo should throw unimplemented error', () { - final WebViewControllerDelegate controller = - ExtendsWebViewControllerDelegate( + final PlatformWebViewController controller = + ExtendsPlatformWebViewController( const WebViewControllerCreationParams()); expect( @@ -323,8 +323,8 @@ void main() { // ignore: lines_longer_than_80_chars 'Default implementation of scrollBy should throw unimplemented error', () { - final WebViewControllerDelegate controller = - ExtendsWebViewControllerDelegate( + final PlatformWebViewController controller = + ExtendsPlatformWebViewController( const WebViewControllerCreationParams()); expect( @@ -337,8 +337,8 @@ void main() { // ignore: lines_longer_than_80_chars 'Default implementation of getScrollPosition should throw unimplemented error', () { - final WebViewControllerDelegate controller = - ExtendsWebViewControllerDelegate( + final PlatformWebViewController controller = + ExtendsPlatformWebViewController( const WebViewControllerCreationParams()); expect( @@ -351,8 +351,8 @@ void main() { // ignore: lines_longer_than_80_chars 'Default implementation of enableDebugging should throw unimplemented error', () { - final WebViewControllerDelegate controller = - ExtendsWebViewControllerDelegate( + final PlatformWebViewController controller = + ExtendsPlatformWebViewController( const WebViewControllerCreationParams()); expect( @@ -365,8 +365,8 @@ void main() { // ignore: lines_longer_than_80_chars 'Default implementation of enableGestureNavigation should throw unimplemented error', () { - final WebViewControllerDelegate controller = - ExtendsWebViewControllerDelegate( + final PlatformWebViewController controller = + ExtendsPlatformWebViewController( const WebViewControllerCreationParams()); expect( @@ -379,8 +379,8 @@ void main() { // ignore: lines_longer_than_80_chars 'Default implementation of enableZoom should throw unimplemented error', () { - final WebViewControllerDelegate controller = - ExtendsWebViewControllerDelegate( + final PlatformWebViewController controller = + ExtendsPlatformWebViewController( const WebViewControllerCreationParams()); expect( @@ -393,8 +393,8 @@ void main() { // ignore: lines_longer_than_80_chars 'Default implementation of setBackgroundColor should throw unimplemented error', () { - final WebViewControllerDelegate controller = - ExtendsWebViewControllerDelegate( + final PlatformWebViewController controller = + ExtendsPlatformWebViewController( const WebViewControllerCreationParams()); expect( @@ -407,8 +407,8 @@ void main() { // ignore: lines_longer_than_80_chars 'Default implementation of setJavaScriptMode should throw unimplemented error', () { - final WebViewControllerDelegate controller = - ExtendsWebViewControllerDelegate( + final PlatformWebViewController controller = + ExtendsPlatformWebViewController( const WebViewControllerCreationParams()); expect( @@ -421,8 +421,8 @@ void main() { // ignore: lines_longer_than_80_chars 'Default implementation of setUserAgent should throw unimplemented error', () { - final WebViewControllerDelegate controller = - ExtendsWebViewControllerDelegate( + final PlatformWebViewController controller = + ExtendsPlatformWebViewController( const WebViewControllerCreationParams()); expect( @@ -437,7 +437,7 @@ class MockWebViewPlatformWithMixin extends MockWebViewPlatform // ignore: prefer_mixin MockPlatformInterfaceMixin {} -class ImplementsWebViewControllerDelegate implements WebViewControllerDelegate { +class ImplementsPlatformWebViewController implements PlatformWebViewController { @override dynamic noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation); } @@ -447,10 +447,10 @@ class MockWebViewControllerDelegate extends Mock // ignore: prefer_mixin MockPlatformInterfaceMixin implements - WebViewControllerDelegate {} + PlatformWebViewController {} -class ExtendsWebViewControllerDelegate extends WebViewControllerDelegate { - ExtendsWebViewControllerDelegate(WebViewControllerCreationParams params) +class ExtendsPlatformWebViewController extends PlatformWebViewController { + ExtendsPlatformWebViewController(WebViewControllerCreationParams params) : super.implementation(params); } diff --git a/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/webview_controller_delegate_test.mocks.dart b/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/platform_webview_controller_test.mocks.dart similarity index 75% rename from packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/webview_controller_delegate_test.mocks.dart rename to packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/platform_webview_controller_test.mocks.dart index 47e0071d1a5e..659df25b6939 100644 --- a/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/webview_controller_delegate_test.mocks.dart +++ b/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/platform_webview_controller_test.mocks.dart @@ -1,11 +1,11 @@ // Mocks generated by Mockito 5.0.16 from annotations -// in webview_flutter_platform_interface/test/src/v4/webview_controller_delegate_test.dart. +// 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/navigation_callback_delegate.dart' +import 'package:webview_flutter_platform_interface/v4/src/platform_navigation_callback_delegate.dart' as _i3; import 'package:webview_flutter_platform_interface/v4/src/webview_platform.dart' as _i2; @@ -19,23 +19,24 @@ import 'package:webview_flutter_platform_interface/v4/src/webview_platform.dart' // ignore_for_file: unnecessary_parenthesis // ignore_for_file: camel_case_types -class _FakeNavigationCallbackCreationParams_0 extends _i1.Fake - implements _i2.NavigationCallbackCreationParams {} +class _FakePlatformNavigationCallbackDelegateCreationParams_0 extends _i1.Fake + implements _i2.PlatformNavigationCallbackDelegateCreationParams {} -/// A class which mocks [NavigationCallbackDelegate]. +/// A class which mocks [PlatformNavigationCallbackDelegate]. /// /// See the documentation for Mockito's code generation for more information. -class MockNavigationCallbackDelegate extends _i1.Mock - implements _i3.NavigationCallbackDelegate { - MockNavigationCallbackDelegate() { +class MockPlatformNavigationCallbackDelegate extends _i1.Mock + implements _i3.PlatformNavigationCallbackDelegate { + MockPlatformNavigationCallbackDelegate() { _i1.throwOnMissingStub(this); } @override - _i2.NavigationCallbackCreationParams get params => + _i2.PlatformNavigationCallbackDelegateCreationParams get params => (super.noSuchMethod(Invocation.getter(#params), - returnValue: _FakeNavigationCallbackCreationParams_0()) - as _i2.NavigationCallbackCreationParams); + returnValue: + _FakePlatformNavigationCallbackDelegateCreationParams_0()) + as _i2.PlatformNavigationCallbackDelegateCreationParams); @override _i4.Future setOnNavigationRequest( _i4.FutureOr Function({bool isForMainFrame, String url})? diff --git a/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/webview_widget_delegate_test.dart b/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/platform_webview_widget_test.dart similarity index 68% rename from packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/webview_widget_delegate_test.dart rename to packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/platform_webview_widget_test.dart index eb529ac556c1..2ac68f6dd3d0 100644 --- a/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/webview_widget_delegate_test.dart +++ b/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/platform_webview_widget_test.dart @@ -6,9 +6,9 @@ import 'package:flutter/widgets.dart'; 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/webview_controller_delegate.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/v4/src/webview_widget_delegate.dart'; import 'webview_platform_test.mocks.dart'; @@ -20,36 +20,36 @@ void main() { test('Cannot be implemented with `implements`', () { final MockWebViewControllerDelegate controller = MockWebViewControllerDelegate(); - final WebViewWidgetCreationParams params = - WebViewWidgetCreationParams(controller: controller); + final PlatformWebViewWidgetCreationParams params = + PlatformWebViewWidgetCreationParams(controller: controller); when(WebViewPlatform.instance!.createWebViewWidgetDelegate(params)) .thenReturn(ImplementsWebViewWidgetDelegate()); expect(() { - WebViewWidgetDelegate(params); + PlatformWebViewWidget(params); }, throwsNoSuchMethodError); }); test('Can be extended', () { final MockWebViewControllerDelegate controller = MockWebViewControllerDelegate(); - final WebViewWidgetCreationParams params = - WebViewWidgetCreationParams(controller: controller); + final PlatformWebViewWidgetCreationParams params = + PlatformWebViewWidgetCreationParams(controller: controller); when(WebViewPlatform.instance!.createWebViewWidgetDelegate(params)) .thenReturn(ExtendsWebViewWidgetDelegate(params)); - expect(WebViewWidgetDelegate(params), isNotNull); + expect(PlatformWebViewWidget(params), isNotNull); }); test('Can be mocked with `implements`', () { final MockWebViewControllerDelegate controller = MockWebViewControllerDelegate(); - final WebViewWidgetCreationParams params = - WebViewWidgetCreationParams(controller: controller); + final PlatformWebViewWidgetCreationParams params = + PlatformWebViewWidgetCreationParams(controller: controller); when(WebViewPlatform.instance!.createWebViewWidgetDelegate(params)) .thenReturn(MockWebViewWidgetDelegate()); - expect(WebViewWidgetDelegate(params), isNotNull); + expect(PlatformWebViewWidget(params), isNotNull); }); } @@ -58,7 +58,7 @@ class MockWebViewPlatformWithMixin extends MockWebViewPlatform // ignore: prefer_mixin MockPlatformInterfaceMixin {} -class ImplementsWebViewWidgetDelegate implements WebViewWidgetDelegate { +class ImplementsWebViewWidgetDelegate implements PlatformWebViewWidget { @override dynamic noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation); } @@ -68,10 +68,10 @@ class MockWebViewWidgetDelegate extends Mock // ignore: prefer_mixin MockPlatformInterfaceMixin implements - WebViewWidgetDelegate {} + PlatformWebViewWidget {} -class ExtendsWebViewWidgetDelegate extends WebViewWidgetDelegate { - ExtendsWebViewWidgetDelegate(WebViewWidgetCreationParams params) +class ExtendsWebViewWidgetDelegate extends PlatformWebViewWidget { + ExtendsWebViewWidgetDelegate(PlatformWebViewWidgetCreationParams params) : super.implementation(params); @override @@ -86,4 +86,4 @@ class MockWebViewControllerDelegate extends Mock // ignore: prefer_mixin MockPlatformInterfaceMixin implements - WebViewControllerDelegate {} + PlatformWebViewController {} 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/src/v4/webview_platform_test.dart index 9f473f3cb34a..2f5c5e6f4d19 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/src/v4/webview_platform_test.dart @@ -6,7 +6,7 @@ import 'package:flutter_test/flutter_test.dart'; 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/webview_controller_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 'webview_platform_test.mocks.dart'; @@ -41,8 +41,8 @@ void main() { final WebViewPlatform webViewPlatform = ExtendsWebViewPlatform(); expect( - () => webViewPlatform.createCookieManagerDelegate( - const WebViewCookieManagerCreationParams()), + () => webViewPlatform.createPlatformCookieManager( + const PlatformWebViewCookieManagerCreationParams()), throwsUnimplementedError, ); }); @@ -54,8 +54,8 @@ void main() { final WebViewPlatform webViewPlatform = ExtendsWebViewPlatform(); expect( - () => webViewPlatform.createNavigationCallbackDelegate( - const NavigationCallbackCreationParams()), + () => webViewPlatform.createPlatformNavigationCallbackDelegate( + const PlatformNavigationCallbackDelegateCreationParams()), throwsUnimplementedError, ); }); @@ -67,7 +67,7 @@ void main() { final WebViewPlatform webViewPlatform = ExtendsWebViewPlatform(); expect( - () => webViewPlatform.createWebViewControllerDelegate( + () => webViewPlatform.createPlatformWebViewController( const WebViewControllerCreationParams()), throwsUnimplementedError, ); @@ -83,7 +83,7 @@ void main() { expect( () => webViewPlatform.createWebViewWidgetDelegate( - WebViewWidgetCreationParams(controller: controller)), + PlatformWebViewWidgetCreationParams(controller: controller)), throwsUnimplementedError, ); }); @@ -106,4 +106,4 @@ class MockWebViewControllerDelegate extends Mock // ignore: prefer_mixin MockPlatformInterfaceMixin implements - WebViewControllerDelegate {} + PlatformWebViewController {} 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 index 0a6ab677c1e2..9a7382326d43 100644 --- 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 @@ -3,18 +3,18 @@ // Do not manually edit this file. import 'package:mockito/mockito.dart' as _i1; -import 'package:webview_flutter_platform_interface/v4/src/navigation_callback_delegate.dart' +import 'package:webview_flutter_platform_interface/v4/src/platform_navigation_callback_delegate.dart' as _i3; -import 'package:webview_flutter_platform_interface/v4/src/types/types.dart' - as _i7; -import 'package:webview_flutter_platform_interface/v4/src/webview_controller_delegate.dart' +import 'package:webview_flutter_platform_interface/v4/src/platform_webview_controller.dart' as _i4; -import 'package:webview_flutter_platform_interface/v4/src/webview_cookie_manager_delegate.dart' +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; -import 'package:webview_flutter_platform_interface/v4/src/webview_widget_delegate.dart' - as _i5; // ignore_for_file: avoid_redundant_argument_values // ignore_for_file: avoid_setters_without_getters @@ -25,17 +25,17 @@ import 'package:webview_flutter_platform_interface/v4/src/webview_widget_delegat // ignore_for_file: unnecessary_parenthesis // ignore_for_file: camel_case_types -class _FakeWebViewCookieManagerDelegate_0 extends _i1.Fake - implements _i2.WebViewCookieManagerDelegate {} +class _FakePlatformWebViewCookieManager_0 extends _i1.Fake + implements _i2.PlatformWebViewCookieManager {} -class _FakeNavigationCallbackDelegate_1 extends _i1.Fake - implements _i3.NavigationCallbackDelegate {} +class _FakePlatformNavigationCallbackDelegate_1 extends _i1.Fake + implements _i3.PlatformNavigationCallbackDelegate {} -class _FakeWebViewControllerDelegate_2 extends _i1.Fake - implements _i4.WebViewControllerDelegate {} +class _FakePlatformWebViewController_2 extends _i1.Fake + implements _i4.PlatformWebViewController {} -class _FakeWebViewWidgetDelegate_3 extends _i1.Fake - implements _i5.WebViewWidgetDelegate {} +class _FakePlatformWebViewWidget_3 extends _i1.Fake + implements _i5.PlatformWebViewWidget {} /// A class which mocks [WebViewPlatform]. /// @@ -46,33 +46,35 @@ class MockWebViewPlatform extends _i1.Mock implements _i6.WebViewPlatform { } @override - _i2.WebViewCookieManagerDelegate createCookieManagerDelegate( - _i7.WebViewCookieManagerCreationParams? params) => + _i2.PlatformWebViewCookieManager createPlatformCookieManager( + _i7.PlatformWebViewCookieManagerCreationParams? params) => (super.noSuchMethod( - Invocation.method(#createCookieManagerDelegate, [params]), - returnValue: _FakeWebViewCookieManagerDelegate_0()) - as _i2.WebViewCookieManagerDelegate); + Invocation.method(#createPlatformCookieManager, [params]), + returnValue: _FakePlatformWebViewCookieManager_0()) + as _i2.PlatformWebViewCookieManager); @override - _i3.NavigationCallbackDelegate createNavigationCallbackDelegate( - _i7.NavigationCallbackCreationParams? params) => - (super.noSuchMethod( - Invocation.method(#createNavigationCallbackDelegate, [params]), - returnValue: _FakeNavigationCallbackDelegate_1()) - as _i3.NavigationCallbackDelegate); + _i3.PlatformNavigationCallbackDelegate + createPlatformNavigationCallbackDelegate( + _i7.PlatformNavigationCallbackDelegateCreationParams? params) => + (super.noSuchMethod( + Invocation.method( + #createPlatformNavigationCallbackDelegate, [params]), + returnValue: _FakePlatformNavigationCallbackDelegate_1()) + as _i3.PlatformNavigationCallbackDelegate); @override - _i4.WebViewControllerDelegate createWebViewControllerDelegate( + _i4.PlatformWebViewController createPlatformWebViewController( _i7.WebViewControllerCreationParams? params) => (super.noSuchMethod( - Invocation.method(#createWebViewControllerDelegate, [params]), - returnValue: _FakeWebViewControllerDelegate_2()) - as _i4.WebViewControllerDelegate); + Invocation.method(#createPlatformWebViewController, [params]), + returnValue: _FakePlatformWebViewController_2()) + as _i4.PlatformWebViewController); @override - _i5.WebViewWidgetDelegate createWebViewWidgetDelegate( - _i7.WebViewWidgetCreationParams? params) => + _i5.PlatformWebViewWidget createWebViewWidgetDelegate( + _i7.PlatformWebViewWidgetCreationParams? params) => (super.noSuchMethod( Invocation.method(#createWebViewWidgetDelegate, [params]), - returnValue: _FakeWebViewWidgetDelegate_3()) - as _i5.WebViewWidgetDelegate); + returnValue: _FakePlatformWebViewWidget_3()) + as _i5.PlatformWebViewWidget); @override String toString() => super.toString(); } From 3e226000cd8b4cea02f886a24683973bed323b88 Mon Sep 17 00:00:00 2001 From: Maurits van Beusekom Date: Wed, 11 May 2022 21:09:24 +0200 Subject: [PATCH 30/31] Apply feedback from PR --- ...dart => platform_navigation_delegate.dart} | 26 +++--- .../v4/src/platform_webview_controller.dart | 8 +- .../lib/v4/src/platform_webview_widget.dart | 2 +- ..._navigation_delegate_creation_params.dart} | 24 +++--- ...atform_webview_widget_creation_params.dart | 2 +- .../lib/v4/src/types/types.dart | 2 +- .../lib/v4/src/webview_platform.dart | 20 ++--- .../webview_flutter_platform_interface.dart | 2 +- ...=> platform_navigation_delegate_test.dart} | 80 +++++++++---------- .../v4/platform_webview_controller_test.dart | 10 +-- ...latform_webview_controller_test.mocks.dart | 21 +++-- .../src/v4/platform_webview_widget_test.dart | 6 +- .../test/src/v4/webview_platform_test.dart | 6 +- .../src/v4/webview_platform_test.mocks.dart | 24 +++--- 14 files changed, 112 insertions(+), 121 deletions(-) rename packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/{platform_navigation_callback_delegate.dart => platform_navigation_delegate.dart} (75%) rename packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/types/{platform_navigation_callback_delegate_creation_params.dart => platform_navigation_delegate_creation_params.dart} (54%) rename packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/{platform_navigation_callback_delegate_test.dart => platform_navigation_delegate_test.dart} (52%) diff --git a/packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/platform_navigation_callback_delegate.dart b/packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/platform_navigation_delegate.dart similarity index 75% rename from packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/platform_navigation_callback_delegate.dart rename to packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/platform_navigation_delegate.dart index 3d306ce8b664..20d11ba0b8c9 100644 --- a/packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/platform_navigation_callback_delegate.dart +++ b/packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/platform_navigation_delegate.dart @@ -11,32 +11,30 @@ import 'webview_platform.dart'; /// An interface defining navigation events that occur on the native platform. /// -/// The [WebViewControllerDelegate] is notifying this delegate on events that +/// The [PlatformWebViewController] is notifying this delegate on events that /// happened on the platform's webview. Platform implementations should -/// implement this class and pass an instance to the [WebViewControllerDelegate]. -abstract class PlatformNavigationCallbackDelegate extends PlatformInterface { - /// Creates a new [PlatformNavigationCallbackDelegate] - factory PlatformNavigationCallbackDelegate( - PlatformNavigationCallbackDelegateCreationParams params) { - final PlatformNavigationCallbackDelegate callbackDelegate = WebViewPlatform - .instance! - .createPlatformNavigationCallbackDelegate(params); +/// implement this class and pass an instance to the [PlatformWebViewController]. +abstract class PlatformNavigationDelegate extends PlatformInterface { + /// Creates a new [PlatformNavigationDelegate] + factory PlatformNavigationDelegate( + PlatformNavigationDelegateCreationParams params) { + final PlatformNavigationDelegate callbackDelegate = + WebViewPlatform.instance!.createPlatformNavigationDelegate(params); PlatformInterface.verify(callbackDelegate, _token); return callbackDelegate; } - /// Used by the platform implementation to create a new [PlatformNavigationCallbackDelegate]. + /// Used by the platform implementation to create a new [PlatformNavigationDelegate]. /// /// Should only be used by platform implementations because they can't extend /// a class that only contains a factory constructor. @protected - PlatformNavigationCallbackDelegate.implementation(this.params) - : super(token: _token); + PlatformNavigationDelegate.implementation(this.params) : super(token: _token); static final Object _token = Object(); - /// The parameters used to initialize the [PlatformNavigationCallbackDelegate]. - final PlatformNavigationCallbackDelegateCreationParams params; + /// The parameters used to initialize the [PlatformNavigationDelegate]. + final PlatformNavigationDelegateCreationParams params; /// Invoked when a navigation request is pending. /// 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/v4/src/platform_webview_controller.dart index 8c82343770cf..92aa65977b9a 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/v4/src/platform_webview_controller.dart @@ -8,7 +8,7 @@ import 'dart:ui'; import 'package:flutter/foundation.dart'; import 'package:plugin_platform_interface/plugin_platform_interface.dart'; -import 'platform_navigation_callback_delegate.dart'; +import 'platform_navigation_delegate.dart'; import 'webview_platform.dart'; /// Interface for a platform implementation of a web view controller. @@ -18,7 +18,7 @@ import 'webview_platform.dart'; /// changes. Extending this class (using `extends`) ensures that the subclass /// will get the default implementation, while platform implementations that /// `implements` this interface will be broken by newly added -/// [WebViewCookieManagerDelegate] methods. +/// [PlatformWebViewCookieManager] methods. abstract class PlatformWebViewController extends PlatformInterface { /// Creates a new [PlatformWebViewController] factory PlatformWebViewController( @@ -157,10 +157,10 @@ abstract class PlatformWebViewController extends PlatformInterface { 'clearLocalStorage is not implemented on the current platform'); } - /// Sets the [PlatformNavigationCallbackDelegate] containing the callback methods that + /// Sets the [PlatformNavigationDelegate] containing the callback methods that /// are called during navigation events. Future setPlatformNavigationCallbackDelegate( - PlatformNavigationCallbackDelegate handler) { + PlatformNavigationDelegate handler) { throw UnimplementedError( 'setPlatformNavigationCallbackDelegate is not implemented on the current platform'); } 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/v4/src/platform_webview_widget.dart index 6d4663ff287c..40334c650b3a 100644 --- a/packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/platform_webview_widget.dart +++ b/packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/platform_webview_widget.dart @@ -12,7 +12,7 @@ abstract class PlatformWebViewWidget extends PlatformInterface { /// Creates a new [PlatformWebViewWidget] factory PlatformWebViewWidget(PlatformWebViewWidgetCreationParams params) { final PlatformWebViewWidget webViewWidgetDelegate = - WebViewPlatform.instance!.createWebViewWidgetDelegate(params); + WebViewPlatform.instance!.createPlatformWebViewWidget(params); PlatformInterface.verify(webViewWidgetDelegate, _token); return webViewWidgetDelegate; } diff --git a/packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/types/platform_navigation_callback_delegate_creation_params.dart b/packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/types/platform_navigation_delegate_creation_params.dart similarity index 54% rename from packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/types/platform_navigation_callback_delegate_creation_params.dart rename to packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/types/platform_navigation_delegate_creation_params.dart index 023cc1c8e502..b20e5eb3ed48 100644 --- a/packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/types/platform_navigation_callback_delegate_creation_params.dart +++ b/packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/types/platform_navigation_delegate_creation_params.dart @@ -4,33 +4,33 @@ import 'package:flutter/material.dart'; -/// Object specifying creation parameters for creating a [PlatformNavigationCallbackDelegate]. +/// Object specifying creation parameters for creating a [PlatformNavigationDelegate]. /// /// Platform specific implementations can add additional fields by extending /// this class. /// /// {@tool sample} -/// This example demonstrates how to extend the [PlatformNavigationCallbackDelegateCreationParams] to +/// This example demonstrates how to extend the [PlatformNavigationDelegateCreationParams] to /// provide additional platform specific parameters. /// -/// When extending [PlatformNavigationCallbackDelegateCreationParams] additional +/// When extending [PlatformNavigationDelegateCreationParams] additional /// parameters should always accept `null` or have a default value to prevent /// breaking changes. /// /// ```dart -/// class AndroidNavigationCallbackDelegateCreationParams extends PlatformNavigationCallbackDelegateCreationParams { -/// AndroidNavigationCallbackDelegateCreationParams._( +/// class AndroidNavigationDelegateCreationParams extends PlatformNavigationDelegateCreationParams { +/// AndroidNavigationDelegateCreationParams._( /// // This parameter prevents breaking changes later. /// // ignore: avoid_unused_constructor_parameters -/// PlatformNavigationCallbackDelegateCreationParams params, { +/// PlatformNavigationDelegateCreationParams params, { /// this.filter, /// }) : super(); /// -/// factory AndroidNavigationCallbackDelegateCreationParams.fromPlatformNavigationCallbackDelegateCreationParams( -/// PlatformNavigationCallbackDelegateCreationParams params, { +/// factory AndroidNavigationDelegateCreationParams.fromPlatformNavigationDelegateCreationParams( +/// PlatformNavigationDelegateCreationParams params, { /// String? filter, /// }) { -/// return AndroidNavigationCallbackDelegateCreationParams._(params, filter: filter); +/// return AndroidNavigationDelegateCreationParams._(params, filter: filter); /// } /// /// final String? filter; @@ -38,7 +38,7 @@ import 'package:flutter/material.dart'; /// ``` /// {@end-tool} @immutable -class PlatformNavigationCallbackDelegateCreationParams { - /// Used by the platform implementation to create a new [PlatformNavigationCallbackDelegate]. - const PlatformNavigationCallbackDelegateCreationParams(); +class PlatformNavigationDelegateCreationParams { + /// Used by the platform implementation to create a new [PlatformNavigationkDelegate]. + const PlatformNavigationDelegateCreationParams(); } 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/v4/src/types/platform_webview_widget_creation_params.dart index abeae6e272c2..1812d7e39c29 100644 --- 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/v4/src/types/platform_webview_widget_creation_params.dart @@ -46,7 +46,7 @@ import '../platform_webview_controller.dart'; /// {@end-tool} @immutable class PlatformWebViewWidgetCreationParams { - /// Used by the platform implementation to create a new [PlatformWebViewWidgetDelegate]. + /// Used by the platform implementation to create a new [PlatformWebViewWidget]. const PlatformWebViewWidgetCreationParams({ this.key, required this.controller, diff --git a/packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/types/types.dart b/packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/types/types.dart index ca19e3d56492..05504fffd211 100644 --- a/packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/types/types.dart +++ b/packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/types/types.dart @@ -5,7 +5,7 @@ export 'javascript_message.dart'; export 'javascript_mode.dart'; export 'load_request_params.dart'; -export 'platform_navigation_callback_delegate_creation_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'; 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/v4/src/webview_platform.dart index 2f8e2d1e39d9..c5c5dffc6a22 100644 --- a/packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/webview_platform.dart +++ b/packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/webview_platform.dart @@ -4,7 +4,7 @@ import 'package:plugin_platform_interface/plugin_platform_interface.dart'; -import 'platform_navigation_callback_delegate.dart'; +import 'platform_navigation_delegate.dart'; import 'platform_webview_controller.dart'; import 'platform_webview_cookie_manager.dart'; import 'platform_webview_widget.dart'; @@ -44,18 +44,18 @@ abstract class WebViewPlatform extends PlatformInterface { PlatformWebViewCookieManagerCreationParams params, ) { throw UnimplementedError( - 'createCookieManagerDelegate is not implemented on the current platform.'); + 'createPlatformCookieManager is not implemented on the current platform.'); } - /// Creates a new [PlatformNavigationCallbackDelegate]. + /// Creates a new [PlatformNavigationDelegate]. /// /// This function should only be called by the app-facing package. - /// Look at using [PlatformNavigationCallbackDelegate] in `webview_flutter` instead. - PlatformNavigationCallbackDelegate createPlatformNavigationCallbackDelegate( - PlatformNavigationCallbackDelegateCreationParams params, + /// Look at using [NavigationDelegate] in `webview_flutter` instead. + PlatformNavigationDelegate createPlatformNavigationDelegate( + PlatformNavigationDelegateCreationParams params, ) { throw UnimplementedError( - 'createNavigationCallbackDelegate is not implemented on the current platform.'); + 'createPlatformNavigationDelegate is not implemented on the current platform.'); } /// Create a new [PlatformWebViewController]. @@ -66,17 +66,17 @@ abstract class WebViewPlatform extends PlatformInterface { PlatformWebViewControllerCreationParams params, ) { throw UnimplementedError( - 'createWebViewControllerDelegate is not implemented on the current platform.'); + 'createPlatformWebViewController is not implemented on the current platform.'); } /// Create a new [PlatformWebViewWidget]. /// /// This function should only be called by the app-facing package. /// Look at using [WebViewWidget] in `webview_flutter` instead. - PlatformWebViewWidget createWebViewWidgetDelegate( + PlatformWebViewWidget createPlatformWebViewWidget( PlatformWebViewWidgetCreationParams params, ) { throw UnimplementedError( - 'createWebViewWidgetDelegate is not implemented on the current platform.'); + 'createPlatformWebViewWidget is not implemented on the current platform.'); } } 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 index 1897fe6b9116..d14fec163327 100644 --- 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 @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -export 'src/platform_navigation_callback_delegate.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'; diff --git a/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/platform_navigation_callback_delegate_test.dart b/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/platform_navigation_delegate_test.dart similarity index 52% rename from packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/platform_navigation_callback_delegate_test.dart rename to packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/platform_navigation_delegate_test.dart index b1342ba7136b..5674c1522408 100644 --- a/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/platform_navigation_callback_delegate_test.dart +++ b/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/platform_navigation_delegate_test.dart @@ -5,7 +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_callback_delegate.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 'webview_platform_test.mocks.dart'; @@ -16,44 +16,41 @@ void main() { }); test('Cannot be implemented with `implements`', () { - const PlatformNavigationCallbackDelegateCreationParams params = - PlatformNavigationCallbackDelegateCreationParams(); - when(WebViewPlatform.instance! - .createPlatformNavigationCallbackDelegate(params)) - .thenReturn(ImplementsPlatformNavigationCallbackDelegate()); + const PlatformNavigationDelegateCreationParams params = + PlatformNavigationDelegateCreationParams(); + when(WebViewPlatform.instance!.createPlatformNavigationDelegate(params)) + .thenReturn(ImplementsPlatformNavigationDelegate()); expect(() { - PlatformNavigationCallbackDelegate(params); + PlatformNavigationDelegate(params); }, throwsNoSuchMethodError); }); test('Can be extended', () { - const PlatformNavigationCallbackDelegateCreationParams params = - PlatformNavigationCallbackDelegateCreationParams(); - when(WebViewPlatform.instance! - .createPlatformNavigationCallbackDelegate(params)) - .thenReturn(ExtendsPlatformNavigationCallbackDelegate(params)); + const PlatformNavigationDelegateCreationParams params = + PlatformNavigationDelegateCreationParams(); + when(WebViewPlatform.instance!.createPlatformNavigationDelegate(params)) + .thenReturn(ExtendsPlatformNavigationDelegate(params)); - expect(PlatformNavigationCallbackDelegate(params), isNotNull); + expect(PlatformNavigationDelegate(params), isNotNull); }); test('Can be mocked with `implements`', () { - const PlatformNavigationCallbackDelegateCreationParams params = - PlatformNavigationCallbackDelegateCreationParams(); - when(WebViewPlatform.instance! - .createPlatformNavigationCallbackDelegate(params)) - .thenReturn(MockNavigationCallbackDelegate()); + const PlatformNavigationDelegateCreationParams params = + PlatformNavigationDelegateCreationParams(); + when(WebViewPlatform.instance!.createPlatformNavigationDelegate(params)) + .thenReturn(MockNavigationDelegate()); - expect(PlatformNavigationCallbackDelegate(params), isNotNull); + expect(PlatformNavigationDelegate(params), isNotNull); }); test( // ignore: lines_longer_than_80_chars 'Default implementation of setOnNavigationRequest should throw unimplemented error', () { - final PlatformNavigationCallbackDelegate callbackDelegate = - ExtendsPlatformNavigationCallbackDelegate( - const PlatformNavigationCallbackDelegateCreationParams()); + final PlatformNavigationDelegate callbackDelegate = + ExtendsPlatformNavigationDelegate( + const PlatformNavigationDelegateCreationParams()); expect( () => callbackDelegate.setOnNavigationRequest( @@ -66,9 +63,9 @@ void main() { // ignore: lines_longer_than_80_chars 'Default implementation of setOnPageStarted should throw unimplemented error', () { - final PlatformNavigationCallbackDelegate callbackDelegate = - ExtendsPlatformNavigationCallbackDelegate( - const PlatformNavigationCallbackDelegateCreationParams()); + final PlatformNavigationDelegate callbackDelegate = + ExtendsPlatformNavigationDelegate( + const PlatformNavigationDelegateCreationParams()); expect( () => callbackDelegate.setOnPageStarted((String url) {}), @@ -80,9 +77,9 @@ void main() { // ignore: lines_longer_than_80_chars 'Default implementation of setOnPageFinished should throw unimplemented error', () { - final PlatformNavigationCallbackDelegate callbackDelegate = - ExtendsPlatformNavigationCallbackDelegate( - const PlatformNavigationCallbackDelegateCreationParams()); + final PlatformNavigationDelegate callbackDelegate = + ExtendsPlatformNavigationDelegate( + const PlatformNavigationDelegateCreationParams()); expect( () => callbackDelegate.setOnPageFinished((String url) {}), @@ -94,9 +91,9 @@ void main() { // ignore: lines_longer_than_80_chars 'Default implementation of setOnProgress should throw unimplemented error', () { - final PlatformNavigationCallbackDelegate callbackDelegate = - ExtendsPlatformNavigationCallbackDelegate( - const PlatformNavigationCallbackDelegateCreationParams()); + final PlatformNavigationDelegate callbackDelegate = + ExtendsPlatformNavigationDelegate( + const PlatformNavigationDelegateCreationParams()); expect( () => callbackDelegate.setOnProgress((int progress) {}), @@ -108,9 +105,9 @@ void main() { // ignore: lines_longer_than_80_chars 'Default implementation of setOnWebResourceError should throw unimplemented error', () { - final PlatformNavigationCallbackDelegate callbackDelegate = - ExtendsPlatformNavigationCallbackDelegate( - const PlatformNavigationCallbackDelegateCreationParams()); + final PlatformNavigationDelegate callbackDelegate = + ExtendsPlatformNavigationDelegate( + const PlatformNavigationDelegateCreationParams()); expect( () => callbackDelegate.setOnWebResourceError((WebResourceError error) {}), @@ -124,22 +121,21 @@ class MockWebViewPlatformWithMixin extends MockWebViewPlatform // ignore: prefer_mixin MockPlatformInterfaceMixin {} -class ImplementsPlatformNavigationCallbackDelegate - implements PlatformNavigationCallbackDelegate { +class ImplementsPlatformNavigationDelegate + implements PlatformNavigationDelegate { @override dynamic noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation); } -class MockNavigationCallbackDelegate extends Mock +class MockNavigationDelegate extends Mock with // ignore: prefer_mixin MockPlatformInterfaceMixin implements - PlatformNavigationCallbackDelegate {} + PlatformNavigationDelegate {} -class ExtendsPlatformNavigationCallbackDelegate - extends PlatformNavigationCallbackDelegate { - ExtendsPlatformNavigationCallbackDelegate( - PlatformNavigationCallbackDelegateCreationParams params) +class ExtendsPlatformNavigationDelegate extends PlatformNavigationDelegate { + ExtendsPlatformNavigationDelegate( + PlatformNavigationDelegateCreationParams params) : super.implementation(params); } 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/src/v4/platform_webview_controller_test.dart index 37ee0b3f126a..76f2aa25bd23 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/src/v4/platform_webview_controller_test.dart @@ -7,14 +7,14 @@ import 'package:flutter_test/flutter_test.dart'; 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_callback_delegate.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 'platform_navigation_callback_delegate_test.dart'; +import 'platform_navigation_delegate_test.dart'; import 'webview_platform_test.mocks.dart'; -@GenerateMocks([PlatformNavigationCallbackDelegate]) +@GenerateMocks([PlatformNavigationDelegate]) void main() { setUp(() { WebViewPlatform.instance = MockWebViewPlatformWithMixin(); @@ -226,8 +226,8 @@ void main() { const PlatformWebViewControllerCreationParams()); expect( - () => controller.setPlatformNavigationCallbackDelegate( - MockNavigationCallbackDelegate()), + () => controller + .setPlatformNavigationCallbackDelegate(MockNavigationDelegate()), throwsUnimplementedError, ); }, diff --git a/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/platform_webview_controller_test.mocks.dart b/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/platform_webview_controller_test.mocks.dart index 659df25b6939..47e67379f124 100644 --- a/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/platform_webview_controller_test.mocks.dart +++ b/packages/webview_flutter/webview_flutter_platform_interface/test/src/v4/platform_webview_controller_test.mocks.dart @@ -5,7 +5,7 @@ import 'dart:async' as _i4; import 'package:mockito/mockito.dart' as _i1; -import 'package:webview_flutter_platform_interface/v4/src/platform_navigation_callback_delegate.dart' +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; @@ -19,24 +19,23 @@ import 'package:webview_flutter_platform_interface/v4/src/webview_platform.dart' // ignore_for_file: unnecessary_parenthesis // ignore_for_file: camel_case_types -class _FakePlatformNavigationCallbackDelegateCreationParams_0 extends _i1.Fake - implements _i2.PlatformNavigationCallbackDelegateCreationParams {} +class _FakePlatformNavigationDelegateCreationParams_0 extends _i1.Fake + implements _i2.PlatformNavigationDelegateCreationParams {} -/// A class which mocks [PlatformNavigationCallbackDelegate]. +/// A class which mocks [PlatformNavigationDelegate]. /// /// See the documentation for Mockito's code generation for more information. -class MockPlatformNavigationCallbackDelegate extends _i1.Mock - implements _i3.PlatformNavigationCallbackDelegate { - MockPlatformNavigationCallbackDelegate() { +class MockPlatformNavigationDelegate extends _i1.Mock + implements _i3.PlatformNavigationDelegate { + MockPlatformNavigationDelegate() { _i1.throwOnMissingStub(this); } @override - _i2.PlatformNavigationCallbackDelegateCreationParams get params => + _i2.PlatformNavigationDelegateCreationParams get params => (super.noSuchMethod(Invocation.getter(#params), - returnValue: - _FakePlatformNavigationCallbackDelegateCreationParams_0()) - as _i2.PlatformNavigationCallbackDelegateCreationParams); + returnValue: _FakePlatformNavigationDelegateCreationParams_0()) + as _i2.PlatformNavigationDelegateCreationParams); @override _i4.Future setOnNavigationRequest( _i4.FutureOr Function({bool isForMainFrame, String url})? 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/src/v4/platform_webview_widget_test.dart index 2ac68f6dd3d0..30fa52ece24a 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/src/v4/platform_webview_widget_test.dart @@ -22,7 +22,7 @@ void main() { MockWebViewControllerDelegate(); final PlatformWebViewWidgetCreationParams params = PlatformWebViewWidgetCreationParams(controller: controller); - when(WebViewPlatform.instance!.createWebViewWidgetDelegate(params)) + when(WebViewPlatform.instance!.createPlatformWebViewWidget(params)) .thenReturn(ImplementsWebViewWidgetDelegate()); expect(() { @@ -35,7 +35,7 @@ void main() { MockWebViewControllerDelegate(); final PlatformWebViewWidgetCreationParams params = PlatformWebViewWidgetCreationParams(controller: controller); - when(WebViewPlatform.instance!.createWebViewWidgetDelegate(params)) + when(WebViewPlatform.instance!.createPlatformWebViewWidget(params)) .thenReturn(ExtendsWebViewWidgetDelegate(params)); expect(PlatformWebViewWidget(params), isNotNull); @@ -46,7 +46,7 @@ void main() { MockWebViewControllerDelegate(); final PlatformWebViewWidgetCreationParams params = PlatformWebViewWidgetCreationParams(controller: controller); - when(WebViewPlatform.instance!.createWebViewWidgetDelegate(params)) + when(WebViewPlatform.instance!.createPlatformWebViewWidget(params)) .thenReturn(MockWebViewWidgetDelegate()); expect(PlatformWebViewWidget(params), isNotNull); 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/src/v4/webview_platform_test.dart index b631baecc004..f09156919512 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/src/v4/webview_platform_test.dart @@ -54,8 +54,8 @@ void main() { final WebViewPlatform webViewPlatform = ExtendsWebViewPlatform(); expect( - () => webViewPlatform.createPlatformNavigationCallbackDelegate( - const PlatformNavigationCallbackDelegateCreationParams()), + () => webViewPlatform.createPlatformNavigationDelegate( + const PlatformNavigationDelegateCreationParams()), throwsUnimplementedError, ); }); @@ -82,7 +82,7 @@ void main() { MockWebViewControllerDelegate(); expect( - () => webViewPlatform.createWebViewWidgetDelegate( + () => webViewPlatform.createPlatformWebViewWidget( PlatformWebViewWidgetCreationParams(controller: controller)), throwsUnimplementedError, ); 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 index 0faaef05decc..5ce007579473 100644 --- 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 @@ -3,7 +3,7 @@ // Do not manually edit this file. import 'package:mockito/mockito.dart' as _i1; -import 'package:webview_flutter_platform_interface/v4/src/platform_navigation_callback_delegate.dart' +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; @@ -28,8 +28,8 @@ import 'package:webview_flutter_platform_interface/v4/src/webview_platform.dart' class _FakePlatformWebViewCookieManager_0 extends _i1.Fake implements _i2.PlatformWebViewCookieManager {} -class _FakePlatformNavigationCallbackDelegate_1 extends _i1.Fake - implements _i3.PlatformNavigationCallbackDelegate {} +class _FakePlatformNavigationDelegate_1 extends _i1.Fake + implements _i3.PlatformNavigationDelegate {} class _FakePlatformWebViewController_2 extends _i1.Fake implements _i4.PlatformWebViewController {} @@ -53,14 +53,12 @@ class MockWebViewPlatform extends _i1.Mock implements _i6.WebViewPlatform { returnValue: _FakePlatformWebViewCookieManager_0()) as _i2.PlatformWebViewCookieManager); @override - _i3.PlatformNavigationCallbackDelegate - createPlatformNavigationCallbackDelegate( - _i7.PlatformNavigationCallbackDelegateCreationParams? params) => - (super.noSuchMethod( - Invocation.method( - #createPlatformNavigationCallbackDelegate, [params]), - returnValue: _FakePlatformNavigationCallbackDelegate_1()) - as _i3.PlatformNavigationCallbackDelegate); + _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) => @@ -69,10 +67,10 @@ class MockWebViewPlatform extends _i1.Mock implements _i6.WebViewPlatform { returnValue: _FakePlatformWebViewController_2()) as _i4.PlatformWebViewController); @override - _i5.PlatformWebViewWidget createWebViewWidgetDelegate( + _i5.PlatformWebViewWidget createPlatformWebViewWidget( _i7.PlatformWebViewWidgetCreationParams? params) => (super.noSuchMethod( - Invocation.method(#createWebViewWidgetDelegate, [params]), + Invocation.method(#createPlatformWebViewWidget, [params]), returnValue: _FakePlatformWebViewWidget_3()) as _i5.PlatformWebViewWidget); @override From 1db2d18ce5b5d930bbcad429aa660c071800e869 Mon Sep 17 00:00:00 2001 From: Maurits van Beusekom Date: Fri, 13 May 2022 08:44:43 +0200 Subject: [PATCH 31/31] Apply feedback from PR --- .../lib/v4/src/platform_navigation_delegate.dart | 10 +++++----- .../lib/v4/src/platform_webview_controller.dart | 10 ++-------- .../test/src/v4/platform_webview_controller_test.dart | 4 ++-- 3 files changed, 9 insertions(+), 15 deletions(-) diff --git a/packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/platform_navigation_delegate.dart b/packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/platform_navigation_delegate.dart index 20d11ba0b8c9..a66f1defdf60 100644 --- a/packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/platform_navigation_delegate.dart +++ b/packages/webview_flutter/webview_flutter_platform_interface/lib/v4/src/platform_navigation_delegate.dart @@ -38,7 +38,7 @@ abstract class PlatformNavigationDelegate extends PlatformInterface { /// Invoked when a navigation request is pending. /// - /// See [WebViewControllerDelegate.setNavigationCallbackDelegate]. + /// See [PlatformWebViewController.setPlatformNavigationDelegate]. Future setOnNavigationRequest( FutureOr Function({required String url, required bool isForMainFrame}) onNavigationRequest, @@ -49,7 +49,7 @@ abstract class PlatformNavigationDelegate extends PlatformInterface { /// Invoked when a page has started loading. /// - /// See [WebViewControllerDelegate.setNavigationCallbackDelegate]. + /// See [PlatformWebViewController.setPlatformNavigationDelegate]. Future setOnPageStarted( void Function(String url) onPageStarted, ) { @@ -59,7 +59,7 @@ abstract class PlatformNavigationDelegate extends PlatformInterface { /// Invoked when a page has finished loading. /// - /// See [WebViewControllerDelegate.setNavigationCallbackDelegate]. + /// See [PlatformWebViewController.setPlatformNavigationDelegate]. Future setOnPageFinished( void Function(String url) onPageFinished, ) { @@ -69,7 +69,7 @@ abstract class PlatformNavigationDelegate extends PlatformInterface { /// Invoked when a page is loading to report the progress. /// - /// See [WebViewControllerDelegate.setNavigationCallbackDelegate]. + /// See [PlatformWebViewController.setPlatformNavigationDelegate]. Future setOnProgress( void Function(int progress) onProgress, ) { @@ -79,7 +79,7 @@ abstract class PlatformNavigationDelegate extends PlatformInterface { /// Invoked when a resource loading error occurred. /// - /// See [WebViewControllerDelegate.setNavigationCallbackDelegate]. + /// See [PlatformWebViewController.setPlatformNavigationDelegate]. Future setOnWebResourceError( void Function(WebResourceError error) onWebResourceError, ) { 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/v4/src/platform_webview_controller.dart index 92aa65977b9a..3585ec8b1886 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/v4/src/platform_webview_controller.dart @@ -159,10 +159,10 @@ abstract class PlatformWebViewController extends PlatformInterface { /// Sets the [PlatformNavigationDelegate] containing the callback methods that /// are called during navigation events. - Future setPlatformNavigationCallbackDelegate( + Future setPlatformNavigationDelegate( PlatformNavigationDelegate handler) { throw UnimplementedError( - 'setPlatformNavigationCallbackDelegate is not implemented on the current platform'); + 'setPlatformNavigationDelegate is not implemented on the current platform'); } /// Runs the given JavaScript in the context of the current page. @@ -262,12 +262,6 @@ abstract class PlatformWebViewController extends PlatformInterface { } /// Sets the value used for the HTTP `User-Agent:` request header. - /// - /// If [userAgent.value] is null the platform's default user agent should be - /// used. - /// - /// An absent value ([userAgent.isPresent] is false) represents no change to - /// this setting from the last time it was set. Future setUserAgent(String? userAgent) { throw UnimplementedError( 'setUserAgent is not implemented on the current platform'); 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/src/v4/platform_webview_controller_test.dart index 76f2aa25bd23..b6d043cac9c8 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/src/v4/platform_webview_controller_test.dart @@ -226,8 +226,8 @@ void main() { const PlatformWebViewControllerCreationParams()); expect( - () => controller - .setPlatformNavigationCallbackDelegate(MockNavigationDelegate()), + () => + controller.setPlatformNavigationDelegate(MockNavigationDelegate()), throwsUnimplementedError, ); },