< 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 >