blob: da03052c7f224076bc5b84bddd404cf06ee76861 [file] [log] [blame]
// Copyright 2013 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import 'package:flutter_test/flutter_test.dart';
import 'package:mockito/annotations.dart';
import 'package:mockito/mockito.dart';
import 'package:webview_flutter_android/src/android_webview.dart';
import 'package:webview_flutter_android/src/android_webview.g.dart';
import 'package:webview_flutter_android/src/android_webview_api_impls.dart';
import 'package:webview_flutter_android/src/instance_manager.dart';
import 'android_webview_test.mocks.dart';
import 'test_android_webview.g.dart';
@GenerateMocks(<Type>[
CookieManagerHostApi,
DownloadListener,
JavaScriptChannel,
TestCookieManagerHostApi,
TestCustomViewCallbackHostApi,
TestDownloadListenerHostApi,
TestGeolocationPermissionsCallbackHostApi,
TestInstanceManagerHostApi,
TestJavaObjectHostApi,
TestJavaScriptChannelHostApi,
TestWebChromeClientHostApi,
TestWebSettingsHostApi,
TestWebStorageHostApi,
TestWebViewClientHostApi,
TestWebViewHostApi,
TestAssetManagerHostApi,
TestPermissionRequestHostApi,
WebChromeClient,
WebView,
WebViewClient,
])
void main() {
TestWidgetsFlutterBinding.ensureInitialized();
// Mocks the calls to the native InstanceManager.
TestInstanceManagerHostApi.setup(MockTestInstanceManagerHostApi());
TestJavaObjectHostApi.setup(MockTestJavaObjectHostApi());
group('Android WebView', () {
group('JavaObject', () {
late MockTestJavaObjectHostApi mockPlatformHostApi;
setUp(() {
mockPlatformHostApi = MockTestJavaObjectHostApi();
TestJavaObjectHostApi.setup(mockPlatformHostApi);
});
test('JavaObject.dispose', () async {
int? callbackIdentifier;
final InstanceManager instanceManager = InstanceManager(
onWeakReferenceRemoved: (int identifier) {
callbackIdentifier = identifier;
},
);
final JavaObject object = JavaObject.detached(
instanceManager: instanceManager,
);
instanceManager.addHostCreatedInstance(object, 0);
JavaObject.dispose(object);
expect(callbackIdentifier, 0);
});
test('JavaObjectFlutterApi.dispose', () {
final InstanceManager instanceManager = InstanceManager(
onWeakReferenceRemoved: (_) {},
);
final JavaObject object = JavaObject.detached(
instanceManager: instanceManager,
);
instanceManager.addHostCreatedInstance(object, 0);
instanceManager.removeWeakReference(object);
expect(instanceManager.containsIdentifier(0), isTrue);
final JavaObjectFlutterApiImpl flutterApi = JavaObjectFlutterApiImpl(
instanceManager: instanceManager,
);
flutterApi.dispose(0);
expect(instanceManager.containsIdentifier(0), isFalse);
});
});
group('WebView', () {
late MockTestWebViewHostApi mockPlatformHostApi;
late InstanceManager instanceManager;
late WebView webView;
late int webViewInstanceId;
setUp(() {
mockPlatformHostApi = MockTestWebViewHostApi();
TestWebViewHostApi.setup(mockPlatformHostApi);
instanceManager = InstanceManager(onWeakReferenceRemoved: (_) {});
WebView.api = WebViewHostApiImpl(instanceManager: instanceManager);
webView = WebView();
webViewInstanceId = instanceManager.getIdentifier(webView)!;
});
test('create', () {
verify(mockPlatformHostApi.create(webViewInstanceId));
});
test('setWebContentsDebuggingEnabled true', () {
WebView.setWebContentsDebuggingEnabled(true);
verify(mockPlatformHostApi.setWebContentsDebuggingEnabled(true));
});
test('setWebContentsDebuggingEnabled false', () {
WebView.setWebContentsDebuggingEnabled(false);
verify(mockPlatformHostApi.setWebContentsDebuggingEnabled(false));
});
test('loadData', () {
webView.loadData(
data: 'hello',
mimeType: 'text/plain',
encoding: 'base64',
);
verify(mockPlatformHostApi.loadData(
webViewInstanceId,
'hello',
'text/plain',
'base64',
));
});
test('loadData with null values', () {
webView.loadData(data: 'hello');
verify(mockPlatformHostApi.loadData(
webViewInstanceId,
'hello',
null,
null,
));
});
test('loadDataWithBaseUrl', () {
webView.loadDataWithBaseUrl(
baseUrl: 'https://base.url',
data: 'hello',
mimeType: 'text/plain',
encoding: 'base64',
historyUrl: 'https://history.url',
);
verify(mockPlatformHostApi.loadDataWithBaseUrl(
webViewInstanceId,
'https://base.url',
'hello',
'text/plain',
'base64',
'https://history.url',
));
});
test('loadDataWithBaseUrl with null values', () {
webView.loadDataWithBaseUrl(data: 'hello');
verify(mockPlatformHostApi.loadDataWithBaseUrl(
webViewInstanceId,
null,
'hello',
null,
null,
null,
));
});
test('loadUrl', () {
webView.loadUrl('hello', <String, String>{'a': 'header'});
verify(mockPlatformHostApi.loadUrl(
webViewInstanceId,
'hello',
<String, String>{'a': 'header'},
));
});
test('canGoBack', () {
when(mockPlatformHostApi.canGoBack(webViewInstanceId))
.thenReturn(false);
expect(webView.canGoBack(), completion(false));
});
test('canGoForward', () {
when(mockPlatformHostApi.canGoForward(webViewInstanceId))
.thenReturn(true);
expect(webView.canGoForward(), completion(true));
});
test('goBack', () {
webView.goBack();
verify(mockPlatformHostApi.goBack(webViewInstanceId));
});
test('goForward', () {
webView.goForward();
verify(mockPlatformHostApi.goForward(webViewInstanceId));
});
test('reload', () {
webView.reload();
verify(mockPlatformHostApi.reload(webViewInstanceId));
});
test('clearCache', () {
webView.clearCache(false);
verify(mockPlatformHostApi.clearCache(webViewInstanceId, false));
});
test('evaluateJavascript', () {
when(
mockPlatformHostApi.evaluateJavascript(
webViewInstanceId, 'runJavaScript'),
).thenAnswer((_) => Future<String>.value('returnValue'));
expect(
webView.evaluateJavascript('runJavaScript'),
completion('returnValue'),
);
});
test('getTitle', () {
when(mockPlatformHostApi.getTitle(webViewInstanceId))
.thenReturn('aTitle');
expect(webView.getTitle(), completion('aTitle'));
});
test('scrollTo', () {
webView.scrollTo(12, 13);
verify(mockPlatformHostApi.scrollTo(webViewInstanceId, 12, 13));
});
test('scrollBy', () {
webView.scrollBy(12, 14);
verify(mockPlatformHostApi.scrollBy(webViewInstanceId, 12, 14));
});
test('getScrollX', () {
when(mockPlatformHostApi.getScrollX(webViewInstanceId)).thenReturn(67);
expect(webView.getScrollX(), completion(67));
});
test('getScrollY', () {
when(mockPlatformHostApi.getScrollY(webViewInstanceId)).thenReturn(56);
expect(webView.getScrollY(), completion(56));
});
test('getScrollPosition', () async {
when(mockPlatformHostApi.getScrollPosition(webViewInstanceId))
.thenReturn(WebViewPoint(x: 2, y: 16));
await expectLater(
webView.getScrollPosition(),
completion(const Offset(2.0, 16.0)),
);
});
test('setWebViewClient', () {
TestWebViewClientHostApi.setup(MockTestWebViewClientHostApi());
WebViewClient.api = WebViewClientHostApiImpl(
instanceManager: instanceManager,
);
final WebViewClient mockWebViewClient = MockWebViewClient();
when(mockWebViewClient.copy()).thenReturn(MockWebViewClient());
instanceManager.addDartCreatedInstance(mockWebViewClient);
webView.setWebViewClient(mockWebViewClient);
final int webViewClientInstanceId =
instanceManager.getIdentifier(mockWebViewClient)!;
verify(mockPlatformHostApi.setWebViewClient(
webViewInstanceId,
webViewClientInstanceId,
));
});
test('addJavaScriptChannel', () {
TestJavaScriptChannelHostApi.setup(MockTestJavaScriptChannelHostApi());
JavaScriptChannel.api = JavaScriptChannelHostApiImpl(
instanceManager: instanceManager,
);
final JavaScriptChannel mockJavaScriptChannel = MockJavaScriptChannel();
when(mockJavaScriptChannel.copy()).thenReturn(MockJavaScriptChannel());
when(mockJavaScriptChannel.channelName).thenReturn('aChannel');
webView.addJavaScriptChannel(mockJavaScriptChannel);
final int javaScriptChannelInstanceId =
instanceManager.getIdentifier(mockJavaScriptChannel)!;
verify(mockPlatformHostApi.addJavaScriptChannel(
webViewInstanceId,
javaScriptChannelInstanceId,
));
});
test('removeJavaScriptChannel', () {
TestJavaScriptChannelHostApi.setup(MockTestJavaScriptChannelHostApi());
JavaScriptChannel.api = JavaScriptChannelHostApiImpl(
instanceManager: instanceManager,
);
final JavaScriptChannel mockJavaScriptChannel = MockJavaScriptChannel();
when(mockJavaScriptChannel.copy()).thenReturn(MockJavaScriptChannel());
when(mockJavaScriptChannel.channelName).thenReturn('aChannel');
expect(
webView.removeJavaScriptChannel(mockJavaScriptChannel),
completes,
);
webView.addJavaScriptChannel(mockJavaScriptChannel);
webView.removeJavaScriptChannel(mockJavaScriptChannel);
final int javaScriptChannelInstanceId =
instanceManager.getIdentifier(mockJavaScriptChannel)!;
verify(mockPlatformHostApi.removeJavaScriptChannel(
webViewInstanceId,
javaScriptChannelInstanceId,
));
});
test('setDownloadListener', () {
TestDownloadListenerHostApi.setup(MockTestDownloadListenerHostApi());
DownloadListener.api = DownloadListenerHostApiImpl(
instanceManager: instanceManager,
);
final DownloadListener mockDownloadListener = MockDownloadListener();
when(mockDownloadListener.copy()).thenReturn(MockDownloadListener());
instanceManager.addDartCreatedInstance(mockDownloadListener);
webView.setDownloadListener(mockDownloadListener);
final int downloadListenerInstanceId =
instanceManager.getIdentifier(mockDownloadListener)!;
verify(mockPlatformHostApi.setDownloadListener(
webViewInstanceId,
downloadListenerInstanceId,
));
});
test('setWebChromeClient', () {
TestWebChromeClientHostApi.setup(MockTestWebChromeClientHostApi());
WebChromeClient.api = WebChromeClientHostApiImpl(
instanceManager: instanceManager,
);
final WebChromeClient mockWebChromeClient = MockWebChromeClient();
when(mockWebChromeClient.copy()).thenReturn(MockWebChromeClient());
instanceManager.addDartCreatedInstance(mockWebChromeClient);
webView.setWebChromeClient(mockWebChromeClient);
final int webChromeClientInstanceId =
instanceManager.getIdentifier(mockWebChromeClient)!;
verify(mockPlatformHostApi.setWebChromeClient(
webViewInstanceId,
webChromeClientInstanceId,
));
});
test('FlutterAPI create', () {
final InstanceManager instanceManager = InstanceManager(
onWeakReferenceRemoved: (_) {},
);
final WebViewFlutterApiImpl api = WebViewFlutterApiImpl(
instanceManager: instanceManager,
);
const int instanceIdentifier = 0;
api.create(instanceIdentifier);
expect(
instanceManager.getInstanceWithWeakReference(instanceIdentifier),
isA<WebView>(),
);
});
test('copy', () {
expect(webView.copy(), isA<WebView>());
});
});
group('WebSettings', () {
late MockTestWebSettingsHostApi mockPlatformHostApi;
late InstanceManager instanceManager;
late WebSettings webSettings;
late int webSettingsInstanceId;
setUp(() {
instanceManager = InstanceManager(onWeakReferenceRemoved: (_) {});
TestWebViewHostApi.setup(MockTestWebViewHostApi());
WebView.api = WebViewHostApiImpl(instanceManager: instanceManager);
mockPlatformHostApi = MockTestWebSettingsHostApi();
TestWebSettingsHostApi.setup(mockPlatformHostApi);
WebSettings.api = WebSettingsHostApiImpl(
instanceManager: instanceManager,
);
webSettings = WebSettings(WebView());
webSettingsInstanceId = instanceManager.getIdentifier(webSettings)!;
});
test('create', () {
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,
));
});
test('setAllowFileAccess', () {
webSettings.setAllowFileAccess(true);
verify(mockPlatformHostApi.setAllowFileAccess(
webSettingsInstanceId,
true,
));
});
test('copy', () {
expect(webSettings.copy(), isA<WebSettings>());
});
test('setTextZoom', () {
webSettings.setTextZoom(100);
verify(mockPlatformHostApi.setTextZoom(
webSettingsInstanceId,
100,
));
});
});
group('JavaScriptChannel', () {
late JavaScriptChannelFlutterApiImpl flutterApi;
late InstanceManager instanceManager;
late MockJavaScriptChannel mockJavaScriptChannel;
late int mockJavaScriptChannelInstanceId;
setUp(() {
instanceManager = InstanceManager(onWeakReferenceRemoved: (_) {});
flutterApi = JavaScriptChannelFlutterApiImpl(
instanceManager: instanceManager,
);
mockJavaScriptChannel = MockJavaScriptChannel();
when(mockJavaScriptChannel.copy()).thenReturn(MockJavaScriptChannel());
mockJavaScriptChannelInstanceId =
instanceManager.addDartCreatedInstance(mockJavaScriptChannel);
});
test('postMessage', () {
late final String result;
when(mockJavaScriptChannel.postMessage).thenReturn((String message) {
result = message;
});
flutterApi.postMessage(
mockJavaScriptChannelInstanceId,
'Hello, World!',
);
expect(result, 'Hello, World!');
});
test('copy', () {
expect(
JavaScriptChannel.detached('channel', postMessage: (_) {}).copy(),
isA<JavaScriptChannel>(),
);
});
});
group('WebViewClient', () {
late WebViewClientFlutterApiImpl flutterApi;
late InstanceManager instanceManager;
late MockWebViewClient mockWebViewClient;
late int mockWebViewClientInstanceId;
late MockWebView mockWebView;
late int mockWebViewInstanceId;
setUp(() {
instanceManager = InstanceManager(onWeakReferenceRemoved: (_) {});
flutterApi = WebViewClientFlutterApiImpl(
instanceManager: instanceManager,
);
mockWebViewClient = MockWebViewClient();
when(mockWebViewClient.copy()).thenReturn(MockWebViewClient());
mockWebViewClientInstanceId =
instanceManager.addDartCreatedInstance(mockWebViewClient);
mockWebView = MockWebView();
when(mockWebView.copy()).thenReturn(MockWebView());
mockWebViewInstanceId =
instanceManager.addDartCreatedInstance(mockWebView);
});
test('onPageStarted', () {
late final List<Object> result;
when(mockWebViewClient.onPageStarted).thenReturn(
(WebView webView, String url) {
result = <Object>[webView, url];
},
);
flutterApi.onPageStarted(
mockWebViewClientInstanceId,
mockWebViewInstanceId,
'https://www.google.com',
);
expect(result, <Object>[mockWebView, 'https://www.google.com']);
});
test('onPageFinished', () {
late final List<Object> result;
when(mockWebViewClient.onPageFinished).thenReturn(
(WebView webView, String url) {
result = <Object>[webView, url];
},
);
flutterApi.onPageFinished(
mockWebViewClientInstanceId,
mockWebViewInstanceId,
'https://www.google.com',
);
expect(result, <Object>[mockWebView, 'https://www.google.com']);
});
test('onReceivedRequestError', () {
late final List<Object> result;
when(mockWebViewClient.onReceivedRequestError).thenReturn(
(
WebView webView,
WebResourceRequest request,
WebResourceError error,
) {
result = <Object>[webView, request, error];
},
);
flutterApi.onReceivedRequestError(
mockWebViewClientInstanceId,
mockWebViewInstanceId,
WebResourceRequestData(
url: 'https://www.google.com',
isForMainFrame: true,
hasGesture: true,
method: 'POST',
isRedirect: false,
requestHeaders: <String?, String?>{},
),
WebResourceErrorData(errorCode: 34, description: 'error description'),
);
expect(
result,
containsAllInOrder(<Object?>[mockWebView, isNotNull, isNotNull]),
);
});
test('onReceivedError', () {
late final List<Object> result;
when(mockWebViewClient.onReceivedError).thenReturn(
(
WebView webView,
int errorCode,
String description,
String failingUrl,
) {
result = <Object>[webView, errorCode, description, failingUrl];
},
);
flutterApi.onReceivedError(
mockWebViewClientInstanceId,
mockWebViewInstanceId,
14,
'desc',
'https://www.google.com',
);
expect(
result,
containsAllInOrder(
<Object?>[mockWebView, 14, 'desc', 'https://www.google.com'],
),
);
});
test('requestLoading', () {
late final List<Object> result;
when(mockWebViewClient.requestLoading).thenReturn(
(WebView webView, WebResourceRequest request) {
result = <Object>[webView, request];
},
);
flutterApi.requestLoading(
mockWebViewClientInstanceId,
mockWebViewInstanceId,
WebResourceRequestData(
url: 'https://www.google.com',
isForMainFrame: true,
hasGesture: true,
method: 'POST',
isRedirect: true,
requestHeaders: <String?, String?>{},
),
);
expect(
result,
containsAllInOrder(<Object?>[mockWebView, isNotNull]),
);
});
test('urlLoading', () {
late final List<Object> result;
when(mockWebViewClient.urlLoading).thenReturn(
(WebView webView, String url) {
result = <Object>[webView, url];
},
);
flutterApi.urlLoading(mockWebViewClientInstanceId,
mockWebViewInstanceId, 'https://www.google.com');
expect(
result,
containsAllInOrder(<Object?>[mockWebView, 'https://www.google.com']),
);
});
test('doUpdateVisitedHistory', () {
late final List<Object> result;
when(mockWebViewClient.doUpdateVisitedHistory).thenReturn(
(
WebView webView,
String url,
bool isReload,
) {
result = <Object>[webView, url, isReload];
},
);
flutterApi.doUpdateVisitedHistory(
mockWebViewClientInstanceId,
mockWebViewInstanceId,
'https://www.google.com',
false,
);
expect(
result,
containsAllInOrder(
<Object?>[mockWebView, 'https://www.google.com', false],
),
);
});
test('copy', () {
expect(WebViewClient.detached().copy(), isA<WebViewClient>());
});
});
group('DownloadListener', () {
late DownloadListenerFlutterApiImpl flutterApi;
late InstanceManager instanceManager;
late MockDownloadListener mockDownloadListener;
late int mockDownloadListenerInstanceId;
setUp(() {
instanceManager = InstanceManager(onWeakReferenceRemoved: (_) {});
flutterApi = DownloadListenerFlutterApiImpl(
instanceManager: instanceManager,
);
mockDownloadListener = MockDownloadListener();
when(mockDownloadListener.copy()).thenReturn(MockDownloadListener());
mockDownloadListenerInstanceId =
instanceManager.addDartCreatedInstance(mockDownloadListener);
});
test('onDownloadStart', () {
late final List<Object> result;
when(mockDownloadListener.onDownloadStart).thenReturn(
(
String url,
String userAgent,
String contentDisposition,
String mimetype,
int contentLength,
) {
result = <Object>[
url,
userAgent,
contentDisposition,
mimetype,
contentLength,
];
},
);
flutterApi.onDownloadStart(
mockDownloadListenerInstanceId,
'url',
'userAgent',
'contentDescription',
'mimetype',
45,
);
expect(
result,
containsAllInOrder(<Object?>[
'url',
'userAgent',
'contentDescription',
'mimetype',
45,
]),
);
});
test('copy', () {
expect(
DownloadListener.detached(
onDownloadStart: (_, __, ____, _____, ______) {},
).copy(),
isA<DownloadListener>(),
);
});
});
group('WebChromeClient', () {
late WebChromeClientFlutterApiImpl flutterApi;
late InstanceManager instanceManager;
late MockWebChromeClient mockWebChromeClient;
late int mockWebChromeClientInstanceId;
late MockWebView mockWebView;
late int mockWebViewInstanceId;
setUp(() {
instanceManager = InstanceManager(onWeakReferenceRemoved: (_) {});
flutterApi = WebChromeClientFlutterApiImpl(
instanceManager: instanceManager,
);
mockWebChromeClient = MockWebChromeClient();
when(mockWebChromeClient.copy()).thenReturn(MockWebChromeClient());
mockWebChromeClientInstanceId =
instanceManager.addDartCreatedInstance(mockWebChromeClient);
mockWebView = MockWebView();
when(mockWebView.copy()).thenReturn(MockWebView());
mockWebViewInstanceId =
instanceManager.addDartCreatedInstance(mockWebView);
});
test('onProgressChanged', () {
late final List<Object> result;
when(mockWebChromeClient.onProgressChanged).thenReturn(
(WebView webView, int progress) {
result = <Object>[webView, progress];
},
);
flutterApi.onProgressChanged(
mockWebChromeClientInstanceId,
mockWebViewInstanceId,
76,
);
expect(result, containsAllInOrder(<Object?>[mockWebView, 76]));
});
test('onGeolocationPermissionsShowPrompt', () async {
const String origin = 'https://www.example.com';
final GeolocationPermissionsCallback callback =
GeolocationPermissionsCallback.detached();
final int paramsId = instanceManager.addDartCreatedInstance(callback);
late final GeolocationPermissionsCallback outerCallback;
when(mockWebChromeClient.onGeolocationPermissionsShowPrompt).thenReturn(
(String origin, GeolocationPermissionsCallback callback) async {
outerCallback = callback;
},
);
flutterApi.onGeolocationPermissionsShowPrompt(
mockWebChromeClientInstanceId,
paramsId,
origin,
);
await expectLater(
outerCallback,
callback,
);
});
test('onShowFileChooser', () async {
late final List<Object> result;
when(mockWebChromeClient.onShowFileChooser).thenReturn(
(WebView webView, FileChooserParams params) {
result = <Object>[webView, params];
return Future<List<String>>.value(<String>['fileOne', 'fileTwo']);
},
);
final FileChooserParams params = FileChooserParams.detached(
isCaptureEnabled: false,
acceptTypes: <String>[],
filenameHint: 'filenameHint',
mode: FileChooserMode.open,
);
instanceManager.addHostCreatedInstance(params, 3);
await expectLater(
flutterApi.onShowFileChooser(
mockWebChromeClientInstanceId,
mockWebViewInstanceId,
3,
),
completion(<String>['fileOne', 'fileTwo']),
);
expect(result[0], mockWebView);
expect(result[1], params);
});
test('setSynchronousReturnValueForOnShowFileChooser', () {
final MockTestWebChromeClientHostApi mockHostApi =
MockTestWebChromeClientHostApi();
TestWebChromeClientHostApi.setup(mockHostApi);
WebChromeClient.api =
WebChromeClientHostApiImpl(instanceManager: instanceManager);
final WebChromeClient webChromeClient = WebChromeClient.detached();
instanceManager.addHostCreatedInstance(webChromeClient, 2);
webChromeClient.setSynchronousReturnValueForOnShowFileChooser(false);
verify(
mockHostApi.setSynchronousReturnValueForOnShowFileChooser(2, false),
);
});
test(
'setSynchronousReturnValueForOnShowFileChooser throws StateError when onShowFileChooser is null',
() {
final MockTestWebChromeClientHostApi mockHostApi =
MockTestWebChromeClientHostApi();
TestWebChromeClientHostApi.setup(mockHostApi);
WebChromeClient.api =
WebChromeClientHostApiImpl(instanceManager: instanceManager);
final WebChromeClient clientWithNullCallback =
WebChromeClient.detached();
instanceManager.addHostCreatedInstance(clientWithNullCallback, 2);
expect(
() => clientWithNullCallback
.setSynchronousReturnValueForOnShowFileChooser(true),
throwsStateError,
);
final WebChromeClient clientWithNonnullCallback =
WebChromeClient.detached(
onShowFileChooser: (_, __) async => <String>[],
);
instanceManager.addHostCreatedInstance(clientWithNonnullCallback, 3);
clientWithNonnullCallback
.setSynchronousReturnValueForOnShowFileChooser(true);
verify(
mockHostApi.setSynchronousReturnValueForOnShowFileChooser(3, true),
);
});
test('onPermissionRequest', () {
final InstanceManager instanceManager = InstanceManager(
onWeakReferenceRemoved: (_) {},
);
const int instanceIdentifier = 0;
late final List<Object?> callbackParameters;
final WebChromeClient instance = WebChromeClient.detached(
onPermissionRequest: (
WebChromeClient instance,
PermissionRequest request,
) {
callbackParameters = <Object?>[
instance,
request,
];
},
instanceManager: instanceManager,
);
instanceManager.addHostCreatedInstance(instance, instanceIdentifier);
final WebChromeClientFlutterApiImpl flutterApi =
WebChromeClientFlutterApiImpl(
instanceManager: instanceManager,
);
final PermissionRequest request = PermissionRequest.detached(
resources: <String>[],
binaryMessenger: null,
instanceManager: instanceManager,
);
const int requestIdentifier = 32;
instanceManager.addHostCreatedInstance(
request,
requestIdentifier,
);
flutterApi.onPermissionRequest(
instanceIdentifier,
requestIdentifier,
);
expect(callbackParameters, <Object?>[instance, request]);
});
test('onShowCustomView', () {
final InstanceManager instanceManager = InstanceManager(
onWeakReferenceRemoved: (_) {},
);
const int instanceIdentifier = 0;
late final List<Object?> callbackParameters;
final WebChromeClient instance = WebChromeClient.detached(
onShowCustomView: (
WebChromeClient instance,
View view,
CustomViewCallback callback,
) {
callbackParameters = <Object?>[
instance,
view,
callback,
];
},
instanceManager: instanceManager,
);
instanceManager.addHostCreatedInstance(instance, instanceIdentifier);
final WebChromeClientFlutterApiImpl flutterApi =
WebChromeClientFlutterApiImpl(
instanceManager: instanceManager,
);
final View view = View.detached(
instanceManager: instanceManager,
);
const int viewIdentifier = 50;
instanceManager.addHostCreatedInstance(view, viewIdentifier);
final CustomViewCallback callback = CustomViewCallback.detached(
instanceManager: instanceManager,
);
const int callbackIdentifier = 51;
instanceManager.addHostCreatedInstance(callback, callbackIdentifier);
flutterApi.onShowCustomView(
instanceIdentifier,
viewIdentifier,
callbackIdentifier,
);
expect(callbackParameters, <Object?>[
instance,
view,
callback,
]);
});
test('onHideCustomView', () {
final InstanceManager instanceManager = InstanceManager(
onWeakReferenceRemoved: (_) {},
);
const int instanceIdentifier = 0;
late final List<Object?> callbackParameters;
final WebChromeClient instance = WebChromeClient.detached(
onHideCustomView: (
WebChromeClient instance,
) {
callbackParameters = <Object?>[
instance,
];
},
instanceManager: instanceManager,
);
instanceManager.addHostCreatedInstance(instance, instanceIdentifier);
final WebChromeClientFlutterApiImpl flutterApi =
WebChromeClientFlutterApiImpl(
instanceManager: instanceManager,
);
flutterApi.onHideCustomView(instanceIdentifier);
expect(callbackParameters, <Object?>[instance]);
});
test('copy', () {
expect(WebChromeClient.detached().copy(), isA<WebChromeClient>());
});
});
test('onGeolocationPermissionsHidePrompt', () {
final InstanceManager instanceManager = InstanceManager(
onWeakReferenceRemoved: (_) {},
);
const int instanceIdentifier = 0;
late final List<Object?> callbackParameters;
final WebChromeClient instance = WebChromeClient.detached(
onGeolocationPermissionsHidePrompt: (WebChromeClient instance) {
callbackParameters = <Object?>[instance];
},
instanceManager: instanceManager,
);
instanceManager.addHostCreatedInstance(instance, instanceIdentifier);
final WebChromeClientFlutterApiImpl flutterApi =
WebChromeClientFlutterApiImpl(instanceManager: instanceManager);
flutterApi.onGeolocationPermissionsHidePrompt(instanceIdentifier);
expect(callbackParameters, <Object?>[instance]);
});
test('copy', () {
expect(WebChromeClient.detached().copy(), isA<WebChromeClient>());
});
});
group('FileChooserParams', () {
test('FlutterApi create', () {
final InstanceManager instanceManager = InstanceManager(
onWeakReferenceRemoved: (_) {},
);
final FileChooserParamsFlutterApiImpl flutterApi =
FileChooserParamsFlutterApiImpl(
instanceManager: instanceManager,
);
flutterApi.create(
0,
false,
const <String>['my', 'list'],
FileChooserMode.openMultiple,
'filenameHint',
);
final FileChooserParams instance =
instanceManager.getInstanceWithWeakReference(0)! as FileChooserParams;
expect(instance.isCaptureEnabled, false);
expect(instance.acceptTypes, const <String>['my', 'list']);
expect(instance.mode, FileChooserMode.openMultiple);
expect(instance.filenameHint, 'filenameHint');
});
group('CustomViewCallback', () {
tearDown(() {
TestCustomViewCallbackHostApi.setup(null);
});
test('onCustomViewHidden', () async {
final MockTestCustomViewCallbackHostApi mockApi =
MockTestCustomViewCallbackHostApi();
TestCustomViewCallbackHostApi.setup(mockApi);
final InstanceManager instanceManager = InstanceManager(
onWeakReferenceRemoved: (_) {},
);
final CustomViewCallback instance = CustomViewCallback.detached(
instanceManager: instanceManager,
);
const int instanceIdentifier = 0;
instanceManager.addHostCreatedInstance(instance, instanceIdentifier);
await instance.onCustomViewHidden();
verify(mockApi.onCustomViewHidden(instanceIdentifier));
});
test('FlutterAPI create', () {
final InstanceManager instanceManager = InstanceManager(
onWeakReferenceRemoved: (_) {},
);
final CustomViewCallbackFlutterApiImpl api =
CustomViewCallbackFlutterApiImpl(
instanceManager: instanceManager,
);
const int instanceIdentifier = 0;
api.create(instanceIdentifier);
expect(
instanceManager.getInstanceWithWeakReference(instanceIdentifier),
isA<CustomViewCallback>(),
);
});
});
group('View', () {
test('FlutterAPI create', () {
final InstanceManager instanceManager = InstanceManager(
onWeakReferenceRemoved: (_) {},
);
final ViewFlutterApiImpl api = ViewFlutterApiImpl(
instanceManager: instanceManager,
);
const int instanceIdentifier = 0;
api.create(instanceIdentifier);
expect(
instanceManager.getInstanceWithWeakReference(instanceIdentifier),
isA<View>(),
);
});
});
});
group('CookieManager', () {
tearDown(() {
TestCookieManagerHostApi.setup(null);
});
test('instance', () {
final MockTestCookieManagerHostApi mockApi =
MockTestCookieManagerHostApi();
TestCookieManagerHostApi.setup(mockApi);
final CookieManager instance = CookieManager.instance;
verify(mockApi.attachInstance(
JavaObject.globalInstanceManager.getIdentifier(instance),
));
});
test('setCookie', () async {
final MockTestCookieManagerHostApi mockApi =
MockTestCookieManagerHostApi();
TestCookieManagerHostApi.setup(mockApi);
final InstanceManager instanceManager = InstanceManager(
onWeakReferenceRemoved: (_) {},
);
final CookieManager instance = CookieManager.detached(
instanceManager: instanceManager,
);
const int instanceIdentifier = 0;
instanceManager.addHostCreatedInstance(instance, instanceIdentifier);
const String url = 'testString';
const String value = 'testString2';
await instance.setCookie(url, value);
verify(mockApi.setCookie(instanceIdentifier, url, value));
});
test('clearCookies', () async {
final MockTestCookieManagerHostApi mockApi =
MockTestCookieManagerHostApi();
TestCookieManagerHostApi.setup(mockApi);
final InstanceManager instanceManager = InstanceManager(
onWeakReferenceRemoved: (_) {},
);
final CookieManager instance = CookieManager.detached(
instanceManager: instanceManager,
);
const int instanceIdentifier = 0;
instanceManager.addHostCreatedInstance(instance, instanceIdentifier);
const bool result = true;
when(mockApi.removeAllCookies(
instanceIdentifier,
)).thenAnswer((_) => Future<bool>.value(result));
expect(await instance.removeAllCookies(), result);
verify(mockApi.removeAllCookies(instanceIdentifier));
});
test('setAcceptThirdPartyCookies', () async {
final MockTestCookieManagerHostApi mockApi =
MockTestCookieManagerHostApi();
TestCookieManagerHostApi.setup(mockApi);
final InstanceManager instanceManager = InstanceManager(
onWeakReferenceRemoved: (_) {},
);
final CookieManager instance = CookieManager.detached(
instanceManager: instanceManager,
);
const int instanceIdentifier = 0;
instanceManager.addHostCreatedInstance(instance, instanceIdentifier);
final WebView webView = WebView.detached(
instanceManager: instanceManager,
);
const int webViewIdentifier = 4;
instanceManager.addHostCreatedInstance(webView, webViewIdentifier);
const bool accept = true;
await instance.setAcceptThirdPartyCookies(
webView,
accept,
);
verify(mockApi.setAcceptThirdPartyCookies(
instanceIdentifier,
webViewIdentifier,
accept,
));
});
});
group('WebStorage', () {
late MockTestWebStorageHostApi mockPlatformHostApi;
late WebStorage webStorage;
late int webStorageInstanceId;
setUp(() {
mockPlatformHostApi = MockTestWebStorageHostApi();
TestWebStorageHostApi.setup(mockPlatformHostApi);
webStorage = WebStorage();
webStorageInstanceId =
WebStorage.api.instanceManager.getIdentifier(webStorage)!;
});
test('create', () {
verify(mockPlatformHostApi.create(webStorageInstanceId));
});
test('deleteAllData', () {
webStorage.deleteAllData();
verify(mockPlatformHostApi.deleteAllData(webStorageInstanceId));
});
test('copy', () {
expect(WebStorage.detached().copy(), isA<WebStorage>());
});
});
group('PermissionRequest', () {
setUp(() {});
tearDown(() {
TestPermissionRequestHostApi.setup(null);
});
test('grant', () async {
final MockTestPermissionRequestHostApi mockApi =
MockTestPermissionRequestHostApi();
TestPermissionRequestHostApi.setup(mockApi);
final InstanceManager instanceManager = InstanceManager(
onWeakReferenceRemoved: (_) {},
);
final PermissionRequest instance = PermissionRequest.detached(
resources: <String>[],
binaryMessenger: null,
instanceManager: instanceManager,
);
const int instanceIdentifier = 0;
instanceManager.addHostCreatedInstance(instance, instanceIdentifier);
const List<String> resources = <String>[PermissionRequest.audioCapture];
await instance.grant(resources);
verify(mockApi.grant(
instanceIdentifier,
resources,
));
});
test('deny', () async {
final MockTestPermissionRequestHostApi mockApi =
MockTestPermissionRequestHostApi();
TestPermissionRequestHostApi.setup(mockApi);
final InstanceManager instanceManager = InstanceManager(
onWeakReferenceRemoved: (_) {},
);
final PermissionRequest instance = PermissionRequest.detached(
resources: <String>[],
binaryMessenger: null,
instanceManager: instanceManager,
);
const int instanceIdentifier = 0;
instanceManager.addHostCreatedInstance(instance, instanceIdentifier);
await instance.deny();
verify(mockApi.deny(instanceIdentifier));
});
});
group('GeolocationPermissionsCallback', () {
tearDown(() {
TestGeolocationPermissionsCallbackHostApi.setup(null);
});
test('invoke', () async {
final MockTestGeolocationPermissionsCallbackHostApi mockApi =
MockTestGeolocationPermissionsCallbackHostApi();
TestGeolocationPermissionsCallbackHostApi.setup(mockApi);
final InstanceManager instanceManager = InstanceManager(
onWeakReferenceRemoved: (_) {},
);
final GeolocationPermissionsCallback instance =
GeolocationPermissionsCallback.detached(
instanceManager: instanceManager,
);
const int instanceIdentifier = 0;
instanceManager.addHostCreatedInstance(instance, instanceIdentifier);
const String origin = 'testString';
const bool allow = true;
const bool retain = true;
await instance.invoke(
origin,
allow,
retain,
);
verify(mockApi.invoke(instanceIdentifier, origin, allow, retain));
});
test('Geolocation FlutterAPI create', () {
final InstanceManager instanceManager = InstanceManager(
onWeakReferenceRemoved: (_) {},
);
final GeolocationPermissionsCallbackFlutterApiImpl api =
GeolocationPermissionsCallbackFlutterApiImpl(
instanceManager: instanceManager,
);
const int instanceIdentifier = 0;
api.create(instanceIdentifier);
expect(
instanceManager.getInstanceWithWeakReference(instanceIdentifier),
isA<GeolocationPermissionsCallback>(),
);
});
test('FlutterAPI create', () {
final InstanceManager instanceManager = InstanceManager(
onWeakReferenceRemoved: (_) {},
);
final PermissionRequestFlutterApiImpl api =
PermissionRequestFlutterApiImpl(
instanceManager: instanceManager,
);
const int instanceIdentifier = 0;
api.create(instanceIdentifier, <String?>[]);
expect(
instanceManager.getInstanceWithWeakReference(instanceIdentifier),
isA<PermissionRequest>(),
);
});
});
}