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