< prev index next >
modules/web/src/main/native/Source/WebCore/bridge/jni/jsc/JNIUtilityPrivate.cpp
Print this page
rev 9675 : 8089842: JavaScript2Java Bridge: A char value cannot be set from JavaScript
*** 176,187 ****
// if it was not one of the cases handled, then null is returned
return jarray;
}
! jobject convertUndefinedToJObject() {
static JGObject jgoUndefined;
if (!jgoUndefined) {
JNIEnv* env = getJNIEnv();
jclass clazz = env->FindClass(JSOBJECT_CLASSNAME);
jgoUndefined = JLObject(env->GetStaticObjectField(
--- 176,198 ----
// if it was not one of the cases handled, then null is returned
return jarray;
}
+ static jchar toJCharValue(const JSValue& value, ExecState* exec)
+ {
+ // If JS type is string and target Java type is char, then
+ // return the first unicode character.
+ if (value.isString()) {
+ String stringValue = value.toString(exec)->value(exec);
+ return (jchar)stringValue[0];
+ }
+ return (jchar)value.toNumber(exec);
+ }
! jobject convertUndefinedToJObject()
! {
static JGObject jgoUndefined;
if (!jgoUndefined) {
JNIEnv* env = getJNIEnv();
jclass clazz = env->FindClass(JSOBJECT_CLASSNAME);
jgoUndefined = JLObject(env->GetStaticObjectField(
*** 189,199 ****
env->GetStaticFieldID(clazz, "UNDEFINED", "Ljava/lang/String;")));
}
return jgoUndefined;
}
-
jvalue convertValueToJValue(ExecState* exec, RootObject* rootObject, JSValue value, JavaType javaType, const char* javaClassName)
{
JSLockHolder lock(exec);
jvalue result;
--- 200,209 ----
*** 267,276 ****
--- 277,293 ----
if (value.isString() && !strcmp(javaClassName, "java.lang.Object")) {
String stringValue = asString(value)->value(exec);
JNIEnv* env = getJNIEnv();
jobject javaString = env->functions->NewString(env, (const jchar*)stringValue.deprecatedCharacters(), stringValue.length());
result.l = javaString;
+ } else if (value.isString() && !strcmp(javaClassName, "java.lang.Character")) {
+ JNIEnv* env = getJNIEnv();
+ static JGClass clazz(env->FindClass("java/lang/Character"));
+ jmethodID meth = env->GetStaticMethodID(clazz, "valueOf", "(C)Ljava/lang/Character;");
+ jchar charValue = toJCharValue(value, exec);
+ jobject javaChar = env->CallStaticObjectMethod(clazz, meth, charValue);
+ result.l = javaChar;
} else if (value.isNumber()) {
JNIEnv* env = getJNIEnv();
if (value.isInt32() && (!strcmp(javaClassName, "java.lang.Number") || !strcmp(javaClassName, "java.lang.Integer") || !strcmp(javaClassName, "java.lang.Object"))) {
static JGClass clazz(env->FindClass("java/lang/Integer"));
jmethodID meth = env->GetStaticMethodID(clazz, "valueOf", "(I)Ljava/lang/Integer;");
*** 319,329 ****
}
break;
case JavaTypeChar:
{
! result.c = (jchar)value.toNumber(exec);
}
break;
case JavaTypeShort:
{
--- 336,346 ----
}
break;
case JavaTypeChar:
{
! result.c = toJCharValue(value, exec);
}
break;
case JavaTypeShort:
{
< prev index next >