< 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,12 +176,23 @@
// 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() {
+jobject convertUndefinedToJObject()
+{
static JGObject jgoUndefined;
if (!jgoUndefined) {
JNIEnv* env = getJNIEnv();
jclass clazz = env->FindClass(JSOBJECT_CLASSNAME);
jgoUndefined = JLObject(env->GetStaticObjectField(
@@ -189,11 +200,10 @@
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;
@@ -267,10 +277,17 @@
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,11 +336,11 @@
}
break;
case JavaTypeChar:
{
- result.c = (jchar)value.toNumber(exec);
+ result.c = toJCharValue(value, exec);
}
break;
case JavaTypeShort:
{
< prev index next >