Skip to content

Commit

Permalink
[TIMOB-25963] Handle java call exceptions
Browse files Browse the repository at this point in the history
  • Loading branch information
Gary Mathews committed Apr 18, 2018
1 parent e9e599c commit ba02d5e
Show file tree
Hide file tree
Showing 3 changed files with 62 additions and 16 deletions.
35 changes: 34 additions & 1 deletion android/runtime/v8/src/native/Proxy.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -166,6 +166,12 @@ static void onPropertyChangedForProxy(Isolate* isolate, Local<String> property,
env->DeleteLocalRef(javaValue);
}

if (env->ExceptionCheck()) {
JSException::fromJavaException(isolate);
env->ExceptionClear();
return;
}

// Store new property value on JS internal map.
setPropertyOnProxy(isolate, property, value, proxyObject);
}
Expand Down Expand Up @@ -206,6 +212,12 @@ void Proxy::getIndexedProperty(uint32_t index, const PropertyCallbackInfo<Value>

proxy->unreferenceJavaObject(javaProxy);

if (env->ExceptionCheck()) {
JSException::fromJavaException(isolate);
env->ExceptionClear();
return;
}

Local<Value> result = TypeConverter::javaObjectToJsValue(isolate, env, value);
env->DeleteLocalRef(value);

Expand Down Expand Up @@ -237,6 +249,12 @@ void Proxy::setIndexedProperty(uint32_t index, Local<Value> value, const Propert
env->DeleteLocalRef(javaValue);
}

if (env->ExceptionCheck()) {
JSException::fromJavaException(isolate);
env->ExceptionClear();
return;
}

info.GetReturnValue().Set(value);
}

Expand Down Expand Up @@ -272,6 +290,12 @@ void Proxy::hasListenersForEventType(const v8::FunctionCallbackInfo<v8::Value>&

env->DeleteLocalRef(krollObject);
env->DeleteLocalRef(javaEventType);

if (env->ExceptionCheck()) {
JSException::fromJavaException(isolate);
env->ExceptionClear();
return;
}
}

void Proxy::onEventFired(const v8::FunctionCallbackInfo<v8::Value>& args)
Expand Down Expand Up @@ -312,6 +336,12 @@ void Proxy::onEventFired(const v8::FunctionCallbackInfo<v8::Value>& args)
if (isNew) {
env->DeleteLocalRef(javaEventData);
}

if (env->ExceptionCheck()) {
JSException::fromJavaException(isolate);
env->ExceptionClear();
return;
}
}

Local<FunctionTemplate> Proxy::inheritProxyTemplate(Isolate* isolate,
Expand Down Expand Up @@ -498,7 +528,10 @@ void Proxy::proxyOnPropertiesChanged(const v8::FunctionCallbackInfo<v8::Value>&

proxy->unreferenceJavaObject(javaProxy);

return;
if (env->ExceptionCheck()) {
JSException::fromJavaException(isolate);
env->ExceptionClear();
}
}

void Proxy::dispose(Isolate* isolate)
Expand Down
7 changes: 7 additions & 0 deletions android/runtime/v8/src/native/ProxyFactory.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@

#include "AndroidUtil.h"
#include "JavaObject.h"
#include "JSException.h"
#include "JNIUtil.h"
#include "KrollBindings.h"
#include "Proxy.h"
Expand Down Expand Up @@ -166,6 +167,12 @@ jobject ProxyFactory::createJavaProxy(jclass javaClass, Local<Object> v8Proxy, c
env->DeleteLocalRef(javaArgs);
// We don't delete the global jclass reference...

if (env->ExceptionCheck()) {
JSException::fromJavaException(isolate);
env->ExceptionClear();
return NULL;
}

return javaProxy;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@
import java.util.Arrays;
import java.util.LinkedList;

import org.appcelerator.kroll.KrollApplication;
import org.appcelerator.kroll.KrollDict;
import org.appcelerator.kroll.KrollExceptionHandler;
import org.appcelerator.kroll.KrollRuntime;
Expand Down Expand Up @@ -54,18 +53,33 @@ private static final String fill(int count)
return new String(string);
}

private static String getError(KrollDict error)
public static final KrollDict getErrorDict(ExceptionMessage error)
{
final KrollDict dict = new KrollDict();
dict.put("title", error.title);
dict.put("message", error.message);
dict.put("sourceName", error.sourceName);
dict.put("line", error.line);
dict.put("lineSource", error.lineSource);
dict.put("lineOffset", error.lineOffset);
dict.put("stack", KrollRuntime.getInstance().getStackTrace());
return dict;
}

public static String getError(KrollDict error)
{
String message = new String();
message += error.getString("sourceName") + ":" + error.getString("line") + "\n";
if (!error.getString("sourceName").isEmpty()) {
message += error.getString("sourceName") + ":" + error.getString("line") + "\n";
}
if (error.containsKeyAndNotNull("lineSource")) {
message += error.getString("lineSource") + "\n";
message += fill(Integer.parseInt(error.getString("lineOffset")) - 1) + "^\n";
}
message += error.getString("message") + "\n";
if (error.containsKeyAndNotNull("stack")) {
message += error.getString("stack");
message += error.getString("stack") + "\n";
}
message += error.getString("message") + "\n";
return message;
}

Expand Down Expand Up @@ -95,16 +109,8 @@ protected static void handleOpenErrorDialog(final ExceptionMessage error)
return;
}

final KrollDict dict = new KrollDict();
dict.put("title", error.title);
dict.put("message", error.message);
dict.put("sourceName", error.sourceName);
dict.put("line", error.line);
dict.put("lineSource", error.lineSource);
dict.put("lineOffset", error.lineOffset);
dict.put("stack", KrollRuntime.getInstance().getStackTrace());
final KrollDict dict = getErrorDict(error);
tiApp.fireAppEvent("uncaughtException", dict);

Log.e(TAG, getError(dict));

if (tiApp.getDeployType().equals(TiApplication.DEPLOY_TYPE_PRODUCTION)) {
Expand All @@ -127,7 +133,7 @@ public void onCurrentActivityReady(Activity activity)

protected static void createDialog(final KrollDict error)
{
final KrollApplication tiApp = KrollRuntime.getInstance().getKrollApplication();
final TiApplication tiApp = TiApplication.getInstance();
if (tiApp == null) {
return;
}
Expand Down

0 comments on commit ba02d5e

Please sign in to comment.