From edff3abdaac7a6ba573efb15daf5e125faf7ad5f Mon Sep 17 00:00:00 2001 From: Amir Hardon Date: Tue, 14 May 2019 10:53:13 -0700 Subject: [PATCH 1/2] Fix wrong main thread checking condition. The Android JavaScriptChannel wasn't checking correctly if messages are received on the main thread and took the branch that assumes we are on the main thread. https://github.com/flutter/engine/pull/8830 causes this behavior to fail (which is good). So now we can also add an e2e test that fails with the buggy behavior. --- packages/webview_flutter/CHANGELOG.md | 4 +++ .../webviewflutter/JavaScriptChannel.java | 2 +- .../example/test_driver/webview.dart | 34 +++++++++++++++++++ packages/webview_flutter/pubspec.yaml | 2 +- 4 files changed, 40 insertions(+), 2 deletions(-) diff --git a/packages/webview_flutter/CHANGELOG.md b/packages/webview_flutter/CHANGELOG.md index 973073a03a55..19a0fcd99a71 100644 --- a/packages/webview_flutter/CHANGELOG.md +++ b/packages/webview_flutter/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.3.7+1 + +* Fix an issue where JavaScriptChannel messages weren't sent from the platform thread on Android. + ## 0.3.7 * Fix loadUrlWithHeaders flaky test. diff --git a/packages/webview_flutter/android/src/main/java/io/flutter/plugins/webviewflutter/JavaScriptChannel.java b/packages/webview_flutter/android/src/main/java/io/flutter/plugins/webviewflutter/JavaScriptChannel.java index 180ca4f1da75..f23aae5b2b69 100644 --- a/packages/webview_flutter/android/src/main/java/io/flutter/plugins/webviewflutter/JavaScriptChannel.java +++ b/packages/webview_flutter/android/src/main/java/io/flutter/plugins/webviewflutter/JavaScriptChannel.java @@ -49,7 +49,7 @@ public void run() { methodChannel.invokeMethod("javascriptChannelMessage", arguments); } }; - if (platformThreadHandler.getLooper() == Looper.getMainLooper()) { + if (platformThreadHandler.getLooper() == Looper.myLooper()) { postMessageRunnable.run(); } else { platformThreadHandler.post(postMessageRunnable); diff --git a/packages/webview_flutter/example/test_driver/webview.dart b/packages/webview_flutter/example/test_driver/webview.dart index 09b4f397058d..6ff708057516 100644 --- a/packages/webview_flutter/example/test_driver/webview.dart +++ b/packages/webview_flutter/example/test_driver/webview.dart @@ -91,6 +91,40 @@ void main() { .evaluateJavascript('document.documentElement.innerText'); expect(content.contains('flutter_test_header'), isTrue); }); + + test('JavaScriptChannel', () async { + final Completer controllerCompleter = + Completer(); + final List messagesReceived = []; + await pumpWidget( + Directionality( + textDirection: TextDirection.ltr, + child: WebView( + key: GlobalKey(), + initialUrl: 'https://flutter.dev/', + onWebViewCreated: (WebViewController controller) { + controllerCompleter.complete(controller); + }, + javascriptMode: JavascriptMode.unrestricted, + // TODO(iskakaushik): Remove this when collection literals makes it to stable. + // ignore: prefer_collection_literals + javascriptChannels: [ + JavascriptChannel( + name: 'Echo', + onMessageReceived: (JavascriptMessage message) { + messagesReceived.add(message.message); + }, + ), + ].toSet(), + ), + ), + ); + final WebViewController controller = await controllerCompleter.future; + + expect(messagesReceived, isEmpty); + await controller.evaluateJavascript('Echo.postMessage("hello");'); + expect(messagesReceived, equals(['hello'])); + }); } Future pumpWidget(Widget widget) { diff --git a/packages/webview_flutter/pubspec.yaml b/packages/webview_flutter/pubspec.yaml index 7ea66ca725bd..789657ad69ce 100644 --- a/packages/webview_flutter/pubspec.yaml +++ b/packages/webview_flutter/pubspec.yaml @@ -1,6 +1,6 @@ name: webview_flutter description: A Flutter plugin that provides a WebView widget on Android and iOS. -version: 0.3.7 +version: 0.3.7+1 author: Flutter Team homepage: https://github.com/flutter/plugins/tree/master/packages/webview_flutter From 6d9d9dd94e2cecb3cd04dd8203b87dce50b0c009 Mon Sep 17 00:00:00 2001 From: Amir Hardon Date: Tue, 14 May 2019 12:32:04 -0700 Subject: [PATCH 2/2] make the test deterministic --- .../webview_flutter/example/test_driver/webview.dart | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/packages/webview_flutter/example/test_driver/webview.dart b/packages/webview_flutter/example/test_driver/webview.dart index 6ff708057516..7a290a05bd5b 100644 --- a/packages/webview_flutter/example/test_driver/webview.dart +++ b/packages/webview_flutter/example/test_driver/webview.dart @@ -95,13 +95,16 @@ void main() { test('JavaScriptChannel', () async { final Completer controllerCompleter = Completer(); + final Completer pageLoaded = Completer(); final List messagesReceived = []; await pumpWidget( Directionality( textDirection: TextDirection.ltr, child: WebView( key: GlobalKey(), - initialUrl: 'https://flutter.dev/', + // This is the data URL for: '' + initialUrl: + 'data:text/html;charset=utf-8;base64,PCFET0NUWVBFIGh0bWw+', onWebViewCreated: (WebViewController controller) { controllerCompleter.complete(controller); }, @@ -116,10 +119,14 @@ void main() { }, ), ].toSet(), + onPageFinished: (String url) { + pageLoaded.complete(null); + }, ), ), ); final WebViewController controller = await controllerCompleter.future; + await pageLoaded.future; expect(messagesReceived, isEmpty); await controller.evaluateJavascript('Echo.postMessage("hello");');