From af5c21b1efc26aee519d7e839b2323d00030bf68 Mon Sep 17 00:00:00 2001 From: huangqi03 Date: Sun, 29 Jan 2017 08:44:52 -0800 Subject: [PATCH] fix: webview.postMessage throws not a constructor in WebView in Android 4.1 ~ 4.3 Summary: `new MessageEvent` not support for Android 4.1 ~ 4.3 WebView. change ``` javascript document.dispatchEvent(new MessageEvent('message', data))) ``` to ``` javascript (function () { var event; var data = {}; try { event = new MessageEvent('message', data); } catch (e) { event = document.createEvent('MessageEvent'); event.initMessageEvent('message', true, true, data.data, data.origin, data.lastEventId, data.source); } document.dispatchEvent(event); })() ``` Closes https://github.com/facebook/react-native/pull/11560 Differential Revision: D4461360 fbshipit-source-id: 110220817d9570e86b31dcf8fe85f6616d54d36e --- .../react/views/webview/ReactWebViewManager.java | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/ReactAndroid/src/main/java/com/facebook/react/views/webview/ReactWebViewManager.java b/ReactAndroid/src/main/java/com/facebook/react/views/webview/ReactWebViewManager.java index 81d8e8710191d8..c9b08b45ba7434 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/views/webview/ReactWebViewManager.java +++ b/ReactAndroid/src/main/java/com/facebook/react/views/webview/ReactWebViewManager.java @@ -503,7 +503,17 @@ public void receiveCommand(WebView root, int commandId, @Nullable ReadableArray try { JSONObject eventInitDict = new JSONObject(); eventInitDict.put("data", args.getString(0)); - root.loadUrl("javascript:(document.dispatchEvent(new MessageEvent('message', " + eventInitDict.toString() + ")))"); + root.loadUrl("javascript:(function () {" + + "var event;" + + "var data = " + eventInitDict.toString() + ";" + + "try {" + + "event = new MessageEvent('message', data);" + + "} catch (e) {" + + "event = document.createEvent('MessageEvent');" + + "event.initMessageEvent('message', true, true, data.data, data.origin, data.lastEventId, data.source);" + + "}" + + "document.dispatchEvent(event);" + + "})();"); } catch (JSONException e) { throw new RuntimeException(e); }