Index: content/browser/renderer_host/java/gin_java_method_invocation_helper.cc |
diff --git a/content/browser/renderer_host/java/gin_java_method_invocation_helper.cc b/content/browser/renderer_host/java/gin_java_method_invocation_helper.cc |
index 5c8abb6a9b3be79803fca6fe23aa295e51935099..d3fb138654424771076277aa52edf517c2dbf8f1 100644 |
--- a/content/browser/renderer_host/java/gin_java_method_invocation_helper.cc |
+++ b/content/browser/renderer_host/java/gin_java_method_invocation_helper.cc |
@@ -118,11 +118,6 @@ bool GinJavaMethodInvocationHelper::AppendObjectRef( |
void GinJavaMethodInvocationHelper::Invoke() { |
JNIEnv* env = AttachCurrentThread(); |
- ScopedJavaLocalRef<jobject> obj(object_->GetLocalRef(env)); |
- if (obj.is_null()) { |
- SetInvocationFailure(kObjectIsGone); |
- return; |
- } |
const JavaMethod* method = |
object_->FindMethod(method_name_, arguments_->GetSize()); |
if (!method) { |
@@ -137,6 +132,18 @@ void GinJavaMethodInvocationHelper::Invoke() { |
return; |
} |
+ ScopedJavaLocalRef<jobject> obj; |
+ ScopedJavaLocalRef<jclass> cls; |
+ if (method->is_static()) { |
+ cls = object_->GetLocalClassRef(env); |
+ } else { |
+ obj = object_->GetLocalRef(env); |
+ } |
+ if (obj.is_null() && cls.is_null()) { |
+ SetInvocationFailure(kObjectIsGone); |
+ return; |
+ } |
+ |
std::vector<jvalue> parameters(method->num_parameters()); |
for (size_t i = 0; i < method->num_parameters(); ++i) { |
const base::Value* argument; |
@@ -144,7 +151,13 @@ void GinJavaMethodInvocationHelper::Invoke() { |
parameters[i] = CoerceJavaScriptValueToJavaValue( |
env, argument, method->parameter_type(i), true, object_refs_); |
} |
- InvokeMethod(obj.obj(), method->return_type(), method->id(), ¶meters[0]); |
+ if (method->is_static()) { |
+ InvokeMethod( |
+ NULL, cls.obj(), method->return_type(), method->id(), ¶meters[0]); |
+ } else { |
+ InvokeMethod( |
+ obj.obj(), NULL, method->return_type(), method->id(), ¶meters[0]); |
+ } |
// Now that we're done with the jvalue, release any local references created |
// by CoerceJavaScriptValueToJavaValue(). |
@@ -197,38 +210,48 @@ const std::string& GinJavaMethodInvocationHelper::GetErrorMessage() { |
} |
void GinJavaMethodInvocationHelper::InvokeMethod(jobject object, |
+ jclass clazz, |
const JavaType& return_type, |
jmethodID id, |
jvalue* parameters) { |
+ DCHECK(object || clazz); |
JNIEnv* env = AttachCurrentThread(); |
base::ListValue result_wrapper; |
switch (return_type.type) { |
case JavaType::TypeBoolean: |
result_wrapper.AppendBoolean( |
- env->CallBooleanMethodA(object, id, parameters)); |
+ object ? env->CallBooleanMethodA(object, id, parameters) |
+ : env->CallStaticBooleanMethodA(clazz, id, parameters)); |
break; |
case JavaType::TypeByte: |
result_wrapper.AppendInteger( |
- env->CallByteMethodA(object, id, parameters)); |
+ object ? env->CallByteMethodA(object, id, parameters) |
+ : env->CallStaticByteMethodA(clazz, id, parameters)); |
break; |
case JavaType::TypeChar: |
result_wrapper.AppendInteger( |
- env->CallCharMethodA(object, id, parameters)); |
+ object ? env->CallCharMethodA(object, id, parameters) |
+ : env->CallStaticCharMethodA(clazz, id, parameters)); |
break; |
case JavaType::TypeShort: |
result_wrapper.AppendInteger( |
- env->CallShortMethodA(object, id, parameters)); |
+ object ? env->CallShortMethodA(object, id, parameters) |
+ : env->CallStaticShortMethodA(clazz, id, parameters)); |
break; |
case JavaType::TypeInt: |
result_wrapper.AppendInteger( |
- env->CallIntMethodA(object, id, parameters)); |
+ object ? env->CallIntMethodA(object, id, parameters) |
+ : env->CallStaticIntMethodA(clazz, id, parameters)); |
break; |
case JavaType::TypeLong: |
result_wrapper.AppendDouble( |
- env->CallLongMethodA(object, id, parameters)); |
+ object ? env->CallLongMethodA(object, id, parameters) |
+ : env->CallStaticLongMethodA(clazz, id, parameters)); |
break; |
case JavaType::TypeFloat: { |
- float result = env->CallFloatMethodA(object, id, parameters); |
+ float result = object |
+ ? env->CallFloatMethodA(object, id, parameters) |
+ : env->CallStaticFloatMethodA(clazz, id, parameters); |
if (base::IsFinite(result)) { |
result_wrapper.AppendDouble(result); |
} else { |
@@ -238,7 +261,9 @@ void GinJavaMethodInvocationHelper::InvokeMethod(jobject object, |
break; |
} |
case JavaType::TypeDouble: { |
- double result = env->CallDoubleMethodA(object, id, parameters); |
+ double result = object |
+ ? env->CallDoubleMethodA(object, id, parameters) |
+ : env->CallStaticDoubleMethodA(clazz, id, parameters); |
if (base::IsFinite(result)) { |
result_wrapper.AppendDouble(result); |
} else { |
@@ -248,7 +273,10 @@ void GinJavaMethodInvocationHelper::InvokeMethod(jobject object, |
break; |
} |
case JavaType::TypeVoid: |
- env->CallVoidMethodA(object, id, parameters); |
+ if (object) |
+ env->CallVoidMethodA(object, id, parameters); |
+ else |
+ env->CallStaticVoidMethodA(clazz, id, parameters); |
result_wrapper.Append( |
GinJavaBridgeValue::CreateUndefinedValue().release()); |
break; |
@@ -261,7 +289,8 @@ void GinJavaMethodInvocationHelper::InvokeMethod(jobject object, |
break; |
case JavaType::TypeString: { |
jstring java_string = static_cast<jstring>( |
- env->CallObjectMethodA(object, id, parameters)); |
+ object ? env->CallObjectMethodA(object, id, parameters) |
+ : env->CallStaticObjectMethodA(clazz, id, parameters)); |
// If an exception was raised, we must clear it before calling most JNI |
// methods. ScopedJavaLocalRef is liable to make such calls, so we test |
// first. |
@@ -285,7 +314,9 @@ void GinJavaMethodInvocationHelper::InvokeMethod(jobject object, |
// If an exception was raised, we must clear it before calling most JNI |
// methods. ScopedJavaLocalRef is liable to make such calls, so we test |
// first. |
- jobject java_object = env->CallObjectMethodA(object, id, parameters); |
+ jobject java_object = |
+ object ? env->CallObjectMethodA(object, id, parameters) |
+ : env->CallStaticObjectMethodA(clazz, id, parameters); |
if (base::android::ClearException(env)) { |
SetInvocationFailure(kJavaExceptionRaised); |
return; |