< 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


 161         {
 162             jarray = (jobjectArray)env->NewDoubleArray(length);
 163             for (unsigned i = 0; i < length; i++) {
 164                 JSValue item = jsArray->get(exec, i);
 165                 jdouble value = (jdouble)item.toNumber(exec);
 166                 env->SetDoubleArrayRegion((jdoubleArray)jarray, (jsize)i, (jsize)1, &value);
 167             }
 168             break;
 169         }
 170 
 171     case JavaTypeArray: // don't handle embedded arrays
 172     case JavaTypeVoid: // Don't expect arrays of void objects
 173     case JavaTypeInvalid: // Array of unknown objects
 174         break;
 175     }
 176 
 177     // if it was not one of the cases handled, then null is returned
 178     return jarray;
 179 }
 180 










 181 
 182 jobject convertUndefinedToJObject() {

 183     static JGObject jgoUndefined;
 184     if (!jgoUndefined) {
 185         JNIEnv* env = getJNIEnv();
 186         jclass clazz = env->FindClass(JSOBJECT_CLASSNAME);
 187         jgoUndefined = JLObject(env->GetStaticObjectField(
 188             clazz,
 189             env->GetStaticFieldID(clazz, "UNDEFINED", "Ljava/lang/String;")));
 190     }
 191     return jgoUndefined;
 192 }
 193 
 194 
 195 jvalue convertValueToJValue(ExecState* exec, RootObject* rootObject, JSValue value, JavaType javaType, const char* javaClassName)
 196 {
 197     JSLockHolder lock(exec);
 198 
 199     jvalue result;
 200     memset(&result, 0, sizeof(jvalue));
 201 
 202     switch (javaType) {
 203     case JavaTypeArray:
 204     case JavaTypeObject:
 205         {
 206             // FIXME: JavaJSObject::convertValueToJObject functionality is almost exactly the same,
 207             // these functions should use common code.
 208 
 209             if (value.isObject()) {
 210                 JSObject* object = asObject(value);
 211                 if (object->inherits(JavaRuntimeObject::info())) {
 212                     // Unwrap a Java instance.
 213                     JavaRuntimeObject* runtimeObject = static_cast<JavaRuntimeObject*>(object);
 214                     JavaInstance* instance = runtimeObject->getInternalJavaInstance();


 252                         static JGClass jsObjectClass = env->FindClass(JSOBJECT_CLASSNAME);
 253                         static jmethodID constructorID = env->GetMethodID(jsObjectClass, "<init>", "(JI)V");
 254                         if (constructorID) {
 255                             rootObject->gcProtect(object);
 256                             jlong nativeHandle = ptr_to_jlong(object);
 257                             result.l = env->NewObject(jsObjectClass, constructorID,
 258                                 nativeHandle,
 259                                 com_sun_webkit_dom_JSObject_JS_CONTEXT_OBJECT);
 260                         }
 261                     }
 262                 }
 263             }
 264 
 265             // Create an appropriate Java object if target type is java.lang.Object or other wrapper Objects {Integer, Double, Boolean}.
 266             if (!result.l) {
 267                 if (value.isString() && !strcmp(javaClassName, "java.lang.Object")) {
 268                     String stringValue = asString(value)->value(exec);
 269                     JNIEnv* env = getJNIEnv();
 270                     jobject javaString = env->functions->NewString(env, (const jchar*)stringValue.deprecatedCharacters(), stringValue.length());
 271                     result.l = javaString;







 272                 } else if (value.isNumber()) {
 273                     JNIEnv* env = getJNIEnv();
 274                     if (value.isInt32() && (!strcmp(javaClassName, "java.lang.Number") || !strcmp(javaClassName, "java.lang.Integer") || !strcmp(javaClassName, "java.lang.Object"))) {
 275                         static JGClass clazz(env->FindClass("java/lang/Integer"));
 276                         jmethodID meth = env->GetStaticMethodID(clazz, "valueOf", "(I)Ljava/lang/Integer;");
 277                         result.l = env->CallStaticObjectMethod(clazz, meth, (jint) value.asInt32());
 278                     } else if (!strcmp(javaClassName, "java.lang.Number") || !strcmp(javaClassName, "java.lang.Double") || !strcmp(javaClassName, "java.lang.Object")) {
 279                         jdouble doubleValue = (jdouble) value.asNumber();
 280                         static JGClass clazz = env->FindClass("java/lang/Double");
 281                         jmethodID meth = env->GetStaticMethodID(clazz, "valueOf", "(D)Ljava/lang/Double;");
 282                         jobject javaDouble = env->CallStaticObjectMethod(clazz, meth, doubleValue);
 283                         result.l = javaDouble;
 284                     }
 285                 } else if (value.isBoolean() && (!strcmp(javaClassName, "java.lang.Boolean") || !strcmp(javaClassName, "java.lang.Object"))) {
 286                     bool boolValue = value.asBoolean();
 287                     JNIEnv* env = getJNIEnv();
 288                     static JGClass clazz(env->FindClass("java/lang/Boolean"));
 289                     jmethodID meth = env->GetStaticMethodID(clazz, "valueOf", "(Z)Ljava/lang/Boolean;");
 290                     jobject javaBoolean = env->CallStaticObjectMethod(clazz, meth, boolValue);
 291                     result.l = javaBoolean;


 304                     result.l = javaString;
 305                 }
 306             }
 307         }
 308         break;
 309 
 310     case JavaTypeBoolean:
 311         {
 312             result.z = (jboolean)value.toNumber(exec);
 313         }
 314         break;
 315 
 316     case JavaTypeByte:
 317         {
 318             result.b = (jbyte)value.toNumber(exec);
 319         }
 320         break;
 321 
 322     case JavaTypeChar:
 323         {
 324             result.c = (jchar)value.toNumber(exec);
 325         }
 326         break;
 327 
 328     case JavaTypeShort:
 329         {
 330             result.s = (jshort)value.toNumber(exec);
 331         }
 332         break;
 333 
 334     case JavaTypeInt:
 335         {
 336             result.i = (jint)value.toNumber(exec);
 337         }
 338         break;
 339 
 340     case JavaTypeLong:
 341         {
 342             result.j = (jlong)value.toNumber(exec);
 343         }
 344         break;




 161         {
 162             jarray = (jobjectArray)env->NewDoubleArray(length);
 163             for (unsigned i = 0; i < length; i++) {
 164                 JSValue item = jsArray->get(exec, i);
 165                 jdouble value = (jdouble)item.toNumber(exec);
 166                 env->SetDoubleArrayRegion((jdoubleArray)jarray, (jsize)i, (jsize)1, &value);
 167             }
 168             break;
 169         }
 170 
 171     case JavaTypeArray: // don't handle embedded arrays
 172     case JavaTypeVoid: // Don't expect arrays of void objects
 173     case JavaTypeInvalid: // Array of unknown objects
 174         break;
 175     }
 176 
 177     // if it was not one of the cases handled, then null is returned
 178     return jarray;
 179 }
 180 
 181 static jchar toJCharValue(const JSValue& value, ExecState* exec)
 182 {
 183     // If JS type is string and target Java type is char, then
 184     // return the first unicode character.
 185     if (value.isString()) {
 186         String stringValue = value.toString(exec)->value(exec);
 187         return (jchar)stringValue[0];
 188     }
 189     return (jchar)value.toNumber(exec);
 190 }
 191 
 192 jobject convertUndefinedToJObject()
 193 {
 194     static JGObject jgoUndefined;
 195     if (!jgoUndefined) {
 196         JNIEnv* env = getJNIEnv();
 197         jclass clazz = env->FindClass(JSOBJECT_CLASSNAME);
 198         jgoUndefined = JLObject(env->GetStaticObjectField(
 199             clazz,
 200             env->GetStaticFieldID(clazz, "UNDEFINED", "Ljava/lang/String;")));
 201     }
 202     return jgoUndefined;
 203 }
 204 

 205 jvalue convertValueToJValue(ExecState* exec, RootObject* rootObject, JSValue value, JavaType javaType, const char* javaClassName)
 206 {
 207     JSLockHolder lock(exec);
 208 
 209     jvalue result;
 210     memset(&result, 0, sizeof(jvalue));
 211 
 212     switch (javaType) {
 213     case JavaTypeArray:
 214     case JavaTypeObject:
 215         {
 216             // FIXME: JavaJSObject::convertValueToJObject functionality is almost exactly the same,
 217             // these functions should use common code.
 218 
 219             if (value.isObject()) {
 220                 JSObject* object = asObject(value);
 221                 if (object->inherits(JavaRuntimeObject::info())) {
 222                     // Unwrap a Java instance.
 223                     JavaRuntimeObject* runtimeObject = static_cast<JavaRuntimeObject*>(object);
 224                     JavaInstance* instance = runtimeObject->getInternalJavaInstance();


 262                         static JGClass jsObjectClass = env->FindClass(JSOBJECT_CLASSNAME);
 263                         static jmethodID constructorID = env->GetMethodID(jsObjectClass, "<init>", "(JI)V");
 264                         if (constructorID) {
 265                             rootObject->gcProtect(object);
 266                             jlong nativeHandle = ptr_to_jlong(object);
 267                             result.l = env->NewObject(jsObjectClass, constructorID,
 268                                 nativeHandle,
 269                                 com_sun_webkit_dom_JSObject_JS_CONTEXT_OBJECT);
 270                         }
 271                     }
 272                 }
 273             }
 274 
 275             // Create an appropriate Java object if target type is java.lang.Object or other wrapper Objects {Integer, Double, Boolean}.
 276             if (!result.l) {
 277                 if (value.isString() && !strcmp(javaClassName, "java.lang.Object")) {
 278                     String stringValue = asString(value)->value(exec);
 279                     JNIEnv* env = getJNIEnv();
 280                     jobject javaString = env->functions->NewString(env, (const jchar*)stringValue.deprecatedCharacters(), stringValue.length());
 281                     result.l = javaString;
 282                 } else if (value.isString() && !strcmp(javaClassName, "java.lang.Character")) {
 283                     JNIEnv* env = getJNIEnv();
 284                     static JGClass clazz(env->FindClass("java/lang/Character"));
 285                     jmethodID meth = env->GetStaticMethodID(clazz, "valueOf", "(C)Ljava/lang/Character;");
 286                     jchar charValue = toJCharValue(value, exec);
 287                     jobject javaChar = env->CallStaticObjectMethod(clazz, meth, charValue);
 288                     result.l = javaChar;
 289                 } else if (value.isNumber()) {
 290                     JNIEnv* env = getJNIEnv();
 291                     if (value.isInt32() && (!strcmp(javaClassName, "java.lang.Number") || !strcmp(javaClassName, "java.lang.Integer") || !strcmp(javaClassName, "java.lang.Object"))) {
 292                         static JGClass clazz(env->FindClass("java/lang/Integer"));
 293                         jmethodID meth = env->GetStaticMethodID(clazz, "valueOf", "(I)Ljava/lang/Integer;");
 294                         result.l = env->CallStaticObjectMethod(clazz, meth, (jint) value.asInt32());
 295                     } else if (!strcmp(javaClassName, "java.lang.Number") || !strcmp(javaClassName, "java.lang.Double") || !strcmp(javaClassName, "java.lang.Object")) {
 296                         jdouble doubleValue = (jdouble) value.asNumber();
 297                         static JGClass clazz = env->FindClass("java/lang/Double");
 298                         jmethodID meth = env->GetStaticMethodID(clazz, "valueOf", "(D)Ljava/lang/Double;");
 299                         jobject javaDouble = env->CallStaticObjectMethod(clazz, meth, doubleValue);
 300                         result.l = javaDouble;
 301                     }
 302                 } else if (value.isBoolean() && (!strcmp(javaClassName, "java.lang.Boolean") || !strcmp(javaClassName, "java.lang.Object"))) {
 303                     bool boolValue = value.asBoolean();
 304                     JNIEnv* env = getJNIEnv();
 305                     static JGClass clazz(env->FindClass("java/lang/Boolean"));
 306                     jmethodID meth = env->GetStaticMethodID(clazz, "valueOf", "(Z)Ljava/lang/Boolean;");
 307                     jobject javaBoolean = env->CallStaticObjectMethod(clazz, meth, boolValue);
 308                     result.l = javaBoolean;


 321                     result.l = javaString;
 322                 }
 323             }
 324         }
 325         break;
 326 
 327     case JavaTypeBoolean:
 328         {
 329             result.z = (jboolean)value.toNumber(exec);
 330         }
 331         break;
 332 
 333     case JavaTypeByte:
 334         {
 335             result.b = (jbyte)value.toNumber(exec);
 336         }
 337         break;
 338 
 339     case JavaTypeChar:
 340         {
 341             result.c = toJCharValue(value, exec);
 342         }
 343         break;
 344 
 345     case JavaTypeShort:
 346         {
 347             result.s = (jshort)value.toNumber(exec);
 348         }
 349         break;
 350 
 351     case JavaTypeInt:
 352         {
 353             result.i = (jint)value.toNumber(exec);
 354         }
 355         break;
 356 
 357     case JavaTypeLong:
 358         {
 359             result.j = (jlong)value.toNumber(exec);
 360         }
 361         break;


< prev index next >