From 2f7e833a794f557cc2041b7b697a5b7cfb0f959e Mon Sep 17 00:00:00 2001 From: Joe Bowser Date: Mon, 10 Mar 2014 14:39:43 -0700 Subject: [PATCH] Got the bridge to work with Crosswalk --- .../apache/cordova/AndroidExposedJsApi.java | 76 ++++++++++++++++++ .../org/apache/cordova/AndroidWebView.java | 2 +- .../apache/cordova/CordovaResourceApi.java | 2 +- .../src/org/apache/cordova/ExposedJsApi.java | 77 +++---------------- .../cordova/NativeToJsMessageQueue.java | 2 +- .../engine/crosswalk/XWalkCordovaWebView.java | 4 +- 6 files changed, 90 insertions(+), 73 deletions(-) create mode 100755 framework/src/org/apache/cordova/AndroidExposedJsApi.java mode change 100755 => 100644 framework/src/org/apache/cordova/ExposedJsApi.java diff --git a/framework/src/org/apache/cordova/AndroidExposedJsApi.java b/framework/src/org/apache/cordova/AndroidExposedJsApi.java new file mode 100755 index 00000000..74945ccd --- /dev/null +++ b/framework/src/org/apache/cordova/AndroidExposedJsApi.java @@ -0,0 +1,76 @@ +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +*/ +package org.apache.cordova; + +import android.webkit.JavascriptInterface; +import org.apache.cordova.PluginManager; +import org.json.JSONException; + +/** + * Contains APIs that the JS can call. All functions in here should also have + * an equivalent entry in CordovaChromeClient.java, and be added to + * cordova-js/lib/android/plugin/android/promptbasednativeapi.js + */ +public /* package */ class AndroidExposedJsApi implements ExposedJsApi { + + private PluginManager pluginManager; + private NativeToJsMessageQueue jsMessageQueue; + + public AndroidExposedJsApi(PluginManager pluginManager, NativeToJsMessageQueue jsMessageQueue) { + this.pluginManager = pluginManager; + this.jsMessageQueue = jsMessageQueue; + } + + @JavascriptInterface + public String exec(String service, String action, String callbackId, String arguments) throws JSONException { + // If the arguments weren't received, send a message back to JS. It will switch bridge modes and try again. See CB-2666. + // We send a message meant specifically for this case. It starts with "@" so no other message can be encoded into the same string. + if (arguments == null) { + return "@Null arguments."; + } + + jsMessageQueue.setPaused(true); + try { + // Tell the resourceApi what thread the JS is running on. + CordovaResourceApi.jsThread = Thread.currentThread(); + + pluginManager.exec(service, action, callbackId, arguments); + String ret = ""; + if (!NativeToJsMessageQueue.DISABLE_EXEC_CHAINING) { + ret = jsMessageQueue.popAndEncode(false); + } + return ret; + } catch (Throwable e) { + e.printStackTrace(); + return ""; + } finally { + jsMessageQueue.setPaused(false); + } + } + + @JavascriptInterface + public void setNativeToJsBridgeMode(int value) { + jsMessageQueue.setBridgeMode(value); + } + + @JavascriptInterface + public String retrieveJsMessages(boolean fromOnlineEvent) { + return jsMessageQueue.popAndEncode(fromOnlineEvent); + } +} diff --git a/framework/src/org/apache/cordova/AndroidWebView.java b/framework/src/org/apache/cordova/AndroidWebView.java index ed4c02cb..00c4bb10 100755 --- a/framework/src/org/apache/cordova/AndroidWebView.java +++ b/framework/src/org/apache/cordova/AndroidWebView.java @@ -343,7 +343,7 @@ public class AndroidWebView extends WebView implements CordovaWebView { pluginManager = new PluginManager(this, this.cordova); jsMessageQueue = new NativeToJsMessageQueue(this, cordova); - exposedJsApi = new ExposedJsApi(pluginManager, jsMessageQueue); + exposedJsApi = new AndroidExposedJsApi(pluginManager, jsMessageQueue); resourceApi = new CordovaResourceApi(this.getContext(), pluginManager); exposeJsInterface(); } diff --git a/framework/src/org/apache/cordova/CordovaResourceApi.java b/framework/src/org/apache/cordova/CordovaResourceApi.java index f1770fda..ff2c5c51 100644 --- a/framework/src/org/apache/cordova/CordovaResourceApi.java +++ b/framework/src/org/apache/cordova/CordovaResourceApi.java @@ -84,7 +84,7 @@ public class CordovaResourceApi { // Creating this is light-weight. private static OkHttpClient httpClient = new OkHttpClient(); - static Thread jsThread; + public static Thread jsThread; private final AssetManager assetManager; private final ContentResolver contentResolver; diff --git a/framework/src/org/apache/cordova/ExposedJsApi.java b/framework/src/org/apache/cordova/ExposedJsApi.java old mode 100755 new mode 100644 index 103e546a..d0f8abf5 --- a/framework/src/org/apache/cordova/ExposedJsApi.java +++ b/framework/src/org/apache/cordova/ExposedJsApi.java @@ -1,76 +1,17 @@ -/* - Licensed to the Apache Software Foundation (ASF) under one - or more contributor license agreements. See the NOTICE file - distributed with this work for additional information - regarding copyright ownership. The ASF licenses this file - to you under the Apache License, Version 2.0 (the - "License"); you may not use this file except in compliance - with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, - software distributed under the License is distributed on an - "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - KIND, either express or implied. See the License for the - specific language governing permissions and limitations - under the License. -*/ package org.apache.cordova; -import android.webkit.JavascriptInterface; -import org.apache.cordova.PluginManager; import org.json.JSONException; -/** - * Contains APIs that the JS can call. All functions in here should also have - * an equivalent entry in CordovaChromeClient.java, and be added to - * cordova-js/lib/android/plugin/android/promptbasednativeapi.js +import android.webkit.JavascriptInterface; + +/* + * Any exposed Javascript API MUST implement these three things! */ -public /* package */ class ExposedJsApi { - - private PluginManager pluginManager; - private NativeToJsMessageQueue jsMessageQueue; - - public ExposedJsApi(PluginManager pluginManager, NativeToJsMessageQueue jsMessageQueue) { - this.pluginManager = pluginManager; - this.jsMessageQueue = jsMessageQueue; - } + +public interface ExposedJsApi { @JavascriptInterface - public String exec(String service, String action, String callbackId, String arguments) throws JSONException { - // If the arguments weren't received, send a message back to JS. It will switch bridge modes and try again. See CB-2666. - // We send a message meant specifically for this case. It starts with "@" so no other message can be encoded into the same string. - if (arguments == null) { - return "@Null arguments."; - } - - jsMessageQueue.setPaused(true); - try { - // Tell the resourceApi what thread the JS is running on. - CordovaResourceApi.jsThread = Thread.currentThread(); - - pluginManager.exec(service, action, callbackId, arguments); - String ret = ""; - if (!NativeToJsMessageQueue.DISABLE_EXEC_CHAINING) { - ret = jsMessageQueue.popAndEncode(false); - } - return ret; - } catch (Throwable e) { - e.printStackTrace(); - return ""; - } finally { - jsMessageQueue.setPaused(false); - } - } - - @JavascriptInterface - public void setNativeToJsBridgeMode(int value) { - jsMessageQueue.setBridgeMode(value); - } - - @JavascriptInterface - public String retrieveJsMessages(boolean fromOnlineEvent) { - return jsMessageQueue.popAndEncode(fromOnlineEvent); - } + public String exec(String service, String action, String callbackId, String arguments) throws JSONException; + public void setNativeToJsBridgeMode(int value); + public String retrieveJsMessages(boolean fromOnlineEvent); } diff --git a/framework/src/org/apache/cordova/NativeToJsMessageQueue.java b/framework/src/org/apache/cordova/NativeToJsMessageQueue.java index c8a3b069..7fb6c065 100755 --- a/framework/src/org/apache/cordova/NativeToJsMessageQueue.java +++ b/framework/src/org/apache/cordova/NativeToJsMessageQueue.java @@ -48,7 +48,7 @@ public class NativeToJsMessageQueue { // Disable sending back native->JS messages during an exec() when the active // exec() is asynchronous. Set this to true when running bridge benchmarks. - static final boolean DISABLE_EXEC_CHAINING = false; + public static final boolean DISABLE_EXEC_CHAINING = false; // Arbitrarily chosen upper limit for how much data to send to JS in one shot. // This currently only chops up on message boundaries. It may be useful diff --git a/framework/src/org/apache/cordova/engine/crosswalk/XWalkCordovaWebView.java b/framework/src/org/apache/cordova/engine/crosswalk/XWalkCordovaWebView.java index 73195fe1..682e28b1 100755 --- a/framework/src/org/apache/cordova/engine/crosswalk/XWalkCordovaWebView.java +++ b/framework/src/org/apache/cordova/engine/crosswalk/XWalkCordovaWebView.java @@ -117,7 +117,7 @@ public class XWalkCordovaWebView extends XWalkView implements CordovaWebView { private long lastMenuEventTime = 0; NativeToJsMessageQueue jsMessageQueue; - ExposedJsApi exposedJsApi; + XwalkExposedJsApi exposedJsApi; /** custom view created by the browser (a video player for example) */ private View mCustomView; @@ -319,7 +319,7 @@ public class XWalkCordovaWebView extends XWalkView implements CordovaWebView { extensionManager = new XWalkExtensionManager(this.cordova.getActivity(), this.cordova.getActivity()); extensionManager.loadExtensions(); jsMessageQueue = new NativeToJsMessageQueue(this, cordova); - exposedJsApi = new ExposedJsApi(pluginManager, jsMessageQueue); + exposedJsApi = new XwalkExposedJsApi(pluginManager, jsMessageQueue); resourceApi = new CordovaResourceApi(this.getContext(), pluginManager); exposeJsInterface(); }