[webview_flutter] Fix wrong main thread checking condition. (#1602)
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.
diff --git a/packages/webview_flutter/CHANGELOG.md b/packages/webview_flutter/CHANGELOG.md
index 973073a..19a0fcd 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 180ca4f..f23aae5 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 @@
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 09b4f39..7a290a0 100644
--- a/packages/webview_flutter/example/test_driver/webview.dart
+++ b/packages/webview_flutter/example/test_driver/webview.dart
@@ -91,6 +91,47 @@
.evaluateJavascript('document.documentElement.innerText');
expect(content.contains('flutter_test_header'), isTrue);
});
+
+ test('JavaScriptChannel', () async {
+ final Completer<WebViewController> controllerCompleter =
+ Completer<WebViewController>();
+ final Completer<void> pageLoaded = Completer<void>();
+ final List<String> messagesReceived = <String>[];
+ await pumpWidget(
+ Directionality(
+ textDirection: TextDirection.ltr,
+ child: WebView(
+ key: GlobalKey(),
+ // This is the data URL for: '<!DOCTYPE html>'
+ 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>[
+ 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(<String>['hello']));
+ });
}
Future<void> pumpWidget(Widget widget) {
diff --git a/packages/webview_flutter/pubspec.yaml b/packages/webview_flutter/pubspec.yaml
index 7ea66ca..789657a 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 <flutter-dev@googlegroups.com>
homepage: https://github.com/flutter/plugins/tree/master/packages/webview_flutter