diff --git a/.github/workflows/analyze.yml b/.github/workflows/analyze.yml index 8508bd3bf..5d09a9f88 100644 --- a/.github/workflows/analyze.yml +++ b/.github/workflows/analyze.yml @@ -9,7 +9,7 @@ jobs: - uses: actions/checkout@v2 - uses: subosito/flutter-action@v1 with: - flutter-version: "2.2.1" + flutter-version: "2.5.1" - name: Install pub dependencies run: | for d in `pwd`/packages/*/; do diff --git a/packages/webview_flutter/CHANGELOG.md b/packages/webview_flutter/CHANGELOG.md index ed67c1134..add91cc14 100644 --- a/packages/webview_flutter/CHANGELOG.md +++ b/packages/webview_flutter/CHANGELOG.md @@ -40,4 +40,7 @@ ## 0.3.6 * Update LWE binary (3dff8724bfb4b2b0b9e7c4e3976a9b02e74ee13c) -* Fix various issue \ No newline at end of file +* Fix various issue + +## 0.3.7 +* Update webivew_flutter to 2.1.1 \ No newline at end of file diff --git a/packages/webview_flutter/README.md b/packages/webview_flutter/README.md index ff3201454..ab2a59da1 100644 --- a/packages/webview_flutter/README.md +++ b/packages/webview_flutter/README.md @@ -22,7 +22,7 @@ This package is not an _endorsed_ implementation of `webview_flutter`. Therefore ```yaml dependencies: - webview_flutter_tizen: ^0.3.5 + webview_flutter_tizen: ^0.3.7 ``` ## Example diff --git a/packages/webview_flutter/example/integration_test/webview_flutter_test.dart b/packages/webview_flutter/example/integration_test/webview_flutter_test.dart index f454c92b4..dc782c3dc 100644 --- a/packages/webview_flutter/example/integration_test/webview_flutter_test.dart +++ b/packages/webview_flutter/example/integration_test/webview_flutter_test.dart @@ -1,9 +1,7 @@ -// Copyright 2018 The Chromium Authors. All rights reserved. +// 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. -// @dart = 2.9 - import 'dart:math'; import 'dart:typed_data'; @@ -12,15 +10,14 @@ import 'package:flutter/src/foundation/basic_types.dart'; import 'package:flutter/src/gestures/recognizer.dart'; import 'package:flutter/widgets.dart'; import 'package:flutter_test/flutter_test.dart'; -import 'package:webview_flutter/platform_interface.dart'; +import 'package:webview_flutter_platform_interface/webview_flutter_platform_interface.dart'; import 'package:webview_flutter/webview_flutter.dart'; import 'package:webview_flutter_tizen/webview_flutter_tizen.dart'; -import 'package:integration_test/integration_test.dart'; typedef void VoidCallback(); void main() { - IntegrationTestWidgetsFlutterBinding.ensureInitialized(); + TestWidgetsFlutterBinding.ensureInitialized(); final _FakePlatformViewsController fakePlatformViewsController = _FakePlatformViewsController(); @@ -45,7 +42,7 @@ void main() { }); testWidgets('Initial url', (WidgetTester tester) async { - WebViewController controller; + late WebViewController controller; await tester.pumpWidget( WebView( initialUrl: 'https://youtube.com', @@ -65,7 +62,7 @@ void main() { )); final FakePlatformWebView platformWebView = - fakePlatformViewsController.lastCreatedView; + fakePlatformViewsController.lastCreatedView!; expect(platformWebView.javascriptMode, JavascriptMode.unrestricted); @@ -77,7 +74,7 @@ void main() { }); testWidgets('Load url', (WidgetTester tester) async { - WebViewController controller; + WebViewController? controller; await tester.pumpWidget( WebView( onWebViewCreated: (WebViewController webViewController) { @@ -88,13 +85,13 @@ void main() { expect(controller, isNotNull); - await controller.loadUrl('https://flutter.io'); + await controller!.loadUrl('https://flutter.io'); - expect(await controller.currentUrl(), 'https://flutter.io'); + expect(await controller!.currentUrl(), 'https://flutter.io'); }); testWidgets('Invalid urls', (WidgetTester tester) async { - WebViewController controller; + WebViewController? controller; await tester.pumpWidget( WebView( onWebViewCreated: (WebViewController webViewController) { @@ -105,19 +102,18 @@ void main() { expect(controller, isNotNull); - expect(() => controller.loadUrl(null), throwsA(anything)); - expect(await controller.currentUrl(), isNull); + expect(await controller!.currentUrl(), isNull); - expect(() => controller.loadUrl(''), throwsA(anything)); - expect(await controller.currentUrl(), isNull); + expect(() => controller!.loadUrl(''), throwsA(anything)); + expect(await controller!.currentUrl(), isNull); // Missing schema. - expect(() => controller.loadUrl('flutter.io'), throwsA(anything)); - expect(await controller.currentUrl(), isNull); + expect(() => controller!.loadUrl('flutter.io'), throwsA(anything)); + expect(await controller!.currentUrl(), isNull); }); testWidgets('Headers in loadUrl', (WidgetTester tester) async { - WebViewController controller; + WebViewController? controller; await tester.pumpWidget( WebView( onWebViewCreated: (WebViewController webViewController) { @@ -131,13 +127,13 @@ void main() { final Map headers = { 'CACHE-CONTROL': 'ABC' }; - await controller.loadUrl('https://flutter.io', headers: headers); - expect(await controller.currentUrl(), equals('https://flutter.io')); + await controller!.loadUrl('https://flutter.io', headers: headers); + expect(await controller!.currentUrl(), equals('https://flutter.io')); }); testWidgets("Can't go back before loading a page", (WidgetTester tester) async { - WebViewController controller; + WebViewController? controller; await tester.pumpWidget( WebView( onWebViewCreated: (WebViewController webViewController) { @@ -148,13 +144,13 @@ void main() { expect(controller, isNotNull); - final bool canGoBackNoPageLoaded = await controller.canGoBack(); + final bool canGoBackNoPageLoaded = await controller!.canGoBack(); expect(canGoBackNoPageLoaded, false); }); testWidgets("Clear Cache", (WidgetTester tester) async { - WebViewController controller; + WebViewController? controller; await tester.pumpWidget( WebView( onWebViewCreated: (WebViewController webViewController) { @@ -164,15 +160,15 @@ void main() { ); expect(controller, isNotNull); - expect(fakePlatformViewsController.lastCreatedView.hasCache, true); + expect(fakePlatformViewsController.lastCreatedView!.hasCache, true); - await controller.clearCache(); + await controller!.clearCache(); - expect(fakePlatformViewsController.lastCreatedView.hasCache, false); + expect(fakePlatformViewsController.lastCreatedView!.hasCache, false); }); testWidgets("Can't go back with no history", (WidgetTester tester) async { - WebViewController controller; + WebViewController? controller; await tester.pumpWidget( WebView( initialUrl: 'https://flutter.io', @@ -183,13 +179,13 @@ void main() { ); expect(controller, isNotNull); - final bool canGoBackFirstPageLoaded = await controller.canGoBack(); + final bool canGoBackFirstPageLoaded = await controller!.canGoBack(); expect(canGoBackFirstPageLoaded, false); }); testWidgets('Can go back', (WidgetTester tester) async { - WebViewController controller; + WebViewController? controller; await tester.pumpWidget( WebView( initialUrl: 'https://flutter.io', @@ -201,15 +197,15 @@ void main() { expect(controller, isNotNull); - await controller.loadUrl('https://www.google.com'); - final bool canGoBackSecondPageLoaded = await controller.canGoBack(); + await controller!.loadUrl('https://www.google.com'); + final bool canGoBackSecondPageLoaded = await controller!.canGoBack(); expect(canGoBackSecondPageLoaded, true); }); testWidgets("Can't go forward before loading a page", (WidgetTester tester) async { - WebViewController controller; + WebViewController? controller; await tester.pumpWidget( WebView( onWebViewCreated: (WebViewController webViewController) { @@ -220,13 +216,13 @@ void main() { expect(controller, isNotNull); - final bool canGoForwardNoPageLoaded = await controller.canGoForward(); + final bool canGoForwardNoPageLoaded = await controller!.canGoForward(); expect(canGoForwardNoPageLoaded, false); }); testWidgets("Can't go forward with no history", (WidgetTester tester) async { - WebViewController controller; + WebViewController? controller; await tester.pumpWidget( WebView( initialUrl: 'https://flutter.io', @@ -237,13 +233,13 @@ void main() { ); expect(controller, isNotNull); - final bool canGoForwardFirstPageLoaded = await controller.canGoForward(); + final bool canGoForwardFirstPageLoaded = await controller!.canGoForward(); expect(canGoForwardFirstPageLoaded, false); }); testWidgets('Can go forward', (WidgetTester tester) async { - WebViewController controller; + WebViewController? controller; await tester.pumpWidget( WebView( initialUrl: 'https://flutter.io', @@ -255,15 +251,15 @@ void main() { expect(controller, isNotNull); - await controller.loadUrl('https://youtube.com'); - await controller.goBack(); - final bool canGoForwardFirstPageBacked = await controller.canGoForward(); + await controller!.loadUrl('https://youtube.com'); + await controller!.goBack(); + final bool canGoForwardFirstPageBacked = await controller!.canGoForward(); expect(canGoForwardFirstPageBacked, true); }); testWidgets('Go back', (WidgetTester tester) async { - WebViewController controller; + WebViewController? controller; await tester.pumpWidget( WebView( initialUrl: 'https://youtube.com', @@ -275,19 +271,19 @@ void main() { expect(controller, isNotNull); - expect(await controller.currentUrl(), 'https://youtube.com'); + expect(await controller!.currentUrl(), 'https://youtube.com'); - await controller.loadUrl('https://flutter.io'); + await controller!.loadUrl('https://flutter.io'); - expect(await controller.currentUrl(), 'https://flutter.io'); + expect(await controller!.currentUrl(), 'https://flutter.io'); - await controller.goBack(); + await controller!.goBack(); - expect(await controller.currentUrl(), 'https://youtube.com'); + expect(await controller!.currentUrl(), 'https://youtube.com'); }); testWidgets('Go forward', (WidgetTester tester) async { - WebViewController controller; + WebViewController? controller; await tester.pumpWidget( WebView( initialUrl: 'https://youtube.com', @@ -299,23 +295,23 @@ void main() { expect(controller, isNotNull); - expect(await controller.currentUrl(), 'https://youtube.com'); + expect(await controller!.currentUrl(), 'https://youtube.com'); - await controller.loadUrl('https://flutter.io'); + await controller!.loadUrl('https://flutter.io'); - expect(await controller.currentUrl(), 'https://flutter.io'); + expect(await controller!.currentUrl(), 'https://flutter.io'); - await controller.goBack(); + await controller!.goBack(); - expect(await controller.currentUrl(), 'https://youtube.com'); + expect(await controller!.currentUrl(), 'https://youtube.com'); - await controller.goForward(); + await controller!.goForward(); - expect(await controller.currentUrl(), 'https://flutter.io'); + expect(await controller!.currentUrl(), 'https://flutter.io'); }); testWidgets('Current URL', (WidgetTester tester) async { - WebViewController controller; + WebViewController? controller; await tester.pumpWidget( WebView( onWebViewCreated: (WebViewController webViewController) { @@ -327,20 +323,20 @@ void main() { expect(controller, isNotNull); // Test a WebView without an explicitly set first URL. - expect(await controller.currentUrl(), isNull); + expect(await controller!.currentUrl(), isNull); - await controller.loadUrl('https://youtube.com'); - expect(await controller.currentUrl(), 'https://youtube.com'); + await controller!.loadUrl('https://youtube.com'); + expect(await controller!.currentUrl(), 'https://youtube.com'); - await controller.loadUrl('https://flutter.io'); - expect(await controller.currentUrl(), 'https://flutter.io'); + await controller!.loadUrl('https://flutter.io'); + expect(await controller!.currentUrl(), 'https://flutter.io'); - await controller.goBack(); - expect(await controller.currentUrl(), 'https://youtube.com'); + await controller!.goBack(); + expect(await controller!.currentUrl(), 'https://youtube.com'); }); testWidgets('Reload url', (WidgetTester tester) async { - WebViewController controller; + late WebViewController controller; await tester.pumpWidget( WebView( initialUrl: 'https://flutter.io', @@ -351,7 +347,7 @@ void main() { ); final FakePlatformWebView platformWebView = - fakePlatformViewsController.lastCreatedView; + fakePlatformViewsController.lastCreatedView!; expect(platformWebView.currentUrl, 'https://flutter.io'); expect(platformWebView.amountOfReloadsOnCurrentUrl, 0); @@ -367,7 +363,7 @@ void main() { }); testWidgets('evaluate Javascript', (WidgetTester tester) async { - WebViewController controller; + late WebViewController controller; await tester.pumpWidget( WebView( initialUrl: 'https://flutter.io', @@ -380,15 +376,11 @@ void main() { expect( await controller.evaluateJavascript("fake js string"), "fake js string", reason: 'should get the argument'); - expect( - () => controller.evaluateJavascript(null), - throwsA(anything), - ); }); testWidgets('evaluate Javascript with JavascriptMode disabled', (WidgetTester tester) async { - WebViewController controller; + late WebViewController controller; await tester.pumpWidget( WebView( initialUrl: 'https://flutter.io', @@ -402,10 +394,6 @@ void main() { () => controller.evaluateJavascript('fake js string'), throwsA(anything), ); - expect( - () => controller.evaluateJavascript(null), - throwsA(anything), - ); }); testWidgets('Cookies can be cleared once', (WidgetTester tester) async { @@ -437,19 +425,17 @@ void main() { await tester.pumpWidget( WebView( initialUrl: 'https://youtube.com', - // TODO(iskakaushik): Remove this when collection literals makes it to stable. - // ignore: prefer_collection_literals - javascriptChannels: [ + javascriptChannels: { JavascriptChannel( name: 'Tts', onMessageReceived: (JavascriptMessage msg) {}), JavascriptChannel( name: 'Alarm', onMessageReceived: (JavascriptMessage msg) {}), - ].toSet(), + }, ), ); final FakePlatformWebView platformWebView = - fakePlatformViewsController.lastCreatedView; + fakePlatformViewsController.lastCreatedView!; expect(platformWebView.javascriptChannelNames, unorderedEquals(['Tts', 'Alarm'])); @@ -477,14 +463,12 @@ void main() { await tester.pumpWidget( WebView( initialUrl: 'https://youtube.com', - // TODO(iskakaushik): Remove this when collection literals makes it to stable. - // ignore: prefer_collection_literals - javascriptChannels: [ + javascriptChannels: { JavascriptChannel( name: 'Alarm', onMessageReceived: (JavascriptMessage msg) {}), JavascriptChannel( name: 'Alarm', onMessageReceived: (JavascriptMessage msg) {}), - ].toSet(), + }, ), ); expect(tester.takeException(), isNot(null)); @@ -494,35 +478,31 @@ void main() { await tester.pumpWidget( WebView( initialUrl: 'https://youtube.com', - // TODO(iskakaushik): Remove this when collection literals makes it to stable. - // ignore: prefer_collection_literals - javascriptChannels: [ + javascriptChannels: { JavascriptChannel( name: 'Tts', onMessageReceived: (JavascriptMessage msg) {}), JavascriptChannel( name: 'Alarm', onMessageReceived: (JavascriptMessage msg) {}), - ].toSet(), + }, ), ); await tester.pumpWidget( WebView( initialUrl: 'https://youtube.com', - // TODO(iskakaushik): Remove this when collection literals makes it to stable. - // ignore: prefer_collection_literals - javascriptChannels: [ + javascriptChannels: { JavascriptChannel( name: 'Tts', onMessageReceived: (JavascriptMessage msg) {}), JavascriptChannel( name: 'Alarm2', onMessageReceived: (JavascriptMessage msg) {}), JavascriptChannel( name: 'Alarm3', onMessageReceived: (JavascriptMessage msg) {}), - ].toSet(), + }, ), ); final FakePlatformWebView platformWebView = - fakePlatformViewsController.lastCreatedView; + fakePlatformViewsController.lastCreatedView!; expect(platformWebView.javascriptChannelNames, unorderedEquals(['Tts', 'Alarm2', 'Alarm3'])); @@ -537,12 +517,10 @@ void main() { await tester.pumpWidget( WebView( initialUrl: 'https://youtube.com', - // TODO(iskakaushik): Remove this when collection literals makes it to stable. - // ignore: prefer_collection_literals - javascriptChannels: [ + javascriptChannels: { JavascriptChannel( name: 'Tts', onMessageReceived: (JavascriptMessage msg) {}), - ].toSet(), + }, ), ); @@ -555,17 +533,15 @@ void main() { await tester.pumpWidget( WebView( initialUrl: 'https://youtube.com', - // TODO(iskakaushik): Remove this when collection literals makes it to stable. - // ignore: prefer_collection_literals - javascriptChannels: [ + javascriptChannels: { JavascriptChannel( name: 'Tts', onMessageReceived: (JavascriptMessage msg) {}), - ].toSet(), + }, ), ); final FakePlatformWebView platformWebView = - fakePlatformViewsController.lastCreatedView; + fakePlatformViewsController.lastCreatedView!; expect(platformWebView.javascriptChannelNames, unorderedEquals(['Tts'])); @@ -577,9 +553,7 @@ void main() { await tester.pumpWidget( WebView( initialUrl: 'https://youtube.com', - // TODO(iskakaushik): Remove this when collection literals makes it to stable. - // ignore: prefer_collection_literals - javascriptChannels: [ + javascriptChannels: { JavascriptChannel( name: 'Tts', onMessageReceived: (JavascriptMessage msg) { @@ -590,12 +564,12 @@ void main() { onMessageReceived: (JavascriptMessage msg) { alarmMessagesReceived.add(msg.message); }), - ].toSet(), + }, ), ); final FakePlatformWebView platformWebView = - fakePlatformViewsController.lastCreatedView; + fakePlatformViewsController.lastCreatedView!; expect(ttsMessagesReceived, isEmpty); expect(alarmMessagesReceived, isEmpty); @@ -608,7 +582,7 @@ void main() { group('$PageStartedCallback', () { testWidgets('onPageStarted is not null', (WidgetTester tester) async { - String returnedUrl; + String? returnedUrl; await tester.pumpWidget(WebView( initialUrl: 'https://youtube.com', @@ -618,7 +592,7 @@ void main() { )); final FakePlatformWebView platformWebView = - fakePlatformViewsController.lastCreatedView; + fakePlatformViewsController.lastCreatedView!; platformWebView.fakeOnPageStartedCallback(); @@ -632,7 +606,7 @@ void main() { )); final FakePlatformWebView platformWebView = - fakePlatformViewsController.lastCreatedView; + fakePlatformViewsController.lastCreatedView!; // The platform side will always invoke a call for onPageStarted. This is // to test that it does not crash on a null callback. @@ -640,7 +614,7 @@ void main() { }); testWidgets('onPageStarted changed', (WidgetTester tester) async { - String returnedUrl; + String? returnedUrl; await tester.pumpWidget(WebView( initialUrl: 'https://youtube.com', @@ -655,7 +629,7 @@ void main() { )); final FakePlatformWebView platformWebView = - fakePlatformViewsController.lastCreatedView; + fakePlatformViewsController.lastCreatedView!; platformWebView.fakeOnPageStartedCallback(); @@ -665,7 +639,7 @@ void main() { group('$PageFinishedCallback', () { testWidgets('onPageFinished is not null', (WidgetTester tester) async { - String returnedUrl; + String? returnedUrl; await tester.pumpWidget(WebView( initialUrl: 'https://youtube.com', @@ -675,7 +649,7 @@ void main() { )); final FakePlatformWebView platformWebView = - fakePlatformViewsController.lastCreatedView; + fakePlatformViewsController.lastCreatedView!; platformWebView.fakeOnPageFinishedCallback(); @@ -689,7 +663,7 @@ void main() { )); final FakePlatformWebView platformWebView = - fakePlatformViewsController.lastCreatedView; + fakePlatformViewsController.lastCreatedView!; // The platform side will always invoke a call for onPageFinished. This is // to test that it does not crash on a null callback. @@ -697,7 +671,7 @@ void main() { }); testWidgets('onPageFinished changed', (WidgetTester tester) async { - String returnedUrl; + String? returnedUrl; await tester.pumpWidget(WebView( initialUrl: 'https://youtube.com', @@ -712,7 +686,7 @@ void main() { )); final FakePlatformWebView platformWebView = - fakePlatformViewsController.lastCreatedView; + fakePlatformViewsController.lastCreatedView!; platformWebView.fakeOnPageFinishedCallback(); @@ -720,6 +694,62 @@ void main() { }); }); + group('$PageLoadingCallback', () { + testWidgets('onLoadingProgress is not null', (WidgetTester tester) async { + int? loadingProgress; + + await tester.pumpWidget(WebView( + initialUrl: 'https://youtube.com', + onProgress: (int progress) { + loadingProgress = progress; + }, + )); + + final FakePlatformWebView? platformWebView = + fakePlatformViewsController.lastCreatedView; + + platformWebView?.fakeOnProgressCallback(50); + + expect(loadingProgress, 50); + }); + + testWidgets('onLoadingProgress is null', (WidgetTester tester) async { + await tester.pumpWidget(const WebView( + initialUrl: 'https://youtube.com', + onProgress: null, + )); + + final FakePlatformWebView platformWebView = + fakePlatformViewsController.lastCreatedView!; + + // This is to test that it does not crash on a null callback. + platformWebView.fakeOnProgressCallback(50); + }); + + testWidgets('onLoadingProgress changed', (WidgetTester tester) async { + int? loadingProgress; + + await tester.pumpWidget(WebView( + initialUrl: 'https://youtube.com', + onProgress: (int progress) {}, + )); + + await tester.pumpWidget(WebView( + initialUrl: 'https://youtube.com', + onProgress: (int progress) { + loadingProgress = progress; + }, + )); + + final FakePlatformWebView platformWebView = + fakePlatformViewsController.lastCreatedView!; + + platformWebView.fakeOnProgressCallback(50); + + expect(loadingProgress, 50); + }); + }); + group('navigationDelegate', () { testWidgets('hasNavigationDelegate', (WidgetTester tester) async { await tester.pumpWidget(const WebView( @@ -727,13 +757,14 @@ void main() { )); final FakePlatformWebView platformWebView = - fakePlatformViewsController.lastCreatedView; + fakePlatformViewsController.lastCreatedView!; expect(platformWebView.hasNavigationDelegate, false); await tester.pumpWidget(WebView( initialUrl: 'https://youtube.com', - navigationDelegate: (NavigationRequest r) => null, + navigationDelegate: (NavigationRequest r) => + NavigationDecision.navigate, )); expect(platformWebView.hasNavigationDelegate, true); @@ -753,7 +784,7 @@ void main() { })); final FakePlatformWebView platformWebView = - fakePlatformViewsController.lastCreatedView; + fakePlatformViewsController.lastCreatedView!; expect(platformWebView.hasNavigationDelegate, true); @@ -778,7 +809,7 @@ void main() { )); final FakePlatformWebView platformWebView = - fakePlatformViewsController.lastCreatedView; + fakePlatformViewsController.lastCreatedView!; expect(platformWebView.debuggingEnabled, true); }); @@ -787,7 +818,7 @@ void main() { await tester.pumpWidget(const WebView()); final FakePlatformWebView platformWebView = - fakePlatformViewsController.lastCreatedView; + fakePlatformViewsController.lastCreatedView!; expect(platformWebView.debuggingEnabled, false); }); @@ -797,7 +828,7 @@ void main() { await tester.pumpWidget(WebView(key: key)); final FakePlatformWebView platformWebView = - fakePlatformViewsController.lastCreatedView; + fakePlatformViewsController.lastCreatedView!; await tester.pumpWidget(WebView( key: key, @@ -833,8 +864,8 @@ void main() { ), ); - final MyWebViewPlatform builder = WebView.platform; - final MyWebViewPlatformController platform = builder.lastPlatformBuilt; + final MyWebViewPlatform builder = WebView.platform as MyWebViewPlatform; + final MyWebViewPlatformController platform = builder.lastPlatformBuilt!; expect( platform.creationParams, @@ -844,17 +875,14 @@ void main() { javascriptMode: JavascriptMode.disabled, hasNavigationDelegate: false, debuggingEnabled: false, - userAgent: WebSetting.of(null), + userAgent: WebSetting.of(null), gestureNavigationEnabled: true, ), - // TODO(iskakaushik): Remove this when collection literals makes it to stable. - // ignore: prefer_collection_literals - javascriptChannelNames: Set(), ))); }); testWidgets('loadUrl', (WidgetTester tester) async { - WebViewController controller; + late WebViewController controller; await tester.pumpWidget( WebView( initialUrl: 'https://youtube.com', @@ -864,8 +892,8 @@ void main() { ), ); - final MyWebViewPlatform builder = WebView.platform; - final MyWebViewPlatformController platform = builder.lastPlatformBuilt; + final MyWebViewPlatform builder = WebView.platform as MyWebViewPlatform; + final MyWebViewPlatformController platform = builder.lastPlatformBuilt!; final Map headers = { 'header': 'value', @@ -885,7 +913,7 @@ void main() { )); final FakePlatformWebView platformWebView = - fakePlatformViewsController.lastCreatedView; + fakePlatformViewsController.lastCreatedView!; expect(platformWebView.userAgent, isNull); @@ -900,9 +928,9 @@ void main() { } class FakePlatformWebView { - FakePlatformWebView(int id, Map params) { + FakePlatformWebView(int? id, Map params) { if (params.containsKey('initialUrl')) { - final String initialUrl = params['initialUrl']; + final String? initialUrl = params['initialUrl']; if (initialUrl != null) { history.add(initialUrl); currentPosition++; @@ -922,20 +950,20 @@ class FakePlatformWebView { channel.setMockMethodCallHandler(onMethodCall); } - MethodChannel channel; + late MethodChannel channel; - List history = []; + List history = []; int currentPosition = -1; int amountOfReloadsOnCurrentUrl = 0; bool hasCache = true; - String get currentUrl => history.isEmpty ? null : history[currentPosition]; - JavascriptMode javascriptMode; - List javascriptChannelNames; + String? get currentUrl => history.isEmpty ? null : history[currentPosition]; + JavascriptMode? javascriptMode; + List? javascriptChannelNames; - bool hasNavigationDelegate; - bool debuggingEnabled; - String userAgent; + bool? hasNavigationDelegate; + bool? debuggingEnabled; + String? userAgent; Future onMethodCall(MethodCall call) { switch (call.method) { @@ -957,34 +985,28 @@ class FakePlatformWebView { break; case 'canGoBack': return Future.sync(() => currentPosition > 0); - break; case 'canGoForward': return Future.sync(() => currentPosition < history.length - 1); - break; case 'goBack': currentPosition = max(-1, currentPosition - 1); return Future.sync(() {}); - break; case 'goForward': currentPosition = min(history.length - 1, currentPosition + 1); return Future.sync(() {}); case 'reload': amountOfReloadsOnCurrentUrl++; return Future.sync(() {}); - break; case 'currentUrl': - return Future.value(currentUrl); - break; + return Future.value(currentUrl); case 'evaluateJavascript': return Future.value(call.arguments); - break; case 'addJavascriptChannels': final List channelNames = List.from(call.arguments); - javascriptChannelNames.addAll(channelNames); + javascriptChannelNames!.addAll(channelNames); break; case 'removeJavascriptChannels': final List channelNames = List.from(call.arguments); - javascriptChannelNames + javascriptChannelNames! .removeWhere((String channel) => channelNames.contains(channel)); break; case 'clearCache': @@ -1002,14 +1024,15 @@ class FakePlatformWebView { }; final ByteData data = codec .encodeMethodCall(MethodCall('javascriptChannelMessage', arguments)); - ServicesBinding.instance.defaultBinaryMessenger - .handlePlatformMessage(channel.name, data, (ByteData data) {}); + _ambiguate(ServicesBinding.instance)! + .defaultBinaryMessenger + .handlePlatformMessage(channel.name, data, (ByteData? data) {}); } // Fakes a main frame navigation that was initiated by the webview, e.g when // the user clicks a link in the currently loaded page. void fakeNavigate(String url) { - if (!hasNavigationDelegate) { + if (!hasNavigationDelegate!) { print('no navigation delegate'); _loadUrl(url); return; @@ -1021,9 +1044,10 @@ class FakePlatformWebView { }; final ByteData data = codec.encodeMethodCall(MethodCall('navigationRequest', arguments)); - ServicesBinding.instance.defaultBinaryMessenger - .handlePlatformMessage(channel.name, data, (ByteData data) { - final bool allow = codec.decodeEnvelope(data); + _ambiguate(ServicesBinding.instance)! + .defaultBinaryMessenger + .handlePlatformMessage(channel.name, data, (ByteData? data) { + final bool allow = codec.decodeEnvelope(data!); if (allow) { _loadUrl(url); } @@ -1038,11 +1062,13 @@ class FakePlatformWebView { {'url': currentUrl}, )); - ServicesBinding.instance.defaultBinaryMessenger.handlePlatformMessage( - channel.name, - data, - (ByteData data) {}, - ); + _ambiguate(ServicesBinding.instance)! + .defaultBinaryMessenger + .handlePlatformMessage( + channel.name, + data, + (ByteData? data) {}, + ); } void fakeOnPageFinishedCallback() { @@ -1053,14 +1079,29 @@ class FakePlatformWebView { {'url': currentUrl}, )); - ServicesBinding.instance.defaultBinaryMessenger.handlePlatformMessage( - channel.name, - data, - (ByteData data) {}, - ); + _ambiguate(ServicesBinding.instance)! + .defaultBinaryMessenger + .handlePlatformMessage( + channel.name, + data, + (ByteData? data) {}, + ); + } + + void fakeOnProgressCallback(int progress) { + final StandardMethodCodec codec = const StandardMethodCodec(); + + final ByteData data = codec.encodeMethodCall(MethodCall( + 'onProgress', + {'progress': progress}, + )); + + _ambiguate(ServicesBinding.instance)! + .defaultBinaryMessenger + .handlePlatformMessage(channel.name, data, (ByteData? data) {}); } - void _loadUrl(String url) { + void _loadUrl(String? url) { history = history.sublist(0, currentPosition + 1); history.add(url); currentPosition++; @@ -1069,13 +1110,13 @@ class FakePlatformWebView { } class _FakePlatformViewsController { - FakePlatformWebView lastCreatedView; + FakePlatformWebView? lastCreatedView; Future fakePlatformViewsMethodHandler(MethodCall call) { switch (call.method) { case 'create': final Map args = call.arguments; - final Map params = _decodeParams(args['params']); + final Map params = _decodeParams(args['params'])!; lastCreatedView = FakePlatformWebView( args['id'], params, @@ -1091,7 +1132,7 @@ class _FakePlatformViewsController { } } -Map _decodeParams(Uint8List paramsMessage) { +Map? _decodeParams(Uint8List paramsMessage) { final ByteBuffer buffer = paramsMessage.buffer; final ByteData messageBytes = buffer.asByteData( paramsMessage.offsetInBytes, @@ -1122,9 +1163,8 @@ class _FakeCookieManager { return Future.sync(() { return hadCookies; }); - break; } - return Future.sync(() => null); + return Future.sync(() => true); } void reset() { @@ -1133,26 +1173,27 @@ class _FakeCookieManager { } class MyWebViewPlatform implements WebViewPlatform { - MyWebViewPlatformController lastPlatformBuilt; + MyWebViewPlatformController? lastPlatformBuilt; @override Widget build({ - BuildContext context, - CreationParams creationParams, - @required WebViewPlatformCallbacksHandler webViewPlatformCallbacksHandler, - @required WebViewPlatformCreatedCallback onWebViewPlatformCreated, - Set> gestureRecognizers, + BuildContext? context, + CreationParams? creationParams, + required WebViewPlatformCallbacksHandler webViewPlatformCallbacksHandler, + required JavascriptChannelRegistry javascriptChannelRegistry, + WebViewPlatformCreatedCallback? onWebViewPlatformCreated, + Set>? gestureRecognizers, }) { assert(onWebViewPlatformCreated != null); lastPlatformBuilt = MyWebViewPlatformController( creationParams, gestureRecognizers, webViewPlatformCallbacksHandler); - onWebViewPlatformCreated(lastPlatformBuilt); + onWebViewPlatformCreated!(lastPlatformBuilt); return Container(); } @override Future clearCookies() { - return Future.sync(() => null); + return Future.sync(() => true); } } @@ -1161,25 +1202,24 @@ class MyWebViewPlatformController extends WebViewPlatformController { WebViewPlatformCallbacksHandler platformHandler) : super(platformHandler); - CreationParams creationParams; - Set> gestureRecognizers; + CreationParams? creationParams; + Set>? gestureRecognizers; - String lastUrlLoaded; - Map lastRequestHeaders; + String? lastUrlLoaded; + Map? lastRequestHeaders; @override - Future loadUrl(String url, Map headers) { + Future loadUrl(String url, Map? headers) async { equals(1, 1); lastUrlLoaded = url; lastRequestHeaders = headers; - return null; } } class MatchesWebSettings extends Matcher { MatchesWebSettings(this._webSettings); - final WebSettings _webSettings; + final WebSettings? _webSettings; @override Description describe(Description description) => @@ -1188,13 +1228,13 @@ class MatchesWebSettings extends Matcher { @override bool matches( covariant WebSettings webSettings, Map matchState) { - return _webSettings.javascriptMode == webSettings.javascriptMode && - _webSettings.hasNavigationDelegate == + return _webSettings!.javascriptMode == webSettings.javascriptMode && + _webSettings!.hasNavigationDelegate == webSettings.hasNavigationDelegate && - _webSettings.debuggingEnabled == webSettings.debuggingEnabled && - _webSettings.gestureNavigationEnabled == + _webSettings!.debuggingEnabled == webSettings.debuggingEnabled && + _webSettings!.gestureNavigationEnabled == webSettings.gestureNavigationEnabled && - _webSettings.userAgent == webSettings.userAgent; + _webSettings!.userAgent == webSettings.userAgent; } } @@ -1212,8 +1252,15 @@ class MatchesCreationParams extends Matcher { Map matchState) { return _creationParams.initialUrl == creationParams.initialUrl && MatchesWebSettings(_creationParams.webSettings) - .matches(creationParams.webSettings, matchState) && + .matches(creationParams.webSettings!, matchState) && orderedEquals(_creationParams.javascriptChannelNames) .matches(creationParams.javascriptChannelNames, matchState); } } + +/// This allows a value of type T or T? to be treated as a value of type T?. +/// +/// We use this so that APIs that have become non-nullable can still be used +/// with `!` and `?` on the stable branch. +// TODO(ianh): Remove this once we roll stable in late 2021. +T? _ambiguate(T? value) => value; diff --git a/packages/webview_flutter/example/pubspec.yaml b/packages/webview_flutter/example/pubspec.yaml index 39f3042b9..3b72359a3 100644 --- a/packages/webview_flutter/example/pubspec.yaml +++ b/packages/webview_flutter/example/pubspec.yaml @@ -2,20 +2,23 @@ name: webview_flutter_tizen_example description: Demonstrates how to use the webview_flutter_tizen plugin. environment: - sdk: ">=2.12.0 <3.0.0" - flutter: ">=2.0.0" + sdk: ">=2.14.0 <3.0.0" + flutter: ">=2.5.0" dependencies: flutter: sdk: flutter - webview_flutter: ^2.0.4 + webview_flutter: ^2.1.1 webview_flutter_tizen: path: ../ dev_dependencies: flutter_driver: sdk: flutter - integration_test: ^1.0.1 + flutter_test: + sdk: flutter + integration_test: + sdk: flutter integration_test_tizen: path: ../../integration_test/ pedantic: ^1.10.0 diff --git a/packages/webview_flutter/lib/src/platform_view.dart b/packages/webview_flutter/lib/src/platform_view.dart index c607cf57e..e5474e966 100644 --- a/packages/webview_flutter/lib/src/platform_view.dart +++ b/packages/webview_flutter/lib/src/platform_view.dart @@ -41,8 +41,8 @@ class _PlatformViewGestureRecognizer extends OneSequenceGestureRecognizer { _PlatformViewGestureRecognizer( _HandlePointerEvent handlePointerEvent, this.gestureRecognizerFactories, { - PointerDeviceKind? kind, - }) : super(kind: kind) { + Set? supportedDevices, + }) : super(supportedDevices: supportedDevices) { team = GestureArenaTeam()..captain = this; _gestureRecognizers = gestureRecognizerFactories.map( (Factory recognizerFactory) { diff --git a/packages/webview_flutter/lib/src/platform_view_tizen.dart b/packages/webview_flutter/lib/src/platform_view_tizen.dart index 03722f7bc..7bc568f55 100644 --- a/packages/webview_flutter/lib/src/platform_view_tizen.dart +++ b/packages/webview_flutter/lib/src/platform_view_tizen.dart @@ -10,6 +10,8 @@ // Imported from above files, the content has been minimally modified. // (e.g. Rename keyword 'Android' -> 'Tizen' ) +// ignore_for_file: public_member_api_docs + part of '../webview_flutter_tizen.dart'; class TizenView extends StatefulWidget { diff --git a/packages/webview_flutter/lib/webview_flutter_tizen.dart b/packages/webview_flutter/lib/webview_flutter_tizen.dart index f9dc36cc0..c765b3d14 100644 --- a/packages/webview_flutter/lib/webview_flutter_tizen.dart +++ b/packages/webview_flutter/lib/webview_flutter_tizen.dart @@ -15,7 +15,8 @@ import 'package:flutter/rendering.dart'; import 'package:webview_flutter/webview_flutter.dart'; import 'package:webview_flutter/platform_interface.dart'; -import 'package:webview_flutter/src/webview_method_channel.dart'; +import 'package:webview_flutter_platform_interface/src/method_channel/webview_method_channel.dart'; +import 'package:webview_flutter_platform_interface/webview_flutter_platform_interface.dart'; part 'src/platform_view.dart'; part 'src/platform_view_tizen.dart'; @@ -25,6 +26,7 @@ part 'src/platform_view_tizen.dart'; /// This is used as the default implementation for [WebView.platform] on Tizen. It uses a method channel to /// communicate with the platform code. class TizenWebView implements WebViewPlatform { + /// Sets a tizen [WebViewPlatform]. static void register() { WebView.platform = TizenWebView(); } @@ -33,9 +35,10 @@ class TizenWebView implements WebViewPlatform { Widget build({ required BuildContext context, required CreationParams creationParams, + required WebViewPlatformCallbacksHandler webViewPlatformCallbacksHandler, + required JavascriptChannelRegistry javascriptChannelRegistry, WebViewPlatformCreatedCallback? onWebViewPlatformCreated, Set>? gestureRecognizers, - required WebViewPlatformCallbacksHandler webViewPlatformCallbacksHandler, }) { assert(webViewPlatformCallbacksHandler != null); return GestureDetector( @@ -48,10 +51,13 @@ class TizenWebView implements WebViewPlatform { return; } onWebViewPlatformCreated(MethodChannelWebViewPlatform( - id, webViewPlatformCallbacksHandler)); + id, + webViewPlatformCallbacksHandler, + javascriptChannelRegistry, + )); }, gestureRecognizers: gestureRecognizers, - layoutDirection: TextDirection.rtl, + layoutDirection: Directionality.maybeOf(context) ?? TextDirection.rtl, creationParams: MethodChannelWebViewPlatform.creationParamsToMap(creationParams), creationParamsCodec: const StandardMessageCodec(), diff --git a/packages/webview_flutter/pubspec.yaml b/packages/webview_flutter/pubspec.yaml index 666d7d4b3..9a4ad11be 100644 --- a/packages/webview_flutter/pubspec.yaml +++ b/packages/webview_flutter/pubspec.yaml @@ -1,16 +1,17 @@ name: webview_flutter_tizen description: Tizen implementation of the webview plugin homepage: https://github.com/flutter-tizen/plugins -version: 0.3.6 +version: 0.3.7 environment: - sdk: ">=2.12.0 <3.0.0" - flutter: ">=2.0.0" + sdk: ">=2.14.0 <3.0.0" + flutter: ">=2.5.0" dependencies: flutter: sdk: flutter - webview_flutter: ^2.0.4 + webview_flutter_platform_interface: ^1.0.0 + webview_flutter: ^2.1.1 dev_dependencies: flutter_test: