From e5218a70198377599cf9ebfcc4ee4b612f02d818 Mon Sep 17 00:00:00 2001 From: Maurice Parrish Date: Fri, 29 Oct 2021 12:34:46 -0700 Subject: [PATCH 01/11] update dart --- .../lib/src/android_webview.dart | 139 +++++---- .../lib/src/android_webview.pigeon.dart | 184 +++++------ .../lib/src/android_webview_api_impls.dart | 58 ++-- .../pigeons/android_webview.dart | 14 +- .../webview_flutter_android/pubspec.yaml | 4 +- .../test/android_webview_test.dart | 237 ++------------- .../test/android_webview_test.mocks.dart | 285 ++++++++++++++++++ 7 files changed, 503 insertions(+), 418 deletions(-) create mode 100644 packages/webview_flutter/webview_flutter_android/test/android_webview_test.mocks.dart diff --git a/packages/webview_flutter/webview_flutter_android/lib/src/android_webview.dart b/packages/webview_flutter/webview_flutter_android/lib/src/android_webview.dart index 1ddd6f3d9f0f..3de5a5a3d106 100644 --- a/packages/webview_flutter/webview_flutter_android/lib/src/android_webview.dart +++ b/packages/webview_flutter/webview_flutter_android/lib/src/android_webview.dart @@ -5,6 +5,7 @@ import 'package:flutter/foundation.dart'; import 'package:flutter/widgets.dart' show AndroidViewSurface; +import 'android_webview.pigeon.dart'; import 'android_webview_api_impls.dart'; // TODO(bparrishMines): This can be removed once pigeon supports null values: https://github.com/flutter/flutter/issues/59118 @@ -29,6 +30,8 @@ const String _nullStringIdentifier = ''; /// To learn more about WebView and alternatives for serving web content, read /// the documentation on /// [Web-based content](https://developer.android.com/guide/webapps). +/// +/// When a [WebView] is no longer needed [release] must be called. class WebView { /// Constructs a new WebView. WebView({this.useHybridComposition = false}) { @@ -40,9 +43,6 @@ class WebView { static WebViewHostApiImpl api = WebViewHostApiImpl(); WebViewClient? _currentWebViewClient; - DownloadListener? _currentDownloadListener; - WebChromeClient? _currentWebChromeClient; - Set _javaScriptChannels = {}; /// Whether the [WebView] will be rendered with an [AndroidViewSurface]. /// @@ -187,18 +187,8 @@ class WebView { /// /// This will replace the current handler. Future setWebViewClient(WebViewClient webViewClient) { - final WebViewClient? currentWebViewClient = _currentWebViewClient; - - if (webViewClient == currentWebViewClient) { - return Future.value(); - } - - if (currentWebViewClient != null) { - WebViewClient.api.disposeFromInstance(currentWebViewClient); - } - - WebViewClient.api.createFromInstance(webViewClient); _currentWebViewClient = webViewClient; + WebViewClient.api.createFromInstance(webViewClient); return api.setWebViewClientFromInstance(this, webViewClient); } @@ -227,7 +217,6 @@ class WebView { /// content is ever loaded into the WebView even inside an iframe. Future addJavaScriptChannel(JavaScriptChannel javaScriptChannel) { JavaScriptChannel.api.createFromInstance(javaScriptChannel); - _javaScriptChannels.add(javaScriptChannel); return api.addJavaScriptChannelFromInstance(this, javaScriptChannel); } @@ -236,27 +225,15 @@ class WebView { /// Note that the removal will not be reflected in JavaScript until the page /// is next (re)loaded. See [addJavaScriptChannel]. Future removeJavaScriptChannel(JavaScriptChannel javaScriptChannel) { - _javaScriptChannels.remove(javaScriptChannel); - api.removeJavaScriptChannelFromInstance(this, javaScriptChannel); - return JavaScriptChannel.api.disposeFromInstance(javaScriptChannel); + JavaScriptChannel.api.createFromInstance(javaScriptChannel); + return api.removeJavaScriptChannelFromInstance(this, javaScriptChannel); } /// Registers the interface to be used when content can not be handled by the rendering engine, and should be downloaded instead. /// /// This will replace the current handler. Future setDownloadListener(DownloadListener listener) { - final DownloadListener? currentDownloadListener = _currentDownloadListener; - - if (listener == currentDownloadListener) { - return Future.value(); - } - - if (currentDownloadListener != null) { - DownloadListener.api.disposeFromInstance(currentDownloadListener); - } - DownloadListener.api.createFromInstance(listener); - _currentDownloadListener = listener; return api.setDownloadListenerFromInstance(this, listener); } @@ -266,26 +243,26 @@ class WebView { /// JavaScript dialogs, favicons, titles, and the progress. This will replace /// the current handler. Future setWebChromeClient(WebChromeClient client) { - final WebChromeClient? currentWebChromeClient = _currentWebChromeClient; - - if (client == currentWebChromeClient) { - return Future.value(); - } - - if (currentWebChromeClient != null) { - WebChromeClient.api.disposeFromInstance(currentWebChromeClient); - } - - final WebViewClient? currentWebViewClient = _currentWebViewClient; + // WebView requires a WebViewClient because of a bug fix that makes + // calls to WebViewClient.requestLoading/WebViewClient.urlLoading when a new + // window is opened. This is to make sure a url opened by `Window.open` has + // a secure url. assert( - currentWebViewClient != null, + _currentWebViewClient != null, "Can't set a WebChromeClient without setting a WebViewClient first.", ); - - WebChromeClient.api.createFromInstance(client, currentWebViewClient!); - _currentWebChromeClient = client; + WebChromeClient.api.createFromInstance(client, _currentWebViewClient!); return api.setWebChromeClientFromInstance(this, client); } + + /// Releases all resources used by the [WebView]. + /// + /// Any methods called on the [WebView] instance after [release] will throw + /// an exception. + Future release() { + _currentWebViewClient = null; + return api.disposeFromInstance(this); + } } /// Manages settings state for a [WebView]. @@ -332,7 +309,7 @@ class WebSettings { /// /// The default is false. Future setSupportMultipleWindows(bool support) { - return api.setSupportZoomFromInstance(this, support); + return api.setSupportMultipleWindowsFromInstance(this, support); } /// Tells the WebView to enable JavaScript execution. @@ -423,12 +400,19 @@ class WebSettings { /// See [WebView.addJavaScriptChannel]. abstract class JavaScriptChannel { /// Constructs a [JavaScriptChannel]. - JavaScriptChannel(this.channelName); + JavaScriptChannel(this.channelName) { + if (!_flutterApisHaveBeenSetup) { + JavaScriptChannelFlutterApi.setup(JavaScriptChannelFlutterApiImpl()); + _flutterApisHaveBeenSetup = true; + } + } /// Pigeon Host Api implementation for [JavaScriptChannel]. @visibleForTesting static JavaScriptChannelHostApiImpl api = JavaScriptChannelHostApiImpl(); + static bool _flutterApisHaveBeenSetup = false; + /// Used to identify this object to receive messages from javaScript. final String channelName; @@ -439,55 +423,62 @@ abstract class JavaScriptChannel { /// Receive various notifications and requests for [WebView]. abstract class WebViewClient { /// Constructs a [WebViewClient]. - WebViewClient({this.shouldOverrideUrlLoading = true}); + WebViewClient({this.shouldOverrideUrlLoading = true}) { + if (!_flutterApisHaveBeenSetup) { + WebViewClientFlutterApi.setup(WebViewClientFlutterApiImpl()); + _flutterApisHaveBeenSetup = true; + } + } + + static bool _flutterApisHaveBeenSetup = false; /// User authentication failed on server. - static const int errorAuthentication = 0xfffffffc; + static const int errorAuthentication = -4; /// Malformed URL. - static const int errorBadUrl = 0xfffffff4; + static const int errorBadUrl = -12; /// Failed to connect to the server. - static const int errorConnect = 0xfffffffa; + static const int errorConnect = -6; /// Failed to perform SSL handshake. - static const int errorFailedSslHandshake = 0xfffffff5; + static const int errorFailedSslHandshake = -11; /// Generic file error. - static const int errorFile = 0xfffffff3; + static const int errorFile = -13; /// File not found. - static const int errorFileNotFound = 0xfffffff2; + static const int errorFileNotFound = -14; /// Server or proxy hostname lookup failed. - static const int errorHostLookup = 0xfffffffe; + static const int errorHostLookup = -2; /// Failed to read or write to the server. - static const int errorIO = 0xfffffff9; + static const int errorIO = -7; /// User authentication failed on proxy. - static const int errorProxyAuthentication = 0xfffffffb; + static const int errorProxyAuthentication = -5; /// Too many redirects. - static const int errorRedirectLoop = 0xfffffff7; + static const int errorRedirectLoop = -9; /// Connection timed out. - static const int errorTimeout = 0xfffffff8; + static const int errorTimeout = -8; /// Too many requests during this load. - static const int errorTooManyRequests = 0xfffffff1; + static const int errorTooManyRequests = -15; /// Generic error. - static const int errorUnknown = 0xffffffff; + static const int errorUnknown = -1; /// Resource load was canceled by Safe Browsing. - static const int errorUnsafeResource = 0xfffffff0; + static const int errorUnsafeResource = -16; /// Unsupported authentication scheme (not basic or digest). - static const int errorUnsupportedAuthScheme = 0xfffffffd; + static const int errorUnsupportedAuthScheme = -3; /// Unsupported URI scheme. - static const int errorUnsupportedScheme = 0xfffffff6; + static const int errorUnsupportedScheme = -10; /// Pigeon Host Api implementation for [WebViewClient]. @visibleForTesting @@ -573,6 +564,16 @@ abstract class WebViewClient { /// The interface to be used when content can not be handled by the rendering engine for [WebView], and should be downloaded instead. abstract class DownloadListener { + /// Constructs a [DownloadListener]. + DownloadListener() { + if (!_flutterApisHaveBeenSetup) { + DownloadListenerFlutterApi.setup(DownloadListenerFlutterApiImpl()); + _flutterApisHaveBeenSetup = true; + } + } + + static bool _flutterApisHaveBeenSetup = false; + /// Pigeon Host Api implementation for [DownloadListener]. @visibleForTesting static DownloadListenerHostApiImpl api = DownloadListenerHostApiImpl(); @@ -589,6 +590,16 @@ abstract class DownloadListener { /// Handles JavaScript dialogs, favicons, titles, and the progress for [WebView]. abstract class WebChromeClient { + /// Constructs a [WebChromeClient]. + WebChromeClient() { + if (!_flutterApisHaveBeenSetup) { + WebChromeClientFlutterApi.setup(WebChromeClientFlutterApiImpl()); + _flutterApisHaveBeenSetup = true; + } + } + + static bool _flutterApisHaveBeenSetup = false; + /// Pigeon Host Api implementation for [WebChromeClient]. @visibleForTesting static WebChromeClientHostApiImpl api = WebChromeClientHostApiImpl(); @@ -627,7 +638,7 @@ class WebResourceRequest { final String method; /// Gets the headers associated with the request. - final Map requestHeaders; + final Map? requestHeaders; } /// Encapsulates information about errors occurred during loading of web resources. diff --git a/packages/webview_flutter/webview_flutter_android/lib/src/android_webview.pigeon.dart b/packages/webview_flutter/webview_flutter_android/lib/src/android_webview.pigeon.dart index 81ec7c7bf80e..2b3f008ed830 100644 --- a/packages/webview_flutter/webview_flutter_android/lib/src/android_webview.pigeon.dart +++ b/packages/webview_flutter/webview_flutter_android/lib/src/android_webview.pigeon.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. -// Autogenerated from Pigeon (v1.0.7), do not edit directly. +// Autogenerated from Pigeon (v1.0.8), do not edit directly. // See also: https://pub.dev/packages/pigeon // ignore_for_file: public_member_api_docs, non_constant_identifier_names, avoid_as, unused_import, unnecessary_parenthesis, prefer_null_aware_operators, omit_local_variable_types, unused_shown_name // @dart = 2.12 @@ -1039,31 +1039,6 @@ class JavaScriptChannelHostApi { return; } } - - Future dispose(int arg_instanceId) async { - final BasicMessageChannel channel = BasicMessageChannel( - 'dev.flutter.pigeon.JavaScriptChannelHostApi.dispose', codec, - binaryMessenger: _binaryMessenger); - final Map? replyMap = - await channel.send([arg_instanceId]) as Map?; - if (replyMap == null) { - throw PlatformException( - code: 'channel-error', - message: 'Unable to establish connection on channel.', - details: null, - ); - } else if (replyMap['error'] != null) { - final Map error = - (replyMap['error'] as Map?)!; - throw PlatformException( - code: (error['code'] as String?)!, - message: error['message'] as String?, - details: error['details'], - ); - } else { - return; - } - } } class _JavaScriptChannelFlutterApiCodec extends StandardMessageCodec { @@ -1074,8 +1049,27 @@ abstract class JavaScriptChannelFlutterApi { static const MessageCodec codec = _JavaScriptChannelFlutterApiCodec(); + void dispose(int instanceId); void postMessage(int instanceId, String message); static void setup(JavaScriptChannelFlutterApi? api) { + { + const BasicMessageChannel channel = BasicMessageChannel( + 'dev.flutter.pigeon.JavaScriptChannelFlutterApi.dispose', codec); + if (api == null) { + channel.setMessageHandler(null); + } else { + channel.setMessageHandler((Object? message) async { + assert(message != null, + 'Argument for dev.flutter.pigeon.JavaScriptChannelFlutterApi.dispose was null.'); + final List args = (message as List?)!; + final int? arg_instanceId = args[0] as int?; + assert(arg_instanceId != null, + 'Argument for dev.flutter.pigeon.JavaScriptChannelFlutterApi.dispose was null, expected non-null int.'); + api.dispose(arg_instanceId!); + return; + }); + } + } { const BasicMessageChannel channel = BasicMessageChannel( 'dev.flutter.pigeon.JavaScriptChannelFlutterApi.postMessage', codec); @@ -1141,31 +1135,6 @@ class WebViewClientHostApi { return; } } - - Future dispose(int arg_instanceId) async { - final BasicMessageChannel channel = BasicMessageChannel( - 'dev.flutter.pigeon.WebViewClientHostApi.dispose', codec, - binaryMessenger: _binaryMessenger); - final Map? replyMap = - await channel.send([arg_instanceId]) as Map?; - if (replyMap == null) { - throw PlatformException( - code: 'channel-error', - message: 'Unable to establish connection on channel.', - details: null, - ); - } else if (replyMap['error'] != null) { - final Map error = - (replyMap['error'] as Map?)!; - throw PlatformException( - code: (error['code'] as String?)!, - message: error['message'] as String?, - details: error['details'], - ); - } else { - return; - } - } } class _WebViewClientFlutterApiCodec extends StandardMessageCodec { @@ -1178,9 +1147,6 @@ class _WebViewClientFlutterApiCodec extends StandardMessageCodec { } else if (value is WebResourceRequestData) { buffer.putUint8(129); writeValue(buffer, value.encode()); - } else if (value is WebResourceRequestData) { - buffer.putUint8(130); - writeValue(buffer, value.encode()); } else { super.writeValue(buffer, value); } @@ -1195,9 +1161,6 @@ class _WebViewClientFlutterApiCodec extends StandardMessageCodec { case 129: return WebResourceRequestData.decode(readValue(buffer)!); - case 130: - return WebResourceRequestData.decode(readValue(buffer)!); - default: return super.readValueOfType(type, buffer); } @@ -1207,6 +1170,7 @@ class _WebViewClientFlutterApiCodec extends StandardMessageCodec { abstract class WebViewClientFlutterApi { static const MessageCodec codec = _WebViewClientFlutterApiCodec(); + void dispose(int instanceId); void onPageStarted(int instanceId, int webViewInstanceId, String url); void onPageFinished(int instanceId, int webViewInstanceId, String url); void onReceivedRequestError(int instanceId, int webViewInstanceId, @@ -1217,6 +1181,24 @@ abstract class WebViewClientFlutterApi { int instanceId, int webViewInstanceId, WebResourceRequestData request); void urlLoading(int instanceId, int webViewInstanceId, String url); static void setup(WebViewClientFlutterApi? api) { + { + const BasicMessageChannel channel = BasicMessageChannel( + 'dev.flutter.pigeon.WebViewClientFlutterApi.dispose', codec); + if (api == null) { + channel.setMessageHandler(null); + } else { + channel.setMessageHandler((Object? message) async { + assert(message != null, + 'Argument for dev.flutter.pigeon.WebViewClientFlutterApi.dispose was null.'); + final List args = (message as List?)!; + final int? arg_instanceId = args[0] as int?; + assert(arg_instanceId != null, + 'Argument for dev.flutter.pigeon.WebViewClientFlutterApi.dispose was null, expected non-null int.'); + api.dispose(arg_instanceId!); + return; + }); + } + } { const BasicMessageChannel channel = BasicMessageChannel( 'dev.flutter.pigeon.WebViewClientFlutterApi.onPageStarted', codec); @@ -1419,31 +1401,6 @@ class DownloadListenerHostApi { return; } } - - Future dispose(int arg_instanceId) async { - final BasicMessageChannel channel = BasicMessageChannel( - 'dev.flutter.pigeon.DownloadListenerHostApi.dispose', codec, - binaryMessenger: _binaryMessenger); - final Map? replyMap = - await channel.send([arg_instanceId]) as Map?; - if (replyMap == null) { - throw PlatformException( - code: 'channel-error', - message: 'Unable to establish connection on channel.', - details: null, - ); - } else if (replyMap['error'] != null) { - final Map error = - (replyMap['error'] as Map?)!; - throw PlatformException( - code: (error['code'] as String?)!, - message: error['message'] as String?, - details: error['details'], - ); - } else { - return; - } - } } class _DownloadListenerFlutterApiCodec extends StandardMessageCodec { @@ -1453,9 +1410,28 @@ class _DownloadListenerFlutterApiCodec extends StandardMessageCodec { abstract class DownloadListenerFlutterApi { static const MessageCodec codec = _DownloadListenerFlutterApiCodec(); + void dispose(int instanceId); void onDownloadStart(int instanceId, String url, String userAgent, String contentDisposition, String mimetype, int contentLength); static void setup(DownloadListenerFlutterApi? api) { + { + const BasicMessageChannel channel = BasicMessageChannel( + 'dev.flutter.pigeon.DownloadListenerFlutterApi.dispose', codec); + if (api == null) { + channel.setMessageHandler(null); + } else { + channel.setMessageHandler((Object? message) async { + assert(message != null, + 'Argument for dev.flutter.pigeon.DownloadListenerFlutterApi.dispose was null.'); + final List args = (message as List?)!; + final int? arg_instanceId = args[0] as int?; + assert(arg_instanceId != null, + 'Argument for dev.flutter.pigeon.DownloadListenerFlutterApi.dispose was null, expected non-null int.'); + api.dispose(arg_instanceId!); + return; + }); + } + } { const BasicMessageChannel channel = BasicMessageChannel( 'dev.flutter.pigeon.DownloadListenerFlutterApi.onDownloadStart', @@ -1535,31 +1511,6 @@ class WebChromeClientHostApi { return; } } - - Future dispose(int arg_instanceId) async { - final BasicMessageChannel channel = BasicMessageChannel( - 'dev.flutter.pigeon.WebChromeClientHostApi.dispose', codec, - binaryMessenger: _binaryMessenger); - final Map? replyMap = - await channel.send([arg_instanceId]) as Map?; - if (replyMap == null) { - throw PlatformException( - code: 'channel-error', - message: 'Unable to establish connection on channel.', - details: null, - ); - } else if (replyMap['error'] != null) { - final Map error = - (replyMap['error'] as Map?)!; - throw PlatformException( - code: (error['code'] as String?)!, - message: error['message'] as String?, - details: error['details'], - ); - } else { - return; - } - } } class _WebChromeClientFlutterApiCodec extends StandardMessageCodec { @@ -1569,8 +1520,27 @@ class _WebChromeClientFlutterApiCodec extends StandardMessageCodec { abstract class WebChromeClientFlutterApi { static const MessageCodec codec = _WebChromeClientFlutterApiCodec(); + void dispose(int instanceId); void onProgressChanged(int instanceId, int webViewInstanceId, int progress); static void setup(WebChromeClientFlutterApi? api) { + { + const BasicMessageChannel channel = BasicMessageChannel( + 'dev.flutter.pigeon.WebChromeClientFlutterApi.dispose', codec); + if (api == null) { + channel.setMessageHandler(null); + } else { + channel.setMessageHandler((Object? message) async { + assert(message != null, + 'Argument for dev.flutter.pigeon.WebChromeClientFlutterApi.dispose was null.'); + final List args = (message as List?)!; + final int? arg_instanceId = args[0] as int?; + assert(arg_instanceId != null, + 'Argument for dev.flutter.pigeon.WebChromeClientFlutterApi.dispose was null, expected non-null int.'); + api.dispose(arg_instanceId!); + return; + }); + } + } { const BasicMessageChannel channel = BasicMessageChannel( 'dev.flutter.pigeon.WebChromeClientFlutterApi.onProgressChanged', diff --git a/packages/webview_flutter/webview_flutter_android/lib/src/android_webview_api_impls.dart b/packages/webview_flutter/webview_flutter_android/lib/src/android_webview_api_impls.dart index f909e49bd802..341b00516d75 100644 --- a/packages/webview_flutter/webview_flutter_android/lib/src/android_webview_api_impls.dart +++ b/packages/webview_flutter/webview_flutter_android/lib/src/android_webview_api_impls.dart @@ -239,7 +239,7 @@ class WebSettingsHostApiImpl extends WebSettingsHostApi { WebSettings instance, bool flag, ) { - return setJavaScriptCanOpenWindowsAutomatically( + return setJavaScriptEnabled( instanceManager.getInstanceId(instance)!, flag, ); @@ -337,26 +337,23 @@ class JavaScriptChannelHostApiImpl extends JavaScriptChannelHostApi { return create(instanceId, instance.channelName); } } - - /// Helper method to convert instances ids to objects. - Future disposeFromInstance(JavaScriptChannel instance) async { - final int? instanceId = instanceManager.removeInstance(instance); - if (instanceId != null) { - return dispose(instanceId); - } - } } /// Flutter api implementation for [JavaScriptChannel]. class JavaScriptChannelFlutterApiImpl extends JavaScriptChannelFlutterApi { /// Constructs a [JavaScriptChannelFlutterApiImpl]. - JavaScriptChannelHostApiImpl({InstanceManager? instanceManager}) { + JavaScriptChannelFlutterApiImpl({InstanceManager? instanceManager}) { this.instanceManager = instanceManager ?? InstanceManager.instance; } /// Maintains instances stored to communicate with java objects. late final InstanceManager instanceManager; + @override + void dispose(int instanceId) { + instanceManager.removeInstance(instanceId); + } + @override void postMessage(int instanceId, String message) { final JavaScriptChannel instance = @@ -385,14 +382,6 @@ class WebViewClientHostApiImpl extends WebViewClientHostApi { return create(instanceId, instance.shouldOverrideUrlLoading); } } - - /// Helper method to convert instances ids to objects. - Future disposeFromInstance(WebViewClient instance) async { - final int? instanceId = instanceManager.removeInstance(instance); - if (instanceId != null) { - return dispose(instanceId); - } - } } /// Flutter api implementation for [WebViewClient]. @@ -405,6 +394,11 @@ class WebViewClientFlutterApiImpl extends WebViewClientFlutterApi { /// Maintains instances stored to communicate with java objects. late final InstanceManager instanceManager; + @override + void dispose(int instanceId) { + instanceManager.removeInstance(instanceId); + } + @override void onPageFinished(int instanceId, int webViewInstanceId, String url) { final WebViewClient instance = @@ -486,7 +480,7 @@ class WebViewClientFlutterApiImpl extends WebViewClientFlutterApi { isRedirect: request.isRedirect, hasGesture: request.hasGesture!, method: request.method!, - requestHeaders: request.requestHeaders!.cast(), + requestHeaders: request.requestHeaders?.cast(), ), ); } @@ -526,14 +520,6 @@ class DownloadListenerHostApiImpl extends DownloadListenerHostApi { return create(instanceId); } } - - /// Helper method to convert instances ids to objects. - Future disposeFromInstance(DownloadListener instance) async { - final int? instanceId = instanceManager.removeInstance(instance); - if (instanceId != null) { - return dispose(instanceId); - } - } } /// Flutter api implementation for [DownloadListener]. @@ -546,6 +532,11 @@ class DownloadListenerFlutterApiImpl extends DownloadListenerFlutterApi { /// Maintains instances stored to communicate with java objects. late final InstanceManager instanceManager; + @override + void dispose(int instanceId) { + instanceManager.removeInstance(instanceId); + } + @override void onDownloadStart( int instanceId, @@ -590,14 +581,6 @@ class WebChromeClientHostApiImpl extends WebChromeClientHostApi { return create(instanceId, instanceManager.getInstanceId(webViewClient)!); } } - - /// Helper method to convert instances ids to objects. - Future disposeFromInstance(WebChromeClient instance) async { - final int? instanceId = instanceManager.removeInstance(instance); - if (instanceId != null) { - return dispose(instanceId); - } - } } /// Flutter api implementation for [DownloadListener]. @@ -610,6 +593,11 @@ class WebChromeClientFlutterApiImpl extends WebChromeClientFlutterApi { /// Maintains instances stored to communicate with java objects. late final InstanceManager instanceManager; + @override + void dispose(int instanceId) { + instanceManager.removeInstance(instanceId); + } + @override void onProgressChanged(int instanceId, int webViewInstanceId, int progress) { final WebChromeClient instance = diff --git a/packages/webview_flutter/webview_flutter_android/pigeons/android_webview.dart b/packages/webview_flutter/webview_flutter_android/pigeons/android_webview.dart index 1877c1b91feb..47bc42058ba9 100644 --- a/packages/webview_flutter/webview_flutter_android/pigeons/android_webview.dart +++ b/packages/webview_flutter/webview_flutter_android/pigeons/android_webview.dart @@ -105,24 +105,24 @@ abstract class WebSettingsHostApi { @HostApi(dartHostTestHandler: 'TestJavaScriptChannelHostApi') abstract class JavaScriptChannelHostApi { void create(int instanceId, String channelName); - - void dispose(int instanceId); } @FlutterApi() abstract class JavaScriptChannelFlutterApi { + void dispose(int instanceId); + void postMessage(int instanceId, String message); } @HostApi(dartHostTestHandler: 'TestWebViewClientHostApi') abstract class WebViewClientHostApi { void create(int instanceId, bool shouldOverrideUrlLoading); - - void dispose(int instanceId); } @FlutterApi() abstract class WebViewClientFlutterApi { + void dispose(int instanceId); + void onPageStarted(int instanceId, int webViewInstanceId, String url); void onPageFinished(int instanceId, int webViewInstanceId, String url); @@ -154,11 +154,12 @@ abstract class WebViewClientFlutterApi { @HostApi(dartHostTestHandler: 'TestDownloadListenerHostApi') abstract class DownloadListenerHostApi { void create(int instanceId); - void dispose(int instanceId); } @FlutterApi() abstract class DownloadListenerFlutterApi { + void dispose(int instanceId); + void onDownloadStart( int instanceId, String url, @@ -172,10 +173,11 @@ abstract class DownloadListenerFlutterApi { @HostApi(dartHostTestHandler: 'TestWebChromeClientHostApi') abstract class WebChromeClientHostApi { void create(int instanceId, int webViewClientInstanceId); - void dispose(int instanceId); } @FlutterApi() abstract class WebChromeClientFlutterApi { + void dispose(int instanceId); + void onProgressChanged(int instanceId, int webViewInstanceId, int progress); } diff --git a/packages/webview_flutter/webview_flutter_android/pubspec.yaml b/packages/webview_flutter/webview_flutter_android/pubspec.yaml index 577d37359af1..cf09d13148d1 100644 --- a/packages/webview_flutter/webview_flutter_android/pubspec.yaml +++ b/packages/webview_flutter/webview_flutter_android/pubspec.yaml @@ -22,10 +22,12 @@ dependencies: webview_flutter_platform_interface: ^1.2.0 dev_dependencies: + build_runner: ^2.1.4 flutter_driver: sdk: flutter flutter_test: sdk: flutter - pigeon: 1.0.7 + mockito: ^5.0.16 + pigeon: 1.0.8 pedantic: ^1.10.0 diff --git a/packages/webview_flutter/webview_flutter_android/test/android_webview_test.dart b/packages/webview_flutter/webview_flutter_android/test/android_webview_test.dart index 462670abdb83..cdb93991d0f1 100644 --- a/packages/webview_flutter/webview_flutter_android/test/android_webview_test.dart +++ b/packages/webview_flutter/webview_flutter_android/test/android_webview_test.dart @@ -3,19 +3,29 @@ // found in the LICENSE file. import 'package:flutter_test/flutter_test.dart'; +import 'package:mockito/annotations.dart'; import 'package:webview_flutter_android/src/android_webview.dart'; import 'package:webview_flutter_android/src/android_webview_api_impls.dart'; import 'package:webview_flutter_android/src/instance_manager.dart'; import 'android_webview.pigeon.dart'; - +import 'android_webview_test.mocks.dart'; + +@GenerateMocks([ + TestWebViewHostApi, + TestWebSettingsHostApi, + TestWebViewClientHostApi, + TestWebChromeClientHostApi, + TestJavaScriptChannelHostApi, + TestDownloadListenerHostApi +]) void main() { TestWidgetsFlutterBinding.ensureInitialized(); group('Android WebView', () { group('$WebView', () { setUpAll(() { - TestWebViewHostApi.setup(TestWebViewHostApiImpl()); + TestWebViewHostApi.setup(MockTestWebViewHostApi()); }); setUp(() { @@ -30,8 +40,8 @@ void main() { group('$WebSettings', () { setUpAll(() { - TestWebViewHostApi.setup(TestWebViewHostApiImpl()); - TestWebSettingsHostApi.setup(TestWebSettingsHostApiImpl()); + TestWebViewHostApi.setup(MockTestWebViewHostApi()); + TestWebSettingsHostApi.setup(MockTestWebSettingsHostApi()); }); setUp(() { @@ -54,8 +64,8 @@ void main() { group('$JavaScriptChannel', () { setUpAll(() { - TestWebViewHostApi.setup(TestWebViewHostApiImpl()); - TestJavaScriptChannelHostApi.setup(TestJavaScriptChannelHostApiImpl()); + TestWebViewHostApi.setup(MockTestWebViewHostApi()); + TestJavaScriptChannelHostApi.setup(MockTestJavaScriptChannelHostApi()); }); setUp(() { @@ -75,19 +85,13 @@ void main() { JavaScriptChannel.api.instanceManager.getInstanceId(channel), isNotNull, ); - - webView.removeJavaScriptChannel(channel); - expect( - JavaScriptChannel.api.instanceManager.getInstanceId(channel), - isNull, - ); }); }); group('$WebViewClient', () { setUpAll(() { - TestWebViewHostApi.setup(TestWebViewHostApiImpl()); - TestWebViewClientHostApi.setup(TestWebViewClientHostApiImpl()); + TestWebViewHostApi.setup(MockTestWebViewHostApi()); + TestWebViewClientHostApi.setup(MockTestWebViewClientHostApi()); }); setUp(() { @@ -100,27 +104,20 @@ void main() { test('create', () { final WebView webView = WebView(); - final WebViewClient webViewClient1 = TestWebViewClient(); - final WebViewClient webViewClient2 = TestWebViewClient(); + final WebViewClient webViewClient = TestWebViewClient(); - webView.setWebViewClient(webViewClient1); + webView.setWebViewClient(webViewClient); expect( - WebViewClient.api.instanceManager.getInstanceId(webViewClient1), + WebViewClient.api.instanceManager.getInstanceId(webViewClient), isNotNull, ); - - webView.setWebViewClient(webViewClient2); - expect( - WebViewClient.api.instanceManager.getInstanceId(webViewClient1), - isNull, - ); }); }); group('$DownloadListener', () { setUpAll(() { - TestWebViewHostApi.setup(TestWebViewHostApiImpl()); - TestDownloadListenerHostApi.setup(TestDownloadListenerHostApiImpl()); + TestWebViewHostApi.setup(MockTestWebViewHostApi()); + TestDownloadListenerHostApi.setup(MockTestDownloadListenerHostApi()); }); setUp(() { @@ -133,28 +130,21 @@ void main() { test('create', () { final WebView webView = WebView(); - final DownloadListener downloadListener1 = TestDownloadListener(); - final DownloadListener downloadListener2 = TestDownloadListener(); + final DownloadListener downloadListener = TestDownloadListener(); - webView.setDownloadListener(downloadListener1); + webView.setDownloadListener(downloadListener); expect( - DownloadListener.api.instanceManager.getInstanceId(downloadListener1), + DownloadListener.api.instanceManager.getInstanceId(downloadListener), isNotNull, ); - - webView.setDownloadListener(downloadListener2); - expect( - DownloadListener.api.instanceManager.getInstanceId(downloadListener1), - isNull, - ); }); }); group('$WebChromeClient', () { setUpAll(() { - TestWebViewHostApi.setup(TestWebViewHostApiImpl()); - TestWebViewClientHostApi.setup(TestWebViewClientHostApiImpl()); - TestWebChromeClientHostApi.setup(TestWebChromeClientHostApiImpl()); + TestWebViewHostApi.setup(MockTestWebViewHostApi()); + TestWebViewClientHostApi.setup(MockTestWebViewClientHostApi()); + TestWebChromeClientHostApi.setup(MockTestWebChromeClientHostApi()); }); setUp(() { @@ -172,20 +162,13 @@ void main() { final WebView webView = WebView(); webView.setWebViewClient(TestWebViewClient()); - final WebChromeClient webChromeClient1 = TestWebChromeClient(); - final WebChromeClient webChromeClient2 = TestWebChromeClient(); + final WebChromeClient webChromeClient = TestWebChromeClient(); - webView.setWebChromeClient(webChromeClient1); + webView.setWebChromeClient(webChromeClient); expect( - WebChromeClient.api.instanceManager.getInstanceId(webChromeClient1), + WebChromeClient.api.instanceManager.getInstanceId(webChromeClient), isNotNull, ); - - webView.setWebChromeClient(webChromeClient2); - expect( - WebChromeClient.api.instanceManager.getInstanceId(webChromeClient1), - isNull, - ); }); }); }); @@ -215,159 +198,3 @@ class TestWebChromeClient extends WebChromeClient { @override void onProgressChanged(WebView webView, int progress) {} } - -class TestWebViewHostApiImpl extends TestWebViewHostApi { - @override - void addJavaScriptChannel(int instanceId, int javaScriptChannelInstanceId) {} - - @override - bool canGoBack(int instanceId) { - throw UnimplementedError(); - } - - @override - bool canGoForward(int instanceId) { - throw UnimplementedError(); - } - - @override - void clearCache(int instanceId, bool includeDiskFiles) {} - - @override - void create(int instanceId, bool useHybridComposition) {} - - @override - void dispose(int instanceId) {} - - @override - Future evaluateJavascript(int instanceId, String javascriptString) { - throw UnimplementedError(); - } - - @override - int getScrollX(int instanceId) { - throw UnimplementedError(); - } - - @override - int getScrollY(int instanceId) { - throw UnimplementedError(); - } - - @override - String getTitle(int instanceId) { - throw UnimplementedError(); - } - - @override - String getUrl(int instanceId) { - throw UnimplementedError(); - } - - @override - void goBack(int instanceId) {} - - @override - void goForward(int instanceId) {} - - @override - void loadUrl(int instanceId, String url, Map headers) {} - - @override - void reload(int instanceId) {} - - @override - void removeJavaScriptChannel( - int instanceId, int javaScriptChannelInstanceId) {} - - @override - void scrollBy(int instanceId, int x, int y) {} - - @override - void scrollTo(int instanceId, int x, int y) {} - - @override - void setDownloadListener(int instanceId, int listenerInstanceId) {} - - @override - void setWebContentsDebuggingEnabled(bool enabled) {} - - @override - void setWebViewClient(int instanceId, int webViewClientInstanceId) {} - - @override - void setWebChromeClient(int instanceId, int clientInstanceId) {} -} - -class TestWebSettingsHostApiImpl extends TestWebSettingsHostApi { - @override - void create(int instanceId, int webViewInstanceId) {} - - @override - void dispose(int instanceId) {} - - @override - void setBuiltInZoomControls(int instanceId, bool enabled) {} - - @override - void setDisplayZoomControls(int instanceId, bool enabled) {} - - @override - void setDomStorageEnabled(int instanceId, bool flag) {} - - @override - void setJavaScriptCanOpenWindowsAutomatically(int instanceId, bool flag) {} - - @override - void setJavaScriptEnabled(int instanceId, bool flag) {} - - @override - void setLoadWithOverviewMode(int instanceId, bool overview) {} - - @override - void setMediaPlaybackRequiresUserGesture(int instanceId, bool require) {} - - @override - void setSupportMultipleWindows(int instanceId, bool support) {} - - @override - void setSupportZoom(int instanceId, bool support) {} - - @override - void setUseWideViewPort(int instanceId, bool use) {} - - @override - void setUserAgentString(int instanceId, String userAgentString) {} -} - -class TestJavaScriptChannelHostApiImpl extends TestJavaScriptChannelHostApi { - @override - void create(int instanceId, String channelName) {} - - @override - void dispose(int instanceId) {} -} - -class TestWebViewClientHostApiImpl extends TestWebViewClientHostApi { - @override - void create(int instanceId, bool shouldOverrideUrlLoading) {} - - @override - void dispose(int instanceId) {} -} - -class TestDownloadListenerHostApiImpl extends TestDownloadListenerHostApi { - @override - void create(int instanceId) {} - - @override - void dispose(int instanceId) {} -} - -class TestWebChromeClientHostApiImpl extends TestWebChromeClientHostApi { - @override - void create(int instanceId, int webViewClientInstanceId) {} - - @override - void dispose(int instanceId) {} -} diff --git a/packages/webview_flutter/webview_flutter_android/test/android_webview_test.mocks.dart b/packages/webview_flutter/webview_flutter_android/test/android_webview_test.mocks.dart new file mode 100644 index 000000000000..57ab9e82ac1c --- /dev/null +++ b/packages/webview_flutter/webview_flutter_android/test/android_webview_test.mocks.dart @@ -0,0 +1,285 @@ +// 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. + +// Mocks generated by Mockito 5.0.16 from annotations +// in webview_flutter_android/test/android_webview_test.dart. +// Do not manually edit this file. + +import 'dart:async' as _i3; + +import 'package:mockito/mockito.dart' as _i1; + +import 'android_webview.pigeon.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 [TestWebViewHostApi]. +/// +/// See the documentation for Mockito's code generation for more information. +class MockTestWebViewHostApi extends _i1.Mock + implements _i2.TestWebViewHostApi { + MockTestWebViewHostApi() { + _i1.throwOnMissingStub(this); + } + + @override + void create(int? instanceId, bool? useHybridComposition) => + super.noSuchMethod( + Invocation.method(#create, [instanceId, useHybridComposition]), + returnValueForMissingStub: null); + @override + void dispose(int? instanceId) => + super.noSuchMethod(Invocation.method(#dispose, [instanceId]), + returnValueForMissingStub: null); + @override + void loadUrl(int? instanceId, String? url, Map? headers) => + super.noSuchMethod( + Invocation.method(#loadUrl, [instanceId, url, headers]), + returnValueForMissingStub: null); + @override + String getUrl(int? instanceId) => + (super.noSuchMethod(Invocation.method(#getUrl, [instanceId]), + returnValue: '') as String); + @override + bool canGoBack(int? instanceId) => + (super.noSuchMethod(Invocation.method(#canGoBack, [instanceId]), + returnValue: false) as bool); + @override + bool canGoForward(int? instanceId) => + (super.noSuchMethod(Invocation.method(#canGoForward, [instanceId]), + returnValue: false) as bool); + @override + void goBack(int? instanceId) => + super.noSuchMethod(Invocation.method(#goBack, [instanceId]), + returnValueForMissingStub: null); + @override + void goForward(int? instanceId) => + super.noSuchMethod(Invocation.method(#goForward, [instanceId]), + returnValueForMissingStub: null); + @override + void reload(int? instanceId) => + super.noSuchMethod(Invocation.method(#reload, [instanceId]), + returnValueForMissingStub: null); + @override + void clearCache(int? instanceId, bool? includeDiskFiles) => + super.noSuchMethod( + Invocation.method(#clearCache, [instanceId, includeDiskFiles]), + returnValueForMissingStub: null); + @override + _i3.Future evaluateJavascript( + int? instanceId, String? javascriptString) => + (super.noSuchMethod( + Invocation.method( + #evaluateJavascript, [instanceId, javascriptString]), + returnValue: Future.value('')) as _i3.Future); + @override + String getTitle(int? instanceId) => + (super.noSuchMethod(Invocation.method(#getTitle, [instanceId]), + returnValue: '') as String); + @override + void scrollTo(int? instanceId, int? x, int? y) => + super.noSuchMethod(Invocation.method(#scrollTo, [instanceId, x, y]), + returnValueForMissingStub: null); + @override + void scrollBy(int? instanceId, int? x, int? y) => + super.noSuchMethod(Invocation.method(#scrollBy, [instanceId, x, y]), + returnValueForMissingStub: null); + @override + int getScrollX(int? instanceId) => + (super.noSuchMethod(Invocation.method(#getScrollX, [instanceId]), + returnValue: 0) as int); + @override + int getScrollY(int? instanceId) => + (super.noSuchMethod(Invocation.method(#getScrollY, [instanceId]), + returnValue: 0) as int); + @override + void setWebContentsDebuggingEnabled(bool? enabled) => super.noSuchMethod( + Invocation.method(#setWebContentsDebuggingEnabled, [enabled]), + returnValueForMissingStub: null); + @override + void setWebViewClient(int? instanceId, int? webViewClientInstanceId) => + super.noSuchMethod( + Invocation.method( + #setWebViewClient, [instanceId, webViewClientInstanceId]), + returnValueForMissingStub: null); + @override + void addJavaScriptChannel( + int? instanceId, int? javaScriptChannelInstanceId) => + super.noSuchMethod( + Invocation.method( + #addJavaScriptChannel, [instanceId, javaScriptChannelInstanceId]), + returnValueForMissingStub: null); + @override + void removeJavaScriptChannel( + int? instanceId, int? javaScriptChannelInstanceId) => + super.noSuchMethod( + Invocation.method(#removeJavaScriptChannel, + [instanceId, javaScriptChannelInstanceId]), + returnValueForMissingStub: null); + @override + void setDownloadListener(int? instanceId, int? listenerInstanceId) => + super.noSuchMethod( + Invocation.method( + #setDownloadListener, [instanceId, listenerInstanceId]), + returnValueForMissingStub: null); + @override + void setWebChromeClient(int? instanceId, int? clientInstanceId) => + super.noSuchMethod( + Invocation.method( + #setWebChromeClient, [instanceId, clientInstanceId]), + returnValueForMissingStub: null); + @override + String toString() => super.toString(); +} + +/// A class which mocks [TestWebSettingsHostApi]. +/// +/// See the documentation for Mockito's code generation for more information. +class MockTestWebSettingsHostApi extends _i1.Mock + implements _i2.TestWebSettingsHostApi { + MockTestWebSettingsHostApi() { + _i1.throwOnMissingStub(this); + } + + @override + void create(int? instanceId, int? webViewInstanceId) => super.noSuchMethod( + Invocation.method(#create, [instanceId, webViewInstanceId]), + returnValueForMissingStub: null); + @override + void dispose(int? instanceId) => + super.noSuchMethod(Invocation.method(#dispose, [instanceId]), + returnValueForMissingStub: null); + @override + void setDomStorageEnabled(int? instanceId, bool? flag) => super.noSuchMethod( + Invocation.method(#setDomStorageEnabled, [instanceId, flag]), + returnValueForMissingStub: null); + @override + void setJavaScriptCanOpenWindowsAutomatically(int? instanceId, bool? flag) => + super.noSuchMethod( + Invocation.method( + #setJavaScriptCanOpenWindowsAutomatically, [instanceId, flag]), + returnValueForMissingStub: null); + @override + void setSupportMultipleWindows(int? instanceId, bool? support) => + super.noSuchMethod( + Invocation.method(#setSupportMultipleWindows, [instanceId, support]), + returnValueForMissingStub: null); + @override + void setJavaScriptEnabled(int? instanceId, bool? flag) => super.noSuchMethod( + Invocation.method(#setJavaScriptEnabled, [instanceId, flag]), + returnValueForMissingStub: null); + @override + void setUserAgentString(int? instanceId, String? userAgentString) => + super.noSuchMethod( + Invocation.method(#setUserAgentString, [instanceId, userAgentString]), + returnValueForMissingStub: null); + @override + void setMediaPlaybackRequiresUserGesture(int? instanceId, bool? require) => + super.noSuchMethod( + Invocation.method( + #setMediaPlaybackRequiresUserGesture, [instanceId, require]), + returnValueForMissingStub: null); + @override + void setSupportZoom(int? instanceId, bool? support) => super.noSuchMethod( + Invocation.method(#setSupportZoom, [instanceId, support]), + returnValueForMissingStub: null); + @override + void setLoadWithOverviewMode(int? instanceId, bool? overview) => + super.noSuchMethod( + Invocation.method(#setLoadWithOverviewMode, [instanceId, overview]), + returnValueForMissingStub: null); + @override + void setUseWideViewPort(int? instanceId, bool? use) => super.noSuchMethod( + Invocation.method(#setUseWideViewPort, [instanceId, use]), + returnValueForMissingStub: null); + @override + void setDisplayZoomControls(int? instanceId, bool? enabled) => + super.noSuchMethod( + Invocation.method(#setDisplayZoomControls, [instanceId, enabled]), + returnValueForMissingStub: null); + @override + void setBuiltInZoomControls(int? instanceId, bool? enabled) => + super.noSuchMethod( + Invocation.method(#setBuiltInZoomControls, [instanceId, enabled]), + returnValueForMissingStub: null); + @override + String toString() => super.toString(); +} + +/// A class which mocks [TestWebViewClientHostApi]. +/// +/// See the documentation for Mockito's code generation for more information. +class MockTestWebViewClientHostApi extends _i1.Mock + implements _i2.TestWebViewClientHostApi { + MockTestWebViewClientHostApi() { + _i1.throwOnMissingStub(this); + } + + @override + void create(int? instanceId, bool? shouldOverrideUrlLoading) => + super.noSuchMethod( + Invocation.method(#create, [instanceId, shouldOverrideUrlLoading]), + returnValueForMissingStub: null); + @override + String toString() => super.toString(); +} + +/// A class which mocks [TestWebChromeClientHostApi]. +/// +/// See the documentation for Mockito's code generation for more information. +class MockTestWebChromeClientHostApi extends _i1.Mock + implements _i2.TestWebChromeClientHostApi { + MockTestWebChromeClientHostApi() { + _i1.throwOnMissingStub(this); + } + + @override + void create(int? instanceId, int? webViewClientInstanceId) => + super.noSuchMethod( + Invocation.method(#create, [instanceId, webViewClientInstanceId]), + returnValueForMissingStub: null); + @override + String toString() => super.toString(); +} + +/// A class which mocks [TestJavaScriptChannelHostApi]. +/// +/// See the documentation for Mockito's code generation for more information. +class MockTestJavaScriptChannelHostApi extends _i1.Mock + implements _i2.TestJavaScriptChannelHostApi { + MockTestJavaScriptChannelHostApi() { + _i1.throwOnMissingStub(this); + } + + @override + void create(int? instanceId, String? channelName) => + super.noSuchMethod(Invocation.method(#create, [instanceId, channelName]), + returnValueForMissingStub: null); + @override + String toString() => super.toString(); +} + +/// A class which mocks [TestDownloadListenerHostApi]. +/// +/// See the documentation for Mockito's code generation for more information. +class MockTestDownloadListenerHostApi extends _i1.Mock + implements _i2.TestDownloadListenerHostApi { + MockTestDownloadListenerHostApi() { + _i1.throwOnMissingStub(this); + } + + @override + void create(int? instanceId) => + super.noSuchMethod(Invocation.method(#create, [instanceId]), + returnValueForMissingStub: null); + @override + String toString() => super.toString(); +} From 20cf2f9fd114f9c2d212f976d0fd5ceeecfea822 Mon Sep 17 00:00:00 2001 From: Maurice Parrish Date: Fri, 5 Nov 2021 17:25:01 -0700 Subject: [PATCH 02/11] add more comprehensive lists and pass headers --- .../lib/src/android_webview.dart | 2 +- .../lib/src/android_webview.pigeon.dart | 151 +++--- .../lib/src/android_webview_api_impls.dart | 3 +- .../webview_flutter_android/pubspec.yaml | 2 +- .../test/android_webview.pigeon.dart | 429 ++++++++---------- .../test/android_webview_test.dart | 232 +++++++++- 6 files changed, 509 insertions(+), 310 deletions(-) diff --git a/packages/webview_flutter/webview_flutter_android/lib/src/android_webview.dart b/packages/webview_flutter/webview_flutter_android/lib/src/android_webview.dart index 3de5a5a3d106..1577c18ce3c8 100644 --- a/packages/webview_flutter/webview_flutter_android/lib/src/android_webview.dart +++ b/packages/webview_flutter/webview_flutter_android/lib/src/android_webview.dart @@ -638,7 +638,7 @@ class WebResourceRequest { final String method; /// Gets the headers associated with the request. - final Map? requestHeaders; + final Map requestHeaders; } /// Encapsulates information about errors occurred during loading of web resources. diff --git a/packages/webview_flutter/webview_flutter_android/lib/src/android_webview.pigeon.dart b/packages/webview_flutter/webview_flutter_android/lib/src/android_webview.pigeon.dart index 2b3f008ed830..7fb95f1dd942 100644 --- a/packages/webview_flutter/webview_flutter_android/lib/src/android_webview.pigeon.dart +++ b/packages/webview_flutter/webview_flutter_android/lib/src/android_webview.pigeon.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. -// Autogenerated from Pigeon (v1.0.8), do not edit directly. +// Autogenerated from Pigeon (v1.0.9), do not edit directly. // See also: https://pub.dev/packages/pigeon // ignore_for_file: public_member_api_docs, non_constant_identifier_names, avoid_as, unused_import, unnecessary_parenthesis, prefer_null_aware_operators, omit_local_variable_types, unused_shown_name // @dart = 2.12 @@ -1051,10 +1051,12 @@ abstract class JavaScriptChannelFlutterApi { void dispose(int instanceId); void postMessage(int instanceId, String message); - static void setup(JavaScriptChannelFlutterApi? api) { + static void setup(JavaScriptChannelFlutterApi? api, + {BinaryMessenger? binaryMessenger}) { { - const BasicMessageChannel channel = BasicMessageChannel( - 'dev.flutter.pigeon.JavaScriptChannelFlutterApi.dispose', codec); + final BasicMessageChannel channel = BasicMessageChannel( + 'dev.flutter.pigeon.JavaScriptChannelFlutterApi.dispose', codec, + binaryMessenger: binaryMessenger); if (api == null) { channel.setMessageHandler(null); } else { @@ -1062,7 +1064,7 @@ abstract class JavaScriptChannelFlutterApi { assert(message != null, 'Argument for dev.flutter.pigeon.JavaScriptChannelFlutterApi.dispose was null.'); final List args = (message as List?)!; - final int? arg_instanceId = args[0] as int?; + final int? arg_instanceId = (args[0] as int?); assert(arg_instanceId != null, 'Argument for dev.flutter.pigeon.JavaScriptChannelFlutterApi.dispose was null, expected non-null int.'); api.dispose(arg_instanceId!); @@ -1071,8 +1073,9 @@ abstract class JavaScriptChannelFlutterApi { } } { - const BasicMessageChannel channel = BasicMessageChannel( - 'dev.flutter.pigeon.JavaScriptChannelFlutterApi.postMessage', codec); + final BasicMessageChannel channel = BasicMessageChannel( + 'dev.flutter.pigeon.JavaScriptChannelFlutterApi.postMessage', codec, + binaryMessenger: binaryMessenger); if (api == null) { channel.setMessageHandler(null); } else { @@ -1080,10 +1083,10 @@ abstract class JavaScriptChannelFlutterApi { assert(message != null, 'Argument for dev.flutter.pigeon.JavaScriptChannelFlutterApi.postMessage was null.'); final List args = (message as List?)!; - final int? arg_instanceId = args[0] as int?; + final int? arg_instanceId = (args[0] as int?); assert(arg_instanceId != null, 'Argument for dev.flutter.pigeon.JavaScriptChannelFlutterApi.postMessage was null, expected non-null int.'); - final String? arg_message = args[1] as String?; + final String? arg_message = (args[1] as String?); assert(arg_message != null, 'Argument for dev.flutter.pigeon.JavaScriptChannelFlutterApi.postMessage was null, expected non-null String.'); api.postMessage(arg_instanceId!, arg_message!); @@ -1180,10 +1183,12 @@ abstract class WebViewClientFlutterApi { void requestLoading( int instanceId, int webViewInstanceId, WebResourceRequestData request); void urlLoading(int instanceId, int webViewInstanceId, String url); - static void setup(WebViewClientFlutterApi? api) { + static void setup(WebViewClientFlutterApi? api, + {BinaryMessenger? binaryMessenger}) { { - const BasicMessageChannel channel = BasicMessageChannel( - 'dev.flutter.pigeon.WebViewClientFlutterApi.dispose', codec); + final BasicMessageChannel channel = BasicMessageChannel( + 'dev.flutter.pigeon.WebViewClientFlutterApi.dispose', codec, + binaryMessenger: binaryMessenger); if (api == null) { channel.setMessageHandler(null); } else { @@ -1191,7 +1196,7 @@ abstract class WebViewClientFlutterApi { assert(message != null, 'Argument for dev.flutter.pigeon.WebViewClientFlutterApi.dispose was null.'); final List args = (message as List?)!; - final int? arg_instanceId = args[0] as int?; + final int? arg_instanceId = (args[0] as int?); assert(arg_instanceId != null, 'Argument for dev.flutter.pigeon.WebViewClientFlutterApi.dispose was null, expected non-null int.'); api.dispose(arg_instanceId!); @@ -1200,8 +1205,9 @@ abstract class WebViewClientFlutterApi { } } { - const BasicMessageChannel channel = BasicMessageChannel( - 'dev.flutter.pigeon.WebViewClientFlutterApi.onPageStarted', codec); + final BasicMessageChannel channel = BasicMessageChannel( + 'dev.flutter.pigeon.WebViewClientFlutterApi.onPageStarted', codec, + binaryMessenger: binaryMessenger); if (api == null) { channel.setMessageHandler(null); } else { @@ -1209,13 +1215,13 @@ abstract class WebViewClientFlutterApi { assert(message != null, 'Argument for dev.flutter.pigeon.WebViewClientFlutterApi.onPageStarted was null.'); final List args = (message as List?)!; - final int? arg_instanceId = args[0] as int?; + final int? arg_instanceId = (args[0] as int?); assert(arg_instanceId != null, 'Argument for dev.flutter.pigeon.WebViewClientFlutterApi.onPageStarted was null, expected non-null int.'); - final int? arg_webViewInstanceId = args[1] as int?; + final int? arg_webViewInstanceId = (args[1] as int?); assert(arg_webViewInstanceId != null, 'Argument for dev.flutter.pigeon.WebViewClientFlutterApi.onPageStarted was null, expected non-null int.'); - final String? arg_url = args[2] as String?; + final String? arg_url = (args[2] as String?); assert(arg_url != null, 'Argument for dev.flutter.pigeon.WebViewClientFlutterApi.onPageStarted was null, expected non-null String.'); api.onPageStarted(arg_instanceId!, arg_webViewInstanceId!, arg_url!); @@ -1224,8 +1230,9 @@ abstract class WebViewClientFlutterApi { } } { - const BasicMessageChannel channel = BasicMessageChannel( - 'dev.flutter.pigeon.WebViewClientFlutterApi.onPageFinished', codec); + final BasicMessageChannel channel = BasicMessageChannel( + 'dev.flutter.pigeon.WebViewClientFlutterApi.onPageFinished', codec, + binaryMessenger: binaryMessenger); if (api == null) { channel.setMessageHandler(null); } else { @@ -1233,13 +1240,13 @@ abstract class WebViewClientFlutterApi { assert(message != null, 'Argument for dev.flutter.pigeon.WebViewClientFlutterApi.onPageFinished was null.'); final List args = (message as List?)!; - final int? arg_instanceId = args[0] as int?; + final int? arg_instanceId = (args[0] as int?); assert(arg_instanceId != null, 'Argument for dev.flutter.pigeon.WebViewClientFlutterApi.onPageFinished was null, expected non-null int.'); - final int? arg_webViewInstanceId = args[1] as int?; + final int? arg_webViewInstanceId = (args[1] as int?); assert(arg_webViewInstanceId != null, 'Argument for dev.flutter.pigeon.WebViewClientFlutterApi.onPageFinished was null, expected non-null int.'); - final String? arg_url = args[2] as String?; + final String? arg_url = (args[2] as String?); assert(arg_url != null, 'Argument for dev.flutter.pigeon.WebViewClientFlutterApi.onPageFinished was null, expected non-null String.'); api.onPageFinished(arg_instanceId!, arg_webViewInstanceId!, arg_url!); @@ -1248,9 +1255,10 @@ abstract class WebViewClientFlutterApi { } } { - const BasicMessageChannel channel = BasicMessageChannel( + final BasicMessageChannel channel = BasicMessageChannel( 'dev.flutter.pigeon.WebViewClientFlutterApi.onReceivedRequestError', - codec); + codec, + binaryMessenger: binaryMessenger); if (api == null) { channel.setMessageHandler(null); } else { @@ -1258,18 +1266,18 @@ abstract class WebViewClientFlutterApi { assert(message != null, 'Argument for dev.flutter.pigeon.WebViewClientFlutterApi.onReceivedRequestError was null.'); final List args = (message as List?)!; - final int? arg_instanceId = args[0] as int?; + final int? arg_instanceId = (args[0] as int?); assert(arg_instanceId != null, 'Argument for dev.flutter.pigeon.WebViewClientFlutterApi.onReceivedRequestError was null, expected non-null int.'); - final int? arg_webViewInstanceId = args[1] as int?; + final int? arg_webViewInstanceId = (args[1] as int?); assert(arg_webViewInstanceId != null, 'Argument for dev.flutter.pigeon.WebViewClientFlutterApi.onReceivedRequestError was null, expected non-null int.'); final WebResourceRequestData? arg_request = - args[2] as WebResourceRequestData?; + (args[2] as WebResourceRequestData?); assert(arg_request != null, 'Argument for dev.flutter.pigeon.WebViewClientFlutterApi.onReceivedRequestError was null, expected non-null WebResourceRequestData.'); final WebResourceErrorData? arg_error = - args[3] as WebResourceErrorData?; + (args[3] as WebResourceErrorData?); assert(arg_error != null, 'Argument for dev.flutter.pigeon.WebViewClientFlutterApi.onReceivedRequestError was null, expected non-null WebResourceErrorData.'); api.onReceivedRequestError(arg_instanceId!, arg_webViewInstanceId!, @@ -1279,8 +1287,9 @@ abstract class WebViewClientFlutterApi { } } { - const BasicMessageChannel channel = BasicMessageChannel( - 'dev.flutter.pigeon.WebViewClientFlutterApi.onReceivedError', codec); + final BasicMessageChannel channel = BasicMessageChannel( + 'dev.flutter.pigeon.WebViewClientFlutterApi.onReceivedError', codec, + binaryMessenger: binaryMessenger); if (api == null) { channel.setMessageHandler(null); } else { @@ -1288,19 +1297,19 @@ abstract class WebViewClientFlutterApi { assert(message != null, 'Argument for dev.flutter.pigeon.WebViewClientFlutterApi.onReceivedError was null.'); final List args = (message as List?)!; - final int? arg_instanceId = args[0] as int?; + final int? arg_instanceId = (args[0] as int?); assert(arg_instanceId != null, 'Argument for dev.flutter.pigeon.WebViewClientFlutterApi.onReceivedError was null, expected non-null int.'); - final int? arg_webViewInstanceId = args[1] as int?; + final int? arg_webViewInstanceId = (args[1] as int?); assert(arg_webViewInstanceId != null, 'Argument for dev.flutter.pigeon.WebViewClientFlutterApi.onReceivedError was null, expected non-null int.'); - final int? arg_errorCode = args[2] as int?; + final int? arg_errorCode = (args[2] as int?); assert(arg_errorCode != null, 'Argument for dev.flutter.pigeon.WebViewClientFlutterApi.onReceivedError was null, expected non-null int.'); - final String? arg_description = args[3] as String?; + final String? arg_description = (args[3] as String?); assert(arg_description != null, 'Argument for dev.flutter.pigeon.WebViewClientFlutterApi.onReceivedError was null, expected non-null String.'); - final String? arg_failingUrl = args[4] as String?; + final String? arg_failingUrl = (args[4] as String?); assert(arg_failingUrl != null, 'Argument for dev.flutter.pigeon.WebViewClientFlutterApi.onReceivedError was null, expected non-null String.'); api.onReceivedError(arg_instanceId!, arg_webViewInstanceId!, @@ -1310,8 +1319,9 @@ abstract class WebViewClientFlutterApi { } } { - const BasicMessageChannel channel = BasicMessageChannel( - 'dev.flutter.pigeon.WebViewClientFlutterApi.requestLoading', codec); + final BasicMessageChannel channel = BasicMessageChannel( + 'dev.flutter.pigeon.WebViewClientFlutterApi.requestLoading', codec, + binaryMessenger: binaryMessenger); if (api == null) { channel.setMessageHandler(null); } else { @@ -1319,14 +1329,14 @@ abstract class WebViewClientFlutterApi { assert(message != null, 'Argument for dev.flutter.pigeon.WebViewClientFlutterApi.requestLoading was null.'); final List args = (message as List?)!; - final int? arg_instanceId = args[0] as int?; + final int? arg_instanceId = (args[0] as int?); assert(arg_instanceId != null, 'Argument for dev.flutter.pigeon.WebViewClientFlutterApi.requestLoading was null, expected non-null int.'); - final int? arg_webViewInstanceId = args[1] as int?; + final int? arg_webViewInstanceId = (args[1] as int?); assert(arg_webViewInstanceId != null, 'Argument for dev.flutter.pigeon.WebViewClientFlutterApi.requestLoading was null, expected non-null int.'); final WebResourceRequestData? arg_request = - args[2] as WebResourceRequestData?; + (args[2] as WebResourceRequestData?); assert(arg_request != null, 'Argument for dev.flutter.pigeon.WebViewClientFlutterApi.requestLoading was null, expected non-null WebResourceRequestData.'); api.requestLoading( @@ -1336,8 +1346,9 @@ abstract class WebViewClientFlutterApi { } } { - const BasicMessageChannel channel = BasicMessageChannel( - 'dev.flutter.pigeon.WebViewClientFlutterApi.urlLoading', codec); + final BasicMessageChannel channel = BasicMessageChannel( + 'dev.flutter.pigeon.WebViewClientFlutterApi.urlLoading', codec, + binaryMessenger: binaryMessenger); if (api == null) { channel.setMessageHandler(null); } else { @@ -1345,13 +1356,13 @@ abstract class WebViewClientFlutterApi { assert(message != null, 'Argument for dev.flutter.pigeon.WebViewClientFlutterApi.urlLoading was null.'); final List args = (message as List?)!; - final int? arg_instanceId = args[0] as int?; + final int? arg_instanceId = (args[0] as int?); assert(arg_instanceId != null, 'Argument for dev.flutter.pigeon.WebViewClientFlutterApi.urlLoading was null, expected non-null int.'); - final int? arg_webViewInstanceId = args[1] as int?; + final int? arg_webViewInstanceId = (args[1] as int?); assert(arg_webViewInstanceId != null, 'Argument for dev.flutter.pigeon.WebViewClientFlutterApi.urlLoading was null, expected non-null int.'); - final String? arg_url = args[2] as String?; + final String? arg_url = (args[2] as String?); assert(arg_url != null, 'Argument for dev.flutter.pigeon.WebViewClientFlutterApi.urlLoading was null, expected non-null String.'); api.urlLoading(arg_instanceId!, arg_webViewInstanceId!, arg_url!); @@ -1413,10 +1424,12 @@ abstract class DownloadListenerFlutterApi { void dispose(int instanceId); void onDownloadStart(int instanceId, String url, String userAgent, String contentDisposition, String mimetype, int contentLength); - static void setup(DownloadListenerFlutterApi? api) { + static void setup(DownloadListenerFlutterApi? api, + {BinaryMessenger? binaryMessenger}) { { - const BasicMessageChannel channel = BasicMessageChannel( - 'dev.flutter.pigeon.DownloadListenerFlutterApi.dispose', codec); + final BasicMessageChannel channel = BasicMessageChannel( + 'dev.flutter.pigeon.DownloadListenerFlutterApi.dispose', codec, + binaryMessenger: binaryMessenger); if (api == null) { channel.setMessageHandler(null); } else { @@ -1424,7 +1437,7 @@ abstract class DownloadListenerFlutterApi { assert(message != null, 'Argument for dev.flutter.pigeon.DownloadListenerFlutterApi.dispose was null.'); final List args = (message as List?)!; - final int? arg_instanceId = args[0] as int?; + final int? arg_instanceId = (args[0] as int?); assert(arg_instanceId != null, 'Argument for dev.flutter.pigeon.DownloadListenerFlutterApi.dispose was null, expected non-null int.'); api.dispose(arg_instanceId!); @@ -1433,9 +1446,10 @@ abstract class DownloadListenerFlutterApi { } } { - const BasicMessageChannel channel = BasicMessageChannel( + final BasicMessageChannel channel = BasicMessageChannel( 'dev.flutter.pigeon.DownloadListenerFlutterApi.onDownloadStart', - codec); + codec, + binaryMessenger: binaryMessenger); if (api == null) { channel.setMessageHandler(null); } else { @@ -1443,22 +1457,22 @@ abstract class DownloadListenerFlutterApi { assert(message != null, 'Argument for dev.flutter.pigeon.DownloadListenerFlutterApi.onDownloadStart was null.'); final List args = (message as List?)!; - final int? arg_instanceId = args[0] as int?; + final int? arg_instanceId = (args[0] as int?); assert(arg_instanceId != null, 'Argument for dev.flutter.pigeon.DownloadListenerFlutterApi.onDownloadStart was null, expected non-null int.'); - final String? arg_url = args[1] as String?; + final String? arg_url = (args[1] as String?); assert(arg_url != null, 'Argument for dev.flutter.pigeon.DownloadListenerFlutterApi.onDownloadStart was null, expected non-null String.'); - final String? arg_userAgent = args[2] as String?; + final String? arg_userAgent = (args[2] as String?); assert(arg_userAgent != null, 'Argument for dev.flutter.pigeon.DownloadListenerFlutterApi.onDownloadStart was null, expected non-null String.'); - final String? arg_contentDisposition = args[3] as String?; + final String? arg_contentDisposition = (args[3] as String?); assert(arg_contentDisposition != null, 'Argument for dev.flutter.pigeon.DownloadListenerFlutterApi.onDownloadStart was null, expected non-null String.'); - final String? arg_mimetype = args[4] as String?; + final String? arg_mimetype = (args[4] as String?); assert(arg_mimetype != null, 'Argument for dev.flutter.pigeon.DownloadListenerFlutterApi.onDownloadStart was null, expected non-null String.'); - final int? arg_contentLength = args[5] as int?; + final int? arg_contentLength = (args[5] as int?); assert(arg_contentLength != null, 'Argument for dev.flutter.pigeon.DownloadListenerFlutterApi.onDownloadStart was null, expected non-null int.'); api.onDownloadStart(arg_instanceId!, arg_url!, arg_userAgent!, @@ -1522,10 +1536,12 @@ abstract class WebChromeClientFlutterApi { void dispose(int instanceId); void onProgressChanged(int instanceId, int webViewInstanceId, int progress); - static void setup(WebChromeClientFlutterApi? api) { + static void setup(WebChromeClientFlutterApi? api, + {BinaryMessenger? binaryMessenger}) { { - const BasicMessageChannel channel = BasicMessageChannel( - 'dev.flutter.pigeon.WebChromeClientFlutterApi.dispose', codec); + final BasicMessageChannel channel = BasicMessageChannel( + 'dev.flutter.pigeon.WebChromeClientFlutterApi.dispose', codec, + binaryMessenger: binaryMessenger); if (api == null) { channel.setMessageHandler(null); } else { @@ -1533,7 +1549,7 @@ abstract class WebChromeClientFlutterApi { assert(message != null, 'Argument for dev.flutter.pigeon.WebChromeClientFlutterApi.dispose was null.'); final List args = (message as List?)!; - final int? arg_instanceId = args[0] as int?; + final int? arg_instanceId = (args[0] as int?); assert(arg_instanceId != null, 'Argument for dev.flutter.pigeon.WebChromeClientFlutterApi.dispose was null, expected non-null int.'); api.dispose(arg_instanceId!); @@ -1542,9 +1558,10 @@ abstract class WebChromeClientFlutterApi { } } { - const BasicMessageChannel channel = BasicMessageChannel( + final BasicMessageChannel channel = BasicMessageChannel( 'dev.flutter.pigeon.WebChromeClientFlutterApi.onProgressChanged', - codec); + codec, + binaryMessenger: binaryMessenger); if (api == null) { channel.setMessageHandler(null); } else { @@ -1552,13 +1569,13 @@ abstract class WebChromeClientFlutterApi { assert(message != null, 'Argument for dev.flutter.pigeon.WebChromeClientFlutterApi.onProgressChanged was null.'); final List args = (message as List?)!; - final int? arg_instanceId = args[0] as int?; + final int? arg_instanceId = (args[0] as int?); assert(arg_instanceId != null, 'Argument for dev.flutter.pigeon.WebChromeClientFlutterApi.onProgressChanged was null, expected non-null int.'); - final int? arg_webViewInstanceId = args[1] as int?; + final int? arg_webViewInstanceId = (args[1] as int?); assert(arg_webViewInstanceId != null, 'Argument for dev.flutter.pigeon.WebChromeClientFlutterApi.onProgressChanged was null, expected non-null int.'); - final int? arg_progress = args[2] as int?; + final int? arg_progress = (args[2] as int?); assert(arg_progress != null, 'Argument for dev.flutter.pigeon.WebChromeClientFlutterApi.onProgressChanged was null, expected non-null int.'); api.onProgressChanged( diff --git a/packages/webview_flutter/webview_flutter_android/lib/src/android_webview_api_impls.dart b/packages/webview_flutter/webview_flutter_android/lib/src/android_webview_api_impls.dart index 341b00516d75..78790cf2c6d7 100644 --- a/packages/webview_flutter/webview_flutter_android/lib/src/android_webview_api_impls.dart +++ b/packages/webview_flutter/webview_flutter_android/lib/src/android_webview_api_impls.dart @@ -480,7 +480,8 @@ class WebViewClientFlutterApiImpl extends WebViewClientFlutterApi { isRedirect: request.isRedirect, hasGesture: request.hasGesture!, method: request.method!, - requestHeaders: request.requestHeaders?.cast(), + requestHeaders: request.requestHeaders?.cast() ?? + {}, ), ); } diff --git a/packages/webview_flutter/webview_flutter_android/pubspec.yaml b/packages/webview_flutter/webview_flutter_android/pubspec.yaml index cf09d13148d1..4e1646aef4a3 100644 --- a/packages/webview_flutter/webview_flutter_android/pubspec.yaml +++ b/packages/webview_flutter/webview_flutter_android/pubspec.yaml @@ -28,6 +28,6 @@ dev_dependencies: flutter_test: sdk: flutter mockito: ^5.0.16 - pigeon: 1.0.8 + pigeon: 1.0.9 pedantic: ^1.10.0 diff --git a/packages/webview_flutter/webview_flutter_android/test/android_webview.pigeon.dart b/packages/webview_flutter/webview_flutter_android/test/android_webview.pigeon.dart index 70aa53ca2610..4173663b6248 100644 --- a/packages/webview_flutter/webview_flutter_android/test/android_webview.pigeon.dart +++ b/packages/webview_flutter/webview_flutter_android/test/android_webview.pigeon.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. -// Autogenerated from Pigeon (v1.0.7), do not edit directly. +// Autogenerated from Pigeon (v1.0.9), do not edit directly. // See also: https://pub.dev/packages/pigeon // ignore_for_file: public_member_api_docs, non_constant_identifier_names, avoid_as, unused_import, avoid_relative_lib_imports // @dart = 2.12 @@ -43,10 +43,12 @@ abstract class TestWebViewHostApi { void removeJavaScriptChannel(int instanceId, int javaScriptChannelInstanceId); void setDownloadListener(int instanceId, int listenerInstanceId); void setWebChromeClient(int instanceId, int clientInstanceId); - static void setup(TestWebViewHostApi? api) { + static void setup(TestWebViewHostApi? api, + {BinaryMessenger? binaryMessenger}) { { - const BasicMessageChannel channel = BasicMessageChannel( - 'dev.flutter.pigeon.WebViewHostApi.create', codec); + final BasicMessageChannel channel = BasicMessageChannel( + 'dev.flutter.pigeon.WebViewHostApi.create', codec, + binaryMessenger: binaryMessenger); if (api == null) { channel.setMockMessageHandler(null); } else { @@ -54,10 +56,10 @@ abstract class TestWebViewHostApi { assert(message != null, 'Argument for dev.flutter.pigeon.WebViewHostApi.create was null.'); final List args = (message as List?)!; - final int? arg_instanceId = args[0] as int?; + final int? arg_instanceId = (args[0] as int?); assert(arg_instanceId != null, 'Argument for dev.flutter.pigeon.WebViewHostApi.create was null, expected non-null int.'); - final bool? arg_useHybridComposition = args[1] as bool?; + final bool? arg_useHybridComposition = (args[1] as bool?); assert(arg_useHybridComposition != null, 'Argument for dev.flutter.pigeon.WebViewHostApi.create was null, expected non-null bool.'); api.create(arg_instanceId!, arg_useHybridComposition!); @@ -66,8 +68,9 @@ abstract class TestWebViewHostApi { } } { - const BasicMessageChannel channel = BasicMessageChannel( - 'dev.flutter.pigeon.WebViewHostApi.dispose', codec); + final BasicMessageChannel channel = BasicMessageChannel( + 'dev.flutter.pigeon.WebViewHostApi.dispose', codec, + binaryMessenger: binaryMessenger); if (api == null) { channel.setMockMessageHandler(null); } else { @@ -75,7 +78,7 @@ abstract class TestWebViewHostApi { assert(message != null, 'Argument for dev.flutter.pigeon.WebViewHostApi.dispose was null.'); final List args = (message as List?)!; - final int? arg_instanceId = args[0] as int?; + final int? arg_instanceId = (args[0] as int?); assert(arg_instanceId != null, 'Argument for dev.flutter.pigeon.WebViewHostApi.dispose was null, expected non-null int.'); api.dispose(arg_instanceId!); @@ -84,8 +87,9 @@ abstract class TestWebViewHostApi { } } { - const BasicMessageChannel channel = BasicMessageChannel( - 'dev.flutter.pigeon.WebViewHostApi.loadUrl', codec); + final BasicMessageChannel channel = BasicMessageChannel( + 'dev.flutter.pigeon.WebViewHostApi.loadUrl', codec, + binaryMessenger: binaryMessenger); if (api == null) { channel.setMockMessageHandler(null); } else { @@ -93,14 +97,14 @@ abstract class TestWebViewHostApi { assert(message != null, 'Argument for dev.flutter.pigeon.WebViewHostApi.loadUrl was null.'); final List args = (message as List?)!; - final int? arg_instanceId = args[0] as int?; + final int? arg_instanceId = (args[0] as int?); assert(arg_instanceId != null, 'Argument for dev.flutter.pigeon.WebViewHostApi.loadUrl was null, expected non-null int.'); - final String? arg_url = args[1] as String?; + final String? arg_url = (args[1] as String?); assert(arg_url != null, 'Argument for dev.flutter.pigeon.WebViewHostApi.loadUrl was null, expected non-null String.'); final Map? arg_headers = - args[2] as Map?; + (args[2] as Map?)?.cast(); assert(arg_headers != null, 'Argument for dev.flutter.pigeon.WebViewHostApi.loadUrl was null, expected non-null Map.'); api.loadUrl(arg_instanceId!, arg_url!, arg_headers!); @@ -109,8 +113,9 @@ abstract class TestWebViewHostApi { } } { - const BasicMessageChannel channel = BasicMessageChannel( - 'dev.flutter.pigeon.WebViewHostApi.getUrl', codec); + final BasicMessageChannel channel = BasicMessageChannel( + 'dev.flutter.pigeon.WebViewHostApi.getUrl', codec, + binaryMessenger: binaryMessenger); if (api == null) { channel.setMockMessageHandler(null); } else { @@ -118,7 +123,7 @@ abstract class TestWebViewHostApi { assert(message != null, 'Argument for dev.flutter.pigeon.WebViewHostApi.getUrl was null.'); final List args = (message as List?)!; - final int? arg_instanceId = args[0] as int?; + final int? arg_instanceId = (args[0] as int?); assert(arg_instanceId != null, 'Argument for dev.flutter.pigeon.WebViewHostApi.getUrl was null, expected non-null int.'); final String output = api.getUrl(arg_instanceId!); @@ -127,8 +132,9 @@ abstract class TestWebViewHostApi { } } { - const BasicMessageChannel channel = BasicMessageChannel( - 'dev.flutter.pigeon.WebViewHostApi.canGoBack', codec); + final BasicMessageChannel channel = BasicMessageChannel( + 'dev.flutter.pigeon.WebViewHostApi.canGoBack', codec, + binaryMessenger: binaryMessenger); if (api == null) { channel.setMockMessageHandler(null); } else { @@ -136,7 +142,7 @@ abstract class TestWebViewHostApi { assert(message != null, 'Argument for dev.flutter.pigeon.WebViewHostApi.canGoBack was null.'); final List args = (message as List?)!; - final int? arg_instanceId = args[0] as int?; + final int? arg_instanceId = (args[0] as int?); assert(arg_instanceId != null, 'Argument for dev.flutter.pigeon.WebViewHostApi.canGoBack was null, expected non-null int.'); final bool output = api.canGoBack(arg_instanceId!); @@ -145,8 +151,9 @@ abstract class TestWebViewHostApi { } } { - const BasicMessageChannel channel = BasicMessageChannel( - 'dev.flutter.pigeon.WebViewHostApi.canGoForward', codec); + final BasicMessageChannel channel = BasicMessageChannel( + 'dev.flutter.pigeon.WebViewHostApi.canGoForward', codec, + binaryMessenger: binaryMessenger); if (api == null) { channel.setMockMessageHandler(null); } else { @@ -154,7 +161,7 @@ abstract class TestWebViewHostApi { assert(message != null, 'Argument for dev.flutter.pigeon.WebViewHostApi.canGoForward was null.'); final List args = (message as List?)!; - final int? arg_instanceId = args[0] as int?; + final int? arg_instanceId = (args[0] as int?); assert(arg_instanceId != null, 'Argument for dev.flutter.pigeon.WebViewHostApi.canGoForward was null, expected non-null int.'); final bool output = api.canGoForward(arg_instanceId!); @@ -163,8 +170,9 @@ abstract class TestWebViewHostApi { } } { - const BasicMessageChannel channel = BasicMessageChannel( - 'dev.flutter.pigeon.WebViewHostApi.goBack', codec); + final BasicMessageChannel channel = BasicMessageChannel( + 'dev.flutter.pigeon.WebViewHostApi.goBack', codec, + binaryMessenger: binaryMessenger); if (api == null) { channel.setMockMessageHandler(null); } else { @@ -172,7 +180,7 @@ abstract class TestWebViewHostApi { assert(message != null, 'Argument for dev.flutter.pigeon.WebViewHostApi.goBack was null.'); final List args = (message as List?)!; - final int? arg_instanceId = args[0] as int?; + final int? arg_instanceId = (args[0] as int?); assert(arg_instanceId != null, 'Argument for dev.flutter.pigeon.WebViewHostApi.goBack was null, expected non-null int.'); api.goBack(arg_instanceId!); @@ -181,8 +189,9 @@ abstract class TestWebViewHostApi { } } { - const BasicMessageChannel channel = BasicMessageChannel( - 'dev.flutter.pigeon.WebViewHostApi.goForward', codec); + final BasicMessageChannel channel = BasicMessageChannel( + 'dev.flutter.pigeon.WebViewHostApi.goForward', codec, + binaryMessenger: binaryMessenger); if (api == null) { channel.setMockMessageHandler(null); } else { @@ -190,7 +199,7 @@ abstract class TestWebViewHostApi { assert(message != null, 'Argument for dev.flutter.pigeon.WebViewHostApi.goForward was null.'); final List args = (message as List?)!; - final int? arg_instanceId = args[0] as int?; + final int? arg_instanceId = (args[0] as int?); assert(arg_instanceId != null, 'Argument for dev.flutter.pigeon.WebViewHostApi.goForward was null, expected non-null int.'); api.goForward(arg_instanceId!); @@ -199,8 +208,9 @@ abstract class TestWebViewHostApi { } } { - const BasicMessageChannel channel = BasicMessageChannel( - 'dev.flutter.pigeon.WebViewHostApi.reload', codec); + final BasicMessageChannel channel = BasicMessageChannel( + 'dev.flutter.pigeon.WebViewHostApi.reload', codec, + binaryMessenger: binaryMessenger); if (api == null) { channel.setMockMessageHandler(null); } else { @@ -208,7 +218,7 @@ abstract class TestWebViewHostApi { assert(message != null, 'Argument for dev.flutter.pigeon.WebViewHostApi.reload was null.'); final List args = (message as List?)!; - final int? arg_instanceId = args[0] as int?; + final int? arg_instanceId = (args[0] as int?); assert(arg_instanceId != null, 'Argument for dev.flutter.pigeon.WebViewHostApi.reload was null, expected non-null int.'); api.reload(arg_instanceId!); @@ -217,8 +227,9 @@ abstract class TestWebViewHostApi { } } { - const BasicMessageChannel channel = BasicMessageChannel( - 'dev.flutter.pigeon.WebViewHostApi.clearCache', codec); + final BasicMessageChannel channel = BasicMessageChannel( + 'dev.flutter.pigeon.WebViewHostApi.clearCache', codec, + binaryMessenger: binaryMessenger); if (api == null) { channel.setMockMessageHandler(null); } else { @@ -226,10 +237,10 @@ abstract class TestWebViewHostApi { assert(message != null, 'Argument for dev.flutter.pigeon.WebViewHostApi.clearCache was null.'); final List args = (message as List?)!; - final int? arg_instanceId = args[0] as int?; + final int? arg_instanceId = (args[0] as int?); assert(arg_instanceId != null, 'Argument for dev.flutter.pigeon.WebViewHostApi.clearCache was null, expected non-null int.'); - final bool? arg_includeDiskFiles = args[1] as bool?; + final bool? arg_includeDiskFiles = (args[1] as bool?); assert(arg_includeDiskFiles != null, 'Argument for dev.flutter.pigeon.WebViewHostApi.clearCache was null, expected non-null bool.'); api.clearCache(arg_instanceId!, arg_includeDiskFiles!); @@ -238,8 +249,9 @@ abstract class TestWebViewHostApi { } } { - const BasicMessageChannel channel = BasicMessageChannel( - 'dev.flutter.pigeon.WebViewHostApi.evaluateJavascript', codec); + final BasicMessageChannel channel = BasicMessageChannel( + 'dev.flutter.pigeon.WebViewHostApi.evaluateJavascript', codec, + binaryMessenger: binaryMessenger); if (api == null) { channel.setMockMessageHandler(null); } else { @@ -247,10 +259,10 @@ abstract class TestWebViewHostApi { assert(message != null, 'Argument for dev.flutter.pigeon.WebViewHostApi.evaluateJavascript was null.'); final List args = (message as List?)!; - final int? arg_instanceId = args[0] as int?; + final int? arg_instanceId = (args[0] as int?); assert(arg_instanceId != null, 'Argument for dev.flutter.pigeon.WebViewHostApi.evaluateJavascript was null, expected non-null int.'); - final String? arg_javascriptString = args[1] as String?; + final String? arg_javascriptString = (args[1] as String?); assert(arg_javascriptString != null, 'Argument for dev.flutter.pigeon.WebViewHostApi.evaluateJavascript was null, expected non-null String.'); final String output = await api.evaluateJavascript( @@ -260,8 +272,9 @@ abstract class TestWebViewHostApi { } } { - const BasicMessageChannel channel = BasicMessageChannel( - 'dev.flutter.pigeon.WebViewHostApi.getTitle', codec); + final BasicMessageChannel channel = BasicMessageChannel( + 'dev.flutter.pigeon.WebViewHostApi.getTitle', codec, + binaryMessenger: binaryMessenger); if (api == null) { channel.setMockMessageHandler(null); } else { @@ -269,7 +282,7 @@ abstract class TestWebViewHostApi { assert(message != null, 'Argument for dev.flutter.pigeon.WebViewHostApi.getTitle was null.'); final List args = (message as List?)!; - final int? arg_instanceId = args[0] as int?; + final int? arg_instanceId = (args[0] as int?); assert(arg_instanceId != null, 'Argument for dev.flutter.pigeon.WebViewHostApi.getTitle was null, expected non-null int.'); final String output = api.getTitle(arg_instanceId!); @@ -278,8 +291,9 @@ abstract class TestWebViewHostApi { } } { - const BasicMessageChannel channel = BasicMessageChannel( - 'dev.flutter.pigeon.WebViewHostApi.scrollTo', codec); + final BasicMessageChannel channel = BasicMessageChannel( + 'dev.flutter.pigeon.WebViewHostApi.scrollTo', codec, + binaryMessenger: binaryMessenger); if (api == null) { channel.setMockMessageHandler(null); } else { @@ -287,13 +301,13 @@ abstract class TestWebViewHostApi { assert(message != null, 'Argument for dev.flutter.pigeon.WebViewHostApi.scrollTo was null.'); final List args = (message as List?)!; - final int? arg_instanceId = args[0] as int?; + final int? arg_instanceId = (args[0] as int?); assert(arg_instanceId != null, 'Argument for dev.flutter.pigeon.WebViewHostApi.scrollTo was null, expected non-null int.'); - final int? arg_x = args[1] as int?; + final int? arg_x = (args[1] as int?); assert(arg_x != null, 'Argument for dev.flutter.pigeon.WebViewHostApi.scrollTo was null, expected non-null int.'); - final int? arg_y = args[2] as int?; + final int? arg_y = (args[2] as int?); assert(arg_y != null, 'Argument for dev.flutter.pigeon.WebViewHostApi.scrollTo was null, expected non-null int.'); api.scrollTo(arg_instanceId!, arg_x!, arg_y!); @@ -302,8 +316,9 @@ abstract class TestWebViewHostApi { } } { - const BasicMessageChannel channel = BasicMessageChannel( - 'dev.flutter.pigeon.WebViewHostApi.scrollBy', codec); + final BasicMessageChannel channel = BasicMessageChannel( + 'dev.flutter.pigeon.WebViewHostApi.scrollBy', codec, + binaryMessenger: binaryMessenger); if (api == null) { channel.setMockMessageHandler(null); } else { @@ -311,13 +326,13 @@ abstract class TestWebViewHostApi { assert(message != null, 'Argument for dev.flutter.pigeon.WebViewHostApi.scrollBy was null.'); final List args = (message as List?)!; - final int? arg_instanceId = args[0] as int?; + final int? arg_instanceId = (args[0] as int?); assert(arg_instanceId != null, 'Argument for dev.flutter.pigeon.WebViewHostApi.scrollBy was null, expected non-null int.'); - final int? arg_x = args[1] as int?; + final int? arg_x = (args[1] as int?); assert(arg_x != null, 'Argument for dev.flutter.pigeon.WebViewHostApi.scrollBy was null, expected non-null int.'); - final int? arg_y = args[2] as int?; + final int? arg_y = (args[2] as int?); assert(arg_y != null, 'Argument for dev.flutter.pigeon.WebViewHostApi.scrollBy was null, expected non-null int.'); api.scrollBy(arg_instanceId!, arg_x!, arg_y!); @@ -326,8 +341,9 @@ abstract class TestWebViewHostApi { } } { - const BasicMessageChannel channel = BasicMessageChannel( - 'dev.flutter.pigeon.WebViewHostApi.getScrollX', codec); + final BasicMessageChannel channel = BasicMessageChannel( + 'dev.flutter.pigeon.WebViewHostApi.getScrollX', codec, + binaryMessenger: binaryMessenger); if (api == null) { channel.setMockMessageHandler(null); } else { @@ -335,7 +351,7 @@ abstract class TestWebViewHostApi { assert(message != null, 'Argument for dev.flutter.pigeon.WebViewHostApi.getScrollX was null.'); final List args = (message as List?)!; - final int? arg_instanceId = args[0] as int?; + final int? arg_instanceId = (args[0] as int?); assert(arg_instanceId != null, 'Argument for dev.flutter.pigeon.WebViewHostApi.getScrollX was null, expected non-null int.'); final int output = api.getScrollX(arg_instanceId!); @@ -344,8 +360,9 @@ abstract class TestWebViewHostApi { } } { - const BasicMessageChannel channel = BasicMessageChannel( - 'dev.flutter.pigeon.WebViewHostApi.getScrollY', codec); + final BasicMessageChannel channel = BasicMessageChannel( + 'dev.flutter.pigeon.WebViewHostApi.getScrollY', codec, + binaryMessenger: binaryMessenger); if (api == null) { channel.setMockMessageHandler(null); } else { @@ -353,7 +370,7 @@ abstract class TestWebViewHostApi { assert(message != null, 'Argument for dev.flutter.pigeon.WebViewHostApi.getScrollY was null.'); final List args = (message as List?)!; - final int? arg_instanceId = args[0] as int?; + final int? arg_instanceId = (args[0] as int?); assert(arg_instanceId != null, 'Argument for dev.flutter.pigeon.WebViewHostApi.getScrollY was null, expected non-null int.'); final int output = api.getScrollY(arg_instanceId!); @@ -362,9 +379,10 @@ abstract class TestWebViewHostApi { } } { - const BasicMessageChannel channel = BasicMessageChannel( + final BasicMessageChannel channel = BasicMessageChannel( 'dev.flutter.pigeon.WebViewHostApi.setWebContentsDebuggingEnabled', - codec); + codec, + binaryMessenger: binaryMessenger); if (api == null) { channel.setMockMessageHandler(null); } else { @@ -372,7 +390,7 @@ abstract class TestWebViewHostApi { assert(message != null, 'Argument for dev.flutter.pigeon.WebViewHostApi.setWebContentsDebuggingEnabled was null.'); final List args = (message as List?)!; - final bool? arg_enabled = args[0] as bool?; + final bool? arg_enabled = (args[0] as bool?); assert(arg_enabled != null, 'Argument for dev.flutter.pigeon.WebViewHostApi.setWebContentsDebuggingEnabled was null, expected non-null bool.'); api.setWebContentsDebuggingEnabled(arg_enabled!); @@ -381,8 +399,9 @@ abstract class TestWebViewHostApi { } } { - const BasicMessageChannel channel = BasicMessageChannel( - 'dev.flutter.pigeon.WebViewHostApi.setWebViewClient', codec); + final BasicMessageChannel channel = BasicMessageChannel( + 'dev.flutter.pigeon.WebViewHostApi.setWebViewClient', codec, + binaryMessenger: binaryMessenger); if (api == null) { channel.setMockMessageHandler(null); } else { @@ -390,10 +409,10 @@ abstract class TestWebViewHostApi { assert(message != null, 'Argument for dev.flutter.pigeon.WebViewHostApi.setWebViewClient was null.'); final List args = (message as List?)!; - final int? arg_instanceId = args[0] as int?; + final int? arg_instanceId = (args[0] as int?); assert(arg_instanceId != null, 'Argument for dev.flutter.pigeon.WebViewHostApi.setWebViewClient was null, expected non-null int.'); - final int? arg_webViewClientInstanceId = args[1] as int?; + final int? arg_webViewClientInstanceId = (args[1] as int?); assert(arg_webViewClientInstanceId != null, 'Argument for dev.flutter.pigeon.WebViewHostApi.setWebViewClient was null, expected non-null int.'); api.setWebViewClient(arg_instanceId!, arg_webViewClientInstanceId!); @@ -402,8 +421,9 @@ abstract class TestWebViewHostApi { } } { - const BasicMessageChannel channel = BasicMessageChannel( - 'dev.flutter.pigeon.WebViewHostApi.addJavaScriptChannel', codec); + final BasicMessageChannel channel = BasicMessageChannel( + 'dev.flutter.pigeon.WebViewHostApi.addJavaScriptChannel', codec, + binaryMessenger: binaryMessenger); if (api == null) { channel.setMockMessageHandler(null); } else { @@ -411,10 +431,10 @@ abstract class TestWebViewHostApi { assert(message != null, 'Argument for dev.flutter.pigeon.WebViewHostApi.addJavaScriptChannel was null.'); final List args = (message as List?)!; - final int? arg_instanceId = args[0] as int?; + final int? arg_instanceId = (args[0] as int?); assert(arg_instanceId != null, 'Argument for dev.flutter.pigeon.WebViewHostApi.addJavaScriptChannel was null, expected non-null int.'); - final int? arg_javaScriptChannelInstanceId = args[1] as int?; + final int? arg_javaScriptChannelInstanceId = (args[1] as int?); assert(arg_javaScriptChannelInstanceId != null, 'Argument for dev.flutter.pigeon.WebViewHostApi.addJavaScriptChannel was null, expected non-null int.'); api.addJavaScriptChannel( @@ -424,8 +444,9 @@ abstract class TestWebViewHostApi { } } { - const BasicMessageChannel channel = BasicMessageChannel( - 'dev.flutter.pigeon.WebViewHostApi.removeJavaScriptChannel', codec); + final BasicMessageChannel channel = BasicMessageChannel( + 'dev.flutter.pigeon.WebViewHostApi.removeJavaScriptChannel', codec, + binaryMessenger: binaryMessenger); if (api == null) { channel.setMockMessageHandler(null); } else { @@ -433,10 +454,10 @@ abstract class TestWebViewHostApi { assert(message != null, 'Argument for dev.flutter.pigeon.WebViewHostApi.removeJavaScriptChannel was null.'); final List args = (message as List?)!; - final int? arg_instanceId = args[0] as int?; + final int? arg_instanceId = (args[0] as int?); assert(arg_instanceId != null, 'Argument for dev.flutter.pigeon.WebViewHostApi.removeJavaScriptChannel was null, expected non-null int.'); - final int? arg_javaScriptChannelInstanceId = args[1] as int?; + final int? arg_javaScriptChannelInstanceId = (args[1] as int?); assert(arg_javaScriptChannelInstanceId != null, 'Argument for dev.flutter.pigeon.WebViewHostApi.removeJavaScriptChannel was null, expected non-null int.'); api.removeJavaScriptChannel( @@ -446,8 +467,9 @@ abstract class TestWebViewHostApi { } } { - const BasicMessageChannel channel = BasicMessageChannel( - 'dev.flutter.pigeon.WebViewHostApi.setDownloadListener', codec); + final BasicMessageChannel channel = BasicMessageChannel( + 'dev.flutter.pigeon.WebViewHostApi.setDownloadListener', codec, + binaryMessenger: binaryMessenger); if (api == null) { channel.setMockMessageHandler(null); } else { @@ -455,10 +477,10 @@ abstract class TestWebViewHostApi { assert(message != null, 'Argument for dev.flutter.pigeon.WebViewHostApi.setDownloadListener was null.'); final List args = (message as List?)!; - final int? arg_instanceId = args[0] as int?; + final int? arg_instanceId = (args[0] as int?); assert(arg_instanceId != null, 'Argument for dev.flutter.pigeon.WebViewHostApi.setDownloadListener was null, expected non-null int.'); - final int? arg_listenerInstanceId = args[1] as int?; + final int? arg_listenerInstanceId = (args[1] as int?); assert(arg_listenerInstanceId != null, 'Argument for dev.flutter.pigeon.WebViewHostApi.setDownloadListener was null, expected non-null int.'); api.setDownloadListener(arg_instanceId!, arg_listenerInstanceId!); @@ -467,8 +489,9 @@ abstract class TestWebViewHostApi { } } { - const BasicMessageChannel channel = BasicMessageChannel( - 'dev.flutter.pigeon.WebViewHostApi.setWebChromeClient', codec); + final BasicMessageChannel channel = BasicMessageChannel( + 'dev.flutter.pigeon.WebViewHostApi.setWebChromeClient', codec, + binaryMessenger: binaryMessenger); if (api == null) { channel.setMockMessageHandler(null); } else { @@ -476,10 +499,10 @@ abstract class TestWebViewHostApi { assert(message != null, 'Argument for dev.flutter.pigeon.WebViewHostApi.setWebChromeClient was null.'); final List args = (message as List?)!; - final int? arg_instanceId = args[0] as int?; + final int? arg_instanceId = (args[0] as int?); assert(arg_instanceId != null, 'Argument for dev.flutter.pigeon.WebViewHostApi.setWebChromeClient was null, expected non-null int.'); - final int? arg_clientInstanceId = args[1] as int?; + final int? arg_clientInstanceId = (args[1] as int?); assert(arg_clientInstanceId != null, 'Argument for dev.flutter.pigeon.WebViewHostApi.setWebChromeClient was null, expected non-null int.'); api.setWebChromeClient(arg_instanceId!, arg_clientInstanceId!); @@ -510,10 +533,12 @@ abstract class TestWebSettingsHostApi { void setUseWideViewPort(int instanceId, bool use); void setDisplayZoomControls(int instanceId, bool enabled); void setBuiltInZoomControls(int instanceId, bool enabled); - static void setup(TestWebSettingsHostApi? api) { + static void setup(TestWebSettingsHostApi? api, + {BinaryMessenger? binaryMessenger}) { { - const BasicMessageChannel channel = BasicMessageChannel( - 'dev.flutter.pigeon.WebSettingsHostApi.create', codec); + final BasicMessageChannel channel = BasicMessageChannel( + 'dev.flutter.pigeon.WebSettingsHostApi.create', codec, + binaryMessenger: binaryMessenger); if (api == null) { channel.setMockMessageHandler(null); } else { @@ -521,10 +546,10 @@ abstract class TestWebSettingsHostApi { assert(message != null, 'Argument for dev.flutter.pigeon.WebSettingsHostApi.create was null.'); final List args = (message as List?)!; - final int? arg_instanceId = args[0] as int?; + final int? arg_instanceId = (args[0] as int?); assert(arg_instanceId != null, 'Argument for dev.flutter.pigeon.WebSettingsHostApi.create was null, expected non-null int.'); - final int? arg_webViewInstanceId = args[1] as int?; + final int? arg_webViewInstanceId = (args[1] as int?); assert(arg_webViewInstanceId != null, 'Argument for dev.flutter.pigeon.WebSettingsHostApi.create was null, expected non-null int.'); api.create(arg_instanceId!, arg_webViewInstanceId!); @@ -533,8 +558,9 @@ abstract class TestWebSettingsHostApi { } } { - const BasicMessageChannel channel = BasicMessageChannel( - 'dev.flutter.pigeon.WebSettingsHostApi.dispose', codec); + final BasicMessageChannel channel = BasicMessageChannel( + 'dev.flutter.pigeon.WebSettingsHostApi.dispose', codec, + binaryMessenger: binaryMessenger); if (api == null) { channel.setMockMessageHandler(null); } else { @@ -542,7 +568,7 @@ abstract class TestWebSettingsHostApi { assert(message != null, 'Argument for dev.flutter.pigeon.WebSettingsHostApi.dispose was null.'); final List args = (message as List?)!; - final int? arg_instanceId = args[0] as int?; + final int? arg_instanceId = (args[0] as int?); assert(arg_instanceId != null, 'Argument for dev.flutter.pigeon.WebSettingsHostApi.dispose was null, expected non-null int.'); api.dispose(arg_instanceId!); @@ -551,8 +577,9 @@ abstract class TestWebSettingsHostApi { } } { - const BasicMessageChannel channel = BasicMessageChannel( - 'dev.flutter.pigeon.WebSettingsHostApi.setDomStorageEnabled', codec); + final BasicMessageChannel channel = BasicMessageChannel( + 'dev.flutter.pigeon.WebSettingsHostApi.setDomStorageEnabled', codec, + binaryMessenger: binaryMessenger); if (api == null) { channel.setMockMessageHandler(null); } else { @@ -560,10 +587,10 @@ abstract class TestWebSettingsHostApi { assert(message != null, 'Argument for dev.flutter.pigeon.WebSettingsHostApi.setDomStorageEnabled was null.'); final List args = (message as List?)!; - final int? arg_instanceId = args[0] as int?; + final int? arg_instanceId = (args[0] as int?); assert(arg_instanceId != null, 'Argument for dev.flutter.pigeon.WebSettingsHostApi.setDomStorageEnabled was null, expected non-null int.'); - final bool? arg_flag = args[1] as bool?; + final bool? arg_flag = (args[1] as bool?); assert(arg_flag != null, 'Argument for dev.flutter.pigeon.WebSettingsHostApi.setDomStorageEnabled was null, expected non-null bool.'); api.setDomStorageEnabled(arg_instanceId!, arg_flag!); @@ -572,9 +599,10 @@ abstract class TestWebSettingsHostApi { } } { - const BasicMessageChannel channel = BasicMessageChannel( + final BasicMessageChannel channel = BasicMessageChannel( 'dev.flutter.pigeon.WebSettingsHostApi.setJavaScriptCanOpenWindowsAutomatically', - codec); + codec, + binaryMessenger: binaryMessenger); if (api == null) { channel.setMockMessageHandler(null); } else { @@ -582,10 +610,10 @@ abstract class TestWebSettingsHostApi { assert(message != null, 'Argument for dev.flutter.pigeon.WebSettingsHostApi.setJavaScriptCanOpenWindowsAutomatically was null.'); final List args = (message as List?)!; - final int? arg_instanceId = args[0] as int?; + final int? arg_instanceId = (args[0] as int?); assert(arg_instanceId != null, 'Argument for dev.flutter.pigeon.WebSettingsHostApi.setJavaScriptCanOpenWindowsAutomatically was null, expected non-null int.'); - final bool? arg_flag = args[1] as bool?; + final bool? arg_flag = (args[1] as bool?); assert(arg_flag != null, 'Argument for dev.flutter.pigeon.WebSettingsHostApi.setJavaScriptCanOpenWindowsAutomatically was null, expected non-null bool.'); api.setJavaScriptCanOpenWindowsAutomatically( @@ -595,9 +623,10 @@ abstract class TestWebSettingsHostApi { } } { - const BasicMessageChannel channel = BasicMessageChannel( + final BasicMessageChannel channel = BasicMessageChannel( 'dev.flutter.pigeon.WebSettingsHostApi.setSupportMultipleWindows', - codec); + codec, + binaryMessenger: binaryMessenger); if (api == null) { channel.setMockMessageHandler(null); } else { @@ -605,10 +634,10 @@ abstract class TestWebSettingsHostApi { assert(message != null, 'Argument for dev.flutter.pigeon.WebSettingsHostApi.setSupportMultipleWindows was null.'); final List args = (message as List?)!; - final int? arg_instanceId = args[0] as int?; + final int? arg_instanceId = (args[0] as int?); assert(arg_instanceId != null, 'Argument for dev.flutter.pigeon.WebSettingsHostApi.setSupportMultipleWindows was null, expected non-null int.'); - final bool? arg_support = args[1] as bool?; + final bool? arg_support = (args[1] as bool?); assert(arg_support != null, 'Argument for dev.flutter.pigeon.WebSettingsHostApi.setSupportMultipleWindows was null, expected non-null bool.'); api.setSupportMultipleWindows(arg_instanceId!, arg_support!); @@ -617,8 +646,9 @@ abstract class TestWebSettingsHostApi { } } { - const BasicMessageChannel channel = BasicMessageChannel( - 'dev.flutter.pigeon.WebSettingsHostApi.setJavaScriptEnabled', codec); + final BasicMessageChannel channel = BasicMessageChannel( + 'dev.flutter.pigeon.WebSettingsHostApi.setJavaScriptEnabled', codec, + binaryMessenger: binaryMessenger); if (api == null) { channel.setMockMessageHandler(null); } else { @@ -626,10 +656,10 @@ abstract class TestWebSettingsHostApi { assert(message != null, 'Argument for dev.flutter.pigeon.WebSettingsHostApi.setJavaScriptEnabled was null.'); final List args = (message as List?)!; - final int? arg_instanceId = args[0] as int?; + final int? arg_instanceId = (args[0] as int?); assert(arg_instanceId != null, 'Argument for dev.flutter.pigeon.WebSettingsHostApi.setJavaScriptEnabled was null, expected non-null int.'); - final bool? arg_flag = args[1] as bool?; + final bool? arg_flag = (args[1] as bool?); assert(arg_flag != null, 'Argument for dev.flutter.pigeon.WebSettingsHostApi.setJavaScriptEnabled was null, expected non-null bool.'); api.setJavaScriptEnabled(arg_instanceId!, arg_flag!); @@ -638,8 +668,9 @@ abstract class TestWebSettingsHostApi { } } { - const BasicMessageChannel channel = BasicMessageChannel( - 'dev.flutter.pigeon.WebSettingsHostApi.setUserAgentString', codec); + final BasicMessageChannel channel = BasicMessageChannel( + 'dev.flutter.pigeon.WebSettingsHostApi.setUserAgentString', codec, + binaryMessenger: binaryMessenger); if (api == null) { channel.setMockMessageHandler(null); } else { @@ -647,10 +678,10 @@ abstract class TestWebSettingsHostApi { assert(message != null, 'Argument for dev.flutter.pigeon.WebSettingsHostApi.setUserAgentString was null.'); final List args = (message as List?)!; - final int? arg_instanceId = args[0] as int?; + final int? arg_instanceId = (args[0] as int?); assert(arg_instanceId != null, 'Argument for dev.flutter.pigeon.WebSettingsHostApi.setUserAgentString was null, expected non-null int.'); - final String? arg_userAgentString = args[1] as String?; + final String? arg_userAgentString = (args[1] as String?); assert(arg_userAgentString != null, 'Argument for dev.flutter.pigeon.WebSettingsHostApi.setUserAgentString was null, expected non-null String.'); api.setUserAgentString(arg_instanceId!, arg_userAgentString!); @@ -659,9 +690,10 @@ abstract class TestWebSettingsHostApi { } } { - const BasicMessageChannel channel = BasicMessageChannel( + final BasicMessageChannel channel = BasicMessageChannel( 'dev.flutter.pigeon.WebSettingsHostApi.setMediaPlaybackRequiresUserGesture', - codec); + codec, + binaryMessenger: binaryMessenger); if (api == null) { channel.setMockMessageHandler(null); } else { @@ -669,10 +701,10 @@ abstract class TestWebSettingsHostApi { assert(message != null, 'Argument for dev.flutter.pigeon.WebSettingsHostApi.setMediaPlaybackRequiresUserGesture was null.'); final List args = (message as List?)!; - final int? arg_instanceId = args[0] as int?; + final int? arg_instanceId = (args[0] as int?); assert(arg_instanceId != null, 'Argument for dev.flutter.pigeon.WebSettingsHostApi.setMediaPlaybackRequiresUserGesture was null, expected non-null int.'); - final bool? arg_require = args[1] as bool?; + final bool? arg_require = (args[1] as bool?); assert(arg_require != null, 'Argument for dev.flutter.pigeon.WebSettingsHostApi.setMediaPlaybackRequiresUserGesture was null, expected non-null bool.'); api.setMediaPlaybackRequiresUserGesture( @@ -682,8 +714,9 @@ abstract class TestWebSettingsHostApi { } } { - const BasicMessageChannel channel = BasicMessageChannel( - 'dev.flutter.pigeon.WebSettingsHostApi.setSupportZoom', codec); + final BasicMessageChannel channel = BasicMessageChannel( + 'dev.flutter.pigeon.WebSettingsHostApi.setSupportZoom', codec, + binaryMessenger: binaryMessenger); if (api == null) { channel.setMockMessageHandler(null); } else { @@ -691,10 +724,10 @@ abstract class TestWebSettingsHostApi { assert(message != null, 'Argument for dev.flutter.pigeon.WebSettingsHostApi.setSupportZoom was null.'); final List args = (message as List?)!; - final int? arg_instanceId = args[0] as int?; + final int? arg_instanceId = (args[0] as int?); assert(arg_instanceId != null, 'Argument for dev.flutter.pigeon.WebSettingsHostApi.setSupportZoom was null, expected non-null int.'); - final bool? arg_support = args[1] as bool?; + final bool? arg_support = (args[1] as bool?); assert(arg_support != null, 'Argument for dev.flutter.pigeon.WebSettingsHostApi.setSupportZoom was null, expected non-null bool.'); api.setSupportZoom(arg_instanceId!, arg_support!); @@ -703,9 +736,10 @@ abstract class TestWebSettingsHostApi { } } { - const BasicMessageChannel channel = BasicMessageChannel( + final BasicMessageChannel channel = BasicMessageChannel( 'dev.flutter.pigeon.WebSettingsHostApi.setLoadWithOverviewMode', - codec); + codec, + binaryMessenger: binaryMessenger); if (api == null) { channel.setMockMessageHandler(null); } else { @@ -713,10 +747,10 @@ abstract class TestWebSettingsHostApi { assert(message != null, 'Argument for dev.flutter.pigeon.WebSettingsHostApi.setLoadWithOverviewMode was null.'); final List args = (message as List?)!; - final int? arg_instanceId = args[0] as int?; + final int? arg_instanceId = (args[0] as int?); assert(arg_instanceId != null, 'Argument for dev.flutter.pigeon.WebSettingsHostApi.setLoadWithOverviewMode was null, expected non-null int.'); - final bool? arg_overview = args[1] as bool?; + final bool? arg_overview = (args[1] as bool?); assert(arg_overview != null, 'Argument for dev.flutter.pigeon.WebSettingsHostApi.setLoadWithOverviewMode was null, expected non-null bool.'); api.setLoadWithOverviewMode(arg_instanceId!, arg_overview!); @@ -725,8 +759,9 @@ abstract class TestWebSettingsHostApi { } } { - const BasicMessageChannel channel = BasicMessageChannel( - 'dev.flutter.pigeon.WebSettingsHostApi.setUseWideViewPort', codec); + final BasicMessageChannel channel = BasicMessageChannel( + 'dev.flutter.pigeon.WebSettingsHostApi.setUseWideViewPort', codec, + binaryMessenger: binaryMessenger); if (api == null) { channel.setMockMessageHandler(null); } else { @@ -734,10 +769,10 @@ abstract class TestWebSettingsHostApi { assert(message != null, 'Argument for dev.flutter.pigeon.WebSettingsHostApi.setUseWideViewPort was null.'); final List args = (message as List?)!; - final int? arg_instanceId = args[0] as int?; + final int? arg_instanceId = (args[0] as int?); assert(arg_instanceId != null, 'Argument for dev.flutter.pigeon.WebSettingsHostApi.setUseWideViewPort was null, expected non-null int.'); - final bool? arg_use = args[1] as bool?; + final bool? arg_use = (args[1] as bool?); assert(arg_use != null, 'Argument for dev.flutter.pigeon.WebSettingsHostApi.setUseWideViewPort was null, expected non-null bool.'); api.setUseWideViewPort(arg_instanceId!, arg_use!); @@ -746,9 +781,9 @@ abstract class TestWebSettingsHostApi { } } { - const BasicMessageChannel channel = BasicMessageChannel( - 'dev.flutter.pigeon.WebSettingsHostApi.setDisplayZoomControls', - codec); + final BasicMessageChannel channel = BasicMessageChannel( + 'dev.flutter.pigeon.WebSettingsHostApi.setDisplayZoomControls', codec, + binaryMessenger: binaryMessenger); if (api == null) { channel.setMockMessageHandler(null); } else { @@ -756,10 +791,10 @@ abstract class TestWebSettingsHostApi { assert(message != null, 'Argument for dev.flutter.pigeon.WebSettingsHostApi.setDisplayZoomControls was null.'); final List args = (message as List?)!; - final int? arg_instanceId = args[0] as int?; + final int? arg_instanceId = (args[0] as int?); assert(arg_instanceId != null, 'Argument for dev.flutter.pigeon.WebSettingsHostApi.setDisplayZoomControls was null, expected non-null int.'); - final bool? arg_enabled = args[1] as bool?; + final bool? arg_enabled = (args[1] as bool?); assert(arg_enabled != null, 'Argument for dev.flutter.pigeon.WebSettingsHostApi.setDisplayZoomControls was null, expected non-null bool.'); api.setDisplayZoomControls(arg_instanceId!, arg_enabled!); @@ -768,9 +803,9 @@ abstract class TestWebSettingsHostApi { } } { - const BasicMessageChannel channel = BasicMessageChannel( - 'dev.flutter.pigeon.WebSettingsHostApi.setBuiltInZoomControls', - codec); + final BasicMessageChannel channel = BasicMessageChannel( + 'dev.flutter.pigeon.WebSettingsHostApi.setBuiltInZoomControls', codec, + binaryMessenger: binaryMessenger); if (api == null) { channel.setMockMessageHandler(null); } else { @@ -778,10 +813,10 @@ abstract class TestWebSettingsHostApi { assert(message != null, 'Argument for dev.flutter.pigeon.WebSettingsHostApi.setBuiltInZoomControls was null.'); final List args = (message as List?)!; - final int? arg_instanceId = args[0] as int?; + final int? arg_instanceId = (args[0] as int?); assert(arg_instanceId != null, 'Argument for dev.flutter.pigeon.WebSettingsHostApi.setBuiltInZoomControls was null, expected non-null int.'); - final bool? arg_enabled = args[1] as bool?; + final bool? arg_enabled = (args[1] as bool?); assert(arg_enabled != null, 'Argument for dev.flutter.pigeon.WebSettingsHostApi.setBuiltInZoomControls was null, expected non-null bool.'); api.setBuiltInZoomControls(arg_instanceId!, arg_enabled!); @@ -801,11 +836,12 @@ abstract class TestJavaScriptChannelHostApi { _TestJavaScriptChannelHostApiCodec(); void create(int instanceId, String channelName); - void dispose(int instanceId); - static void setup(TestJavaScriptChannelHostApi? api) { + static void setup(TestJavaScriptChannelHostApi? api, + {BinaryMessenger? binaryMessenger}) { { - const BasicMessageChannel channel = BasicMessageChannel( - 'dev.flutter.pigeon.JavaScriptChannelHostApi.create', codec); + final BasicMessageChannel channel = BasicMessageChannel( + 'dev.flutter.pigeon.JavaScriptChannelHostApi.create', codec, + binaryMessenger: binaryMessenger); if (api == null) { channel.setMockMessageHandler(null); } else { @@ -813,10 +849,10 @@ abstract class TestJavaScriptChannelHostApi { assert(message != null, 'Argument for dev.flutter.pigeon.JavaScriptChannelHostApi.create was null.'); final List args = (message as List?)!; - final int? arg_instanceId = args[0] as int?; + final int? arg_instanceId = (args[0] as int?); assert(arg_instanceId != null, 'Argument for dev.flutter.pigeon.JavaScriptChannelHostApi.create was null, expected non-null int.'); - final String? arg_channelName = args[1] as String?; + final String? arg_channelName = (args[1] as String?); assert(arg_channelName != null, 'Argument for dev.flutter.pigeon.JavaScriptChannelHostApi.create was null, expected non-null String.'); api.create(arg_instanceId!, arg_channelName!); @@ -824,24 +860,6 @@ abstract class TestJavaScriptChannelHostApi { }); } } - { - const BasicMessageChannel channel = BasicMessageChannel( - 'dev.flutter.pigeon.JavaScriptChannelHostApi.dispose', codec); - if (api == null) { - channel.setMockMessageHandler(null); - } else { - channel.setMockMessageHandler((Object? message) async { - assert(message != null, - 'Argument for dev.flutter.pigeon.JavaScriptChannelHostApi.dispose was null.'); - final List args = (message as List?)!; - final int? arg_instanceId = args[0] as int?; - assert(arg_instanceId != null, - 'Argument for dev.flutter.pigeon.JavaScriptChannelHostApi.dispose was null, expected non-null int.'); - api.dispose(arg_instanceId!); - return {}; - }); - } - } } } @@ -853,11 +871,12 @@ abstract class TestWebViewClientHostApi { static const MessageCodec codec = _TestWebViewClientHostApiCodec(); void create(int instanceId, bool shouldOverrideUrlLoading); - void dispose(int instanceId); - static void setup(TestWebViewClientHostApi? api) { + static void setup(TestWebViewClientHostApi? api, + {BinaryMessenger? binaryMessenger}) { { - const BasicMessageChannel channel = BasicMessageChannel( - 'dev.flutter.pigeon.WebViewClientHostApi.create', codec); + final BasicMessageChannel channel = BasicMessageChannel( + 'dev.flutter.pigeon.WebViewClientHostApi.create', codec, + binaryMessenger: binaryMessenger); if (api == null) { channel.setMockMessageHandler(null); } else { @@ -865,10 +884,10 @@ abstract class TestWebViewClientHostApi { assert(message != null, 'Argument for dev.flutter.pigeon.WebViewClientHostApi.create was null.'); final List args = (message as List?)!; - final int? arg_instanceId = args[0] as int?; + final int? arg_instanceId = (args[0] as int?); assert(arg_instanceId != null, 'Argument for dev.flutter.pigeon.WebViewClientHostApi.create was null, expected non-null int.'); - final bool? arg_shouldOverrideUrlLoading = args[1] as bool?; + final bool? arg_shouldOverrideUrlLoading = (args[1] as bool?); assert(arg_shouldOverrideUrlLoading != null, 'Argument for dev.flutter.pigeon.WebViewClientHostApi.create was null, expected non-null bool.'); api.create(arg_instanceId!, arg_shouldOverrideUrlLoading!); @@ -876,24 +895,6 @@ abstract class TestWebViewClientHostApi { }); } } - { - const BasicMessageChannel channel = BasicMessageChannel( - 'dev.flutter.pigeon.WebViewClientHostApi.dispose', codec); - if (api == null) { - channel.setMockMessageHandler(null); - } else { - channel.setMockMessageHandler((Object? message) async { - assert(message != null, - 'Argument for dev.flutter.pigeon.WebViewClientHostApi.dispose was null.'); - final List args = (message as List?)!; - final int? arg_instanceId = args[0] as int?; - assert(arg_instanceId != null, - 'Argument for dev.flutter.pigeon.WebViewClientHostApi.dispose was null, expected non-null int.'); - api.dispose(arg_instanceId!); - return {}; - }); - } - } } } @@ -906,11 +907,12 @@ abstract class TestDownloadListenerHostApi { _TestDownloadListenerHostApiCodec(); void create(int instanceId); - void dispose(int instanceId); - static void setup(TestDownloadListenerHostApi? api) { + static void setup(TestDownloadListenerHostApi? api, + {BinaryMessenger? binaryMessenger}) { { - const BasicMessageChannel channel = BasicMessageChannel( - 'dev.flutter.pigeon.DownloadListenerHostApi.create', codec); + final BasicMessageChannel channel = BasicMessageChannel( + 'dev.flutter.pigeon.DownloadListenerHostApi.create', codec, + binaryMessenger: binaryMessenger); if (api == null) { channel.setMockMessageHandler(null); } else { @@ -918,7 +920,7 @@ abstract class TestDownloadListenerHostApi { assert(message != null, 'Argument for dev.flutter.pigeon.DownloadListenerHostApi.create was null.'); final List args = (message as List?)!; - final int? arg_instanceId = args[0] as int?; + final int? arg_instanceId = (args[0] as int?); assert(arg_instanceId != null, 'Argument for dev.flutter.pigeon.DownloadListenerHostApi.create was null, expected non-null int.'); api.create(arg_instanceId!); @@ -926,24 +928,6 @@ abstract class TestDownloadListenerHostApi { }); } } - { - const BasicMessageChannel channel = BasicMessageChannel( - 'dev.flutter.pigeon.DownloadListenerHostApi.dispose', codec); - if (api == null) { - channel.setMockMessageHandler(null); - } else { - channel.setMockMessageHandler((Object? message) async { - assert(message != null, - 'Argument for dev.flutter.pigeon.DownloadListenerHostApi.dispose was null.'); - final List args = (message as List?)!; - final int? arg_instanceId = args[0] as int?; - assert(arg_instanceId != null, - 'Argument for dev.flutter.pigeon.DownloadListenerHostApi.dispose was null, expected non-null int.'); - api.dispose(arg_instanceId!); - return {}; - }); - } - } } } @@ -955,11 +939,12 @@ abstract class TestWebChromeClientHostApi { static const MessageCodec codec = _TestWebChromeClientHostApiCodec(); void create(int instanceId, int webViewClientInstanceId); - void dispose(int instanceId); - static void setup(TestWebChromeClientHostApi? api) { + static void setup(TestWebChromeClientHostApi? api, + {BinaryMessenger? binaryMessenger}) { { - const BasicMessageChannel channel = BasicMessageChannel( - 'dev.flutter.pigeon.WebChromeClientHostApi.create', codec); + final BasicMessageChannel channel = BasicMessageChannel( + 'dev.flutter.pigeon.WebChromeClientHostApi.create', codec, + binaryMessenger: binaryMessenger); if (api == null) { channel.setMockMessageHandler(null); } else { @@ -967,10 +952,10 @@ abstract class TestWebChromeClientHostApi { assert(message != null, 'Argument for dev.flutter.pigeon.WebChromeClientHostApi.create was null.'); final List args = (message as List?)!; - final int? arg_instanceId = args[0] as int?; + final int? arg_instanceId = (args[0] as int?); assert(arg_instanceId != null, 'Argument for dev.flutter.pigeon.WebChromeClientHostApi.create was null, expected non-null int.'); - final int? arg_webViewClientInstanceId = args[1] as int?; + final int? arg_webViewClientInstanceId = (args[1] as int?); assert(arg_webViewClientInstanceId != null, 'Argument for dev.flutter.pigeon.WebChromeClientHostApi.create was null, expected non-null int.'); api.create(arg_instanceId!, arg_webViewClientInstanceId!); @@ -978,23 +963,5 @@ abstract class TestWebChromeClientHostApi { }); } } - { - const BasicMessageChannel channel = BasicMessageChannel( - 'dev.flutter.pigeon.WebChromeClientHostApi.dispose', codec); - if (api == null) { - channel.setMockMessageHandler(null); - } else { - channel.setMockMessageHandler((Object? message) async { - assert(message != null, - 'Argument for dev.flutter.pigeon.WebChromeClientHostApi.dispose was null.'); - final List args = (message as List?)!; - final int? arg_instanceId = args[0] as int?; - assert(arg_instanceId != null, - 'Argument for dev.flutter.pigeon.WebChromeClientHostApi.dispose was null, expected non-null int.'); - api.dispose(arg_instanceId!); - return {}; - }); - } - } } } diff --git a/packages/webview_flutter/webview_flutter_android/test/android_webview_test.dart b/packages/webview_flutter/webview_flutter_android/test/android_webview_test.dart index cdb93991d0f1..c9cae714a0fe 100644 --- a/packages/webview_flutter/webview_flutter_android/test/android_webview_test.dart +++ b/packages/webview_flutter/webview_flutter_android/test/android_webview_test.dart @@ -4,6 +4,7 @@ import 'package:flutter_test/flutter_test.dart'; import 'package:mockito/annotations.dart'; +import 'package:mockito/mockito.dart'; import 'package:webview_flutter_android/src/android_webview.dart'; import 'package:webview_flutter_android/src/android_webview_api_impls.dart'; import 'package:webview_flutter_android/src/instance_manager.dart'; @@ -24,17 +25,225 @@ void main() { group('Android WebView', () { group('$WebView', () { - setUpAll(() { - TestWebViewHostApi.setup(MockTestWebViewHostApi()); - }); + late MockTestWebViewHostApi mockPlatformHostApi = + MockTestWebViewHostApi(); + + late InstanceManager testInstanceManager; + late WebViewHostApiImpl testWebViewHostApi; + + late WebView testWebView; + late int testWebViewInstanceId; setUp(() { - WebView.api = WebViewHostApiImpl(instanceManager: InstanceManager()); + mockPlatformHostApi = MockTestWebViewHostApi(); + TestWebViewHostApi.setup(mockPlatformHostApi); + + testInstanceManager = InstanceManager(); + testWebViewHostApi = WebViewHostApiImpl( + instanceManager: testInstanceManager, + ); + WebView.api = testWebViewHostApi; + + testWebView = WebView(); + testWebViewInstanceId = testInstanceManager.getInstanceId(testWebView)!; }); test('create', () { - final WebView webView = WebView(); - expect(WebView.api.instanceManager.getInstanceId(webView), isNotNull); + verify(mockPlatformHostApi.create(testWebViewInstanceId, false)); + }); + + test('setWebContentsDebuggingEnabled', () { + WebView.setWebContentsDebuggingEnabled(true); + verify(mockPlatformHostApi.setWebContentsDebuggingEnabled(true)); + }); + + test('loadUrl', () { + testWebView.loadUrl('hello', {'a': 'header'}); + verify(mockPlatformHostApi.loadUrl( + testWebViewInstanceId, + 'hello', + {'a': 'header'}, + )); + }); + + test('canGoBack', () { + when(mockPlatformHostApi.canGoBack(testWebViewInstanceId)) + .thenReturn(false); + expect(testWebView.canGoBack(), completion(false)); + }); + + test('canGoForward', () { + when(mockPlatformHostApi.canGoForward(testWebViewInstanceId)) + .thenReturn(true); + expect(testWebView.canGoForward(), completion(true)); + }); + + test('goBack', () { + testWebView.goBack(); + verify(mockPlatformHostApi.goBack(testWebViewInstanceId)); + }); + + test('goForward', () { + testWebView.goForward(); + verify(mockPlatformHostApi.goForward(testWebViewInstanceId)); + }); + + test('reload', () { + testWebView.reload(); + verify(mockPlatformHostApi.reload(testWebViewInstanceId)); + }); + + test('clearCache', () { + testWebView.clearCache(false); + verify(mockPlatformHostApi.clearCache(testWebViewInstanceId, false)); + }); + + test('evaluateJavascript', () { + when( + mockPlatformHostApi.evaluateJavascript( + testWebViewInstanceId, 'runJavaScript'), + ).thenAnswer((_) => Future.value('returnValue')); + expect( + testWebView.evaluateJavascript('runJavaScript'), + completion('returnValue'), + ); + }); + + test('getTitle', () { + when(mockPlatformHostApi.getTitle(testWebViewInstanceId)) + .thenReturn('aTitle'); + expect(testWebView.getTitle(), completion('aTitle')); + }); + + test('scrollTo', () { + testWebView.scrollTo(12, 13); + verify(mockPlatformHostApi.scrollTo(testWebViewInstanceId, 12, 13)); + }); + + test('scrollBy', () { + testWebView.scrollBy(12, 14); + verify(mockPlatformHostApi.scrollBy(testWebViewInstanceId, 12, 14)); + }); + + test('getScrollX', () { + when(mockPlatformHostApi.getScrollX(testWebViewInstanceId)) + .thenReturn(67); + expect(testWebView.getScrollX(), completion(67)); + }); + + test('getScrollY', () { + when(mockPlatformHostApi.getScrollY(testWebViewInstanceId)) + .thenReturn(56); + expect(testWebView.getScrollY(), completion(56)); + }); + + test('setWebViewClient', () { + TestWebViewClientHostApi.setup(MockTestWebViewClientHostApi()); + WebViewClient.api = WebViewClientHostApiImpl( + instanceManager: testInstanceManager, + ); + + final WebViewClient webViewClient = + TestWebViewClient(shouldOverrideUrlLoading: false); + testWebView.setWebViewClient(webViewClient); + + final int webViewClientInstanceId = + testInstanceManager.getInstanceId(webViewClient)!; + verify(mockPlatformHostApi.setWebViewClient( + testWebViewInstanceId, + webViewClientInstanceId, + )); + }); + + test('addJavaScriptChannel', () { + TestJavaScriptChannelHostApi.setup(MockTestJavaScriptChannelHostApi()); + JavaScriptChannel.api = JavaScriptChannelHostApiImpl( + instanceManager: testInstanceManager, + ); + + final JavaScriptChannel javaScriptChannel = + TestJavaScriptChannel('jChannel'); + testWebView.addJavaScriptChannel(javaScriptChannel); + + final int javaScriptChannelInstanceId = + testInstanceManager.getInstanceId(javaScriptChannel)!; + verify(mockPlatformHostApi.addJavaScriptChannel( + testWebViewInstanceId, + javaScriptChannelInstanceId, + )); + }); + + test('removeJavaScriptChannel', () { + TestJavaScriptChannelHostApi.setup(MockTestJavaScriptChannelHostApi()); + JavaScriptChannel.api = JavaScriptChannelHostApiImpl( + instanceManager: testInstanceManager, + ); + + final JavaScriptChannel javaScriptChannel = + TestJavaScriptChannel('jChannel'); + + expect( + testWebView.removeJavaScriptChannel(javaScriptChannel), + completes, + ); + + testWebView.addJavaScriptChannel(javaScriptChannel); + testWebView.removeJavaScriptChannel(javaScriptChannel); + + final int javaScriptChannelInstanceId = + testInstanceManager.getInstanceId(javaScriptChannel)!; + verify(mockPlatformHostApi.removeJavaScriptChannel( + testWebViewInstanceId, + javaScriptChannelInstanceId, + )); + }); + + test('setDownloadListener', () { + TestDownloadListenerHostApi.setup(MockTestDownloadListenerHostApi()); + DownloadListener.api = DownloadListenerHostApiImpl( + instanceManager: testInstanceManager, + ); + + final DownloadListener downloadListener = TestDownloadListener(); + testWebView.setDownloadListener(downloadListener); + + final int downloadListenerInstanceId = + testInstanceManager.getInstanceId(downloadListener)!; + verify(mockPlatformHostApi.setDownloadListener( + testWebViewInstanceId, + downloadListenerInstanceId, + )); + }); + + test('setWebChromeClient', () { + // Setting a WebChromeClient requires setting a WebViewClient first. + TestWebViewClientHostApi.setup(MockTestWebViewClientHostApi()); + WebViewClient.api = WebViewClientHostApiImpl( + instanceManager: testInstanceManager, + ); + final WebViewClient webViewClient = + TestWebViewClient(shouldOverrideUrlLoading: false); + testWebView.setWebViewClient(webViewClient); + + TestWebChromeClientHostApi.setup(MockTestWebChromeClientHostApi()); + WebChromeClient.api = WebChromeClientHostApiImpl( + instanceManager: testInstanceManager, + ); + + final WebChromeClient webChromeClient = TestWebChromeClient(); + testWebView.setWebChromeClient(webChromeClient); + + final int webChromeClientInstanceId = + testInstanceManager.getInstanceId(webChromeClient)!; + verify(mockPlatformHostApi.setWebChromeClient( + testWebViewInstanceId, + webChromeClientInstanceId, + )); + }); + + test('release', () { + testWebView.release(); + verify(mockPlatformHostApi.dispose(testWebViewInstanceId)); }); }); @@ -104,7 +313,8 @@ void main() { test('create', () { final WebView webView = WebView(); - final WebViewClient webViewClient = TestWebViewClient(); + final WebViewClient webViewClient = + TestWebViewClient(shouldOverrideUrlLoading: true); webView.setWebViewClient(webViewClient); expect( @@ -160,7 +370,8 @@ void main() { test('create', () { final WebView webView = WebView(); - webView.setWebViewClient(TestWebViewClient()); + webView.setWebViewClient( + TestWebViewClient(shouldOverrideUrlLoading: true)); final WebChromeClient webChromeClient = TestWebChromeClient(); @@ -181,7 +392,10 @@ class TestJavaScriptChannel extends JavaScriptChannel { void postMessage(String message) {} } -class TestWebViewClient extends WebViewClient {} +class TestWebViewClient extends WebViewClient { + TestWebViewClient({required bool shouldOverrideUrlLoading}) + : super(shouldOverrideUrlLoading: shouldOverrideUrlLoading); +} class TestDownloadListener extends DownloadListener { @override From 42dc4bf83006dd564f6cfbd7c6cf8cce593ba47d Mon Sep 17 00:00:00 2001 From: Maurice Parrish Date: Fri, 5 Nov 2021 19:28:05 -0700 Subject: [PATCH 03/11] first callback test --- .../test/android_webview_test.dart | 305 ++++++++++------ .../test/android_webview_test.mocks.dart | 331 ++++++++++++------ 2 files changed, 412 insertions(+), 224 deletions(-) diff --git a/packages/webview_flutter/webview_flutter_android/test/android_webview_test.dart b/packages/webview_flutter/webview_flutter_android/test/android_webview_test.dart index c9cae714a0fe..e22aa0a73902 100644 --- a/packages/webview_flutter/webview_flutter_android/test/android_webview_test.dart +++ b/packages/webview_flutter/webview_flutter_android/test/android_webview_test.dart @@ -13,43 +13,42 @@ import 'android_webview.pigeon.dart'; import 'android_webview_test.mocks.dart'; @GenerateMocks([ - TestWebViewHostApi, + DownloadListener, + JavaScriptChannel, + TestDownloadListenerHostApi, + TestJavaScriptChannelHostApi, + TestWebChromeClientHostApi, TestWebSettingsHostApi, TestWebViewClientHostApi, - TestWebChromeClientHostApi, - TestJavaScriptChannelHostApi, - TestDownloadListenerHostApi + TestWebViewHostApi, + WebChromeClient, + WebViewClient, ]) void main() { TestWidgetsFlutterBinding.ensureInitialized(); group('Android WebView', () { group('$WebView', () { - late MockTestWebViewHostApi mockPlatformHostApi = - MockTestWebViewHostApi(); + late MockTestWebViewHostApi mockPlatformHostApi; - late InstanceManager testInstanceManager; - late WebViewHostApiImpl testWebViewHostApi; + late InstanceManager instanceManager; - late WebView testWebView; - late int testWebViewInstanceId; + late WebView webView; + late int webViewInstanceId; setUp(() { mockPlatformHostApi = MockTestWebViewHostApi(); TestWebViewHostApi.setup(mockPlatformHostApi); - testInstanceManager = InstanceManager(); - testWebViewHostApi = WebViewHostApiImpl( - instanceManager: testInstanceManager, - ); - WebView.api = testWebViewHostApi; + instanceManager = InstanceManager(); + WebView.api = WebViewHostApiImpl(instanceManager: instanceManager); - testWebView = WebView(); - testWebViewInstanceId = testInstanceManager.getInstanceId(testWebView)!; + webView = WebView(); + webViewInstanceId = instanceManager.getInstanceId(webView)!; }); test('create', () { - verify(mockPlatformHostApi.create(testWebViewInstanceId, false)); + verify(mockPlatformHostApi.create(webViewInstanceId, false)); }); test('setWebContentsDebuggingEnabled', () { @@ -58,99 +57,97 @@ void main() { }); test('loadUrl', () { - testWebView.loadUrl('hello', {'a': 'header'}); + webView.loadUrl('hello', {'a': 'header'}); verify(mockPlatformHostApi.loadUrl( - testWebViewInstanceId, + webViewInstanceId, 'hello', {'a': 'header'}, )); }); test('canGoBack', () { - when(mockPlatformHostApi.canGoBack(testWebViewInstanceId)) + when(mockPlatformHostApi.canGoBack(webViewInstanceId)) .thenReturn(false); - expect(testWebView.canGoBack(), completion(false)); + expect(webView.canGoBack(), completion(false)); }); test('canGoForward', () { - when(mockPlatformHostApi.canGoForward(testWebViewInstanceId)) + when(mockPlatformHostApi.canGoForward(webViewInstanceId)) .thenReturn(true); - expect(testWebView.canGoForward(), completion(true)); + expect(webView.canGoForward(), completion(true)); }); test('goBack', () { - testWebView.goBack(); - verify(mockPlatformHostApi.goBack(testWebViewInstanceId)); + webView.goBack(); + verify(mockPlatformHostApi.goBack(webViewInstanceId)); }); test('goForward', () { - testWebView.goForward(); - verify(mockPlatformHostApi.goForward(testWebViewInstanceId)); + webView.goForward(); + verify(mockPlatformHostApi.goForward(webViewInstanceId)); }); test('reload', () { - testWebView.reload(); - verify(mockPlatformHostApi.reload(testWebViewInstanceId)); + webView.reload(); + verify(mockPlatformHostApi.reload(webViewInstanceId)); }); test('clearCache', () { - testWebView.clearCache(false); - verify(mockPlatformHostApi.clearCache(testWebViewInstanceId, false)); + webView.clearCache(false); + verify(mockPlatformHostApi.clearCache(webViewInstanceId, false)); }); test('evaluateJavascript', () { when( mockPlatformHostApi.evaluateJavascript( - testWebViewInstanceId, 'runJavaScript'), + webViewInstanceId, 'runJavaScript'), ).thenAnswer((_) => Future.value('returnValue')); expect( - testWebView.evaluateJavascript('runJavaScript'), + webView.evaluateJavascript('runJavaScript'), completion('returnValue'), ); }); test('getTitle', () { - when(mockPlatformHostApi.getTitle(testWebViewInstanceId)) + when(mockPlatformHostApi.getTitle(webViewInstanceId)) .thenReturn('aTitle'); - expect(testWebView.getTitle(), completion('aTitle')); + expect(webView.getTitle(), completion('aTitle')); }); test('scrollTo', () { - testWebView.scrollTo(12, 13); - verify(mockPlatformHostApi.scrollTo(testWebViewInstanceId, 12, 13)); + webView.scrollTo(12, 13); + verify(mockPlatformHostApi.scrollTo(webViewInstanceId, 12, 13)); }); test('scrollBy', () { - testWebView.scrollBy(12, 14); - verify(mockPlatformHostApi.scrollBy(testWebViewInstanceId, 12, 14)); + webView.scrollBy(12, 14); + verify(mockPlatformHostApi.scrollBy(webViewInstanceId, 12, 14)); }); test('getScrollX', () { - when(mockPlatformHostApi.getScrollX(testWebViewInstanceId)) - .thenReturn(67); - expect(testWebView.getScrollX(), completion(67)); + when(mockPlatformHostApi.getScrollX(webViewInstanceId)).thenReturn(67); + expect(webView.getScrollX(), completion(67)); }); test('getScrollY', () { - when(mockPlatformHostApi.getScrollY(testWebViewInstanceId)) - .thenReturn(56); - expect(testWebView.getScrollY(), completion(56)); + when(mockPlatformHostApi.getScrollY(webViewInstanceId)).thenReturn(56); + expect(webView.getScrollY(), completion(56)); }); test('setWebViewClient', () { TestWebViewClientHostApi.setup(MockTestWebViewClientHostApi()); WebViewClient.api = WebViewClientHostApiImpl( - instanceManager: testInstanceManager, + instanceManager: instanceManager, ); final WebViewClient webViewClient = TestWebViewClient(shouldOverrideUrlLoading: false); - testWebView.setWebViewClient(webViewClient); + webView.setWebViewClient(webViewClient); final int webViewClientInstanceId = - testInstanceManager.getInstanceId(webViewClient)!; + instanceManager.getInstanceId(webViewClient)!; verify(mockPlatformHostApi.setWebViewClient( - testWebViewInstanceId, + webViewInstanceId, webViewClientInstanceId, )); }); @@ -158,17 +155,18 @@ void main() { test('addJavaScriptChannel', () { TestJavaScriptChannelHostApi.setup(MockTestJavaScriptChannelHostApi()); JavaScriptChannel.api = JavaScriptChannelHostApiImpl( - instanceManager: testInstanceManager, + instanceManager: instanceManager, ); - final JavaScriptChannel javaScriptChannel = - TestJavaScriptChannel('jChannel'); - testWebView.addJavaScriptChannel(javaScriptChannel); + final JavaScriptChannel mockJavaScriptChannel = MockJavaScriptChannel(); + when(mockJavaScriptChannel.channelName).thenReturn('aChannel'); + + webView.addJavaScriptChannel(mockJavaScriptChannel); final int javaScriptChannelInstanceId = - testInstanceManager.getInstanceId(javaScriptChannel)!; + instanceManager.getInstanceId(mockJavaScriptChannel)!; verify(mockPlatformHostApi.addJavaScriptChannel( - testWebViewInstanceId, + webViewInstanceId, javaScriptChannelInstanceId, )); }); @@ -176,24 +174,24 @@ void main() { test('removeJavaScriptChannel', () { TestJavaScriptChannelHostApi.setup(MockTestJavaScriptChannelHostApi()); JavaScriptChannel.api = JavaScriptChannelHostApiImpl( - instanceManager: testInstanceManager, + instanceManager: instanceManager, ); - final JavaScriptChannel javaScriptChannel = - TestJavaScriptChannel('jChannel'); + final JavaScriptChannel mockJavaScriptChannel = MockJavaScriptChannel(); + when(mockJavaScriptChannel.channelName).thenReturn('aChannel'); expect( - testWebView.removeJavaScriptChannel(javaScriptChannel), + webView.removeJavaScriptChannel(mockJavaScriptChannel), completes, ); - testWebView.addJavaScriptChannel(javaScriptChannel); - testWebView.removeJavaScriptChannel(javaScriptChannel); + webView.addJavaScriptChannel(mockJavaScriptChannel); + webView.removeJavaScriptChannel(mockJavaScriptChannel); final int javaScriptChannelInstanceId = - testInstanceManager.getInstanceId(javaScriptChannel)!; + instanceManager.getInstanceId(mockJavaScriptChannel)!; verify(mockPlatformHostApi.removeJavaScriptChannel( - testWebViewInstanceId, + webViewInstanceId, javaScriptChannelInstanceId, )); }); @@ -201,16 +199,16 @@ void main() { test('setDownloadListener', () { TestDownloadListenerHostApi.setup(MockTestDownloadListenerHostApi()); DownloadListener.api = DownloadListenerHostApiImpl( - instanceManager: testInstanceManager, + instanceManager: instanceManager, ); final DownloadListener downloadListener = TestDownloadListener(); - testWebView.setDownloadListener(downloadListener); + webView.setDownloadListener(downloadListener); final int downloadListenerInstanceId = - testInstanceManager.getInstanceId(downloadListener)!; + instanceManager.getInstanceId(downloadListener)!; verify(mockPlatformHostApi.setDownloadListener( - testWebViewInstanceId, + webViewInstanceId, downloadListenerInstanceId, )); }); @@ -219,81 +217,177 @@ void main() { // Setting a WebChromeClient requires setting a WebViewClient first. TestWebViewClientHostApi.setup(MockTestWebViewClientHostApi()); WebViewClient.api = WebViewClientHostApiImpl( - instanceManager: testInstanceManager, + instanceManager: instanceManager, ); final WebViewClient webViewClient = TestWebViewClient(shouldOverrideUrlLoading: false); - testWebView.setWebViewClient(webViewClient); + webView.setWebViewClient(webViewClient); TestWebChromeClientHostApi.setup(MockTestWebChromeClientHostApi()); WebChromeClient.api = WebChromeClientHostApiImpl( - instanceManager: testInstanceManager, + instanceManager: instanceManager, ); final WebChromeClient webChromeClient = TestWebChromeClient(); - testWebView.setWebChromeClient(webChromeClient); + webView.setWebChromeClient(webChromeClient); final int webChromeClientInstanceId = - testInstanceManager.getInstanceId(webChromeClient)!; + instanceManager.getInstanceId(webChromeClient)!; verify(mockPlatformHostApi.setWebChromeClient( - testWebViewInstanceId, + webViewInstanceId, webChromeClientInstanceId, )); }); test('release', () { - testWebView.release(); - verify(mockPlatformHostApi.dispose(testWebViewInstanceId)); + webView.release(); + verify(mockPlatformHostApi.dispose(webViewInstanceId)); }); }); group('$WebSettings', () { - setUpAll(() { - TestWebViewHostApi.setup(MockTestWebViewHostApi()); - TestWebSettingsHostApi.setup(MockTestWebSettingsHostApi()); - }); + late MockTestWebSettingsHostApi mockPlatformHostApi; + + late InstanceManager instanceManager; + + late WebSettings webSettings; + late int webSettingsInstanceId; setUp(() { - final InstanceManager instanceManager = InstanceManager(); + instanceManager = InstanceManager(); + + TestWebViewHostApi.setup(MockTestWebViewHostApi()); WebView.api = WebViewHostApiImpl(instanceManager: instanceManager); + + mockPlatformHostApi = MockTestWebSettingsHostApi(); + TestWebSettingsHostApi.setup(mockPlatformHostApi); + WebSettings.api = WebSettingsHostApiImpl( instanceManager: instanceManager, ); + + webSettings = WebSettings(WebView()); + webSettingsInstanceId = instanceManager.getInstanceId(webSettings)!; }); test('create', () { - final WebView webView = WebView(); - final WebSettings webSettings = WebSettings(webView); - expect( - WebSettings.api.instanceManager.getInstanceId(webSettings), - isNotNull, - ); + verify(mockPlatformHostApi.create(webSettingsInstanceId, any)); + }); + + test('setDomStorageEnabled', () { + webSettings.setDomStorageEnabled(false); + verify(mockPlatformHostApi.setDomStorageEnabled( + webSettingsInstanceId, + false, + )); + }); + + test('setJavaScriptCanOpenWindowsAutomatically', () { + webSettings.setJavaScriptCanOpenWindowsAutomatically(true); + verify(mockPlatformHostApi.setJavaScriptCanOpenWindowsAutomatically( + webSettingsInstanceId, + true, + )); + }); + + test('setSupportMultipleWindows', () { + webSettings.setSupportMultipleWindows(false); + verify(mockPlatformHostApi.setSupportMultipleWindows( + webSettingsInstanceId, + false, + )); + }); + + test('setJavaScriptEnabled', () { + webSettings.setJavaScriptEnabled(true); + verify(mockPlatformHostApi.setJavaScriptEnabled( + webSettingsInstanceId, + true, + )); + }); + + test('setUserAgentString', () { + webSettings.setUserAgentString('hola'); + verify(mockPlatformHostApi.setUserAgentString( + webSettingsInstanceId, + 'hola', + )); + }); + + test('setMediaPlaybackRequiresUserGesture', () { + webSettings.setMediaPlaybackRequiresUserGesture(false); + verify(mockPlatformHostApi.setMediaPlaybackRequiresUserGesture( + webSettingsInstanceId, + false, + )); + }); + + test('setSupportZoom', () { + webSettings.setSupportZoom(true); + verify(mockPlatformHostApi.setSupportZoom( + webSettingsInstanceId, + true, + )); + }); + + test('setLoadWithOverviewMode', () { + webSettings.setLoadWithOverviewMode(false); + verify(mockPlatformHostApi.setLoadWithOverviewMode( + webSettingsInstanceId, + false, + )); + }); + + test('setUseWideViewPort', () { + webSettings.setUseWideViewPort(true); + verify(mockPlatformHostApi.setUseWideViewPort( + webSettingsInstanceId, + true, + )); + }); + + test('setDisplayZoomControls', () { + webSettings.setDisplayZoomControls(false); + verify(mockPlatformHostApi.setDisplayZoomControls( + webSettingsInstanceId, + false, + )); + }); + + test('setBuiltInZoomControls', () { + webSettings.setBuiltInZoomControls(true); + verify(mockPlatformHostApi.setBuiltInZoomControls( + webSettingsInstanceId, + true, + )); }); }); group('$JavaScriptChannel', () { - setUpAll(() { - TestWebViewHostApi.setup(MockTestWebViewHostApi()); - TestJavaScriptChannelHostApi.setup(MockTestJavaScriptChannelHostApi()); - }); + late JavaScriptChannelFlutterApiImpl flutterApi; + + late InstanceManager instanceManager; + + late MockJavaScriptChannel mockJavaScriptChannel; + late int mockJavaScriptChannelInstanceId; setUp(() { - final InstanceManager instanceManager = InstanceManager(); - WebView.api = WebViewHostApiImpl(instanceManager: instanceManager); - JavaScriptChannel.api = JavaScriptChannelHostApiImpl( + instanceManager = InstanceManager(); + flutterApi = JavaScriptChannelFlutterApiImpl( instanceManager: instanceManager, ); - }); - test('create', () { - final WebView webView = WebView(); - final JavaScriptChannel channel = TestJavaScriptChannel('myChannel'); + mockJavaScriptChannel = MockJavaScriptChannel(); + mockJavaScriptChannelInstanceId = + instanceManager.tryAddInstance(mockJavaScriptChannel)!; + }); - webView.addJavaScriptChannel(channel); - expect( - JavaScriptChannel.api.instanceManager.getInstanceId(channel), - isNotNull, + test('postMessage', () { + flutterApi.postMessage( + mockJavaScriptChannelInstanceId, + 'Hello, World!', ); + verify(mockJavaScriptChannel.postMessage('Hello, World!')); }); }); @@ -385,13 +479,6 @@ void main() { }); } -class TestJavaScriptChannel extends JavaScriptChannel { - TestJavaScriptChannel(String channelName) : super(channelName); - - @override - void postMessage(String message) {} -} - class TestWebViewClient extends WebViewClient { TestWebViewClient({required bool shouldOverrideUrlLoading}) : super(shouldOverrideUrlLoading: shouldOverrideUrlLoading); diff --git a/packages/webview_flutter/webview_flutter_android/test/android_webview_test.mocks.dart b/packages/webview_flutter/webview_flutter_android/test/android_webview_test.mocks.dart index 57ab9e82ac1c..fda4734340bf 100644 --- a/packages/webview_flutter/webview_flutter_android/test/android_webview_test.mocks.dart +++ b/packages/webview_flutter/webview_flutter_android/test/android_webview_test.mocks.dart @@ -6,11 +6,12 @@ // in webview_flutter_android/test/android_webview_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_android/src/android_webview.dart' as _i2; -import 'android_webview.pigeon.dart' as _i2; +import 'android_webview.pigeon.dart' as _i3; // ignore_for_file: avoid_redundant_argument_values // ignore_for_file: avoid_setters_without_getters @@ -21,120 +22,92 @@ import 'android_webview.pigeon.dart' as _i2; // ignore_for_file: unnecessary_parenthesis // ignore_for_file: camel_case_types -/// A class which mocks [TestWebViewHostApi]. +/// A class which mocks [DownloadListener]. /// /// See the documentation for Mockito's code generation for more information. -class MockTestWebViewHostApi extends _i1.Mock - implements _i2.TestWebViewHostApi { - MockTestWebViewHostApi() { +class MockDownloadListener extends _i1.Mock implements _i2.DownloadListener { + MockDownloadListener() { _i1.throwOnMissingStub(this); } @override - void create(int? instanceId, bool? useHybridComposition) => - super.noSuchMethod( - Invocation.method(#create, [instanceId, useHybridComposition]), - returnValueForMissingStub: null); - @override - void dispose(int? instanceId) => - super.noSuchMethod(Invocation.method(#dispose, [instanceId]), - returnValueForMissingStub: null); - @override - void loadUrl(int? instanceId, String? url, Map? headers) => - super.noSuchMethod( - Invocation.method(#loadUrl, [instanceId, url, headers]), - returnValueForMissingStub: null); - @override - String getUrl(int? instanceId) => - (super.noSuchMethod(Invocation.method(#getUrl, [instanceId]), - returnValue: '') as String); - @override - bool canGoBack(int? instanceId) => - (super.noSuchMethod(Invocation.method(#canGoBack, [instanceId]), - returnValue: false) as bool); - @override - bool canGoForward(int? instanceId) => - (super.noSuchMethod(Invocation.method(#canGoForward, [instanceId]), - returnValue: false) as bool); - @override - void goBack(int? instanceId) => - super.noSuchMethod(Invocation.method(#goBack, [instanceId]), - returnValueForMissingStub: null); - @override - void goForward(int? instanceId) => - super.noSuchMethod(Invocation.method(#goForward, [instanceId]), - returnValueForMissingStub: null); - @override - void reload(int? instanceId) => - super.noSuchMethod(Invocation.method(#reload, [instanceId]), - returnValueForMissingStub: null); - @override - void clearCache(int? instanceId, bool? includeDiskFiles) => + void onDownloadStart(String? url, String? userAgent, + String? contentDisposition, String? mimetype, int? contentLength) => super.noSuchMethod( - Invocation.method(#clearCache, [instanceId, includeDiskFiles]), + Invocation.method(#onDownloadStart, + [url, userAgent, contentDisposition, mimetype, contentLength]), returnValueForMissingStub: null); @override - _i3.Future evaluateJavascript( - int? instanceId, String? javascriptString) => - (super.noSuchMethod( - Invocation.method( - #evaluateJavascript, [instanceId, javascriptString]), - returnValue: Future.value('')) as _i3.Future); - @override - String getTitle(int? instanceId) => - (super.noSuchMethod(Invocation.method(#getTitle, [instanceId]), - returnValue: '') as String); + String toString() => super.toString(); +} + +/// A class which mocks [JavaScriptChannel]. +/// +/// See the documentation for Mockito's code generation for more information. +class MockJavaScriptChannel extends _i1.Mock implements _i2.JavaScriptChannel { + MockJavaScriptChannel() { + _i1.throwOnMissingStub(this); + } + @override - void scrollTo(int? instanceId, int? x, int? y) => - super.noSuchMethod(Invocation.method(#scrollTo, [instanceId, x, y]), - returnValueForMissingStub: null); + String get channelName => + (super.noSuchMethod(Invocation.getter(#channelName), returnValue: '') + as String); @override - void scrollBy(int? instanceId, int? x, int? y) => - super.noSuchMethod(Invocation.method(#scrollBy, [instanceId, x, y]), + void postMessage(String? message) => + super.noSuchMethod(Invocation.method(#postMessage, [message]), returnValueForMissingStub: null); @override - int getScrollX(int? instanceId) => - (super.noSuchMethod(Invocation.method(#getScrollX, [instanceId]), - returnValue: 0) as int); - @override - int getScrollY(int? instanceId) => - (super.noSuchMethod(Invocation.method(#getScrollY, [instanceId]), - returnValue: 0) as int); - @override - void setWebContentsDebuggingEnabled(bool? enabled) => super.noSuchMethod( - Invocation.method(#setWebContentsDebuggingEnabled, [enabled]), - returnValueForMissingStub: null); + String toString() => super.toString(); +} + +/// A class which mocks [TestDownloadListenerHostApi]. +/// +/// See the documentation for Mockito's code generation for more information. +class MockTestDownloadListenerHostApi extends _i1.Mock + implements _i3.TestDownloadListenerHostApi { + MockTestDownloadListenerHostApi() { + _i1.throwOnMissingStub(this); + } + @override - void setWebViewClient(int? instanceId, int? webViewClientInstanceId) => - super.noSuchMethod( - Invocation.method( - #setWebViewClient, [instanceId, webViewClientInstanceId]), + void create(int? instanceId) => + super.noSuchMethod(Invocation.method(#create, [instanceId]), returnValueForMissingStub: null); @override - void addJavaScriptChannel( - int? instanceId, int? javaScriptChannelInstanceId) => - super.noSuchMethod( - Invocation.method( - #addJavaScriptChannel, [instanceId, javaScriptChannelInstanceId]), - returnValueForMissingStub: null); + String toString() => super.toString(); +} + +/// A class which mocks [TestJavaScriptChannelHostApi]. +/// +/// See the documentation for Mockito's code generation for more information. +class MockTestJavaScriptChannelHostApi extends _i1.Mock + implements _i3.TestJavaScriptChannelHostApi { + MockTestJavaScriptChannelHostApi() { + _i1.throwOnMissingStub(this); + } + @override - void removeJavaScriptChannel( - int? instanceId, int? javaScriptChannelInstanceId) => - super.noSuchMethod( - Invocation.method(#removeJavaScriptChannel, - [instanceId, javaScriptChannelInstanceId]), + void create(int? instanceId, String? channelName) => + super.noSuchMethod(Invocation.method(#create, [instanceId, channelName]), returnValueForMissingStub: null); @override - void setDownloadListener(int? instanceId, int? listenerInstanceId) => - super.noSuchMethod( - Invocation.method( - #setDownloadListener, [instanceId, listenerInstanceId]), - returnValueForMissingStub: null); + String toString() => super.toString(); +} + +/// A class which mocks [TestWebChromeClientHostApi]. +/// +/// See the documentation for Mockito's code generation for more information. +class MockTestWebChromeClientHostApi extends _i1.Mock + implements _i3.TestWebChromeClientHostApi { + MockTestWebChromeClientHostApi() { + _i1.throwOnMissingStub(this); + } + @override - void setWebChromeClient(int? instanceId, int? clientInstanceId) => + void create(int? instanceId, int? webViewClientInstanceId) => super.noSuchMethod( - Invocation.method( - #setWebChromeClient, [instanceId, clientInstanceId]), + Invocation.method(#create, [instanceId, webViewClientInstanceId]), returnValueForMissingStub: null); @override String toString() => super.toString(); @@ -144,7 +117,7 @@ class MockTestWebViewHostApi extends _i1.Mock /// /// See the documentation for Mockito's code generation for more information. class MockTestWebSettingsHostApi extends _i1.Mock - implements _i2.TestWebSettingsHostApi { + implements _i3.TestWebSettingsHostApi { MockTestWebSettingsHostApi() { _i1.throwOnMissingStub(this); } @@ -218,7 +191,7 @@ class MockTestWebSettingsHostApi extends _i1.Mock /// /// See the documentation for Mockito's code generation for more information. class MockTestWebViewClientHostApi extends _i1.Mock - implements _i2.TestWebViewClientHostApi { + implements _i3.TestWebViewClientHostApi { MockTestWebViewClientHostApi() { _i1.throwOnMissingStub(this); } @@ -232,53 +205,181 @@ class MockTestWebViewClientHostApi extends _i1.Mock String toString() => super.toString(); } -/// A class which mocks [TestWebChromeClientHostApi]. +/// A class which mocks [TestWebViewHostApi]. /// /// See the documentation for Mockito's code generation for more information. -class MockTestWebChromeClientHostApi extends _i1.Mock - implements _i2.TestWebChromeClientHostApi { - MockTestWebChromeClientHostApi() { +class MockTestWebViewHostApi extends _i1.Mock + implements _i3.TestWebViewHostApi { + MockTestWebViewHostApi() { _i1.throwOnMissingStub(this); } @override - void create(int? instanceId, int? webViewClientInstanceId) => + void create(int? instanceId, bool? useHybridComposition) => super.noSuchMethod( - Invocation.method(#create, [instanceId, webViewClientInstanceId]), + Invocation.method(#create, [instanceId, useHybridComposition]), + returnValueForMissingStub: null); + @override + void dispose(int? instanceId) => + super.noSuchMethod(Invocation.method(#dispose, [instanceId]), + returnValueForMissingStub: null); + @override + void loadUrl(int? instanceId, String? url, Map? headers) => + super.noSuchMethod( + Invocation.method(#loadUrl, [instanceId, url, headers]), + returnValueForMissingStub: null); + @override + String getUrl(int? instanceId) => + (super.noSuchMethod(Invocation.method(#getUrl, [instanceId]), + returnValue: '') as String); + @override + bool canGoBack(int? instanceId) => + (super.noSuchMethod(Invocation.method(#canGoBack, [instanceId]), + returnValue: false) as bool); + @override + bool canGoForward(int? instanceId) => + (super.noSuchMethod(Invocation.method(#canGoForward, [instanceId]), + returnValue: false) as bool); + @override + void goBack(int? instanceId) => + super.noSuchMethod(Invocation.method(#goBack, [instanceId]), + returnValueForMissingStub: null); + @override + void goForward(int? instanceId) => + super.noSuchMethod(Invocation.method(#goForward, [instanceId]), + returnValueForMissingStub: null); + @override + void reload(int? instanceId) => + super.noSuchMethod(Invocation.method(#reload, [instanceId]), + returnValueForMissingStub: null); + @override + void clearCache(int? instanceId, bool? includeDiskFiles) => + super.noSuchMethod( + Invocation.method(#clearCache, [instanceId, includeDiskFiles]), + returnValueForMissingStub: null); + @override + _i4.Future evaluateJavascript( + int? instanceId, String? javascriptString) => + (super.noSuchMethod( + Invocation.method( + #evaluateJavascript, [instanceId, javascriptString]), + returnValue: Future.value('')) as _i4.Future); + @override + String getTitle(int? instanceId) => + (super.noSuchMethod(Invocation.method(#getTitle, [instanceId]), + returnValue: '') as String); + @override + void scrollTo(int? instanceId, int? x, int? y) => + super.noSuchMethod(Invocation.method(#scrollTo, [instanceId, x, y]), + returnValueForMissingStub: null); + @override + void scrollBy(int? instanceId, int? x, int? y) => + super.noSuchMethod(Invocation.method(#scrollBy, [instanceId, x, y]), + returnValueForMissingStub: null); + @override + int getScrollX(int? instanceId) => + (super.noSuchMethod(Invocation.method(#getScrollX, [instanceId]), + returnValue: 0) as int); + @override + int getScrollY(int? instanceId) => + (super.noSuchMethod(Invocation.method(#getScrollY, [instanceId]), + returnValue: 0) as int); + @override + void setWebContentsDebuggingEnabled(bool? enabled) => super.noSuchMethod( + Invocation.method(#setWebContentsDebuggingEnabled, [enabled]), + returnValueForMissingStub: null); + @override + void setWebViewClient(int? instanceId, int? webViewClientInstanceId) => + super.noSuchMethod( + Invocation.method( + #setWebViewClient, [instanceId, webViewClientInstanceId]), + returnValueForMissingStub: null); + @override + void addJavaScriptChannel( + int? instanceId, int? javaScriptChannelInstanceId) => + super.noSuchMethod( + Invocation.method( + #addJavaScriptChannel, [instanceId, javaScriptChannelInstanceId]), + returnValueForMissingStub: null); + @override + void removeJavaScriptChannel( + int? instanceId, int? javaScriptChannelInstanceId) => + super.noSuchMethod( + Invocation.method(#removeJavaScriptChannel, + [instanceId, javaScriptChannelInstanceId]), + returnValueForMissingStub: null); + @override + void setDownloadListener(int? instanceId, int? listenerInstanceId) => + super.noSuchMethod( + Invocation.method( + #setDownloadListener, [instanceId, listenerInstanceId]), + returnValueForMissingStub: null); + @override + void setWebChromeClient(int? instanceId, int? clientInstanceId) => + super.noSuchMethod( + Invocation.method( + #setWebChromeClient, [instanceId, clientInstanceId]), returnValueForMissingStub: null); @override String toString() => super.toString(); } -/// A class which mocks [TestJavaScriptChannelHostApi]. +/// A class which mocks [WebChromeClient]. /// /// See the documentation for Mockito's code generation for more information. -class MockTestJavaScriptChannelHostApi extends _i1.Mock - implements _i2.TestJavaScriptChannelHostApi { - MockTestJavaScriptChannelHostApi() { +class MockWebChromeClient extends _i1.Mock implements _i2.WebChromeClient { + MockWebChromeClient() { _i1.throwOnMissingStub(this); } @override - void create(int? instanceId, String? channelName) => - super.noSuchMethod(Invocation.method(#create, [instanceId, channelName]), + void onProgressChanged(_i2.WebView? webView, int? progress) => super + .noSuchMethod(Invocation.method(#onProgressChanged, [webView, progress]), returnValueForMissingStub: null); @override String toString() => super.toString(); } -/// A class which mocks [TestDownloadListenerHostApi]. +/// A class which mocks [WebViewClient]. /// /// See the documentation for Mockito's code generation for more information. -class MockTestDownloadListenerHostApi extends _i1.Mock - implements _i2.TestDownloadListenerHostApi { - MockTestDownloadListenerHostApi() { +class MockWebViewClient extends _i1.Mock implements _i2.WebViewClient { + MockWebViewClient() { _i1.throwOnMissingStub(this); } @override - void create(int? instanceId) => - super.noSuchMethod(Invocation.method(#create, [instanceId]), + bool get shouldOverrideUrlLoading => + (super.noSuchMethod(Invocation.getter(#shouldOverrideUrlLoading), + returnValue: false) as bool); + @override + void onPageStarted(_i2.WebView? webView, String? url) => + super.noSuchMethod(Invocation.method(#onPageStarted, [webView, url]), + returnValueForMissingStub: null); + @override + void onPageFinished(_i2.WebView? webView, String? url) => + super.noSuchMethod(Invocation.method(#onPageFinished, [webView, url]), + returnValueForMissingStub: null); + @override + void onReceivedRequestError(_i2.WebView? webView, + _i2.WebResourceRequest? request, _i2.WebResourceError? error) => + super.noSuchMethod( + Invocation.method(#onReceivedRequestError, [webView, request, error]), + returnValueForMissingStub: null); + @override + void onReceivedError(_i2.WebView? webView, int? errorCode, + String? description, String? failingUrl) => + super.noSuchMethod( + Invocation.method( + #onReceivedError, [webView, errorCode, description, failingUrl]), + returnValueForMissingStub: null); + @override + void requestLoading(_i2.WebView? webView, _i2.WebResourceRequest? request) => + super.noSuchMethod(Invocation.method(#requestLoading, [webView, request]), + returnValueForMissingStub: null); + @override + void urlLoading(_i2.WebView? webView, String? url) => + super.noSuchMethod(Invocation.method(#urlLoading, [webView, url]), returnValueForMissingStub: null); @override String toString() => super.toString(); From 1dac6179d98e4b62a8ce495b3690702ca8ff00a5 Mon Sep 17 00:00:00 2001 From: Maurice Parrish Date: Fri, 5 Nov 2021 22:18:43 -0700 Subject: [PATCH 04/11] finish comprehensive testing --- .../lib/src/android_webview.dart | 18 +- .../lib/src/android_webview_api_impls.dart | 45 ++-- .../test/android_webview_test.dart | 253 ++++++++++++------ .../test/android_webview_test.mocks.dart | 119 ++++++++ 4 files changed, 320 insertions(+), 115 deletions(-) diff --git a/packages/webview_flutter/webview_flutter_android/lib/src/android_webview.dart b/packages/webview_flutter/webview_flutter_android/lib/src/android_webview.dart index 1577c18ce3c8..98cf4dbeb5ba 100644 --- a/packages/webview_flutter/webview_flutter_android/lib/src/android_webview.dart +++ b/packages/webview_flutter/webview_flutter_android/lib/src/android_webview.dart @@ -417,7 +417,7 @@ abstract class JavaScriptChannel { final String channelName; /// Callback method when javaScript calls `postMessage` on the object instance passed. - void postMessage(String message) {} + void postMessage(String message); } /// Receive various notifications and requests for [WebView]. @@ -605,7 +605,7 @@ abstract class WebChromeClient { static WebChromeClientHostApiImpl api = WebChromeClientHostApiImpl(); /// Notify the host application that a file should be downloaded. - void onProgressChanged(WebView webView, int progress); + void onProgressChanged(WebView webView, int progress) {} } /// Encompasses parameters to the [WebViewClient.requestLoading] method. @@ -620,24 +620,24 @@ class WebResourceRequest { required this.requestHeaders, }); - /// Gets the URL for which the resource request was made. + /// The URL for which the resource request was made. final String url; - /// Gets whether the request was made in order to fetch the main frame's document. - final isForMainFrame; + /// Whether the request was made in order to fetch the main frame's document. + final bool isForMainFrame; - /// Gets whether the request was a result of a server-side redirect. + /// Whether the request was a result of a server-side redirect. /// /// Only supported on Android version >= 24. final bool? isRedirect; - /// Gets whether a gesture (such as a click) was associated with the request. + /// Whether a gesture (such as a click) was associated with the request. final bool hasGesture; - /// Gets the method associated with the request, for example "GET". + /// The method associated with the request, for example "GET". final String method; - /// Gets the headers associated with the request. + /// The headers associated with the request. final Map requestHeaders; } diff --git a/packages/webview_flutter/webview_flutter_android/lib/src/android_webview_api_impls.dart b/packages/webview_flutter/webview_flutter_android/lib/src/android_webview_api_impls.dart index 78790cf2c6d7..b8aff73b8c50 100644 --- a/packages/webview_flutter/webview_flutter_android/lib/src/android_webview_api_impls.dart +++ b/packages/webview_flutter/webview_flutter_android/lib/src/android_webview_api_impls.dart @@ -8,6 +8,27 @@ import 'android_webview.dart'; import 'android_webview.pigeon.dart'; import 'instance_manager.dart'; +/// Converts [WebResourceRequestData] to [WebResourceRequest] +WebResourceRequest _toWebResourceRequest(WebResourceRequestData data) { + return WebResourceRequest( + url: data.url!, + isForMainFrame: data.isForMainFrame!, + isRedirect: data.isRedirect, + hasGesture: data.hasGesture!, + method: data.method!, + requestHeaders: + data.requestHeaders?.cast() ?? {}, + ); +} + +/// Converts [WebResourceErrorData] to [WebResourceError]. +WebResourceError _toWebResourceError(WebResourceErrorData data) { + return WebResourceError( + errorCode: data.errorCode!, + description: data.description!, + ); +} + /// Host api implementation for [WebView]. class WebViewHostApiImpl extends WebViewHostApi { /// Constructs a [WebViewHostApiImpl]. @@ -449,18 +470,8 @@ class WebViewClientFlutterApiImpl extends WebViewClientFlutterApi { instanceManager.getInstance(instanceId) as WebViewClient; instance.onReceivedRequestError( instanceManager.getInstance(webViewInstanceId) as WebView, - WebResourceRequest( - url: request.url!, - isForMainFrame: request.isForMainFrame!, - isRedirect: request.isRedirect, - hasGesture: request.hasGesture!, - method: request.method!, - requestHeaders: request.requestHeaders!.cast(), - ), - WebResourceError( - errorCode: error.errorCode!, - description: error.description!, - ), + _toWebResourceRequest(request), + _toWebResourceError(error), ); } @@ -474,15 +485,7 @@ class WebViewClientFlutterApiImpl extends WebViewClientFlutterApi { instanceManager.getInstance(instanceId) as WebViewClient; instance.requestLoading( instanceManager.getInstance(webViewInstanceId) as WebView, - WebResourceRequest( - url: request.url!, - isForMainFrame: request.isForMainFrame!, - isRedirect: request.isRedirect, - hasGesture: request.hasGesture!, - method: request.method!, - requestHeaders: request.requestHeaders?.cast() ?? - {}, - ), + _toWebResourceRequest(request), ); } diff --git a/packages/webview_flutter/webview_flutter_android/test/android_webview_test.dart b/packages/webview_flutter/webview_flutter_android/test/android_webview_test.dart index e22aa0a73902..79049800290c 100644 --- a/packages/webview_flutter/webview_flutter_android/test/android_webview_test.dart +++ b/packages/webview_flutter/webview_flutter_android/test/android_webview_test.dart @@ -6,6 +6,7 @@ import 'package:flutter_test/flutter_test.dart'; import 'package:mockito/annotations.dart'; import 'package:mockito/mockito.dart'; import 'package:webview_flutter_android/src/android_webview.dart'; +import 'package:webview_flutter_android/src/android_webview.pigeon.dart'; import 'package:webview_flutter_android/src/android_webview_api_impls.dart'; import 'package:webview_flutter_android/src/instance_manager.dart'; @@ -22,6 +23,7 @@ import 'android_webview_test.mocks.dart'; TestWebViewClientHostApi, TestWebViewHostApi, WebChromeClient, + WebView, WebViewClient, ]) void main() { @@ -140,12 +142,12 @@ void main() { instanceManager: instanceManager, ); - final WebViewClient webViewClient = - TestWebViewClient(shouldOverrideUrlLoading: false); - webView.setWebViewClient(webViewClient); + final WebViewClient mockWebViewClient = MockWebViewClient(); + when(mockWebViewClient.shouldOverrideUrlLoading).thenReturn(false); + webView.setWebViewClient(mockWebViewClient); final int webViewClientInstanceId = - instanceManager.getInstanceId(webViewClient)!; + instanceManager.getInstanceId(mockWebViewClient)!; verify(mockPlatformHostApi.setWebViewClient( webViewInstanceId, webViewClientInstanceId, @@ -202,11 +204,11 @@ void main() { instanceManager: instanceManager, ); - final DownloadListener downloadListener = TestDownloadListener(); - webView.setDownloadListener(downloadListener); + final DownloadListener mockDownloadListener = MockDownloadListener(); + webView.setDownloadListener(mockDownloadListener); final int downloadListenerInstanceId = - instanceManager.getInstanceId(downloadListener)!; + instanceManager.getInstanceId(mockDownloadListener)!; verify(mockPlatformHostApi.setDownloadListener( webViewInstanceId, downloadListenerInstanceId, @@ -219,20 +221,20 @@ void main() { WebViewClient.api = WebViewClientHostApiImpl( instanceManager: instanceManager, ); - final WebViewClient webViewClient = - TestWebViewClient(shouldOverrideUrlLoading: false); - webView.setWebViewClient(webViewClient); + final WebViewClient mockWebViewClient = MockWebViewClient(); + when(mockWebViewClient.shouldOverrideUrlLoading).thenReturn(false); + webView.setWebViewClient(mockWebViewClient); TestWebChromeClientHostApi.setup(MockTestWebChromeClientHostApi()); WebChromeClient.api = WebChromeClientHostApiImpl( instanceManager: instanceManager, ); - final WebChromeClient webChromeClient = TestWebChromeClient(); - webView.setWebChromeClient(webChromeClient); + final WebChromeClient mockWebChromeClient = MockWebChromeClient(); + webView.setWebChromeClient(mockWebChromeClient); final int webChromeClientInstanceId = - instanceManager.getInstanceId(webChromeClient)!; + instanceManager.getInstanceId(mockWebChromeClient)!; verify(mockPlatformHostApi.setWebChromeClient( webViewInstanceId, webChromeClientInstanceId, @@ -392,110 +394,191 @@ void main() { }); group('$WebViewClient', () { - setUpAll(() { - TestWebViewHostApi.setup(MockTestWebViewHostApi()); - TestWebViewClientHostApi.setup(MockTestWebViewClientHostApi()); - }); + late WebViewClientFlutterApiImpl flutterApi; + + late InstanceManager instanceManager; + + late MockWebViewClient mockWebViewClient; + late int mockWebViewClientInstanceId; + + late MockWebView mockWebView; + late int mockWebViewInstanceId; setUp(() { - final InstanceManager instanceManager = InstanceManager(); - WebView.api = WebViewHostApiImpl(instanceManager: instanceManager); - WebViewClient.api = WebViewClientHostApiImpl( + instanceManager = InstanceManager(); + flutterApi = WebViewClientFlutterApiImpl( instanceManager: instanceManager, ); + + mockWebViewClient = MockWebViewClient(); + mockWebViewClientInstanceId = + instanceManager.tryAddInstance(mockWebViewClient)!; + + mockWebView = MockWebView(); + mockWebViewInstanceId = instanceManager.tryAddInstance(mockWebView)!; }); - test('create', () { - final WebView webView = WebView(); - final WebViewClient webViewClient = - TestWebViewClient(shouldOverrideUrlLoading: true); + test('onPageStarted', () { + flutterApi.onPageStarted( + mockWebViewClientInstanceId, + mockWebViewInstanceId, + 'https://www.google.com', + ); + verify(mockWebViewClient.onPageStarted( + mockWebView, + 'https://www.google.com', + )); + }); - webView.setWebViewClient(webViewClient); - expect( - WebViewClient.api.instanceManager.getInstanceId(webViewClient), - isNotNull, + test('onPageFinished', () { + flutterApi.onPageFinished( + mockWebViewClientInstanceId, + mockWebViewInstanceId, + 'https://www.google.com', + ); + verify(mockWebViewClient.onPageFinished( + mockWebView, + 'https://www.google.com', + )); + }); + + test('onReceivedRequestError', () { + flutterApi.onReceivedRequestError( + mockWebViewClientInstanceId, + mockWebViewInstanceId, + WebResourceRequestData() + ..url = 'https://www.google.com' + ..isForMainFrame = true + ..hasGesture = true + ..method = 'POST', + WebResourceErrorData() + ..errorCode = 34 + ..description = 'error description', + ); + + verify(mockWebViewClient.onReceivedRequestError( + mockWebView, + argThat(isNotNull), + argThat(isNotNull), + )); + }); + + test('onReceivedError', () { + flutterApi.onReceivedError( + mockWebViewClientInstanceId, + mockWebViewInstanceId, + 14, + 'desc', + 'https://www.google.com', ); + + verify(mockWebViewClient.onReceivedError( + mockWebView, + 14, + 'desc', + 'https://www.google.com', + )); + }); + + test('requestLoading', () { + flutterApi.requestLoading( + mockWebViewClientInstanceId, + mockWebViewInstanceId, + WebResourceRequestData() + ..url = 'https://www.google.com' + ..isForMainFrame = true + ..hasGesture = true + ..method = 'POST', + ); + + verify(mockWebViewClient.requestLoading( + mockWebView, + argThat(isNotNull), + )); + }); + + test('urlLoading', () { + flutterApi.urlLoading(mockWebViewClientInstanceId, + mockWebViewInstanceId, 'https://www.google.com'); + + verify(mockWebViewClient.urlLoading( + mockWebView, + 'https://www.google.com', + )); }); }); group('$DownloadListener', () { - setUpAll(() { - TestWebViewHostApi.setup(MockTestWebViewHostApi()); - TestDownloadListenerHostApi.setup(MockTestDownloadListenerHostApi()); - }); + late DownloadListenerFlutterApiImpl flutterApi; + + late InstanceManager instanceManager; + + late MockDownloadListener mockDownloadListener; + late int mockDownloadListenerInstanceId; setUp(() { - final InstanceManager instanceManager = InstanceManager(); - WebView.api = WebViewHostApiImpl(instanceManager: instanceManager); - DownloadListener.api = DownloadListenerHostApiImpl( + instanceManager = InstanceManager(); + flutterApi = DownloadListenerFlutterApiImpl( instanceManager: instanceManager, ); - }); - test('create', () { - final WebView webView = WebView(); - final DownloadListener downloadListener = TestDownloadListener(); + mockDownloadListener = MockDownloadListener(); + mockDownloadListenerInstanceId = + instanceManager.tryAddInstance(mockDownloadListener)!; + }); - webView.setDownloadListener(downloadListener); - expect( - DownloadListener.api.instanceManager.getInstanceId(downloadListener), - isNotNull, + test('onPageStarted', () { + flutterApi.onDownloadStart( + mockDownloadListenerInstanceId, + 'url', + 'userAgent', + 'contentDescription', + 'mimetype', + 45, ); + verify(mockDownloadListener.onDownloadStart( + 'url', + 'userAgent', + 'contentDescription', + 'mimetype', + 45, + )); }); }); group('$WebChromeClient', () { - setUpAll(() { - TestWebViewHostApi.setup(MockTestWebViewHostApi()); - TestWebViewClientHostApi.setup(MockTestWebViewClientHostApi()); - TestWebChromeClientHostApi.setup(MockTestWebChromeClientHostApi()); - }); + late WebChromeClientFlutterApiImpl flutterApi; + + late InstanceManager instanceManager; + + late MockWebChromeClient mockWebChromeClient; + late int mockWebChromeClientInstanceId; + + late MockWebView mockWebView; + late int mockWebViewInstanceId; setUp(() { - final InstanceManager instanceManager = InstanceManager(); - WebView.api = WebViewHostApiImpl(instanceManager: instanceManager); - WebViewClient.api = WebViewClientHostApiImpl( - instanceManager: instanceManager, - ); - WebChromeClient.api = WebChromeClientHostApiImpl( + instanceManager = InstanceManager(); + flutterApi = WebChromeClientFlutterApiImpl( instanceManager: instanceManager, ); - }); - test('create', () { - final WebView webView = WebView(); - webView.setWebViewClient( - TestWebViewClient(shouldOverrideUrlLoading: true)); + mockWebChromeClient = MockWebChromeClient(); + mockWebChromeClientInstanceId = + instanceManager.tryAddInstance(mockWebChromeClient)!; - final WebChromeClient webChromeClient = TestWebChromeClient(); + mockWebView = MockWebView(); + mockWebViewInstanceId = instanceManager.tryAddInstance(mockWebView)!; + }); - webView.setWebChromeClient(webChromeClient); - expect( - WebChromeClient.api.instanceManager.getInstanceId(webChromeClient), - isNotNull, + test('onPageStarted', () { + flutterApi.onProgressChanged( + mockWebChromeClientInstanceId, + mockWebViewInstanceId, + 76, ); + verify(mockWebChromeClient.onProgressChanged(mockWebView, 76)); }); }); }); } - -class TestWebViewClient extends WebViewClient { - TestWebViewClient({required bool shouldOverrideUrlLoading}) - : super(shouldOverrideUrlLoading: shouldOverrideUrlLoading); -} - -class TestDownloadListener extends DownloadListener { - @override - void onDownloadStart( - String url, - String userAgent, - String contentDisposition, - String mimetype, - int contentLength, - ) {} -} - -class TestWebChromeClient extends WebChromeClient { - @override - void onProgressChanged(WebView webView, int progress) {} -} diff --git a/packages/webview_flutter/webview_flutter_android/test/android_webview_test.mocks.dart b/packages/webview_flutter/webview_flutter_android/test/android_webview_test.mocks.dart index fda4734340bf..4378ed7abf77 100644 --- a/packages/webview_flutter/webview_flutter_android/test/android_webview_test.mocks.dart +++ b/packages/webview_flutter/webview_flutter_android/test/android_webview_test.mocks.dart @@ -22,6 +22,8 @@ import 'android_webview.pigeon.dart' as _i3; // ignore_for_file: unnecessary_parenthesis // ignore_for_file: camel_case_types +class _FakeWebSettings_0 extends _i1.Fake implements _i2.WebSettings {} + /// A class which mocks [DownloadListener]. /// /// See the documentation for Mockito's code generation for more information. @@ -340,6 +342,123 @@ class MockWebChromeClient extends _i1.Mock implements _i2.WebChromeClient { String toString() => super.toString(); } +/// A class which mocks [WebView]. +/// +/// See the documentation for Mockito's code generation for more information. +class MockWebView extends _i1.Mock implements _i2.WebView { + MockWebView() { + _i1.throwOnMissingStub(this); + } + + @override + bool get useHybridComposition => + (super.noSuchMethod(Invocation.getter(#useHybridComposition), + returnValue: false) as bool); + @override + _i2.WebSettings get settings => + (super.noSuchMethod(Invocation.getter(#settings), + returnValue: _FakeWebSettings_0()) as _i2.WebSettings); + @override + _i4.Future loadUrl(String? url, Map? headers) => + (super.noSuchMethod(Invocation.method(#loadUrl, [url, headers]), + returnValue: Future.value(), + returnValueForMissingStub: Future.value()) as _i4.Future); + @override + _i4.Future getUrl() => + (super.noSuchMethod(Invocation.method(#getUrl, []), + returnValue: Future.value()) as _i4.Future); + @override + _i4.Future canGoBack() => + (super.noSuchMethod(Invocation.method(#canGoBack, []), + returnValue: Future.value(false)) as _i4.Future); + @override + _i4.Future canGoForward() => + (super.noSuchMethod(Invocation.method(#canGoForward, []), + returnValue: Future.value(false)) as _i4.Future); + @override + _i4.Future goBack() => + (super.noSuchMethod(Invocation.method(#goBack, []), + returnValue: Future.value(), + returnValueForMissingStub: Future.value()) as _i4.Future); + @override + _i4.Future goForward() => + (super.noSuchMethod(Invocation.method(#goForward, []), + returnValue: Future.value(), + returnValueForMissingStub: Future.value()) as _i4.Future); + @override + _i4.Future reload() => + (super.noSuchMethod(Invocation.method(#reload, []), + returnValue: Future.value(), + returnValueForMissingStub: Future.value()) as _i4.Future); + @override + _i4.Future clearCache(bool? includeDiskFiles) => + (super.noSuchMethod(Invocation.method(#clearCache, [includeDiskFiles]), + returnValue: Future.value(), + returnValueForMissingStub: Future.value()) as _i4.Future); + @override + _i4.Future evaluateJavascript(String? javascriptString) => (super + .noSuchMethod(Invocation.method(#evaluateJavascript, [javascriptString]), + returnValue: Future.value()) as _i4.Future); + @override + _i4.Future getTitle() => + (super.noSuchMethod(Invocation.method(#getTitle, []), + returnValue: Future.value()) as _i4.Future); + @override + _i4.Future scrollTo(int? x, int? y) => + (super.noSuchMethod(Invocation.method(#scrollTo, [x, y]), + returnValue: Future.value(), + returnValueForMissingStub: Future.value()) as _i4.Future); + @override + _i4.Future scrollBy(int? x, int? y) => + (super.noSuchMethod(Invocation.method(#scrollBy, [x, y]), + returnValue: Future.value(), + returnValueForMissingStub: Future.value()) as _i4.Future); + @override + _i4.Future getScrollX() => + (super.noSuchMethod(Invocation.method(#getScrollX, []), + returnValue: Future.value(0)) as _i4.Future); + @override + _i4.Future getScrollY() => + (super.noSuchMethod(Invocation.method(#getScrollY, []), + returnValue: Future.value(0)) as _i4.Future); + @override + _i4.Future setWebViewClient(_i2.WebViewClient? webViewClient) => + (super.noSuchMethod(Invocation.method(#setWebViewClient, [webViewClient]), + returnValue: Future.value(), + returnValueForMissingStub: Future.value()) as _i4.Future); + @override + _i4.Future addJavaScriptChannel( + _i2.JavaScriptChannel? javaScriptChannel) => + (super.noSuchMethod( + Invocation.method(#addJavaScriptChannel, [javaScriptChannel]), + returnValue: Future.value(), + returnValueForMissingStub: Future.value()) as _i4.Future); + @override + _i4.Future removeJavaScriptChannel( + _i2.JavaScriptChannel? javaScriptChannel) => + (super.noSuchMethod( + Invocation.method(#removeJavaScriptChannel, [javaScriptChannel]), + returnValue: Future.value(), + returnValueForMissingStub: Future.value()) as _i4.Future); + @override + _i4.Future setDownloadListener(_i2.DownloadListener? listener) => + (super.noSuchMethod(Invocation.method(#setDownloadListener, [listener]), + returnValue: Future.value(), + returnValueForMissingStub: Future.value()) as _i4.Future); + @override + _i4.Future setWebChromeClient(_i2.WebChromeClient? client) => + (super.noSuchMethod(Invocation.method(#setWebChromeClient, [client]), + returnValue: Future.value(), + returnValueForMissingStub: Future.value()) as _i4.Future); + @override + _i4.Future release() => + (super.noSuchMethod(Invocation.method(#release, []), + returnValue: Future.value(), + returnValueForMissingStub: Future.value()) as _i4.Future); + @override + String toString() => super.toString(); +} + /// A class which mocks [WebViewClient]. /// /// See the documentation for Mockito's code generation for more information. From 1a09487afc1d9843b4887cec37869e33295ffb2f Mon Sep 17 00:00:00 2001 From: Maurice Parrish Date: Fri, 5 Nov 2021 22:28:04 -0700 Subject: [PATCH 05/11] link for comments --- .../lib/src/android_webview.dart | 56 +++++++++++++++---- 1 file changed, 44 insertions(+), 12 deletions(-) diff --git a/packages/webview_flutter/webview_flutter_android/lib/src/android_webview.dart b/packages/webview_flutter/webview_flutter_android/lib/src/android_webview.dart index 98cf4dbeb5ba..cbdaaeb93c52 100644 --- a/packages/webview_flutter/webview_flutter_android/lib/src/android_webview.dart +++ b/packages/webview_flutter/webview_flutter_android/lib/src/android_webview.dart @@ -401,9 +401,9 @@ class WebSettings { abstract class JavaScriptChannel { /// Constructs a [JavaScriptChannel]. JavaScriptChannel(this.channelName) { - if (!_flutterApisHaveBeenSetup) { + if (!_flutterApisHaveBeenSetUp) { JavaScriptChannelFlutterApi.setup(JavaScriptChannelFlutterApiImpl()); - _flutterApisHaveBeenSetup = true; + _flutterApisHaveBeenSetUp = true; } } @@ -411,7 +411,7 @@ abstract class JavaScriptChannel { @visibleForTesting static JavaScriptChannelHostApiImpl api = JavaScriptChannelHostApiImpl(); - static bool _flutterApisHaveBeenSetup = false; + static bool _flutterApisHaveBeenSetUp = false; /// Used to identify this object to receive messages from javaScript. final String channelName; @@ -424,60 +424,92 @@ abstract class JavaScriptChannel { abstract class WebViewClient { /// Constructs a [WebViewClient]. WebViewClient({this.shouldOverrideUrlLoading = true}) { - if (!_flutterApisHaveBeenSetup) { + if (!_flutterApisHaveBeenSetUp) { WebViewClientFlutterApi.setup(WebViewClientFlutterApiImpl()); - _flutterApisHaveBeenSetup = true; + _flutterApisHaveBeenSetUp = true; } } - static bool _flutterApisHaveBeenSetup = false; + static bool _flutterApisHaveBeenSetUp = false; /// User authentication failed on server. + /// + /// See https://developer.android.com/reference/android/webkit/WebViewClient#ERROR_AUTHENTICATION static const int errorAuthentication = -4; /// Malformed URL. + /// + /// See https://developer.android.com/reference/android/webkit/WebViewClient#ERROR_BAD_URL static const int errorBadUrl = -12; /// Failed to connect to the server. + /// + /// See https://developer.android.com/reference/android/webkit/WebViewClient#ERROR_CONNECT static const int errorConnect = -6; /// Failed to perform SSL handshake. + /// + /// See https://developer.android.com/reference/android/webkit/WebViewClient#ERROR_FAILED_SSL_HANDSHAKE static const int errorFailedSslHandshake = -11; /// Generic file error. + /// + /// See https://developer.android.com/reference/android/webkit/WebViewClient#ERROR_FILE static const int errorFile = -13; /// File not found. + /// + /// See https://developer.android.com/reference/android/webkit/WebViewClient#ERROR_FILE_NOT_FOUND static const int errorFileNotFound = -14; /// Server or proxy hostname lookup failed. + /// + /// See https://developer.android.com/reference/android/webkit/WebViewClient#ERROR_HOST_LOOKUP static const int errorHostLookup = -2; /// Failed to read or write to the server. + /// + /// See https://developer.android.com/reference/android/webkit/WebViewClient#ERROR_IO static const int errorIO = -7; /// User authentication failed on proxy. + /// + /// See https://developer.android.com/reference/android/webkit/WebViewClient#ERROR_PROXY_AUTHENTICATION static const int errorProxyAuthentication = -5; /// Too many redirects. + /// + /// See https://developer.android.com/reference/android/webkit/WebViewClient#ERROR_REDIRECT_LOOP static const int errorRedirectLoop = -9; /// Connection timed out. + /// + /// See https://developer.android.com/reference/android/webkit/WebViewClient#ERROR_TIMEOUT static const int errorTimeout = -8; /// Too many requests during this load. + /// + /// See https://developer.android.com/reference/android/webkit/WebViewClient#ERROR_TOO_MANY_REQUESTS static const int errorTooManyRequests = -15; /// Generic error. + /// + /// See https://developer.android.com/reference/android/webkit/WebViewClient#ERROR_UNKNOWN static const int errorUnknown = -1; /// Resource load was canceled by Safe Browsing. + /// + /// See https://developer.android.com/reference/android/webkit/WebViewClient#ERROR_UNSAFE_RESOURCE static const int errorUnsafeResource = -16; /// Unsupported authentication scheme (not basic or digest). + /// + /// See https://developer.android.com/reference/android/webkit/WebViewClient#ERROR_UNSUPPORTED_AUTH_SCHEME static const int errorUnsupportedAuthScheme = -3; /// Unsupported URI scheme. + /// + /// See https://developer.android.com/reference/android/webkit/WebViewClient#ERROR_UNSUPPORTED_SCHEME static const int errorUnsupportedScheme = -10; /// Pigeon Host Api implementation for [WebViewClient]. @@ -566,13 +598,13 @@ abstract class WebViewClient { abstract class DownloadListener { /// Constructs a [DownloadListener]. DownloadListener() { - if (!_flutterApisHaveBeenSetup) { + if (!_flutterApisHaveBeenSetUp) { DownloadListenerFlutterApi.setup(DownloadListenerFlutterApiImpl()); - _flutterApisHaveBeenSetup = true; + _flutterApisHaveBeenSetUp = true; } } - static bool _flutterApisHaveBeenSetup = false; + static bool _flutterApisHaveBeenSetUp = false; /// Pigeon Host Api implementation for [DownloadListener]. @visibleForTesting @@ -592,13 +624,13 @@ abstract class DownloadListener { abstract class WebChromeClient { /// Constructs a [WebChromeClient]. WebChromeClient() { - if (!_flutterApisHaveBeenSetup) { + if (!_flutterApisHaveBeenSetUp) { WebChromeClientFlutterApi.setup(WebChromeClientFlutterApiImpl()); - _flutterApisHaveBeenSetup = true; + _flutterApisHaveBeenSetUp = true; } } - static bool _flutterApisHaveBeenSetup = false; + static bool _flutterApisHaveBeenSetUp = false; /// Pigeon Host Api implementation for [WebChromeClient]. @visibleForTesting From c00a5e8f588a68b10e9279782123fb47e7da8690 Mon Sep 17 00:00:00 2001 From: Maurice Parrish Date: Mon, 8 Nov 2021 11:30:32 -0800 Subject: [PATCH 06/11] remove instance after dispose is finished --- .../lib/src/android_webview_api_impls.dart | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/webview_flutter/webview_flutter_android/lib/src/android_webview_api_impls.dart b/packages/webview_flutter/webview_flutter_android/lib/src/android_webview_api_impls.dart index b8aff73b8c50..229ad9973650 100644 --- a/packages/webview_flutter/webview_flutter_android/lib/src/android_webview_api_impls.dart +++ b/packages/webview_flutter/webview_flutter_android/lib/src/android_webview_api_impls.dart @@ -52,10 +52,11 @@ class WebViewHostApiImpl extends WebViewHostApi { /// Helper method to convert instances ids to objects. Future disposeFromInstance(WebView instance) async { - final int? instanceId = instanceManager.removeInstance(instance); + final int? instanceId = instanceManager.getInstanceId(instance); if (instanceId != null) { - return dispose(instanceId); + await dispose(instanceId); } + instanceManager.removeInstance(instance); } /// Helper method to convert instances ids to objects. From b89ae0e8b512e6c56ca8a39d2ebbf3b87a0d20f7 Mon Sep 17 00:00:00 2001 From: Maurice Parrish Date: Tue, 9 Nov 2021 10:52:17 -0800 Subject: [PATCH 07/11] settings also needs to be released --- .../webview_flutter_android/lib/src/android_webview.dart | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/webview_flutter/webview_flutter_android/lib/src/android_webview.dart b/packages/webview_flutter/webview_flutter_android/lib/src/android_webview.dart index cbdaaeb93c52..09615c868e68 100644 --- a/packages/webview_flutter/webview_flutter_android/lib/src/android_webview.dart +++ b/packages/webview_flutter/webview_flutter_android/lib/src/android_webview.dart @@ -257,10 +257,10 @@ class WebView { /// Releases all resources used by the [WebView]. /// - /// Any methods called on the [WebView] instance after [release] will throw - /// an exception. + /// Any methods called after [release] will throw an exception. Future release() { _currentWebViewClient = null; + WebSettings.api.disposeFromInstance(settings); return api.disposeFromInstance(this); } } From cc1654ea0c1eecdd8b4eeed8d1bb5a41c8237e49 Mon Sep 17 00:00:00 2001 From: Maurice Parrish Date: Wed, 10 Nov 2021 10:42:53 -0800 Subject: [PATCH 08/11] change to ensure initialized and fix unit tests --- .../lib/src/android_webview.dart | 42 ++++++++----------- .../test/android_webview_test.dart | 10 +++++ 2 files changed, 28 insertions(+), 24 deletions(-) diff --git a/packages/webview_flutter/webview_flutter_android/lib/src/android_webview.dart b/packages/webview_flutter/webview_flutter_android/lib/src/android_webview.dart index 09615c868e68..20405eb1ee8b 100644 --- a/packages/webview_flutter/webview_flutter_android/lib/src/android_webview.dart +++ b/packages/webview_flutter/webview_flutter_android/lib/src/android_webview.dart @@ -13,6 +13,20 @@ import 'android_webview_api_impls.dart'; // values. const String _nullStringIdentifier = ''; +class _AndroidWebViewFlutterApis { + static bool _flutterApisHaveBeenSetUp = false; + + static void ensureInitialized() { + if (!_flutterApisHaveBeenSetUp) { + DownloadListenerFlutterApi.setup(DownloadListenerFlutterApiImpl()); + WebViewClientFlutterApi.setup(WebViewClientFlutterApiImpl()); + WebChromeClientFlutterApi.setup(WebChromeClientFlutterApiImpl()); + JavaScriptChannelFlutterApi.setup(JavaScriptChannelFlutterApiImpl()); + _flutterApisHaveBeenSetUp = true; + } + } +} + /// An Android View that displays web pages. /// /// **Basic usage** @@ -401,18 +415,13 @@ class WebSettings { abstract class JavaScriptChannel { /// Constructs a [JavaScriptChannel]. JavaScriptChannel(this.channelName) { - if (!_flutterApisHaveBeenSetUp) { - JavaScriptChannelFlutterApi.setup(JavaScriptChannelFlutterApiImpl()); - _flutterApisHaveBeenSetUp = true; - } + _AndroidWebViewFlutterApis.ensureInitialized(); } /// Pigeon Host Api implementation for [JavaScriptChannel]. @visibleForTesting static JavaScriptChannelHostApiImpl api = JavaScriptChannelHostApiImpl(); - static bool _flutterApisHaveBeenSetUp = false; - /// Used to identify this object to receive messages from javaScript. final String channelName; @@ -424,14 +433,9 @@ abstract class JavaScriptChannel { abstract class WebViewClient { /// Constructs a [WebViewClient]. WebViewClient({this.shouldOverrideUrlLoading = true}) { - if (!_flutterApisHaveBeenSetUp) { - WebViewClientFlutterApi.setup(WebViewClientFlutterApiImpl()); - _flutterApisHaveBeenSetUp = true; - } + _AndroidWebViewFlutterApis.ensureInitialized(); } - static bool _flutterApisHaveBeenSetUp = false; - /// User authentication failed on server. /// /// See https://developer.android.com/reference/android/webkit/WebViewClient#ERROR_AUTHENTICATION @@ -598,14 +602,9 @@ abstract class WebViewClient { abstract class DownloadListener { /// Constructs a [DownloadListener]. DownloadListener() { - if (!_flutterApisHaveBeenSetUp) { - DownloadListenerFlutterApi.setup(DownloadListenerFlutterApiImpl()); - _flutterApisHaveBeenSetUp = true; - } + _AndroidWebViewFlutterApis.ensureInitialized(); } - static bool _flutterApisHaveBeenSetUp = false; - /// Pigeon Host Api implementation for [DownloadListener]. @visibleForTesting static DownloadListenerHostApiImpl api = DownloadListenerHostApiImpl(); @@ -624,14 +623,9 @@ abstract class DownloadListener { abstract class WebChromeClient { /// Constructs a [WebChromeClient]. WebChromeClient() { - if (!_flutterApisHaveBeenSetUp) { - WebChromeClientFlutterApi.setup(WebChromeClientFlutterApiImpl()); - _flutterApisHaveBeenSetUp = true; - } + _AndroidWebViewFlutterApis.ensureInitialized(); } - static bool _flutterApisHaveBeenSetUp = false; - /// Pigeon Host Api implementation for [WebChromeClient]. @visibleForTesting static WebChromeClientHostApiImpl api = WebChromeClientHostApiImpl(); diff --git a/packages/webview_flutter/webview_flutter_android/test/android_webview_test.dart b/packages/webview_flutter/webview_flutter_android/test/android_webview_test.dart index 79049800290c..24cd35c9b3cf 100644 --- a/packages/webview_flutter/webview_flutter_android/test/android_webview_test.dart +++ b/packages/webview_flutter/webview_flutter_android/test/android_webview_test.dart @@ -242,7 +242,17 @@ void main() { }); test('release', () { + final MockTestWebSettingsHostApi mockWebSettingsPlatformHostApi = + MockTestWebSettingsHostApi(); + TestWebSettingsHostApi.setup(mockWebSettingsPlatformHostApi); + + WebSettings.api = + WebSettingsHostApiImpl(instanceManager: instanceManager); + final int webSettingsInstanceId = + instanceManager.getInstanceId(webView.settings)!; + webView.release(); + verify(mockWebSettingsPlatformHostApi.dispose(webSettingsInstanceId)); verify(mockPlatformHostApi.dispose(webViewInstanceId)); }); }); From 153dad2e654a4aa381b92eca69f413e21ae915b3 Mon Sep 17 00:00:00 2001 From: Maurice Parrish Date: Wed, 10 Nov 2021 11:35:33 -0800 Subject: [PATCH 09/11] FlutterApi initializer to a testable public class --- .../lib/src/android_webview.dart | 22 ++------ .../lib/src/android_webview_api_impls.dart | 50 +++++++++++++++++++ 2 files changed, 54 insertions(+), 18 deletions(-) diff --git a/packages/webview_flutter/webview_flutter_android/lib/src/android_webview.dart b/packages/webview_flutter/webview_flutter_android/lib/src/android_webview.dart index 20405eb1ee8b..4017d526336d 100644 --- a/packages/webview_flutter/webview_flutter_android/lib/src/android_webview.dart +++ b/packages/webview_flutter/webview_flutter_android/lib/src/android_webview.dart @@ -13,20 +13,6 @@ import 'android_webview_api_impls.dart'; // values. const String _nullStringIdentifier = ''; -class _AndroidWebViewFlutterApis { - static bool _flutterApisHaveBeenSetUp = false; - - static void ensureInitialized() { - if (!_flutterApisHaveBeenSetUp) { - DownloadListenerFlutterApi.setup(DownloadListenerFlutterApiImpl()); - WebViewClientFlutterApi.setup(WebViewClientFlutterApiImpl()); - WebChromeClientFlutterApi.setup(WebChromeClientFlutterApiImpl()); - JavaScriptChannelFlutterApi.setup(JavaScriptChannelFlutterApiImpl()); - _flutterApisHaveBeenSetUp = true; - } - } -} - /// An Android View that displays web pages. /// /// **Basic usage** @@ -415,7 +401,7 @@ class WebSettings { abstract class JavaScriptChannel { /// Constructs a [JavaScriptChannel]. JavaScriptChannel(this.channelName) { - _AndroidWebViewFlutterApis.ensureInitialized(); + AndroidWebViewFlutterApis.instance.ensureInitialized(); } /// Pigeon Host Api implementation for [JavaScriptChannel]. @@ -433,7 +419,7 @@ abstract class JavaScriptChannel { abstract class WebViewClient { /// Constructs a [WebViewClient]. WebViewClient({this.shouldOverrideUrlLoading = true}) { - _AndroidWebViewFlutterApis.ensureInitialized(); + AndroidWebViewFlutterApis.instance.ensureInitialized(); } /// User authentication failed on server. @@ -602,7 +588,7 @@ abstract class WebViewClient { abstract class DownloadListener { /// Constructs a [DownloadListener]. DownloadListener() { - _AndroidWebViewFlutterApis.ensureInitialized(); + AndroidWebViewFlutterApis.instance.ensureInitialized(); } /// Pigeon Host Api implementation for [DownloadListener]. @@ -623,7 +609,7 @@ abstract class DownloadListener { abstract class WebChromeClient { /// Constructs a [WebChromeClient]. WebChromeClient() { - _AndroidWebViewFlutterApis.ensureInitialized(); + AndroidWebViewFlutterApis.instance.ensureInitialized(); } /// Pigeon Host Api implementation for [WebChromeClient]. diff --git a/packages/webview_flutter/webview_flutter_android/lib/src/android_webview_api_impls.dart b/packages/webview_flutter/webview_flutter_android/lib/src/android_webview_api_impls.dart index 229ad9973650..7420c367fe29 100644 --- a/packages/webview_flutter/webview_flutter_android/lib/src/android_webview_api_impls.dart +++ b/packages/webview_flutter/webview_flutter_android/lib/src/android_webview_api_impls.dart @@ -29,6 +29,56 @@ WebResourceError _toWebResourceError(WebResourceErrorData data) { ); } +/// Handles initialization of Flutter APIs for Android WebView. +class AndroidWebViewFlutterApis { + /// Creates a [AndroidWebViewFlutterApis]. + AndroidWebViewFlutterApis({ + DownloadListenerFlutterApiImpl? downloadListenerFlutterApi, + WebViewClientFlutterApiImpl? webViewClientFlutterApi, + WebChromeClientFlutterApiImpl? webChromeClientFlutterApi, + JavaScriptChannelFlutterApiImpl? javaScriptChannelFlutterApi, + }) { + this.downloadListenerFlutterApi = + downloadListenerFlutterApi ?? DownloadListenerFlutterApiImpl(); + this.webViewClientFlutterApi = + webViewClientFlutterApi ?? WebViewClientFlutterApiImpl(); + this.webChromeClientFlutterApi = + webChromeClientFlutterApi ?? WebChromeClientFlutterApiImpl(); + this.javaScriptChannelFlutterApi = + javaScriptChannelFlutterApi ?? JavaScriptChannelFlutterApiImpl(); + } + + static bool _flutterApisHaveBeenSetUp = false; + + /// Mutable instance containing all Flutter Apis for Android WebView. + /// + /// This should only be changed for testing purposes. + static AndroidWebViewFlutterApis instance = AndroidWebViewFlutterApis(); + + /// Flutter Api for [DownloadListener]. + late final DownloadListenerFlutterApiImpl downloadListenerFlutterApi; + + /// Flutter Api for [WebViewClient]. + late final WebViewClientFlutterApiImpl webViewClientFlutterApi; + + /// Flutter Api for [WebChromeClient]. + late final WebChromeClientFlutterApiImpl webChromeClientFlutterApi; + + /// Flutter Api for [JavaScriptChannel]. + late final JavaScriptChannelFlutterApiImpl javaScriptChannelFlutterApi; + + /// Ensures all the Flutter APIs have been setup to receive calls from native code. + void ensureInitialized() { + if (!_flutterApisHaveBeenSetUp) { + DownloadListenerFlutterApi.setup(downloadListenerFlutterApi); + WebViewClientFlutterApi.setup(webViewClientFlutterApi); + WebChromeClientFlutterApi.setup(webChromeClientFlutterApi); + JavaScriptChannelFlutterApi.setup(javaScriptChannelFlutterApi); + _flutterApisHaveBeenSetUp = true; + } + } +} + /// Host api implementation for [WebView]. class WebViewHostApiImpl extends WebViewHostApi { /// Constructs a [WebViewHostApiImpl]. From c63fb74d223367e7467feaf1f58c770053271517 Mon Sep 17 00:00:00 2001 From: Maurice Parrish Date: Wed, 10 Nov 2021 11:38:52 -0800 Subject: [PATCH 10/11] rename --- .../webview_flutter_android/lib/src/android_webview.dart | 8 ++++---- .../lib/src/android_webview_api_impls.dart | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/packages/webview_flutter/webview_flutter_android/lib/src/android_webview.dart b/packages/webview_flutter/webview_flutter_android/lib/src/android_webview.dart index 4017d526336d..5a85a5eee8a5 100644 --- a/packages/webview_flutter/webview_flutter_android/lib/src/android_webview.dart +++ b/packages/webview_flutter/webview_flutter_android/lib/src/android_webview.dart @@ -401,7 +401,7 @@ class WebSettings { abstract class JavaScriptChannel { /// Constructs a [JavaScriptChannel]. JavaScriptChannel(this.channelName) { - AndroidWebViewFlutterApis.instance.ensureInitialized(); + AndroidWebViewFlutterApis.instance.ensureSetUp(); } /// Pigeon Host Api implementation for [JavaScriptChannel]. @@ -419,7 +419,7 @@ abstract class JavaScriptChannel { abstract class WebViewClient { /// Constructs a [WebViewClient]. WebViewClient({this.shouldOverrideUrlLoading = true}) { - AndroidWebViewFlutterApis.instance.ensureInitialized(); + AndroidWebViewFlutterApis.instance.ensureSetUp(); } /// User authentication failed on server. @@ -588,7 +588,7 @@ abstract class WebViewClient { abstract class DownloadListener { /// Constructs a [DownloadListener]. DownloadListener() { - AndroidWebViewFlutterApis.instance.ensureInitialized(); + AndroidWebViewFlutterApis.instance.ensureSetUp(); } /// Pigeon Host Api implementation for [DownloadListener]. @@ -609,7 +609,7 @@ abstract class DownloadListener { abstract class WebChromeClient { /// Constructs a [WebChromeClient]. WebChromeClient() { - AndroidWebViewFlutterApis.instance.ensureInitialized(); + AndroidWebViewFlutterApis.instance.ensureSetUp(); } /// Pigeon Host Api implementation for [WebChromeClient]. diff --git a/packages/webview_flutter/webview_flutter_android/lib/src/android_webview_api_impls.dart b/packages/webview_flutter/webview_flutter_android/lib/src/android_webview_api_impls.dart index 7420c367fe29..fba0dea0a421 100644 --- a/packages/webview_flutter/webview_flutter_android/lib/src/android_webview_api_impls.dart +++ b/packages/webview_flutter/webview_flutter_android/lib/src/android_webview_api_impls.dart @@ -48,7 +48,7 @@ class AndroidWebViewFlutterApis { javaScriptChannelFlutterApi ?? JavaScriptChannelFlutterApiImpl(); } - static bool _flutterApisHaveBeenSetUp = false; + static bool _haveBeenSetUp = false; /// Mutable instance containing all Flutter Apis for Android WebView. /// @@ -68,13 +68,13 @@ class AndroidWebViewFlutterApis { late final JavaScriptChannelFlutterApiImpl javaScriptChannelFlutterApi; /// Ensures all the Flutter APIs have been setup to receive calls from native code. - void ensureInitialized() { - if (!_flutterApisHaveBeenSetUp) { + void ensureSetUp() { + if (!_haveBeenSetUp) { DownloadListenerFlutterApi.setup(downloadListenerFlutterApi); WebViewClientFlutterApi.setup(webViewClientFlutterApi); WebChromeClientFlutterApi.setup(webChromeClientFlutterApi); JavaScriptChannelFlutterApi.setup(javaScriptChannelFlutterApi); - _flutterApisHaveBeenSetUp = true; + _haveBeenSetUp = true; } } } From 913f6c83f7e0023305cfb28c0cbecbacf05f7af8 Mon Sep 17 00:00:00 2001 From: Maurice Parrish Date: Wed, 10 Nov 2021 11:41:11 -0800 Subject: [PATCH 11/11] removed unused import --- .../webview_flutter_android/lib/src/android_webview.dart | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/webview_flutter/webview_flutter_android/lib/src/android_webview.dart b/packages/webview_flutter/webview_flutter_android/lib/src/android_webview.dart index 5a85a5eee8a5..f6faa8e74331 100644 --- a/packages/webview_flutter/webview_flutter_android/lib/src/android_webview.dart +++ b/packages/webview_flutter/webview_flutter_android/lib/src/android_webview.dart @@ -5,7 +5,6 @@ import 'package:flutter/foundation.dart'; import 'package:flutter/widgets.dart' show AndroidViewSurface; -import 'android_webview.pigeon.dart'; import 'android_webview_api_impls.dart'; // TODO(bparrishMines): This can be removed once pigeon supports null values: https://github.com/flutter/flutter/issues/59118