From 0c5d8b2f3c8548b006055aba41f67bf06e10d1f1 Mon Sep 17 00:00:00 2001 From: Maurice Parrish <10687576+bparrishMines@users.noreply.github.com> Date: Fri, 30 Jun 2023 14:42:38 -0400 Subject: [PATCH 1/4] android side --- .../analysis_options.yaml | 8 - .../legacy/webview_flutter_test.dart | 4 +- .../webview_flutter_test.dart | 602 +++++++++--------- .../lib/src/android_webview_controller.dart | 15 +- .../test/android_webview_controller_test.dart | 6 +- .../analysis_options.yaml | 8 - 6 files changed, 331 insertions(+), 312 deletions(-) delete mode 100644 packages/webview_flutter/webview_flutter_android/analysis_options.yaml delete mode 100644 packages/webview_flutter/webview_flutter_wkwebview/analysis_options.yaml diff --git a/packages/webview_flutter/webview_flutter_android/analysis_options.yaml b/packages/webview_flutter/webview_flutter_android/analysis_options.yaml deleted file mode 100644 index 7c19fabd68d4..000000000000 --- a/packages/webview_flutter/webview_flutter_android/analysis_options.yaml +++ /dev/null @@ -1,8 +0,0 @@ -# TODO(stuartmorgan): Remove this file and fix all the unawaited_futures -# violations. See https://github.com/flutter/flutter/issues/127323 - -include: ../../../analysis_options.yaml - -linter: - rules: - unawaited_futures: false diff --git a/packages/webview_flutter/webview_flutter_android/example/integration_test/legacy/webview_flutter_test.dart b/packages/webview_flutter/webview_flutter_android/example/integration_test/legacy/webview_flutter_test.dart index 852ed0f62b48..b4b2817decf8 100644 --- a/packages/webview_flutter/webview_flutter_android/example/integration_test/legacy/webview_flutter_test.dart +++ b/packages/webview_flutter/webview_flutter_android/example/integration_test/legacy/webview_flutter_test.dart @@ -29,7 +29,7 @@ Future main() async { IntegrationTestWidgetsFlutterBinding.ensureInitialized(); final HttpServer server = await HttpServer.bind(InternetAddress.anyIPv4, 0); - server.forEach((HttpRequest request) { + unawaited(server.forEach((HttpRequest request) { if (request.uri.path == '/hello.txt') { request.response.writeln('Hello, world.'); } else if (request.uri.path == '/secondary.txt') { @@ -42,7 +42,7 @@ Future main() async { fail('unexpected request: ${request.method} ${request.uri}'); } request.response.close(); - }); + })); final String prefixUrl = 'http://${server.address.address}:${server.port}'; final String primaryUrl = '$prefixUrl/hello.txt'; final String secondaryUrl = '$prefixUrl/secondary.txt'; diff --git a/packages/webview_flutter/webview_flutter_android/example/integration_test/webview_flutter_test.dart b/packages/webview_flutter/webview_flutter_android/example/integration_test/webview_flutter_test.dart index 17e040628ea0..462027ed97a8 100644 --- a/packages/webview_flutter/webview_flutter_android/example/integration_test/webview_flutter_test.dart +++ b/packages/webview_flutter/webview_flutter_android/example/integration_test/webview_flutter_test.dart @@ -26,7 +26,7 @@ Future main() async { IntegrationTestWidgetsFlutterBinding.ensureInitialized(); final HttpServer server = await HttpServer.bind(InternetAddress.anyIPv4, 0); - server.forEach((HttpRequest request) { + unawaited(server.forEach((HttpRequest request) { if (request.uri.path == '/hello.txt') { request.response.writeln('Hello, world.'); } else if (request.uri.path == '/secondary.txt') { @@ -39,7 +39,7 @@ Future main() async { fail('unexpected request: ${request.method} ${request.uri}'); } request.response.close(); - }); + })); final String prefixUrl = 'http://${server.address.address}:${server.port}'; final String primaryUrl = '$prefixUrl/hello.txt'; final String secondaryUrl = '$prefixUrl/secondary.txt'; @@ -50,13 +50,15 @@ Future main() async { final PlatformWebViewController controller = PlatformWebViewController( const PlatformWebViewControllerCreationParams(), - ) - ..setPlatformNavigationDelegate( - PlatformNavigationDelegate( - const PlatformNavigationDelegateCreationParams(), - )..setOnPageFinished((_) => pageFinished.complete()), - ) - ..loadRequest(LoadRequestParams(uri: Uri.parse(primaryUrl))); + ); + final PlatformNavigationDelegate delegate = PlatformNavigationDelegate( + const PlatformNavigationDelegateCreationParams(), + ); + unawaited(delegate.setOnPageFinished((_) => pageFinished.complete())); + unawaited(controller.setPlatformNavigationDelegate(delegate)); + await controller.loadRequest( + LoadRequestParams(uri: Uri.parse(primaryUrl)), + ); await tester.pumpWidget(Builder( builder: (BuildContext context) { @@ -117,9 +119,8 @@ Future main() async { android.WebView.api = WebViewHostApiImpl( instanceManager: instanceManager, ); - android.WebSettings.api = WebSettingsHostApiImpl( - instanceManager: instanceManager, - ); + android.WebSettings.api = + WebSettingsHostApiImpl(instanceManager: instanceManager); android.WebChromeClient.api = WebChromeClientHostApiImpl( instanceManager: instanceManager, ); @@ -177,14 +178,14 @@ Future main() async { final PlatformWebViewController controller = PlatformWebViewController( const PlatformWebViewControllerCreationParams(), - ) - ..setJavaScriptMode(JavaScriptMode.unrestricted) - ..setPlatformNavigationDelegate( - PlatformNavigationDelegate( - const PlatformNavigationDelegateCreationParams(), - )..setOnPageFinished((_) => pageFinished.complete()), - ) - ..loadRequest(LoadRequestParams(uri: Uri.parse(primaryUrl))); + ); + unawaited(controller.setJavaScriptMode(JavaScriptMode.unrestricted)); + final PlatformNavigationDelegate delegate = PlatformNavigationDelegate( + const PlatformNavigationDelegateCreationParams(), + ); + unawaited(delegate.setOnPageFinished((_) => pageFinished.complete())); + unawaited(controller.setPlatformNavigationDelegate(delegate)); + await controller.loadRequest(LoadRequestParams(uri: Uri.parse(primaryUrl))); await tester.pumpWidget(Builder( builder: (BuildContext context) { @@ -211,19 +212,19 @@ Future main() async { final PlatformWebViewController controller = PlatformWebViewController( const PlatformWebViewControllerCreationParams(), - ) - ..setJavaScriptMode(JavaScriptMode.unrestricted) - ..setPlatformNavigationDelegate( - PlatformNavigationDelegate( - const PlatformNavigationDelegateCreationParams(), - )..setOnPageFinished((String url) => pageLoads.add(url)), - ) - ..loadRequest( - LoadRequestParams( - uri: Uri.parse(headersUrl), - headers: headers, - ), - ); + ); + unawaited(controller.setJavaScriptMode(JavaScriptMode.unrestricted)); + final PlatformNavigationDelegate delegate = PlatformNavigationDelegate( + const PlatformNavigationDelegateCreationParams(), + ); + unawaited(delegate.setOnPageFinished((String url) => pageLoads.add(url))); + unawaited(controller.setPlatformNavigationDelegate(delegate)); + await controller.loadRequest( + LoadRequestParams( + uri: Uri.parse(headersUrl), + headers: headers, + ), + ); await tester.pumpWidget(Builder( builder: (BuildContext context) { @@ -243,15 +244,16 @@ Future main() async { testWidgets('JavascriptChannel', (WidgetTester tester) async { final Completer pageFinished = Completer(); + final PlatformWebViewController controller = PlatformWebViewController( const PlatformWebViewControllerCreationParams(), - ) - ..setJavaScriptMode(JavaScriptMode.unrestricted) - ..setPlatformNavigationDelegate( - PlatformNavigationDelegate( - const PlatformNavigationDelegateCreationParams(), - )..setOnPageFinished((_) => pageFinished.complete()), - ); + ); + unawaited(controller.setJavaScriptMode(JavaScriptMode.unrestricted)); + final PlatformNavigationDelegate delegate = PlatformNavigationDelegate( + const PlatformNavigationDelegateCreationParams(), + ); + unawaited(delegate.setOnPageFinished((_) => pageFinished.complete())); + unawaited(controller.setPlatformNavigationDelegate(delegate)); final Completer channelCompleter = Completer(); await controller.addJavaScriptChannel( @@ -318,15 +320,17 @@ Future main() async { final PlatformWebViewController controller = PlatformWebViewController( const PlatformWebViewControllerCreationParams(), - ) - ..setJavaScriptMode(JavaScriptMode.unrestricted) - ..setPlatformNavigationDelegate( - PlatformNavigationDelegate( - const PlatformNavigationDelegateCreationParams(), - )..setOnPageFinished((_) => pageFinished.complete()), - ) - ..setUserAgent('Custom_User_Agent1') - ..loadRequest(LoadRequestParams(uri: Uri.parse('about:blank'))); + ); + unawaited(controller.setJavaScriptMode(JavaScriptMode.unrestricted)); + unawaited(controller.setUserAgent('Custom_User_Agent1')); + final PlatformNavigationDelegate delegate = PlatformNavigationDelegate( + const PlatformNavigationDelegateCreationParams(), + ); + unawaited(delegate.setOnPageFinished((_) => pageFinished.complete())); + unawaited(controller.setPlatformNavigationDelegate(delegate)); + + await controller + .loadRequest(LoadRequestParams(uri: Uri.parse('about:blank'))); await tester.pumpWidget(Builder( builder: (BuildContext context) { @@ -385,23 +389,24 @@ Future main() async { testWidgets('Auto media playback', (WidgetTester tester) async { Completer pageLoaded = Completer(); - PlatformWebViewController controller = AndroidWebViewController( + AndroidWebViewController controller = AndroidWebViewController( const PlatformWebViewControllerCreationParams(), - ) - ..setJavaScriptMode(JavaScriptMode.unrestricted) - ..setPlatformNavigationDelegate( - AndroidNavigationDelegate( - const PlatformNavigationDelegateCreationParams(), - )..setOnPageFinished((_) => pageLoaded.complete()), - ) - ..setMediaPlaybackRequiresUserGesture(false) - ..loadRequest( - LoadRequestParams( - uri: Uri.parse( - 'data:text/html;charset=utf-8;base64,$videoTestBase64', - ), + ); + unawaited(controller.setJavaScriptMode(JavaScriptMode.unrestricted)); + unawaited(controller.setMediaPlaybackRequiresUserGesture(false)); + AndroidNavigationDelegate delegate = AndroidNavigationDelegate( + const PlatformNavigationDelegateCreationParams(), + ); + unawaited(delegate.setOnPageFinished((_) => pageLoaded.complete())); + unawaited(controller.setPlatformNavigationDelegate(delegate)); + + await controller.loadRequest( + LoadRequestParams( + uri: Uri.parse( + 'data:text/html;charset=utf-8;base64,$videoTestBase64', ), - ); + ), + ); await tester.pumpWidget(Builder( builder: (BuildContext context) { @@ -418,22 +423,23 @@ Future main() async { expect(isPaused, false); pageLoaded = Completer(); - controller = PlatformWebViewController( + controller = AndroidWebViewController( const PlatformWebViewControllerCreationParams(), - ) - ..setJavaScriptMode(JavaScriptMode.unrestricted) - ..setPlatformNavigationDelegate( - PlatformNavigationDelegate( - const PlatformNavigationDelegateCreationParams(), - )..setOnPageFinished((_) => pageLoaded.complete()), - ) - ..loadRequest( - LoadRequestParams( - uri: Uri.parse( - 'data:text/html;charset=utf-8;base64,$videoTestBase64', - ), + ); + unawaited(controller.setJavaScriptMode(JavaScriptMode.unrestricted)); + delegate = AndroidNavigationDelegate( + const PlatformNavigationDelegateCreationParams(), + ); + unawaited(delegate.setOnPageFinished((_) => pageLoaded.complete())); + unawaited(controller.setPlatformNavigationDelegate(delegate)); + + await controller.loadRequest( + LoadRequestParams( + uri: Uri.parse( + 'data:text/html;charset=utf-8;base64,$videoTestBase64', ), - ); + ), + ); await tester.pumpWidget(Builder( builder: (BuildContext context) { @@ -454,35 +460,37 @@ Future main() async { final Completer pageLoaded = Completer(); final Completer videoPlaying = Completer(); - final PlatformWebViewController controller = AndroidWebViewController( + final AndroidWebViewController controller = AndroidWebViewController( const PlatformWebViewControllerCreationParams(), - ) - ..setJavaScriptMode(JavaScriptMode.unrestricted) - ..setPlatformNavigationDelegate( - AndroidNavigationDelegate( - const PlatformNavigationDelegateCreationParams(), - )..setOnPageFinished((_) => pageLoaded.complete()), - ) - ..addJavaScriptChannel( - JavaScriptChannelParams( - name: 'VideoTestTime', - onMessageReceived: (JavaScriptMessage message) { - final double currentTime = double.parse(message.message); - // Let it play for at least 1 second to make sure the related video's properties are set. - if (currentTime > 1 && !videoPlaying.isCompleted) { - videoPlaying.complete(null); - } - }, - ), - ) - ..setMediaPlaybackRequiresUserGesture(false) - ..loadRequest( - LoadRequestParams( - uri: Uri.parse( - 'data:text/html;charset=utf-8;base64,$videoTestBase64', - ), + ); + unawaited(controller.setJavaScriptMode(JavaScriptMode.unrestricted)); + unawaited(controller.setMediaPlaybackRequiresUserGesture(false)); + final AndroidNavigationDelegate delegate = AndroidNavigationDelegate( + const PlatformNavigationDelegateCreationParams(), + ); + unawaited(delegate.setOnPageFinished((_) => pageLoaded.complete())); + unawaited(controller.setPlatformNavigationDelegate(delegate)); + + unawaited(controller.addJavaScriptChannel( + JavaScriptChannelParams( + name: 'VideoTestTime', + onMessageReceived: (JavaScriptMessage message) { + final double currentTime = double.parse(message.message); + // Let it play for at least 1 second to make sure the related video's properties are set. + if (currentTime > 1 && !videoPlaying.isCompleted) { + videoPlaying.complete(null); + } + }, + ), + )); + + await controller.loadRequest( + LoadRequestParams( + uri: Uri.parse( + 'data:text/html;charset=utf-8;base64,$videoTestBase64', ), - ); + ), + ); await tester.pumpWidget(Builder( builder: (BuildContext context) { @@ -537,23 +545,24 @@ Future main() async { testWidgets('Auto media playback', (WidgetTester tester) async { Completer pageLoaded = Completer(); - PlatformWebViewController controller = AndroidWebViewController( + AndroidWebViewController controller = AndroidWebViewController( const PlatformWebViewControllerCreationParams(), - ) - ..setJavaScriptMode(JavaScriptMode.unrestricted) - ..setPlatformNavigationDelegate( - AndroidNavigationDelegate( - const PlatformNavigationDelegateCreationParams(), - )..setOnPageFinished((_) => pageLoaded.complete()), - ) - ..setMediaPlaybackRequiresUserGesture(false) - ..loadRequest( - LoadRequestParams( - uri: Uri.parse( - 'data:text/html;charset=utf-8;base64,$audioTestBase64', - ), + ); + unawaited(controller.setJavaScriptMode(JavaScriptMode.unrestricted)); + unawaited(controller.setMediaPlaybackRequiresUserGesture(false)); + AndroidNavigationDelegate delegate = AndroidNavigationDelegate( + const PlatformNavigationDelegateCreationParams(), + ); + unawaited(delegate.setOnPageFinished((_) => pageLoaded.complete())); + unawaited(controller.setPlatformNavigationDelegate(delegate)); + + await controller.loadRequest( + LoadRequestParams( + uri: Uri.parse( + 'data:text/html;charset=utf-8;base64,$audioTestBase64', ), - ); + ), + ); await tester.pumpWidget(Builder( builder: (BuildContext context) { @@ -570,22 +579,22 @@ Future main() async { expect(isPaused, false); pageLoaded = Completer(); - controller = PlatformWebViewController( + controller = AndroidWebViewController( const PlatformWebViewControllerCreationParams(), - ) - ..setJavaScriptMode(JavaScriptMode.unrestricted) - ..setPlatformNavigationDelegate( - PlatformNavigationDelegate( - const PlatformNavigationDelegateCreationParams(), - )..setOnPageFinished((_) => pageLoaded.complete()), - ) - ..loadRequest( - LoadRequestParams( - uri: Uri.parse( - 'data:text/html;charset=utf-8;base64,$audioTestBase64', - ), + ); + unawaited(controller.setJavaScriptMode(JavaScriptMode.unrestricted)); + delegate = AndroidNavigationDelegate( + const PlatformNavigationDelegateCreationParams(), + ); + unawaited(delegate.setOnPageFinished((_) => pageLoaded.complete())); + unawaited(controller.setPlatformNavigationDelegate(delegate)); + await controller.loadRequest( + LoadRequestParams( + uri: Uri.parse( + 'data:text/html;charset=utf-8;base64,$audioTestBase64', ), - ); + ), + ); await tester.pumpWidget(Builder( builder: (BuildContext context) { @@ -618,20 +627,21 @@ Future main() async { final PlatformWebViewController controller = PlatformWebViewController( const PlatformWebViewControllerCreationParams(), - ) - ..setJavaScriptMode(JavaScriptMode.unrestricted) - ..setPlatformNavigationDelegate( - PlatformNavigationDelegate( - const PlatformNavigationDelegateCreationParams(), - )..setOnPageFinished((_) => pageLoaded.complete()), - ) - ..loadRequest( - LoadRequestParams( - uri: Uri.parse( - 'data:text/html;charset=utf-8;base64,$getTitleTestBase64', - ), + ); + unawaited(controller.setJavaScriptMode(JavaScriptMode.unrestricted)); + final PlatformNavigationDelegate delegate = PlatformNavigationDelegate( + const PlatformNavigationDelegateCreationParams(), + ); + unawaited(delegate.setOnPageFinished((_) => pageLoaded.complete())); + unawaited(controller.setPlatformNavigationDelegate(delegate)); + + await controller.loadRequest( + LoadRequestParams( + uri: Uri.parse( + 'data:text/html;charset=utf-8;base64,$getTitleTestBase64', ), - ); + ), + ); await tester.pumpWidget(Builder( builder: (BuildContext context) { @@ -682,20 +692,21 @@ Future main() async { final Completer pageLoaded = Completer(); final PlatformWebViewController controller = PlatformWebViewController( const PlatformWebViewControllerCreationParams(), - ) - ..setJavaScriptMode(JavaScriptMode.unrestricted) - ..setPlatformNavigationDelegate( - PlatformNavigationDelegate( - const PlatformNavigationDelegateCreationParams(), - )..setOnPageFinished((_) => pageLoaded.complete()), - ) - ..loadRequest( - LoadRequestParams( - uri: Uri.parse( - 'data:text/html;charset=utf-8;base64,$scrollTestPageBase64', - ), + ); + unawaited(controller.setJavaScriptMode(JavaScriptMode.unrestricted)); + final PlatformNavigationDelegate delegate = PlatformNavigationDelegate( + const PlatformNavigationDelegateCreationParams(), + ); + unawaited(delegate.setOnPageFinished((_) => pageLoaded.complete())); + unawaited(controller.setPlatformNavigationDelegate(delegate)); + + await controller.loadRequest( + LoadRequestParams( + uri: Uri.parse( + 'data:text/html;charset=utf-8;base64,$scrollTestPageBase64', ), - ); + ), + ); await tester.pumpWidget(Builder( builder: (BuildContext context) { @@ -743,22 +754,24 @@ Future main() async { final PlatformWebViewController controller = PlatformWebViewController( const PlatformWebViewControllerCreationParams(), - ) - ..setJavaScriptMode(JavaScriptMode.unrestricted) - ..setPlatformNavigationDelegate( - PlatformNavigationDelegate( - const PlatformNavigationDelegateCreationParams(), - ) - ..setOnPageFinished((_) => pageLoaded.complete()) - ..setOnNavigationRequest((NavigationRequest navigationRequest) { - return (navigationRequest.url.contains('youtube.com')) - ? NavigationDecision.prevent - : NavigationDecision.navigate; - }), - ) - ..loadRequest( - LoadRequestParams(uri: Uri.parse(blankPageEncoded)), - ); + ); + unawaited(controller.setJavaScriptMode(JavaScriptMode.unrestricted)); + final PlatformNavigationDelegate delegate = PlatformNavigationDelegate( + const PlatformNavigationDelegateCreationParams(), + ); + unawaited(delegate.setOnPageFinished((_) => pageLoaded.complete())); + unawaited( + delegate.setOnNavigationRequest((NavigationRequest navigationRequest) { + return (navigationRequest.url.contains('youtube.com')) + ? NavigationDecision.prevent + : NavigationDecision.navigate; + }), + ); + unawaited(controller.setPlatformNavigationDelegate(delegate)); + + await controller.loadRequest( + LoadRequestParams(uri: Uri.parse(blankPageEncoded)), + ); await tester.pumpWidget(Builder( builder: (BuildContext context) { @@ -784,18 +797,21 @@ Future main() async { final PlatformWebViewController controller = PlatformWebViewController( const PlatformWebViewControllerCreationParams(), - ) - ..setJavaScriptMode(JavaScriptMode.unrestricted) - ..setPlatformNavigationDelegate( - PlatformNavigationDelegate( - const PlatformNavigationDelegateCreationParams(), - )..setOnWebResourceError((WebResourceError error) { - errorCompleter.complete(error); - }), - ) - ..loadRequest( - LoadRequestParams(uri: Uri.parse('https://www.notawebsite..com')), - ); + ); + unawaited(controller.setJavaScriptMode(JavaScriptMode.unrestricted)); + final PlatformNavigationDelegate delegate = PlatformNavigationDelegate( + const PlatformNavigationDelegateCreationParams(), + ); + unawaited( + delegate.setOnWebResourceError((WebResourceError error) { + errorCompleter.complete(error); + }), + ); + unawaited(controller.setPlatformNavigationDelegate(delegate)); + + await controller.loadRequest( + LoadRequestParams(uri: Uri.parse('https://www.notawebsite..com')), + ); await tester.pumpWidget(Builder( builder: (BuildContext context) { @@ -825,24 +841,27 @@ Future main() async { final PlatformWebViewController controller = PlatformWebViewController( const PlatformWebViewControllerCreationParams(), - ) - ..setJavaScriptMode(JavaScriptMode.unrestricted) - ..setPlatformNavigationDelegate( - PlatformNavigationDelegate( - const PlatformNavigationDelegateCreationParams(), - ) - ..setOnPageFinished((_) => pageFinishCompleter.complete()) - ..setOnWebResourceError((WebResourceError error) { - errorCompleter.complete(error); - }), - ) - ..loadRequest( - LoadRequestParams( - uri: Uri.parse( - 'data:text/html;charset=utf-8;base64,PCFET0NUWVBFIGh0bWw+', - ), + ); + unawaited(controller.setJavaScriptMode(JavaScriptMode.unrestricted)); + final PlatformNavigationDelegate delegate = PlatformNavigationDelegate( + const PlatformNavigationDelegateCreationParams(), + ); + unawaited( + delegate.setOnPageFinished((_) => pageFinishCompleter.complete()), + ); + unawaited( + delegate.setOnWebResourceError((WebResourceError error) { + errorCompleter.complete(error); + }), + ); + unawaited(controller.setPlatformNavigationDelegate(delegate)); + await controller.loadRequest( + LoadRequestParams( + uri: Uri.parse( + 'data:text/html;charset=utf-8;base64,PCFET0NUWVBFIGh0bWw+', ), - ); + ), + ); await tester.pumpWidget(Builder( builder: (BuildContext context) { @@ -861,20 +880,22 @@ Future main() async { final PlatformWebViewController controller = PlatformWebViewController( const PlatformWebViewControllerCreationParams(), - ) - ..setJavaScriptMode(JavaScriptMode.unrestricted) - ..setPlatformNavigationDelegate( - PlatformNavigationDelegate( - const PlatformNavigationDelegateCreationParams(), - ) - ..setOnPageFinished((_) => pageLoaded.complete()) - ..setOnNavigationRequest((NavigationRequest navigationRequest) { - return (navigationRequest.url.contains('youtube.com')) - ? NavigationDecision.prevent - : NavigationDecision.navigate; - }), - ) - ..loadRequest(LoadRequestParams(uri: Uri.parse(blankPageEncoded))); + ); + unawaited(controller.setJavaScriptMode(JavaScriptMode.unrestricted)); + final PlatformNavigationDelegate delegate = PlatformNavigationDelegate( + const PlatformNavigationDelegateCreationParams(), + ); + unawaited(delegate.setOnPageFinished((_) => pageLoaded.complete())); + unawaited(delegate + .setOnNavigationRequest((NavigationRequest navigationRequest) { + return (navigationRequest.url.contains('youtube.com')) + ? NavigationDecision.prevent + : NavigationDecision.navigate; + })); + unawaited(controller.setPlatformNavigationDelegate(delegate)); + + await controller + .loadRequest(LoadRequestParams(uri: Uri.parse(blankPageEncoded))); await tester.pumpWidget(Builder( builder: (BuildContext context) { @@ -904,23 +925,23 @@ Future main() async { final PlatformWebViewController controller = PlatformWebViewController( const PlatformWebViewControllerCreationParams(), - ) - ..setJavaScriptMode(JavaScriptMode.unrestricted) - ..setPlatformNavigationDelegate( - PlatformNavigationDelegate( - const PlatformNavigationDelegateCreationParams(), - ) - ..setOnPageFinished((_) => pageLoaded.complete()) - ..setOnNavigationRequest( - (NavigationRequest navigationRequest) async { - NavigationDecision decision = NavigationDecision.prevent; - decision = await Future.delayed( - const Duration(milliseconds: 10), - () => NavigationDecision.navigate); - return decision; - }), - ) - ..loadRequest(LoadRequestParams(uri: Uri.parse(blankPageEncoded))); + ); + unawaited(controller.setJavaScriptMode(JavaScriptMode.unrestricted)); + final PlatformNavigationDelegate delegate = PlatformNavigationDelegate( + const PlatformNavigationDelegateCreationParams(), + ); + unawaited(delegate.setOnPageFinished((_) => pageLoaded.complete())); + unawaited(delegate + .setOnNavigationRequest((NavigationRequest navigationRequest) async { + NavigationDecision decision = NavigationDecision.prevent; + decision = await Future.delayed( + const Duration(milliseconds: 10), + () => NavigationDecision.navigate); + return decision; + })); + unawaited(controller.setPlatformNavigationDelegate(delegate)); + await controller + .loadRequest(LoadRequestParams(uri: Uri.parse(blankPageEncoded))); await tester.pumpWidget(Builder( builder: (BuildContext context) { @@ -943,17 +964,17 @@ Future main() async { testWidgets('can receive url changes', (WidgetTester tester) async { final Completer pageLoaded = Completer(); - final PlatformNavigationDelegate navigationDelegate = - PlatformNavigationDelegate( - const PlatformNavigationDelegateCreationParams(), - )..setOnPageFinished((_) => pageLoaded.complete()); - final PlatformWebViewController controller = PlatformWebViewController( const PlatformWebViewControllerCreationParams(), - ) - ..setJavaScriptMode(JavaScriptMode.unrestricted) - ..setPlatformNavigationDelegate(navigationDelegate) - ..loadRequest(LoadRequestParams(uri: Uri.parse(blankPageEncoded))); + ); + unawaited(controller.setJavaScriptMode(JavaScriptMode.unrestricted)); + final PlatformNavigationDelegate delegate = PlatformNavigationDelegate( + const PlatformNavigationDelegateCreationParams(), + ); + unawaited(delegate.setOnPageFinished((_) => pageLoaded.complete())); + unawaited(controller.setPlatformNavigationDelegate(delegate)); + await controller + .loadRequest(LoadRequestParams(uri: Uri.parse(blankPageEncoded))); await tester.pumpWidget(Builder( builder: (BuildContext context) { @@ -964,10 +985,10 @@ Future main() async { )); await pageLoaded.future; - await navigationDelegate.setOnPageFinished((_) {}); + await delegate.setOnPageFinished((_) {}); final Completer urlChangeCompleter = Completer(); - await navigationDelegate.setOnUrlChange((UrlChange change) { + await delegate.setOnUrlChange((UrlChange change) { urlChangeCompleter.complete(change.url); }); @@ -980,17 +1001,17 @@ Future main() async { (WidgetTester tester) async { final Completer pageLoaded = Completer(); - final PlatformNavigationDelegate navigationDelegate = - PlatformNavigationDelegate( - const PlatformNavigationDelegateCreationParams(), - )..setOnPageFinished((_) => pageLoaded.complete()); - final PlatformWebViewController controller = PlatformWebViewController( const PlatformWebViewControllerCreationParams(), - ) - ..setJavaScriptMode(JavaScriptMode.unrestricted) - ..setPlatformNavigationDelegate(navigationDelegate) - ..loadRequest(LoadRequestParams(uri: Uri.parse(primaryUrl))); + ); + unawaited(controller.setJavaScriptMode(JavaScriptMode.unrestricted)); + final PlatformNavigationDelegate delegate = PlatformNavigationDelegate( + const PlatformNavigationDelegateCreationParams(), + ); + unawaited(delegate.setOnPageFinished((_) => pageLoaded.complete())); + unawaited(controller.setPlatformNavigationDelegate(delegate)); + await controller + .loadRequest(LoadRequestParams(uri: Uri.parse(primaryUrl))); await tester.pumpWidget(Builder( builder: (BuildContext context) { @@ -1001,10 +1022,10 @@ Future main() async { )); await pageLoaded.future; - await navigationDelegate.setOnPageFinished((_) {}); + await delegate.setOnPageFinished((_) {}); final Completer urlChangeCompleter = Completer(); - await navigationDelegate.setOnUrlChange((UrlChange change) { + await delegate.setOnUrlChange((UrlChange change) { urlChangeCompleter.complete(change.url); }); @@ -1022,11 +1043,13 @@ Future main() async { final PlatformWebViewController controller = PlatformWebViewController( const PlatformWebViewControllerCreationParams(), - ) - ..setJavaScriptMode(JavaScriptMode.unrestricted) - ..setPlatformNavigationDelegate(PlatformNavigationDelegate( - const PlatformNavigationDelegateCreationParams(), - )..setOnPageFinished((_) => pageLoaded.complete())); + ); + unawaited(controller.setJavaScriptMode(JavaScriptMode.unrestricted)); + final PlatformNavigationDelegate delegate = PlatformNavigationDelegate( + const PlatformNavigationDelegateCreationParams(), + ); + unawaited(delegate.setOnPageFinished((_) => pageLoaded.complete())); + unawaited(controller.setPlatformNavigationDelegate(delegate)); await tester.pumpWidget(Builder( builder: (BuildContext context) { @@ -1049,12 +1072,15 @@ Future main() async { final PlatformWebViewController controller = PlatformWebViewController( const PlatformWebViewControllerCreationParams(), - ) - ..setJavaScriptMode(JavaScriptMode.unrestricted) - ..setPlatformNavigationDelegate(PlatformNavigationDelegate( - const PlatformNavigationDelegateCreationParams(), - )..setOnPageFinished((_) => pageLoaded.complete())) - ..loadRequest(LoadRequestParams(uri: Uri.parse(primaryUrl))); + ); + unawaited(controller.setJavaScriptMode(JavaScriptMode.unrestricted)); + final PlatformNavigationDelegate delegate = PlatformNavigationDelegate( + const PlatformNavigationDelegateCreationParams(), + ); + unawaited(delegate.setOnPageFinished((_) => pageLoaded.complete())); + unawaited(controller.setPlatformNavigationDelegate(delegate)); + await controller + .loadRequest(LoadRequestParams(uri: Uri.parse(primaryUrl))); await tester.pumpWidget(Builder( builder: (BuildContext context) { @@ -1118,18 +1144,21 @@ Future main() async { final PlatformWebViewController controller = PlatformWebViewController( const PlatformWebViewControllerCreationParams(), - ) - ..setJavaScriptMode(JavaScriptMode.unrestricted) - ..setPlatformNavigationDelegate(PlatformNavigationDelegate( - const PlatformNavigationDelegateCreationParams(), - )..setOnPageFinished((_) => pageLoadCompleter.complete())) - ..loadRequest( - LoadRequestParams( - uri: Uri.parse( - 'data:text/html;charset=utf-8;base64,$openWindowTestBase64', - ), + ); + unawaited(controller.setJavaScriptMode(JavaScriptMode.unrestricted)); + final PlatformNavigationDelegate delegate = PlatformNavigationDelegate( + const PlatformNavigationDelegateCreationParams(), + ); + unawaited( + delegate.setOnPageFinished((_) => pageLoadCompleter.complete())); + unawaited(controller.setPlatformNavigationDelegate(delegate)); + await controller.loadRequest( + LoadRequestParams( + uri: Uri.parse( + 'data:text/html;charset=utf-8;base64,$openWindowTestBase64', ), - ); + ), + ); await tester.pumpWidget(Builder( builder: (BuildContext context) { @@ -1159,11 +1188,14 @@ Future main() async { final PlatformWebViewController controller = PlatformWebViewController( const PlatformWebViewControllerCreationParams(), - ) - ..setPlatformNavigationDelegate(PlatformNavigationDelegate( - const PlatformNavigationDelegateCreationParams(), - )..setOnPageFinished((_) => pageLoaded.complete())) - ..loadRequest(LoadRequestParams(uri: Uri.parse(primaryUrl))); + ); + final PlatformNavigationDelegate delegate = PlatformNavigationDelegate( + const PlatformNavigationDelegateCreationParams(), + ); + unawaited(delegate.setOnPageFinished((_) => pageLoaded.complete())); + unawaited(controller.setPlatformNavigationDelegate(delegate)); + await controller + .loadRequest(LoadRequestParams(uri: Uri.parse(primaryUrl))); await tester.pumpWidget(Builder( builder: (BuildContext context) { diff --git a/packages/webview_flutter/webview_flutter_android/lib/src/android_webview_controller.dart b/packages/webview_flutter/webview_flutter_android/lib/src/android_webview_controller.dart index 151cc81b8237..6a4c918f95a5 100644 --- a/packages/webview_flutter/webview_flutter_android/lib/src/android_webview_controller.dart +++ b/packages/webview_flutter/webview_flutter_android/lib/src/android_webview_controller.dart @@ -120,10 +120,10 @@ class AndroidWebViewController extends PlatformWebViewController { final GeolocationPermissionsResponse response = await onShowPrompt( GeolocationPermissionsRequestParams(origin: origin), ); - callback.invoke(origin, response.allow, response.retain); + return callback.invoke(origin, response.allow, response.retain); } else { // default don't allow - callback.invoke(origin, false, false); + return callback.invoke(origin, false, false); } }; }), @@ -338,9 +338,11 @@ class AndroidWebViewController extends PlatformWebViewController { Future setPlatformNavigationDelegate( covariant AndroidNavigationDelegate handler) async { _currentNavigationDelegate = handler; - handler.setOnLoadRequest(loadRequest); - _webView.setWebViewClient(handler.androidWebViewClient); - _webView.setDownloadListener(handler.androidDownloadListener); + await Future.wait(>[ + handler.setOnLoadRequest(loadRequest), + _webView.setWebViewClient(handler.androidWebViewClient), + _webView.setDownloadListener(handler.androidDownloadListener), + ]); } @override @@ -1103,7 +1105,8 @@ class AndroidNavigationDelegate extends PlatformNavigationDelegate { NavigationRequestCallback onNavigationRequest, ) async { _onNavigationRequest = onNavigationRequest; - _webViewClient.setSynchronousReturnValueForShouldOverrideUrlLoading(true); + return _webViewClient + .setSynchronousReturnValueForShouldOverrideUrlLoading(true); } @override diff --git a/packages/webview_flutter/webview_flutter_android/test/android_webview_controller_test.dart b/packages/webview_flutter/webview_flutter_android/test/android_webview_controller_test.dart index d8527ca9e0eb..a6905c7ee981 100644 --- a/packages/webview_flutter/webview_flutter_android/test/android_webview_controller_test.dart +++ b/packages/webview_flutter/webview_flutter_android/test/android_webview_controller_test.dart @@ -608,7 +608,7 @@ void main() { mockWebChromeClient.setSynchronousReturnValueForOnShowFileChooser(true), ); - onShowFileChooserCallback( + await onShowFileChooserCallback( android_webview.WebView.detached(), android_webview.FileChooserParams.detached( isCaptureEnabled: false, @@ -670,7 +670,7 @@ void main() { bool isAllow = false; late final GeolocationPermissionsResponse response; - controller.setGeolocationPermissionsPromptCallbacks( + await controller.setGeolocationPermissionsPromptCallbacks( onShowPrompt: (GeolocationPermissionsRequestParams request) async { isAllow = request.origin == allowOrigin; response = @@ -720,7 +720,7 @@ void main() { await controller.setOnPlatformPermissionRequest( (PlatformWebViewPermissionRequest request) async { permissionRequest = request; - request.grant(); + await request.grant(); }, ); diff --git a/packages/webview_flutter/webview_flutter_wkwebview/analysis_options.yaml b/packages/webview_flutter/webview_flutter_wkwebview/analysis_options.yaml deleted file mode 100644 index 7c19fabd68d4..000000000000 --- a/packages/webview_flutter/webview_flutter_wkwebview/analysis_options.yaml +++ /dev/null @@ -1,8 +0,0 @@ -# TODO(stuartmorgan): Remove this file and fix all the unawaited_futures -# violations. See https://github.com/flutter/flutter/issues/127323 - -include: ../../../analysis_options.yaml - -linter: - rules: - unawaited_futures: false From b6da7c2b5bf319e5d65cfd299a7e3f5a984eab3f Mon Sep 17 00:00:00 2001 From: Maurice Parrish <10687576+bparrishMines@users.noreply.github.com> Date: Fri, 30 Jun 2023 15:27:15 -0400 Subject: [PATCH 2/4] ios side --- .../legacy/webview_flutter_test.dart | 4 +- .../webview_flutter_test.dart | 648 +++++++++--------- .../src/legacy/web_kit_webview_widget.dart | 22 +- .../lib/src/webkit_webview_controller.dart | 4 +- .../test/src/web_kit/web_kit_test.dart | 7 +- .../test/webkit_webview_controller_test.dart | 10 +- 6 files changed, 364 insertions(+), 331 deletions(-) diff --git a/packages/webview_flutter/webview_flutter_wkwebview/example/integration_test/legacy/webview_flutter_test.dart b/packages/webview_flutter/webview_flutter_wkwebview/example/integration_test/legacy/webview_flutter_test.dart index d9e6fb96d5c9..962608420489 100644 --- a/packages/webview_flutter/webview_flutter_wkwebview/example/integration_test/legacy/webview_flutter_test.dart +++ b/packages/webview_flutter/webview_flutter_wkwebview/example/integration_test/legacy/webview_flutter_test.dart @@ -26,7 +26,7 @@ Future main() async { IntegrationTestWidgetsFlutterBinding.ensureInitialized(); final HttpServer server = await HttpServer.bind(InternetAddress.anyIPv4, 0); - server.forEach((HttpRequest request) { + unawaited(server.forEach((HttpRequest request) { if (request.uri.path == '/hello.txt') { request.response.writeln('Hello, world.'); } else if (request.uri.path == '/secondary.txt') { @@ -39,7 +39,7 @@ Future main() async { fail('unexpected request: ${request.method} ${request.uri}'); } request.response.close(); - }); + })); final String prefixUrl = 'http://${server.address.address}:${server.port}'; final String primaryUrl = '$prefixUrl/hello.txt'; final String secondaryUrl = '$prefixUrl/secondary.txt'; diff --git a/packages/webview_flutter/webview_flutter_wkwebview/example/integration_test/webview_flutter_test.dart b/packages/webview_flutter/webview_flutter_wkwebview/example/integration_test/webview_flutter_test.dart index 9318d9cce124..a94ed584f744 100644 --- a/packages/webview_flutter/webview_flutter_wkwebview/example/integration_test/webview_flutter_test.dart +++ b/packages/webview_flutter/webview_flutter_wkwebview/example/integration_test/webview_flutter_test.dart @@ -25,7 +25,7 @@ Future main() async { IntegrationTestWidgetsFlutterBinding.ensureInitialized(); final HttpServer server = await HttpServer.bind(InternetAddress.anyIPv4, 0); - server.forEach((HttpRequest request) { + unawaited(server.forEach((HttpRequest request) { if (request.uri.path == '/hello.txt') { request.response.writeln('Hello, world.'); } else if (request.uri.path == '/secondary.txt') { @@ -38,7 +38,7 @@ Future main() async { fail('unexpected request: ${request.method} ${request.uri}'); } request.response.close(); - }); + })); final String prefixUrl = 'http://${server.address.address}:${server.port}'; final String primaryUrl = '$prefixUrl/hello.txt'; final String secondaryUrl = '$prefixUrl/secondary.txt'; @@ -117,13 +117,15 @@ Future main() async { final PlatformWebViewController controller = PlatformWebViewController( const PlatformWebViewControllerCreationParams(), - ) - ..setPlatformNavigationDelegate( - PlatformNavigationDelegate( - const PlatformNavigationDelegateCreationParams(), - )..setOnPageFinished((_) => pageFinished.complete()), - ) - ..loadRequest(LoadRequestParams(uri: Uri.parse(primaryUrl))); + ); + final PlatformNavigationDelegate delegate = PlatformNavigationDelegate( + const PlatformNavigationDelegateCreationParams(), + ); + unawaited(delegate.setOnPageFinished((_) => pageFinished.complete())); + unawaited(controller.setPlatformNavigationDelegate(delegate)); + await controller.loadRequest( + LoadRequestParams(uri: Uri.parse(primaryUrl)), + ); await tester.pumpWidget(Builder( builder: (BuildContext context) { @@ -144,14 +146,14 @@ Future main() async { final PlatformWebViewController controller = PlatformWebViewController( const PlatformWebViewControllerCreationParams(), - ) - ..setJavaScriptMode(JavaScriptMode.unrestricted) - ..setPlatformNavigationDelegate( - PlatformNavigationDelegate( - const PlatformNavigationDelegateCreationParams(), - )..setOnPageFinished((_) => pageFinished.complete()), - ) - ..loadRequest(LoadRequestParams(uri: Uri.parse(primaryUrl))); + ); + unawaited(controller.setJavaScriptMode(JavaScriptMode.unrestricted)); + final PlatformNavigationDelegate delegate = PlatformNavigationDelegate( + const PlatformNavigationDelegateCreationParams(), + ); + unawaited(delegate.setOnPageFinished((_) => pageFinished.complete())); + unawaited(controller.setPlatformNavigationDelegate(delegate)); + await controller.loadRequest(LoadRequestParams(uri: Uri.parse(primaryUrl))); await tester.pumpWidget(Builder( builder: (BuildContext context) { @@ -178,19 +180,19 @@ Future main() async { final PlatformWebViewController controller = PlatformWebViewController( const PlatformWebViewControllerCreationParams(), - ) - ..setJavaScriptMode(JavaScriptMode.unrestricted) - ..setPlatformNavigationDelegate( - WebKitNavigationDelegate( - const WebKitNavigationDelegateCreationParams(), - )..setOnPageFinished((String url) => pageLoads.add(url)), - ) - ..loadRequest( - LoadRequestParams( - uri: Uri.parse(headersUrl), - headers: headers, - ), - ); + ); + unawaited(controller.setJavaScriptMode(JavaScriptMode.unrestricted)); + final PlatformNavigationDelegate delegate = PlatformNavigationDelegate( + const PlatformNavigationDelegateCreationParams(), + ); + unawaited(delegate.setOnPageFinished((String url) => pageLoads.add(url))); + unawaited(controller.setPlatformNavigationDelegate(delegate)); + await controller.loadRequest( + LoadRequestParams( + uri: Uri.parse(headersUrl), + headers: headers, + ), + ); await tester.pumpWidget(Builder( builder: (BuildContext context) { @@ -212,13 +214,13 @@ Future main() async { final Completer pageFinished = Completer(); final PlatformWebViewController controller = PlatformWebViewController( const PlatformWebViewControllerCreationParams(), - ) - ..setJavaScriptMode(JavaScriptMode.unrestricted) - ..setPlatformNavigationDelegate( - WebKitNavigationDelegate( - const WebKitNavigationDelegateCreationParams(), - )..setOnPageFinished((_) => pageFinished.complete()), - ); + ); + unawaited(controller.setJavaScriptMode(JavaScriptMode.unrestricted)); + final PlatformNavigationDelegate delegate = PlatformNavigationDelegate( + const PlatformNavigationDelegateCreationParams(), + ); + unawaited(delegate.setOnPageFinished((_) => pageFinished.complete())); + unawaited(controller.setPlatformNavigationDelegate(delegate)); final Completer channelCompleter = Completer(); await controller.addJavaScriptChannel( @@ -230,7 +232,7 @@ Future main() async { ), ); - controller.loadHtmlString( + await controller.loadHtmlString( 'data:text/html;charset=utf-8;base64,PCFET0NUWVBFIGh0bWw+', ); @@ -275,9 +277,9 @@ Future main() async { testWidgets('set custom userAgent', (WidgetTester tester) async { final PlatformWebViewController controller = PlatformWebViewController( const PlatformWebViewControllerCreationParams(), - ) - ..setJavaScriptMode(JavaScriptMode.unrestricted) - ..setUserAgent('Custom_User_Agent1'); + ); + unawaited(controller.setJavaScriptMode(JavaScriptMode.unrestricted)); + unawaited(controller.setUserAgent('Custom_User_Agent1')); await tester.pumpWidget(Builder( builder: (BuildContext context) { @@ -334,24 +336,25 @@ Future main() async { testWidgets('Auto media playback', (WidgetTester tester) async { Completer pageLoaded = Completer(); - PlatformWebViewController controller = PlatformWebViewController( + WebKitWebViewController controller = WebKitWebViewController( WebKitWebViewControllerCreationParams( mediaTypesRequiringUserAction: const {}, ), - ) - ..setJavaScriptMode(JavaScriptMode.unrestricted) - ..setPlatformNavigationDelegate( - WebKitNavigationDelegate( - const WebKitNavigationDelegateCreationParams(), - )..setOnPageFinished((_) => pageLoaded.complete()), - ) - ..loadRequest( - LoadRequestParams( - uri: Uri.parse( - 'data:text/html;charset=utf-8;base64,$videoTestBase64', - ), + ); + unawaited(controller.setJavaScriptMode(JavaScriptMode.unrestricted)); + WebKitNavigationDelegate delegate = WebKitNavigationDelegate( + const PlatformNavigationDelegateCreationParams(), + ); + unawaited(delegate.setOnPageFinished((_) => pageLoaded.complete())); + unawaited(controller.setPlatformNavigationDelegate(delegate)); + + await controller.loadRequest( + LoadRequestParams( + uri: Uri.parse( + 'data:text/html;charset=utf-8;base64,$videoTestBase64', ), - ); + ), + ); await tester.pumpWidget(Builder( builder: (BuildContext context) { @@ -368,22 +371,23 @@ Future main() async { expect(isPaused, false); pageLoaded = Completer(); - controller = PlatformWebViewController( - WebKitWebViewControllerCreationParams(), - ) - ..setJavaScriptMode(JavaScriptMode.unrestricted) - ..setPlatformNavigationDelegate( - WebKitNavigationDelegate( - const WebKitNavigationDelegateCreationParams(), - )..setOnPageFinished((_) => pageLoaded.complete()), - ) - ..loadRequest( - LoadRequestParams( - uri: Uri.parse( - 'data:text/html;charset=utf-8;base64,$videoTestBase64', - ), + controller = WebKitWebViewController( + const PlatformWebViewControllerCreationParams(), + ); + unawaited(controller.setJavaScriptMode(JavaScriptMode.unrestricted)); + delegate = WebKitNavigationDelegate( + const PlatformNavigationDelegateCreationParams(), + ); + unawaited(delegate.setOnPageFinished((_) => pageLoaded.complete())); + unawaited(controller.setPlatformNavigationDelegate(delegate)); + + await controller.loadRequest( + LoadRequestParams( + uri: Uri.parse( + 'data:text/html;charset=utf-8;base64,$videoTestBase64', ), - ); + ), + ); await tester.pumpWidget(Builder( builder: (BuildContext context) { @@ -410,32 +414,34 @@ Future main() async { mediaTypesRequiringUserAction: const {}, allowsInlineMediaPlayback: true, ), - ) - ..setJavaScriptMode(JavaScriptMode.unrestricted) - ..setPlatformNavigationDelegate( - WebKitNavigationDelegate( - const WebKitNavigationDelegateCreationParams(), - )..setOnPageFinished((_) => pageLoaded.complete()), - ) - ..addJavaScriptChannel( - JavaScriptChannelParams( - name: 'VideoTestTime', - onMessageReceived: (JavaScriptMessage message) { - final double currentTime = double.parse(message.message); - // Let it play for at least 1 second to make sure the related video's properties are set. - if (currentTime > 1 && !videoPlaying.isCompleted) { - videoPlaying.complete(null); - } - }, - ), - ) - ..loadRequest( - LoadRequestParams( - uri: Uri.parse( - 'data:text/html;charset=utf-8;base64,$videoTestBase64', - ), + ); + unawaited(controller.setJavaScriptMode(JavaScriptMode.unrestricted)); + final WebKitNavigationDelegate delegate = WebKitNavigationDelegate( + const PlatformNavigationDelegateCreationParams(), + ); + unawaited(delegate.setOnPageFinished((_) => pageLoaded.complete())); + unawaited(controller.setPlatformNavigationDelegate(delegate)); + + unawaited(controller.addJavaScriptChannel( + JavaScriptChannelParams( + name: 'VideoTestTime', + onMessageReceived: (JavaScriptMessage message) { + final double currentTime = double.parse(message.message); + // Let it play for at least 1 second to make sure the related video's properties are set. + if (currentTime > 1 && !videoPlaying.isCompleted) { + videoPlaying.complete(null); + } + }, + ), + )); + + await controller.loadRequest( + LoadRequestParams( + uri: Uri.parse( + 'data:text/html;charset=utf-8;base64,$videoTestBase64', ), - ); + ), + ); await tester.pumpWidget(Builder( builder: (BuildContext context) { @@ -466,32 +472,34 @@ Future main() async { WebKitWebViewControllerCreationParams( mediaTypesRequiringUserAction: const {}, ), - ) - ..setJavaScriptMode(JavaScriptMode.unrestricted) - ..setPlatformNavigationDelegate( - WebKitNavigationDelegate( - const WebKitNavigationDelegateCreationParams(), - )..setOnPageFinished((_) => pageLoaded.complete()), - ) - ..addJavaScriptChannel( - JavaScriptChannelParams( - name: 'VideoTestTime', - onMessageReceived: (JavaScriptMessage message) { - final double currentTime = double.parse(message.message); - // Let it play for at least 1 second to make sure the related video's properties are set. - if (currentTime > 1 && !videoPlaying.isCompleted) { - videoPlaying.complete(null); - } - }, - ), - ) - ..loadRequest( - LoadRequestParams( - uri: Uri.parse( - 'data:text/html;charset=utf-8;base64,$videoTestBase64', - ), + ); + unawaited(controller.setJavaScriptMode(JavaScriptMode.unrestricted)); + final WebKitNavigationDelegate delegate = WebKitNavigationDelegate( + const PlatformNavigationDelegateCreationParams(), + ); + unawaited(delegate.setOnPageFinished((_) => pageLoaded.complete())); + unawaited(controller.setPlatformNavigationDelegate(delegate)); + + unawaited(controller.addJavaScriptChannel( + JavaScriptChannelParams( + name: 'VideoTestTime', + onMessageReceived: (JavaScriptMessage message) { + final double currentTime = double.parse(message.message); + // Let it play for at least 1 second to make sure the related video's properties are set. + if (currentTime > 1 && !videoPlaying.isCompleted) { + videoPlaying.complete(null); + } + }, + ), + )); + + await controller.loadRequest( + LoadRequestParams( + uri: Uri.parse( + 'data:text/html;charset=utf-8;base64,$videoTestBase64', ), - ); + ), + ); await tester.pumpWidget(Builder( builder: (BuildContext context) { @@ -551,20 +559,21 @@ Future main() async { WebKitWebViewControllerCreationParams( mediaTypesRequiringUserAction: const {}, ), - ) - ..setJavaScriptMode(JavaScriptMode.unrestricted) - ..setPlatformNavigationDelegate( - WebKitNavigationDelegate( - const WebKitNavigationDelegateCreationParams(), - )..setOnPageFinished((_) => pageLoaded.complete()), - ) - ..loadRequest( - LoadRequestParams( - uri: Uri.parse( - 'data:text/html;charset=utf-8;base64,$audioTestBase64', - ), + ); + unawaited(controller.setJavaScriptMode(JavaScriptMode.unrestricted)); + WebKitNavigationDelegate delegate = WebKitNavigationDelegate( + const PlatformNavigationDelegateCreationParams(), + ); + unawaited(delegate.setOnPageFinished((_) => pageLoaded.complete())); + unawaited(controller.setPlatformNavigationDelegate(delegate)); + + await controller.loadRequest( + LoadRequestParams( + uri: Uri.parse( + 'data:text/html;charset=utf-8;base64,$audioTestBase64', ), - ); + ), + ); await tester.pumpWidget(Builder( builder: (BuildContext context) { @@ -583,20 +592,20 @@ Future main() async { pageLoaded = Completer(); controller = PlatformWebViewController( WebKitWebViewControllerCreationParams(), - ) - ..setJavaScriptMode(JavaScriptMode.unrestricted) - ..setPlatformNavigationDelegate( - WebKitNavigationDelegate( - const WebKitNavigationDelegateCreationParams(), - )..setOnPageFinished((_) => pageLoaded.complete()), - ) - ..loadRequest( - LoadRequestParams( - uri: Uri.parse( - 'data:text/html;charset=utf-8;base64,$audioTestBase64', - ), + ); + unawaited(controller.setJavaScriptMode(JavaScriptMode.unrestricted)); + delegate = WebKitNavigationDelegate( + const PlatformNavigationDelegateCreationParams(), + ); + unawaited(delegate.setOnPageFinished((_) => pageLoaded.complete())); + unawaited(controller.setPlatformNavigationDelegate(delegate)); + await controller.loadRequest( + LoadRequestParams( + uri: Uri.parse( + 'data:text/html;charset=utf-8;base64,$audioTestBase64', ), - ); + ), + ); await tester.pumpWidget(Builder( builder: (BuildContext context) { @@ -628,21 +637,22 @@ Future main() async { final Completer pageLoaded = Completer(); final PlatformWebViewController controller = PlatformWebViewController( - WebKitWebViewControllerCreationParams(), - ) - ..setJavaScriptMode(JavaScriptMode.unrestricted) - ..setPlatformNavigationDelegate( - WebKitNavigationDelegate( - const WebKitNavigationDelegateCreationParams(), - )..setOnPageFinished((_) => pageLoaded.complete()), - ) - ..loadRequest( - LoadRequestParams( - uri: Uri.parse( - 'data:text/html;charset=utf-8;base64,$getTitleTestBase64', - ), + const PlatformWebViewControllerCreationParams(), + ); + unawaited(controller.setJavaScriptMode(JavaScriptMode.unrestricted)); + final PlatformNavigationDelegate delegate = PlatformNavigationDelegate( + const PlatformNavigationDelegateCreationParams(), + ); + unawaited(delegate.setOnPageFinished((_) => pageLoaded.complete())); + unawaited(controller.setPlatformNavigationDelegate(delegate)); + + await controller.loadRequest( + LoadRequestParams( + uri: Uri.parse( + 'data:text/html;charset=utf-8;base64,$getTitleTestBase64', ), - ); + ), + ); await tester.pumpWidget(Builder( builder: (BuildContext context) { @@ -692,21 +702,22 @@ Future main() async { final Completer pageLoaded = Completer(); final PlatformWebViewController controller = PlatformWebViewController( - WebKitWebViewControllerCreationParams(), - ) - ..setJavaScriptMode(JavaScriptMode.unrestricted) - ..setPlatformNavigationDelegate( - WebKitNavigationDelegate( - const WebKitNavigationDelegateCreationParams(), - )..setOnPageFinished((_) => pageLoaded.complete()), - ) - ..loadRequest( - LoadRequestParams( - uri: Uri.parse( - 'data:text/html;charset=utf-8;base64,$scrollTestPageBase64', - ), + const PlatformWebViewControllerCreationParams(), + ); + unawaited(controller.setJavaScriptMode(JavaScriptMode.unrestricted)); + final PlatformNavigationDelegate delegate = PlatformNavigationDelegate( + const PlatformNavigationDelegateCreationParams(), + ); + unawaited(delegate.setOnPageFinished((_) => pageLoaded.complete())); + unawaited(controller.setPlatformNavigationDelegate(delegate)); + + await controller.loadRequest( + LoadRequestParams( + uri: Uri.parse( + 'data:text/html;charset=utf-8;base64,$scrollTestPageBase64', ), - ); + ), + ); await tester.pumpWidget(Builder( builder: (BuildContext context) { @@ -753,23 +764,25 @@ Future main() async { Completer pageLoaded = Completer(); final PlatformWebViewController controller = PlatformWebViewController( - WebKitWebViewControllerCreationParams(), - ) - ..setJavaScriptMode(JavaScriptMode.unrestricted) - ..setPlatformNavigationDelegate( - WebKitNavigationDelegate( - const WebKitNavigationDelegateCreationParams(), - ) - ..setOnPageFinished((_) => pageLoaded.complete()) - ..setOnNavigationRequest((NavigationRequest navigationRequest) { - return (navigationRequest.url.contains('youtube.com')) - ? NavigationDecision.prevent - : NavigationDecision.navigate; - }), - ) - ..loadRequest( - LoadRequestParams(uri: Uri.parse(blankPageEncoded)), - ); + const PlatformWebViewControllerCreationParams(), + ); + unawaited(controller.setJavaScriptMode(JavaScriptMode.unrestricted)); + final PlatformNavigationDelegate delegate = PlatformNavigationDelegate( + const PlatformNavigationDelegateCreationParams(), + ); + unawaited(delegate.setOnPageFinished((_) => pageLoaded.complete())); + unawaited( + delegate.setOnNavigationRequest((NavigationRequest navigationRequest) { + return (navigationRequest.url.contains('youtube.com')) + ? NavigationDecision.prevent + : NavigationDecision.navigate; + }), + ); + unawaited(controller.setPlatformNavigationDelegate(delegate)); + + await controller.loadRequest( + LoadRequestParams(uri: Uri.parse(blankPageEncoded)), + ); await tester.pumpWidget(Builder( builder: (BuildContext context) { @@ -794,19 +807,22 @@ Future main() async { Completer(); final PlatformWebViewController controller = PlatformWebViewController( - WebKitWebViewControllerCreationParams(), - ) - ..setJavaScriptMode(JavaScriptMode.unrestricted) - ..setPlatformNavigationDelegate( - WebKitNavigationDelegate( - const WebKitNavigationDelegateCreationParams(), - )..setOnWebResourceError((WebResourceError error) { - errorCompleter.complete(error); - }), - ) - ..loadRequest( - LoadRequestParams(uri: Uri.parse('https://www.notawebsite..com')), - ); + const PlatformWebViewControllerCreationParams(), + ); + unawaited(controller.setJavaScriptMode(JavaScriptMode.unrestricted)); + final PlatformNavigationDelegate delegate = PlatformNavigationDelegate( + const PlatformNavigationDelegateCreationParams(), + ); + unawaited( + delegate.setOnWebResourceError((WebResourceError error) { + errorCompleter.complete(error); + }), + ); + unawaited(controller.setPlatformNavigationDelegate(delegate)); + + await controller.loadRequest( + LoadRequestParams(uri: Uri.parse('https://www.notawebsite..com')), + ); await tester.pumpWidget(Builder( builder: (BuildContext context) { @@ -829,25 +845,28 @@ Future main() async { final Completer pageFinishCompleter = Completer(); final PlatformWebViewController controller = PlatformWebViewController( - WebKitWebViewControllerCreationParams(), - ) - ..setJavaScriptMode(JavaScriptMode.unrestricted) - ..setPlatformNavigationDelegate( - WebKitNavigationDelegate( - const WebKitNavigationDelegateCreationParams(), - ) - ..setOnPageFinished((_) => pageFinishCompleter.complete()) - ..setOnWebResourceError((WebResourceError error) { - errorCompleter.complete(error); - }), - ) - ..loadRequest( - LoadRequestParams( - uri: Uri.parse( - 'data:text/html;charset=utf-8;base64,PCFET0NUWVBFIGh0bWw+', - ), + const PlatformWebViewControllerCreationParams(), + ); + unawaited(controller.setJavaScriptMode(JavaScriptMode.unrestricted)); + final PlatformNavigationDelegate delegate = PlatformNavigationDelegate( + const PlatformNavigationDelegateCreationParams(), + ); + unawaited( + delegate.setOnPageFinished((_) => pageFinishCompleter.complete()), + ); + unawaited( + delegate.setOnWebResourceError((WebResourceError error) { + errorCompleter.complete(error); + }), + ); + unawaited(controller.setPlatformNavigationDelegate(delegate)); + await controller.loadRequest( + LoadRequestParams( + uri: Uri.parse( + 'data:text/html;charset=utf-8;base64,PCFET0NUWVBFIGh0bWw+', ), - ); + ), + ); await tester.pumpWidget(Builder( builder: (BuildContext context) { @@ -883,25 +902,28 @@ Future main() async { final Completer pageFinishCompleter = Completer(); final PlatformWebViewController controller = PlatformWebViewController( - WebKitWebViewControllerCreationParams(), - ) - ..setJavaScriptMode(JavaScriptMode.unrestricted) - ..setPlatformNavigationDelegate( - WebKitNavigationDelegate( - const WebKitNavigationDelegateCreationParams(), - ) - ..setOnPageFinished((_) => pageFinishCompleter.complete()) - ..setOnWebResourceError((WebResourceError error) { - errorCompleter.complete(error); - }), - ) - ..loadRequest( - LoadRequestParams( - uri: Uri.parse( - 'data:text/html;charset=utf-8;base64,$iframeTestBase64', - ), + const PlatformWebViewControllerCreationParams(), + ); + unawaited(controller.setJavaScriptMode(JavaScriptMode.unrestricted)); + final PlatformNavigationDelegate delegate = PlatformNavigationDelegate( + const PlatformNavigationDelegateCreationParams(), + ); + unawaited( + delegate.setOnPageFinished((_) => pageFinishCompleter.complete()), + ); + unawaited( + delegate.setOnWebResourceError((WebResourceError error) { + errorCompleter.complete(error); + }), + ); + unawaited(controller.setPlatformNavigationDelegate(delegate)); + await controller.loadRequest( + LoadRequestParams( + uri: Uri.parse( + 'data:text/html;charset=utf-8;base64,$iframeTestBase64', ), - ); + ), + ); await tester.pumpWidget(Builder( builder: (BuildContext context) { @@ -920,21 +942,23 @@ Future main() async { Completer pageLoaded = Completer(); final PlatformWebViewController controller = PlatformWebViewController( - WebKitWebViewControllerCreationParams(), - ) - ..setJavaScriptMode(JavaScriptMode.unrestricted) - ..setPlatformNavigationDelegate( - WebKitNavigationDelegate( - const WebKitNavigationDelegateCreationParams(), - ) - ..setOnPageFinished((_) => pageLoaded.complete()) - ..setOnNavigationRequest((NavigationRequest navigationRequest) { - return (navigationRequest.url.contains('youtube.com')) - ? NavigationDecision.prevent - : NavigationDecision.navigate; - }), - ) - ..loadRequest(LoadRequestParams(uri: Uri.parse(blankPageEncoded))); + const PlatformWebViewControllerCreationParams(), + ); + unawaited(controller.setJavaScriptMode(JavaScriptMode.unrestricted)); + final PlatformNavigationDelegate delegate = PlatformNavigationDelegate( + const PlatformNavigationDelegateCreationParams(), + ); + unawaited(delegate.setOnPageFinished((_) => pageLoaded.complete())); + unawaited(delegate + .setOnNavigationRequest((NavigationRequest navigationRequest) { + return (navigationRequest.url.contains('youtube.com')) + ? NavigationDecision.prevent + : NavigationDecision.navigate; + })); + unawaited(controller.setPlatformNavigationDelegate(delegate)); + + await controller + .loadRequest(LoadRequestParams(uri: Uri.parse(blankPageEncoded))); await tester.pumpWidget(Builder( builder: (BuildContext context) { @@ -963,24 +987,24 @@ Future main() async { Completer pageLoaded = Completer(); final PlatformWebViewController controller = PlatformWebViewController( - WebKitWebViewControllerCreationParams(), - ) - ..setJavaScriptMode(JavaScriptMode.unrestricted) - ..setPlatformNavigationDelegate( - WebKitNavigationDelegate( - const WebKitNavigationDelegateCreationParams(), - ) - ..setOnPageFinished((_) => pageLoaded.complete()) - ..setOnNavigationRequest( - (NavigationRequest navigationRequest) async { - NavigationDecision decision = NavigationDecision.prevent; - decision = await Future.delayed( - const Duration(milliseconds: 10), - () => NavigationDecision.navigate); - return decision; - }), - ) - ..loadRequest(LoadRequestParams(uri: Uri.parse(blankPageEncoded))); + const PlatformWebViewControllerCreationParams(), + ); + unawaited(controller.setJavaScriptMode(JavaScriptMode.unrestricted)); + final PlatformNavigationDelegate delegate = PlatformNavigationDelegate( + const PlatformNavigationDelegateCreationParams(), + ); + unawaited(delegate.setOnPageFinished((_) => pageLoaded.complete())); + unawaited(delegate + .setOnNavigationRequest((NavigationRequest navigationRequest) async { + NavigationDecision decision = NavigationDecision.prevent; + decision = await Future.delayed( + const Duration(milliseconds: 10), + () => NavigationDecision.navigate); + return decision; + })); + unawaited(controller.setPlatformNavigationDelegate(delegate)); + await controller + .loadRequest(LoadRequestParams(uri: Uri.parse(blankPageEncoded))); await tester.pumpWidget(Builder( builder: (BuildContext context) { @@ -1003,17 +1027,17 @@ Future main() async { testWidgets('can receive url changes', (WidgetTester tester) async { final Completer pageLoaded = Completer(); - final PlatformNavigationDelegate navigationDelegate = - PlatformNavigationDelegate( - const PlatformNavigationDelegateCreationParams(), - )..setOnPageFinished((_) => pageLoaded.complete()); - final PlatformWebViewController controller = PlatformWebViewController( const PlatformWebViewControllerCreationParams(), - ) - ..setJavaScriptMode(JavaScriptMode.unrestricted) - ..setPlatformNavigationDelegate(navigationDelegate) - ..loadRequest(LoadRequestParams(uri: Uri.parse(blankPageEncoded))); + ); + unawaited(controller.setJavaScriptMode(JavaScriptMode.unrestricted)); + final PlatformNavigationDelegate delegate = PlatformNavigationDelegate( + const PlatformNavigationDelegateCreationParams(), + ); + unawaited(delegate.setOnPageFinished((_) => pageLoaded.complete())); + unawaited(controller.setPlatformNavigationDelegate(delegate)); + await controller + .loadRequest(LoadRequestParams(uri: Uri.parse(blankPageEncoded))); await tester.pumpWidget(Builder( builder: (BuildContext context) { @@ -1024,10 +1048,10 @@ Future main() async { )); await pageLoaded.future; - await navigationDelegate.setOnPageFinished((_) {}); + await delegate.setOnPageFinished((_) {}); final Completer urlChangeCompleter = Completer(); - await navigationDelegate.setOnUrlChange((UrlChange change) { + await delegate.setOnUrlChange((UrlChange change) { urlChangeCompleter.complete(change.url); }); @@ -1040,17 +1064,17 @@ Future main() async { (WidgetTester tester) async { final Completer pageLoaded = Completer(); - final PlatformNavigationDelegate navigationDelegate = - PlatformNavigationDelegate( - const PlatformNavigationDelegateCreationParams(), - )..setOnPageFinished((_) => pageLoaded.complete()); - final PlatformWebViewController controller = PlatformWebViewController( const PlatformWebViewControllerCreationParams(), - ) - ..setJavaScriptMode(JavaScriptMode.unrestricted) - ..setPlatformNavigationDelegate(navigationDelegate) - ..loadRequest(LoadRequestParams(uri: Uri.parse(primaryUrl))); + ); + unawaited(controller.setJavaScriptMode(JavaScriptMode.unrestricted)); + final PlatformNavigationDelegate delegate = PlatformNavigationDelegate( + const PlatformNavigationDelegateCreationParams(), + ); + unawaited(delegate.setOnPageFinished((_) => pageLoaded.complete())); + unawaited(controller.setPlatformNavigationDelegate(delegate)); + await controller + .loadRequest(LoadRequestParams(uri: Uri.parse(primaryUrl))); await tester.pumpWidget(Builder( builder: (BuildContext context) { @@ -1061,10 +1085,10 @@ Future main() async { )); await pageLoaded.future; - await navigationDelegate.setOnPageFinished((_) {}); + await delegate.setOnPageFinished((_) {}); final Completer urlChangeCompleter = Completer(); - await navigationDelegate.setOnUrlChange((UrlChange change) { + await delegate.setOnUrlChange((UrlChange change) { urlChangeCompleter.complete(change.url); }); @@ -1080,9 +1104,9 @@ Future main() async { (WidgetTester tester) async { final WebKitWebViewController controller = WebKitWebViewController( WebKitWebViewControllerCreationParams(), - ) - ..setAllowsBackForwardNavigationGestures(true) - ..loadRequest(LoadRequestParams(uri: Uri.parse(primaryUrl))); + ); + unawaited(controller.setAllowsBackForwardNavigationGestures(true)); + await controller.loadRequest(LoadRequestParams(uri: Uri.parse(primaryUrl))); await tester.pumpWidget(Builder( builder: (BuildContext context) { @@ -1102,11 +1126,12 @@ Future main() async { final PlatformWebViewController controller = PlatformWebViewController( WebKitWebViewControllerCreationParams(), - ) - ..setJavaScriptMode(JavaScriptMode.unrestricted) - ..setPlatformNavigationDelegate(WebKitNavigationDelegate( - const WebKitNavigationDelegateCreationParams(), - )..setOnPageFinished((_) => pageLoaded.complete())); + ); + unawaited(controller.setJavaScriptMode(JavaScriptMode.unrestricted)); + final PlatformNavigationDelegate delegate = PlatformNavigationDelegate( + const PlatformNavigationDelegateCreationParams(), + ); + unawaited(delegate.setOnPageFinished((_) => pageLoaded.complete())); await controller.runJavaScript('window.open("$primaryUrl", "_blank")'); @@ -1129,13 +1154,16 @@ Future main() async { Completer pageLoaded = Completer(); final PlatformWebViewController controller = PlatformWebViewController( - WebKitWebViewControllerCreationParams(), - ) - ..setJavaScriptMode(JavaScriptMode.unrestricted) - ..setPlatformNavigationDelegate(WebKitNavigationDelegate( - const WebKitNavigationDelegateCreationParams(), - )..setOnPageFinished((_) => pageLoaded.complete())) - ..loadRequest(LoadRequestParams(uri: Uri.parse(primaryUrl))); + const PlatformWebViewControllerCreationParams(), + ); + unawaited(controller.setJavaScriptMode(JavaScriptMode.unrestricted)); + final PlatformNavigationDelegate delegate = PlatformNavigationDelegate( + const PlatformNavigationDelegateCreationParams(), + ); + unawaited(delegate.setOnPageFinished((_) => pageLoaded.complete())); + unawaited(controller.setPlatformNavigationDelegate(delegate)); + await controller + .loadRequest(LoadRequestParams(uri: Uri.parse(primaryUrl))); await tester.pumpWidget(Builder( builder: (BuildContext context) { diff --git a/packages/webview_flutter/webview_flutter_wkwebview/lib/src/legacy/web_kit_webview_widget.dart b/packages/webview_flutter/webview_flutter_wkwebview/lib/src/legacy/web_kit_webview_widget.dart index 2c201be4aecf..da0745a44217 100644 --- a/packages/webview_flutter/webview_flutter_wkwebview/lib/src/legacy/web_kit_webview_widget.dart +++ b/packages/webview_flutter/webview_flutter_wkwebview/lib/src/legacy/web_kit_webview_widget.dart @@ -214,24 +214,24 @@ class WebKitWebViewPlatformController extends WebViewPlatformController { ), ); - webView.setUIDelegate(uiDelegate); + unawaited(webView.setUIDelegate(uiDelegate)); await addJavascriptChannels(params.javascriptChannelNames); - webView.setNavigationDelegate(navigationDelegate); + unawaited(webView.setNavigationDelegate(navigationDelegate)); if (params.userAgent != null) { - webView.setCustomUserAgent(params.userAgent); + unawaited(webView.setCustomUserAgent(params.userAgent)); } if (params.webSettings != null) { - updateSettings(params.webSettings!); + unawaited(updateSettings(params.webSettings!)); } if (params.backgroundColor != null) { - webView.setOpaque(false); - webView.setBackgroundColor(Colors.transparent); - webView.scrollView.setBackgroundColor(params.backgroundColor); + unawaited(webView.setOpaque(false)); + unawaited(webView.setBackgroundColor(Colors.transparent)); + unawaited(webView.scrollView.setBackgroundColor(params.backgroundColor)); } if (params.initialUrl != null) { @@ -379,8 +379,8 @@ class WebKitWebViewPlatformController extends WebViewPlatformController { Future currentUrl() => webView.getUrl(); @override - Future scrollTo(int x, int y) async { - webView.scrollView.setContentOffset(Point( + Future scrollTo(int x, int y) { + return webView.scrollView.setContentOffset(Point( x.toDouble(), y.toDouble(), )); @@ -550,7 +550,9 @@ class WebKitWebViewPlatformController extends WebViewPlatformController { Future _resetUserScripts({ Set removedJavaScriptChannels = const {}, }) async { - webView.configuration.userContentController.removeAllUserScripts(); + unawaited( + webView.configuration.userContentController.removeAllUserScripts(), + ); // TODO(bparrishMines): This can be replaced with // `removeAllScriptMessageHandlers` once Dart supports runtime version // checking. (e.g. The equivalent to @availability in Objective-C.) diff --git a/packages/webview_flutter/webview_flutter_wkwebview/lib/src/webkit_webview_controller.dart b/packages/webview_flutter/webview_flutter_wkwebview/lib/src/webkit_webview_controller.dart index 3d6a99b49806..5df538ca0c2f 100644 --- a/packages/webview_flutter/webview_flutter_wkwebview/lib/src/webkit_webview_controller.dart +++ b/packages/webview_flutter/webview_flutter_wkwebview/lib/src/webkit_webview_controller.dart @@ -518,7 +518,9 @@ class WebKitWebViewController extends PlatformWebViewController { // workaround could interfere with exposing support for custom scripts from // applications. Future _resetUserScripts({String? removedJavaScriptChannel}) async { - _webView.configuration.userContentController.removeAllUserScripts(); + unawaited( + _webView.configuration.userContentController.removeAllUserScripts(), + ); // TODO(bparrishMines): This can be replaced with // `removeAllScriptMessageHandlers` once Dart supports runtime version // checking. (e.g. The equivalent to @availability in Objective-C.) diff --git a/packages/webview_flutter/webview_flutter_wkwebview/test/src/web_kit/web_kit_test.dart b/packages/webview_flutter/webview_flutter_wkwebview/test/src/web_kit/web_kit_test.dart index ac266ff79ebb..856ca55e7c60 100644 --- a/packages/webview_flutter/webview_flutter_wkwebview/test/src/web_kit/web_kit_test.dart +++ b/packages/webview_flutter/webview_flutter_wkwebview/test/src/web_kit/web_kit_test.dart @@ -346,7 +346,8 @@ void main() { instanceManager: instanceManager, ); - userContentController.addScriptMessageHandler(handler, 'handlerName'); + await userContentController.addScriptMessageHandler( + handler, 'handlerName'); verify(mockPlatformHostApi.addScriptMessageHandler( instanceManager.getIdentifier(userContentController), instanceManager.getIdentifier(handler), @@ -355,7 +356,7 @@ void main() { }); test('removeScriptMessageHandler', () async { - userContentController.removeScriptMessageHandler('handlerName'); + await userContentController.removeScriptMessageHandler('handlerName'); verify(mockPlatformHostApi.removeScriptMessageHandler( instanceManager.getIdentifier(userContentController), 'handlerName', @@ -363,7 +364,7 @@ void main() { }); test('removeAllScriptMessageHandlers', () async { - userContentController.removeAllScriptMessageHandlers(); + await userContentController.removeAllScriptMessageHandlers(); verify(mockPlatformHostApi.removeAllScriptMessageHandlers( instanceManager.getIdentifier(userContentController), )); diff --git a/packages/webview_flutter/webview_flutter_wkwebview/test/webkit_webview_controller_test.dart b/packages/webview_flutter/webview_flutter_wkwebview/test/webkit_webview_controller_test.dart index 5cea3b14b0a6..89df6340d100 100644 --- a/packages/webview_flutter/webview_flutter_wkwebview/test/webkit_webview_controller_test.dart +++ b/packages/webview_flutter/webview_flutter_wkwebview/test/webkit_webview_controller_test.dart @@ -608,7 +608,7 @@ void main() { mockScrollView: mockScrollView, ); - controller.setBackgroundColor(Colors.red); + await controller.setBackgroundColor(Colors.red); // UIScrollView.setBackgroundColor must be called last. verifyInOrder([ @@ -894,7 +894,7 @@ void main() { ); late final int callbackProgress; - navigationDelegate.setOnProgress( + await navigationDelegate.setOnProgress( (int progress) => callbackProgress = progress, ); @@ -1031,7 +1031,7 @@ void main() { ); final Completer urlChangeCompleter = Completer(); - navigationDelegate.setOnUrlChange( + await navigationDelegate.setOnUrlChange( (UrlChange change) => urlChangeCompleter.complete(change), ); @@ -1085,7 +1085,7 @@ void main() { ); final Completer urlChangeCompleter = Completer(); - navigationDelegate.setOnUrlChange( + await navigationDelegate.setOnUrlChange( (UrlChange change) => urlChangeCompleter.complete(change), ); @@ -1127,7 +1127,7 @@ void main() { await controller.setOnPlatformPermissionRequest( (PlatformWebViewPermissionRequest request) async { permissionRequest = request; - request.grant(); + await request.grant(); }, ); From ddb79ecbd640c0e9263a0b2615233e4a1b494f41 Mon Sep 17 00:00:00 2001 From: Maurice Parrish <10687576+bparrishMines@users.noreply.github.com> Date: Fri, 30 Jun 2023 15:48:24 -0400 Subject: [PATCH 3/4] version bump --- packages/webview_flutter/webview_flutter_android/CHANGELOG.md | 4 ++++ packages/webview_flutter/webview_flutter_android/pubspec.yaml | 2 +- .../webview_flutter/webview_flutter_wkwebview/CHANGELOG.md | 4 ++++ .../webview_flutter/webview_flutter_wkwebview/pubspec.yaml | 2 +- 4 files changed, 10 insertions(+), 2 deletions(-) diff --git a/packages/webview_flutter/webview_flutter_android/CHANGELOG.md b/packages/webview_flutter/webview_flutter_android/CHANGELOG.md index 10489c3703f6..114f2a74eb77 100644 --- a/packages/webview_flutter/webview_flutter_android/CHANGELOG.md +++ b/packages/webview_flutter/webview_flutter_android/CHANGELOG.md @@ -1,3 +1,7 @@ +## 3.8.2 + +* Fixes unawaited_futures violations. + ## 3.8.1 * Bumps androidx.webkit:webkit from 1.6.0 to 1.7.0. diff --git a/packages/webview_flutter/webview_flutter_android/pubspec.yaml b/packages/webview_flutter/webview_flutter_android/pubspec.yaml index 609fa7a1cf28..a58c031b82b7 100644 --- a/packages/webview_flutter/webview_flutter_android/pubspec.yaml +++ b/packages/webview_flutter/webview_flutter_android/pubspec.yaml @@ -2,7 +2,7 @@ name: webview_flutter_android description: A Flutter plugin that provides a WebView widget on Android. repository: https://github.com/flutter/packages/tree/main/packages/webview_flutter/webview_flutter_android issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+webview%22 -version: 3.8.1 +version: 3.8.2 environment: sdk: ">=2.18.0 <4.0.0" diff --git a/packages/webview_flutter/webview_flutter_wkwebview/CHANGELOG.md b/packages/webview_flutter/webview_flutter_wkwebview/CHANGELOG.md index 2f5fca2be758..318d5468ee5c 100644 --- a/packages/webview_flutter/webview_flutter_wkwebview/CHANGELOG.md +++ b/packages/webview_flutter/webview_flutter_wkwebview/CHANGELOG.md @@ -1,3 +1,7 @@ +## 3.6.1 + +* Fixes unawaited_futures violations. + ## 3.6.0 * Adds support to enable debugging of web contents on the latest versions of WebKit. See diff --git a/packages/webview_flutter/webview_flutter_wkwebview/pubspec.yaml b/packages/webview_flutter/webview_flutter_wkwebview/pubspec.yaml index 4385f822dc78..2572ecc4f59a 100644 --- a/packages/webview_flutter/webview_flutter_wkwebview/pubspec.yaml +++ b/packages/webview_flutter/webview_flutter_wkwebview/pubspec.yaml @@ -2,7 +2,7 @@ name: webview_flutter_wkwebview description: A Flutter plugin that provides a WebView widget based on Apple's WKWebView control. repository: https://github.com/flutter/packages/tree/main/packages/webview_flutter/webview_flutter_wkwebview issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+webview%22 -version: 3.6.0 +version: 3.6.1 environment: sdk: ">=2.18.0 <4.0.0" From 1cf044030e94196dfb8383cd5bdf3333d923598b Mon Sep 17 00:00:00 2001 From: Maurice Parrish <10687576+bparrishMines@users.noreply.github.com> Date: Thu, 6 Jul 2023 18:34:35 -0400 Subject: [PATCH 4/4] fix test --- .../example/integration_test/webview_flutter_test.dart | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/webview_flutter/webview_flutter_wkwebview/example/integration_test/webview_flutter_test.dart b/packages/webview_flutter/webview_flutter_wkwebview/example/integration_test/webview_flutter_test.dart index a94ed584f744..4b457d0e4ca4 100644 --- a/packages/webview_flutter/webview_flutter_wkwebview/example/integration_test/webview_flutter_test.dart +++ b/packages/webview_flutter/webview_flutter_wkwebview/example/integration_test/webview_flutter_test.dart @@ -1132,6 +1132,7 @@ Future main() async { const PlatformNavigationDelegateCreationParams(), ); unawaited(delegate.setOnPageFinished((_) => pageLoaded.complete())); + unawaited(controller.setPlatformNavigationDelegate(delegate)); await controller.runJavaScript('window.open("$primaryUrl", "_blank")');