Catch uncaught exceptions in from plugins and turn them into error responses.
When a plugin throws an unchecked exception, we're not catching it anywhere and so the error callback is not being called. This change adds a try/catch to catch such exceptions. Project: http://git-wip-us.apache.org/repos/asf/cordova-android/repo Commit: http://git-wip-us.apache.org/repos/asf/cordova-android/commit/79e313a0 Tree: http://git-wip-us.apache.org/repos/asf/cordova-android/tree/79e313a0 Diff: http://git-wip-us.apache.org/repos/asf/cordova-android/diff/79e313a0 Branch: refs/heads/pluggable_webview Commit: 79e313a0c07d6afbb0e8ecb46e10fd432291145c Parents: 9f4c75d Author: Andrew Grieve <[email protected]> Authored: Thu Mar 6 21:25:48 2014 -0500 Committer: Joe Bowser <[email protected]> Committed: Mon Mar 17 11:58:14 2014 -0700 ---------------------------------------------------------------------- framework/src/org/apache/cordova/PluginManager.java | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cordova-android/blob/79e313a0/framework/src/org/apache/cordova/PluginManager.java ---------------------------------------------------------------------- diff --git a/framework/src/org/apache/cordova/PluginManager.java b/framework/src/org/apache/cordova/PluginManager.java index e9795e8..f095722 100755 --- a/framework/src/org/apache/cordova/PluginManager.java +++ b/framework/src/org/apache/cordova/PluginManager.java @@ -236,22 +236,25 @@ public class PluginManager { app.sendPluginResult(cr, callbackId); return; } + CallbackContext callbackContext = new CallbackContext(callbackId, app); try { - CallbackContext callbackContext = new CallbackContext(callbackId, app); long pluginStartTime = System.currentTimeMillis(); boolean wasValidAction = plugin.execute(action, rawArgs, callbackContext); long duration = System.currentTimeMillis() - pluginStartTime; - + if (duration > SLOW_EXEC_WARNING_THRESHOLD) { Log.w(TAG, "THREAD WARNING: exec() call to " + service + "." + action + " blocked the main thread for " + duration + "ms. Plugin should use CordovaInterface.getThreadPool()."); } if (!wasValidAction) { PluginResult cr = new PluginResult(PluginResult.Status.INVALID_ACTION); - app.sendPluginResult(cr, callbackId); + callbackContext.sendPluginResult(cr); } } catch (JSONException e) { PluginResult cr = new PluginResult(PluginResult.Status.JSON_EXCEPTION); - app.sendPluginResult(cr, callbackId); + callbackContext.sendPluginResult(cr); + } catch (Exception e) { + Log.e(TAG, "Uncaught exception from plugin", e); + callbackContext.error(e.getMessage()); } }
