Add tests for uncaught exceptions from methods called through the Java Bridge

This is a cherry-pick from master. See
https://android-git.corp.google.com/g/184260

If a method called on a Java object through the Java Bridge throws an uncaught
exception, we throw a JavaScript exception.

See WebKit change https://android-git.corp.google.com/g/184252

Bug: 6386557
Change-Id: Ie2a97a26372fb11782b35db09bc2046fb7eb1f86
This commit is contained in:
Steve Block
2012-04-24 13:01:57 +01:00
parent 8a1da40523
commit e9e260fbc0

View File

@@ -186,6 +186,13 @@ public class JavaBridgeBasicsTest extends JavaBridgeTestBase {
assertRaisesException("testController.foo()");
}
public void testUncaughtJavaExceptionRaisesJavaException() throws Throwable {
injectObjectAndReload(new Object() {
public void method() { throw new RuntimeException("foo"); }
}, "testObject");
assertRaisesException("testObject.method()");
}
// Note that this requires that we can pass a JavaScript string to Java.
public void testTypeOfStaticMethod() throws Throwable {
injectObjectAndReload(new ObjectWithStaticMethod(), "testObject");
@@ -394,7 +401,6 @@ public class JavaBridgeBasicsTest extends JavaBridgeTestBase {
assertEquals("", mTestController.waitForStringValue());
}
// java.lang.reflect only allows access to public methods and fields. See b/6386557.
public void testReflectPublicMethod() throws Throwable {
injectObjectAndReload(new Object() {
public String method() { return "foo"; }
@@ -404,7 +410,6 @@ public class JavaBridgeBasicsTest extends JavaBridgeTestBase {
".toString()"));
}
// java.lang.reflect only allows access to public methods and fields. See b/6386557.
public void testReflectPublicField() throws Throwable {
injectObjectAndReload(new Object() {
public String field = "foo";
@@ -412,4 +417,26 @@ public class JavaBridgeBasicsTest extends JavaBridgeTestBase {
assertEquals("foo", executeJavaScriptAndGetStringResult(
"testObject.getClass().getField('field').get(testObject).toString()"));
}
public void testReflectPrivateMethodRaisesException() throws Throwable {
injectObjectAndReload(new Object() {
private void method() {};
}, "testObject");
assertRaisesException("testObject.getClass().getMethod('method', null)");
// getDeclaredMethod() is able to access a private method, but invoke()
// throws a Java exception.
assertRaisesException(
"testObject.getClass().getDeclaredMethod('method', null).invoke(testObject, null)");
}
public void testReflectPrivateFieldRaisesException() throws Throwable {
injectObjectAndReload(new Object() {
private int field;
}, "testObject");
assertRaisesException("testObject.getClass().getField('field')");
// getDeclaredField() is able to access a private field, but getInt()
// throws a Java exception.
assertRaisesException(
"testObject.getClass().getDeclaredField('field').getInt(testObject)");
}
}