| // 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); |
| }); |
| }); |
| } |