From 2de350d64200c80f7bd0cfe23575ed5e5e03fc5e Mon Sep 17 00:00:00 2001 From: Joe Bowser Date: Wed, 9 Mar 2016 10:35:09 -0800 Subject: [PATCH 1/2] Creating an evaluateJavascript branch --- bin/templates/project/assets/www/cordova.js | 15 +++++------ cordova-js-src/exec.js | 3 ++- .../apache/cordova/CordovaWebViewEngine.java | 4 +++ .../cordova/NativeToJsMessageQueue.java | 25 +++++++++++++++++++ .../cordova/engine/SystemWebViewEngine.java | 6 +++++ 5 files changed, 45 insertions(+), 8 deletions(-) diff --git a/bin/templates/project/assets/www/cordova.js b/bin/templates/project/assets/www/cordova.js index bf1231f42a..c011012f7a 100644 --- a/bin/templates/project/assets/www/cordova.js +++ b/bin/templates/project/assets/www/cordova.js @@ -330,7 +330,7 @@ module.exports = cordova; }); -// file: /Users/steveng/repo/cordova/cordova-android/cordova-js-src/android/nativeapiprovider.js +// file: /Users/jbowser/cordova/cordova-android/cordova-js-src/android/nativeapiprovider.js define("cordova/android/nativeapiprovider", function(require, exports, module) { /** @@ -353,7 +353,7 @@ module.exports = { }); -// file: /Users/steveng/repo/cordova/cordova-android/cordova-js-src/android/promptbasednativeapi.js +// file: /Users/jbowser/cordova/cordova-android/cordova-js-src/android/promptbasednativeapi.js define("cordova/android/promptbasednativeapi", function(require, exports, module) { /** @@ -862,7 +862,7 @@ module.exports = channel; }); -// file: /Users/steveng/repo/cordova/cordova-android/cordova-js-src/exec.js +// file: /Users/jbowser/cordova/cordova-android/cordova-js-src/exec.js define("cordova/exec", function(require, exports, module) { /** @@ -897,7 +897,8 @@ var cordova = require('cordova'), // For the ONLINE_EVENT to be viable, it would need to intercept all event // listeners (both through addEventListener and window.ononline) as well // as set the navigator property itself. - ONLINE_EVENT: 2 + ONLINE_EVENT: 2, + EVAL_BRIDGE: 3 }, jsToNativeBridgeMode, // Set lazily. nativeToJsBridgeMode = nativeToJsModes.ONLINE_EVENT, @@ -1611,7 +1612,7 @@ exports.reset(); }); -// file: /Users/steveng/repo/cordova/cordova-android/cordova-js-src/platform.js +// file: /Users/jbowser/cordova/cordova-android/cordova-js-src/platform.js define("cordova/platform", function(require, exports, module) { // The last resume event that was received that had the result of a plugin call. @@ -1721,7 +1722,7 @@ function onMessageFromNative(msg) { }); -// file: /Users/steveng/repo/cordova/cordova-android/cordova-js-src/plugin/android/app.js +// file: /Users/jbowser/cordova/cordova-android/cordova-js-src/plugin/android/app.js define("cordova/plugin/android/app", function(require, exports, module) { var exec = require('cordova/exec'); @@ -2164,4 +2165,4 @@ window.cordova = require('cordova'); require('cordova/init'); -})(); \ No newline at end of file +})(); diff --git a/cordova-js-src/exec.js b/cordova-js-src/exec.js index fa8b41be79..197fb5dfad 100644 --- a/cordova-js-src/exec.js +++ b/cordova-js-src/exec.js @@ -51,7 +51,8 @@ var cordova = require('cordova'), // For the ONLINE_EVENT to be viable, it would need to intercept all event // listeners (both through addEventListener and window.ononline) as well // as set the navigator property itself. - ONLINE_EVENT: 2 + ONLINE_EVENT: 2, + EVAL_BRIDGE: 3 }, jsToNativeBridgeMode, // Set lazily. nativeToJsBridgeMode = nativeToJsModes.ONLINE_EVENT, diff --git a/framework/src/org/apache/cordova/CordovaWebViewEngine.java b/framework/src/org/apache/cordova/CordovaWebViewEngine.java index f34c749c46..c8e5a55d23 100644 --- a/framework/src/org/apache/cordova/CordovaWebViewEngine.java +++ b/framework/src/org/apache/cordova/CordovaWebViewEngine.java @@ -20,6 +20,7 @@ Licensed to the Apache Software Foundation (ASF) under one import android.view.KeyEvent; import android.view.View; +import android.webkit.ValueCallback; /** * Interface for all Cordova engines. @@ -58,6 +59,9 @@ void init(CordovaWebView parentWebView, CordovaInterface cordova, Client client, /** Clean up all resources associated with the WebView. */ void destroy(); + /** Add the evaulate Javascript method **/ + void evaluateJavascript(String js, ValueCallback callback); + /** * Used to retrieve the associated CordovaWebView given a View without knowing the type of Engine. * E.g. ((CordovaWebView.EngineView)activity.findViewById(android.R.id.webView)).getCordovaWebView(); diff --git a/framework/src/org/apache/cordova/NativeToJsMessageQueue.java b/framework/src/org/apache/cordova/NativeToJsMessageQueue.java index a05e8b816a..ec8cc744e6 100755 --- a/framework/src/org/apache/cordova/NativeToJsMessageQueue.java +++ b/framework/src/org/apache/cordova/NativeToJsMessageQueue.java @@ -351,6 +351,31 @@ public void notifyOfFlush(final NativeToJsMessageQueue queue, boolean fromOnline } } + /** Uses webView.evaluateJavascript to execute messages. */ + public static class EvalBridgeMode extends BridgeMode { + private final CordovaWebViewEngine engine; + private final CordovaInterface cordova; + + public EvalBridgeMode(CordovaWebViewEngine engine, CordovaInterface cordova) { + this.engine = engine; + this.cordova = cordova; + } + + @Override + public void onNativeToJsMessageAvailable(final NativeToJsMessageQueue queue) { + cordova.getActivity().runOnUiThread(new Runnable() { + public void run() { + String js = queue.popAndEncodeAsJs(); + if (js != null) { + engine.evaluateJavascript(js, null); + } + } + }); + } + } + + + private static class JsMessage { final String jsPayloadOrCallbackId; final PluginResult pluginResult; diff --git a/framework/src/org/apache/cordova/engine/SystemWebViewEngine.java b/framework/src/org/apache/cordova/engine/SystemWebViewEngine.java index 5e6e4b68e4..d9b1b841be 100755 --- a/framework/src/org/apache/cordova/engine/SystemWebViewEngine.java +++ b/framework/src/org/apache/cordova/engine/SystemWebViewEngine.java @@ -29,6 +29,7 @@ Licensed to the Apache Software Foundation (ASF) under one import android.os.Build; import android.util.Log; import android.view.View; +import android.webkit.ValueCallback; import android.webkit.WebSettings; import android.webkit.WebSettings.LayoutAlgorithm; import android.webkit.WebView; @@ -331,4 +332,9 @@ public void destroy() { } } } + + @Override + public void evaluateJavascript(String js, ValueCallback callback) { + webView.evaluateJavascript(js, callback); + } } From 4a301cd0ec53a528540fdea43f0a33832bd502ba Mon Sep 17 00:00:00 2001 From: Simon MacDonald Date: Sun, 13 Mar 2016 22:39:47 -0400 Subject: [PATCH 2/2] Make evaluateJavaScript brige default --- bin/templates/project/assets/www/cordova.js | 2 +- cordova-js-src/exec.js | 2 +- .../src/org/apache/cordova/engine/SystemWebViewEngine.java | 3 ++- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/bin/templates/project/assets/www/cordova.js b/bin/templates/project/assets/www/cordova.js index c011012f7a..18779b89fa 100644 --- a/bin/templates/project/assets/www/cordova.js +++ b/bin/templates/project/assets/www/cordova.js @@ -901,7 +901,7 @@ var cordova = require('cordova'), EVAL_BRIDGE: 3 }, jsToNativeBridgeMode, // Set lazily. - nativeToJsBridgeMode = nativeToJsModes.ONLINE_EVENT, + nativeToJsBridgeMode = nativeToJsModes.EVAL_BRIDGE, pollEnabled = false, bridgeSecret = -1; diff --git a/cordova-js-src/exec.js b/cordova-js-src/exec.js index 197fb5dfad..eab81c02c7 100644 --- a/cordova-js-src/exec.js +++ b/cordova-js-src/exec.js @@ -55,7 +55,7 @@ var cordova = require('cordova'), EVAL_BRIDGE: 3 }, jsToNativeBridgeMode, // Set lazily. - nativeToJsBridgeMode = nativeToJsModes.ONLINE_EVENT, + nativeToJsBridgeMode = nativeToJsModes.EVAL_BRIDGE, pollEnabled = false, bridgeSecret = -1; diff --git a/framework/src/org/apache/cordova/engine/SystemWebViewEngine.java b/framework/src/org/apache/cordova/engine/SystemWebViewEngine.java index d9b1b841be..58456bf82d 100755 --- a/framework/src/org/apache/cordova/engine/SystemWebViewEngine.java +++ b/framework/src/org/apache/cordova/engine/SystemWebViewEngine.java @@ -117,7 +117,8 @@ public void runOnUiThread(Runnable r) { SystemWebViewEngine.this.cordova.getActivity().runOnUiThread(r); } })); - bridge = new CordovaBridge(pluginManager, nativeToJsMessageQueue); + nativeToJsMessageQueue.addBridgeMode(new NativeToJsMessageQueue.EvalBridgeMode(this, cordova)); + bridge = new CordovaBridge(pluginManager, nativeToJsMessageQueue); exposeJsInterface(webView, bridge); }