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..7a290a05bd5b 100644 --- a/packages/webview_flutter/example/test_driver/webview.dart +++ b/packages/webview_flutter/example/test_driver/webview.dart @@ -91,6 +91,47 @@ void main() { .evaluateJavascript('document.documentElement.innerText'); expect(content.contains('flutter_test_header'), isTrue); }); + + test('JavaScriptChannel', () async { + final Completer controllerCompleter = + Completer(); + final Completer pageLoaded = Completer(); + final List messagesReceived = []; + await pumpWidget( + Directionality( + textDirection: TextDirection.ltr, + child: WebView( + key: GlobalKey(), + // This is the data URL for: '' + initialUrl: + 'data:text/html;charset=utf-8;base64,PCFET0NUWVBFIGh0bWw+', + 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(), + onPageFinished: (String url) { + pageLoaded.complete(null); + }, + ), + ), + ); + final WebViewController controller = await controllerCompleter.future; + await pageLoaded.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