blob: b5b3cf3e8b872c961ba9ef7c4a2fa6f34d490caa [file] [log] [blame]
// Copyright 2019 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// ignore_for_file: avoid_as, import_of_legacy_library_into_null_safe
import 'dart:convert' show utf8;
import 'dart:typed_data';
import 'package:fidl_fuchsia_net_http/fidl_async.dart' as fidl_net;
import 'package:fidl_fuchsia_web/fidl_async.dart' as fidl_web;
import 'package:flutter/widgets.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:fuchsia_webview_flutter/src/fuchsia_web_services.dart';
import 'package:fuchsia_webview_flutter/src/fuchsia_webview_platform_controller.dart';
import 'package:fuchsia_webview_flutter/webview.dart';
import 'package:mockito/mockito.dart';
import 'package:webview_flutter/platform_interface.dart';
import 'package:webview_flutter/webview_flutter.dart';
// ignore_for_file: implementation_imports
class MockFuchsiaWebServices extends Mock implements FuchsiaWebServices {}
class MockWebViewPlatformCallbacksHandler extends Mock
implements WebViewPlatformCallbacksHandler {}
class MockFuchsiaWebViewPlatformController extends Mock
implements FuchsiaWebViewPlatformController {}
class MockNavigationControllerProxy extends Mock
implements fidl_web.NavigationControllerProxy {}
void main() {
FuchsiaWebServices? mockWebServices;
fidl_web.NavigationControllerProxy? mockNavigationController;
setUp(() {
mockWebServices = MockFuchsiaWebServices();
mockNavigationController = MockNavigationControllerProxy();
when(mockWebServices!.navigationController)
.thenReturn(mockNavigationController!);
WebView.platform = FuchsiaWebView(fuchsiaWebServices: mockWebServices);
});
tearDown(() {
WebView.platform = null;
});
testWidgets('Create WebView', (WidgetTester tester) async {
await tester.pumpWidget(const WebView());
});
group('navigation: ', () {
late WebViewController webViewController;
late WebView webView;
setUp(() {
webView = WebView(
onWebViewCreated: (WebViewController webViewCtl) {
webViewController = webViewCtl;
},
);
});
testWidgets('loadUrl', (WidgetTester tester) async {
await tester.pumpWidget(webView);
final headers = <String, String>{'header': 'value'};
String url = 'https://google.com';
await webViewController.loadUrl(url, headers: headers);
verify(mockNavigationController!.loadUrl(
url,
fidl_web.LoadUrlParams(
type: fidl_web.LoadUrlReason.typed,
headers: [
fidl_net.Header(
name: utf8.encode('header') as Uint8List,
value: utf8.encode('value') as Uint8List)
],
)));
});
testWidgets('goBack', (WidgetTester tester) async {
await tester.pumpWidget(webView);
await webViewController.goBack();
verify(mockNavigationController!.goBack());
});
testWidgets('goForward', (WidgetTester tester) async {
await tester.pumpWidget(webView);
await webViewController.goForward();
verify(mockNavigationController!.goForward());
});
testWidgets('reload', (WidgetTester tester) async {
await tester.pumpWidget(webView);
await webViewController.reload();
verify(
mockNavigationController!.reload(fidl_web.ReloadType.partialCache));
});
testWidgets('disposed when removed from widget tree',
(WidgetTester tester) async {
final includeWebview = ValueNotifier<bool>(true);
await tester.pumpWidget(ValueListenableBuilder(
valueListenable: includeWebview,
builder: (_, dynamic includeWebviewValue, __) {
return includeWebviewValue ? webView : Container();
}));
await tester.pumpAndSettle();
verifyNever(mockWebServices!.dispose());
includeWebview.value = false;
await tester.pumpAndSettle();
verify(mockWebServices!.dispose());
});
});
group('JS injection', () {
late WebViewController webViewController;
late WebView webView;
setUp(() {
webView = WebView(
onWebViewCreated: (WebViewController webViewCtl) {
webViewController = webViewCtl;
},
javascriptMode: JavascriptMode.unrestricted,
);
});
testWidgets('evaluateJavascript', (WidgetTester tester) async {
await tester.pumpWidget(webView);
const script = 'console.log("hello");';
await webViewController.evaluateJavascript(script);
verify(mockWebServices!.evaluateJavascript(['*'], script));
});
});
group('FuchsiaWebServices config', () {
test('default config', () {
expect(
FuchsiaWebServices.webFeaturesFromSettings(),
FuchsiaWebServices.baseWebFeatures |
fidl_web.ContextFeatureFlags.vulkan);
});
test('software false', () {
expect(
FuchsiaWebServices.webFeaturesFromSettings(
useSoftwareRendering: false),
FuchsiaWebServices.baseWebFeatures |
fidl_web.ContextFeatureFlags.vulkan);
});
test('software true', () {
expect(
FuchsiaWebServices.webFeaturesFromSettings(
useSoftwareRendering: true),
FuchsiaWebServices.baseWebFeatures);
});
});
}