OLD | NEW |
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "content/browser/renderer_host/java/java_bound_object.h" | 5 #include "content/browser/renderer_host/java/java_bound_object.h" |
6 | 6 |
7 #include "base/android/jni_android.h" | 7 #include "base/android/jni_android.h" |
8 #include "base/android/jni_string.h" | 8 #include "base/android/jni_string.h" |
9 #include "base/memory/singleton.h" | 9 #include "base/memory/singleton.h" |
10 #include "base/string_number_conversions.h" | 10 #include "base/string_number_conversions.h" |
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
93 bool JavaNPObject::Invoke(NPObject* np_object, NPIdentifier np_identifier, | 93 bool JavaNPObject::Invoke(NPObject* np_object, NPIdentifier np_identifier, |
94 const NPVariant* args, uint32_t arg_count, | 94 const NPVariant* args, uint32_t arg_count, |
95 NPVariant* result) { | 95 NPVariant* result) { |
96 std::string name = NPIdentifierToString(np_identifier); | 96 std::string name = NPIdentifierToString(np_identifier); |
97 JavaNPObject* obj = reinterpret_cast<JavaNPObject*>(np_object); | 97 JavaNPObject* obj = reinterpret_cast<JavaNPObject*>(np_object); |
98 return obj->bound_object->Invoke(name, args, arg_count, result); | 98 return obj->bound_object->Invoke(name, args, arg_count, result); |
99 } | 99 } |
100 | 100 |
101 bool JavaNPObject::HasProperty(NPObject* np_object, | 101 bool JavaNPObject::HasProperty(NPObject* np_object, |
102 NPIdentifier np_identifier) { | 102 NPIdentifier np_identifier) { |
103 // LIVECONNECT_COMPLIANCE: Return false to indicate that the property is not | 103 // LIVECONNECT_COMPLIANCE: Existing behavior is to return false to indicate |
104 // present. We should support this correctly. | 104 // that the property is not present. Spec requires supporting this correctly. |
105 return false; | 105 return false; |
106 } | 106 } |
107 | 107 |
108 bool JavaNPObject::GetProperty(NPObject* np_object, | 108 bool JavaNPObject::GetProperty(NPObject* np_object, |
109 NPIdentifier np_identifier, | 109 NPIdentifier np_identifier, |
110 NPVariant* result) { | 110 NPVariant* result) { |
111 // LIVECONNECT_COMPLIANCE: Return false to indicate that the property is | 111 // LIVECONNECT_COMPLIANCE: Existing behavior is to return false to indicate |
112 // undefined. We should support this correctly. | 112 // that the property is undefined. Spec requires supporting this correctly. |
113 return false; | 113 return false; |
114 } | 114 } |
115 | 115 |
116 // Calls a Java method through JNI and returns the result as an NPVariant. Note | 116 // Calls a Java method through JNI and returns the result as an NPVariant. Note |
117 // that this method does not do any type coercion. The Java return value is | 117 // that this method does not do any type coercion. The Java return value is |
118 // simply converted to the corresponding NPAPI type. | 118 // simply converted to the corresponding NPAPI type. |
119 NPVariant CallJNIMethod(jobject object, JavaType::Type return_type, | 119 NPVariant CallJNIMethod(jobject object, JavaType::Type return_type, |
120 jmethodID id, jvalue* parameters) { | 120 jmethodID id, jvalue* parameters) { |
121 JNIEnv* env = AttachCurrentThread(); | 121 JNIEnv* env = AttachCurrentThread(); |
122 NPVariant result; | 122 NPVariant result; |
(...skipping 23 matching lines...) Expand all Loading... |
146 break; | 146 break; |
147 case JavaType::TypeDouble: | 147 case JavaType::TypeDouble: |
148 DOUBLE_TO_NPVARIANT(env->CallDoubleMethodA(object, id, parameters), | 148 DOUBLE_TO_NPVARIANT(env->CallDoubleMethodA(object, id, parameters), |
149 result); | 149 result); |
150 break; | 150 break; |
151 case JavaType::TypeVoid: | 151 case JavaType::TypeVoid: |
152 env->CallVoidMethodA(object, id, parameters); | 152 env->CallVoidMethodA(object, id, parameters); |
153 VOID_TO_NPVARIANT(result); | 153 VOID_TO_NPVARIANT(result); |
154 break; | 154 break; |
155 case JavaType::TypeArray: | 155 case JavaType::TypeArray: |
156 // TODO(steveblock): Handle arrays | 156 // LIVECONNECT_COMPLIANCE: Existing behavior is to not call methods that |
| 157 // return arrays. Spec requires calling the method and converting the |
| 158 // result to a JavaScript array. |
157 VOID_TO_NPVARIANT(result); | 159 VOID_TO_NPVARIANT(result); |
158 break; | 160 break; |
159 case JavaType::TypeString: { | 161 case JavaType::TypeString: { |
160 ScopedJavaLocalRef<jstring> java_string(env, static_cast<jstring>( | 162 ScopedJavaLocalRef<jstring> java_string(env, static_cast<jstring>( |
161 env->CallObjectMethodA(object, id, parameters))); | 163 env->CallObjectMethodA(object, id, parameters))); |
162 if (!java_string.obj()) { | 164 if (!java_string.obj()) { |
163 // LIVECONNECT_COMPLIANCE: Return undefined to maintain existing | 165 // LIVECONNECT_COMPLIANCE: Existing behavior is to return undefined. |
164 // behavior. We should return a null string. | 166 // Spec requires returning a null string. |
165 VOID_TO_NPVARIANT(result); | 167 VOID_TO_NPVARIANT(result); |
166 break; | 168 break; |
167 } | 169 } |
168 std::string str = | 170 std::string str = |
169 base::android::ConvertJavaStringToUTF8(env, java_string.obj()); | 171 base::android::ConvertJavaStringToUTF8(env, java_string.obj()); |
170 // Take a copy and pass ownership to the variant. We must allocate using | 172 // Take a copy and pass ownership to the variant. We must allocate using |
171 // NPN_MemAlloc, to match NPN_ReleaseVariant, which uses NPN_MemFree. | 173 // NPN_MemAlloc, to match NPN_ReleaseVariant, which uses NPN_MemFree. |
172 size_t length = str.length(); | 174 size_t length = str.length(); |
173 char* buffer = static_cast<char*>(NPN_MemAlloc(length)); | 175 char* buffer = static_cast<char*>(NPN_MemAlloc(length)); |
174 str.copy(buffer, length, 0); | 176 str.copy(buffer, length, 0); |
(...skipping 21 matching lines...) Expand all Loading... |
196 jvalue result; | 198 jvalue result; |
197 DCHECK(variant.type == NPVariantType_Int32 || | 199 DCHECK(variant.type == NPVariantType_Int32 || |
198 variant.type == NPVariantType_Double); | 200 variant.type == NPVariantType_Double); |
199 bool is_double = variant.type == NPVariantType_Double; | 201 bool is_double = variant.type == NPVariantType_Double; |
200 switch (target_type) { | 202 switch (target_type) { |
201 case JavaType::TypeByte: | 203 case JavaType::TypeByte: |
202 result.b = is_double ? static_cast<jbyte>(NPVARIANT_TO_DOUBLE(variant)) : | 204 result.b = is_double ? static_cast<jbyte>(NPVARIANT_TO_DOUBLE(variant)) : |
203 static_cast<jbyte>(NPVARIANT_TO_INT32(variant)); | 205 static_cast<jbyte>(NPVARIANT_TO_INT32(variant)); |
204 break; | 206 break; |
205 case JavaType::TypeChar: | 207 case JavaType::TypeChar: |
206 // LIVECONNECT_COMPLIANCE: Convert double to 0 to maintain existing | 208 // LIVECONNECT_COMPLIANCE: Existing behavior is to convert double to 0. |
207 // behavior. | 209 // Spec requires converting doubles the same as int32. |
208 result.c = is_double ? 0 : | 210 result.c = is_double ? 0 : |
209 static_cast<jchar>(NPVARIANT_TO_INT32(variant)); | 211 static_cast<jchar>(NPVARIANT_TO_INT32(variant)); |
210 break; | 212 break; |
211 case JavaType::TypeShort: | 213 case JavaType::TypeShort: |
212 result.s = is_double ? static_cast<jshort>(NPVARIANT_TO_DOUBLE(variant)) : | 214 result.s = is_double ? static_cast<jshort>(NPVARIANT_TO_DOUBLE(variant)) : |
213 static_cast<jshort>(NPVARIANT_TO_INT32(variant)); | 215 static_cast<jshort>(NPVARIANT_TO_INT32(variant)); |
214 break; | 216 break; |
215 case JavaType::TypeInt: | 217 case JavaType::TypeInt: |
216 result.i = is_double ? static_cast<jint>(NPVARIANT_TO_DOUBLE(variant)) : | 218 result.i = is_double ? static_cast<jint>(NPVARIANT_TO_DOUBLE(variant)) : |
217 NPVARIANT_TO_INT32(variant); | 219 NPVARIANT_TO_INT32(variant); |
218 break; | 220 break; |
219 case JavaType::TypeLong: | 221 case JavaType::TypeLong: |
220 result.j = is_double ? static_cast<jlong>(NPVARIANT_TO_DOUBLE(variant)) : | 222 result.j = is_double ? static_cast<jlong>(NPVARIANT_TO_DOUBLE(variant)) : |
221 NPVARIANT_TO_INT32(variant); | 223 NPVARIANT_TO_INT32(variant); |
222 break; | 224 break; |
223 case JavaType::TypeFloat: | 225 case JavaType::TypeFloat: |
224 result.f = is_double ? static_cast<jfloat>(NPVARIANT_TO_DOUBLE(variant)) : | 226 result.f = is_double ? static_cast<jfloat>(NPVARIANT_TO_DOUBLE(variant)) : |
225 NPVARIANT_TO_INT32(variant); | 227 NPVARIANT_TO_INT32(variant); |
226 break; | 228 break; |
227 case JavaType::TypeDouble: | 229 case JavaType::TypeDouble: |
228 result.d = is_double ? NPVARIANT_TO_DOUBLE(variant) : | 230 result.d = is_double ? NPVARIANT_TO_DOUBLE(variant) : |
229 NPVARIANT_TO_INT32(variant); | 231 NPVARIANT_TO_INT32(variant); |
230 break; | 232 break; |
231 case JavaType::TypeObject: | 233 case JavaType::TypeObject: |
232 // LIVECONNECT_COMPLIANCE: Convert to null to maintain existing behavior. | 234 // LIVECONNECT_COMPLIANCE: Existing behavior is to convert to null. Spec |
233 // We should handle object equivalents of primitive types. | 235 // requires handling object equivalents of primitive types. |
234 result.l = NULL; | 236 result.l = NULL; |
235 break; | 237 break; |
236 case JavaType::TypeString: | 238 case JavaType::TypeString: |
237 result.l = ConvertUTF8ToJavaString( | 239 result.l = ConvertUTF8ToJavaString( |
238 AttachCurrentThread(), | 240 AttachCurrentThread(), |
239 is_double ? StringPrintf("%.6lg", NPVARIANT_TO_DOUBLE(variant)) : | 241 is_double ? StringPrintf("%.6lg", NPVARIANT_TO_DOUBLE(variant)) : |
240 base::IntToString(NPVARIANT_TO_INT32(variant))); | 242 base::IntToString(NPVARIANT_TO_INT32(variant))); |
241 break; | 243 break; |
242 case JavaType::TypeBoolean: | 244 case JavaType::TypeBoolean: |
243 // LIVECONNECT_COMPLIANCE: Convert to false to maintain existing behavior. | 245 // LIVECONNECT_COMPLIANCE: Existing behavior is to convert to false. Spec |
244 // We should convert to false for o or NaN, true otherwise. | 246 // requires converting to false for 0 or NaN, true otherwise. |
245 result.z = JNI_FALSE; | 247 result.z = JNI_FALSE; |
246 break; | 248 break; |
247 case JavaType::TypeArray: | 249 case JavaType::TypeArray: |
248 // LIVECONNECT_COMPLIANCE: Convert to null to maintain existing behavior. | 250 // LIVECONNECT_COMPLIANCE: Existing behavior is to convert to null. Spec |
249 // We should raise a JavaScript exception. | 251 // requires raising a JavaScript exception. |
250 result.l = NULL; | 252 result.l = NULL; |
251 break; | 253 break; |
252 case JavaType::TypeVoid: | 254 case JavaType::TypeVoid: |
253 // Conversion to void must never happen. | 255 // Conversion to void must never happen. |
254 NOTREACHED(); | 256 NOTREACHED(); |
255 break; | 257 break; |
256 } | 258 } |
257 return result; | 259 return result; |
258 } | 260 } |
259 | 261 |
260 jvalue CoerceJavaScriptBooleanToJavaValue(const NPVariant& variant, | 262 jvalue CoerceJavaScriptBooleanToJavaValue(const NPVariant& variant, |
261 JavaType::Type target_type) { | 263 JavaType::Type target_type) { |
262 // See http://jdk6.java.net/plugin2/liveconnect/#JS_BOOLEAN_VALUES. | 264 // See http://jdk6.java.net/plugin2/liveconnect/#JS_BOOLEAN_VALUES. |
263 DCHECK_EQ(NPVariantType_Bool, variant.type); | 265 DCHECK_EQ(NPVariantType_Bool, variant.type); |
264 bool boolean_value = NPVARIANT_TO_BOOLEAN(variant); | 266 bool boolean_value = NPVARIANT_TO_BOOLEAN(variant); |
265 jvalue result; | 267 jvalue result; |
266 switch (target_type) { | 268 switch (target_type) { |
267 case JavaType::TypeBoolean: | 269 case JavaType::TypeBoolean: |
268 result.z = boolean_value ? JNI_TRUE : JNI_FALSE; | 270 result.z = boolean_value ? JNI_TRUE : JNI_FALSE; |
269 break; | 271 break; |
270 case JavaType::TypeObject: | 272 case JavaType::TypeObject: |
271 // LIVECONNECT_COMPLIANCE: Convert to NULL to maintain existing behavior. | 273 // LIVECONNECT_COMPLIANCE: Existing behavior is to convert to NULL. Spec |
272 // We should handle java.lang.Boolean and java.lang.Object. | 274 // requires handling java.lang.Boolean and java.lang.Object. |
273 result.l = NULL; | 275 result.l = NULL; |
274 break; | 276 break; |
275 case JavaType::TypeString: | 277 case JavaType::TypeString: |
276 result.l = ConvertUTF8ToJavaString(AttachCurrentThread(), | 278 result.l = ConvertUTF8ToJavaString(AttachCurrentThread(), |
277 boolean_value ? "true" : "false"); | 279 boolean_value ? "true" : "false"); |
278 break; | 280 break; |
279 case JavaType::TypeByte: | 281 case JavaType::TypeByte: |
280 case JavaType::TypeChar: | 282 case JavaType::TypeChar: |
281 case JavaType::TypeShort: | 283 case JavaType::TypeShort: |
282 case JavaType::TypeInt: | 284 case JavaType::TypeInt: |
283 case JavaType::TypeLong: | 285 case JavaType::TypeLong: |
284 case JavaType::TypeFloat: | 286 case JavaType::TypeFloat: |
285 case JavaType::TypeDouble: { | 287 case JavaType::TypeDouble: { |
286 // LIVECONNECT_COMPLIANCE: Convert to 0 to maintain existing behavior. We | 288 // LIVECONNECT_COMPLIANCE: Existing behavior is to convert to 0. Spec |
287 // should convert to 0 or 1. | 289 // requires converting to 0 or 1. |
288 jvalue null_value = {0}; | 290 jvalue null_value = {0}; |
289 result = null_value; | 291 result = null_value; |
290 break; | 292 break; |
291 } | 293 } |
292 case JavaType::TypeArray: | 294 case JavaType::TypeArray: |
293 // LIVECONNECT_COMPLIANCE: Convert to NULL to maintain existing behavior. | 295 // LIVECONNECT_COMPLIANCE: Existing behavior is to convert to NULL. Spec |
294 // We should raise a JavaScript exception. | 296 // requires raising a JavaScript exception. |
295 result.l = NULL; | 297 result.l = NULL; |
296 break; | 298 break; |
297 case JavaType::TypeVoid: | 299 case JavaType::TypeVoid: |
298 // Conversion to void must never happen. | 300 // Conversion to void must never happen. |
299 NOTREACHED(); | 301 NOTREACHED(); |
300 break; | 302 break; |
301 } | 303 } |
302 return result; | 304 return result; |
303 } | 305 } |
304 | 306 |
305 jvalue CoerceJavaScriptStringToJavaValue(const NPVariant& variant, | 307 jvalue CoerceJavaScriptStringToJavaValue(const NPVariant& variant, |
306 JavaType::Type target_type) { | 308 JavaType::Type target_type) { |
307 // See http://jdk6.java.net/plugin2/liveconnect/#JS_STRING_VALUES. | 309 // See http://jdk6.java.net/plugin2/liveconnect/#JS_STRING_VALUES. |
308 DCHECK_EQ(NPVariantType_String, variant.type); | 310 DCHECK_EQ(NPVariantType_String, variant.type); |
309 jvalue result; | 311 jvalue result; |
310 switch (target_type) { | 312 switch (target_type) { |
311 case JavaType::TypeString: | 313 case JavaType::TypeString: |
312 result.l = ConvertUTF8ToJavaString( | 314 result.l = ConvertUTF8ToJavaString( |
313 AttachCurrentThread(), | 315 AttachCurrentThread(), |
314 base::StringPiece(NPVARIANT_TO_STRING(variant).UTF8Characters, | 316 base::StringPiece(NPVARIANT_TO_STRING(variant).UTF8Characters, |
315 NPVARIANT_TO_STRING(variant).UTF8Length)); | 317 NPVARIANT_TO_STRING(variant).UTF8Length)); |
316 break; | 318 break; |
317 case JavaType::TypeObject: | 319 case JavaType::TypeObject: |
318 // LIVECONNECT_COMPLIANCE: Convert to NULL to maintain existing behavior. | 320 // LIVECONNECT_COMPLIANCE: Existing behavior is to convert to NULL. Spec |
319 // We should handle java.lang.Object. | 321 // requires handling java.lang.Object. |
320 result.l = NULL; | 322 result.l = NULL; |
321 break; | 323 break; |
322 case JavaType::TypeByte: | 324 case JavaType::TypeByte: |
323 case JavaType::TypeShort: | 325 case JavaType::TypeShort: |
324 case JavaType::TypeInt: | 326 case JavaType::TypeInt: |
325 case JavaType::TypeLong: | 327 case JavaType::TypeLong: |
326 case JavaType::TypeFloat: | 328 case JavaType::TypeFloat: |
327 case JavaType::TypeDouble: { | 329 case JavaType::TypeDouble: { |
328 // LIVECONNECT_COMPLIANCE: Convert to 0 to maintain existing behavior. we | 330 // LIVECONNECT_COMPLIANCE: Existing behavior is to convert to 0. Spec |
329 // should use valueOf() method of corresponding object type. | 331 // requires using valueOf() method of corresponding object type. |
330 jvalue null_value = {0}; | 332 jvalue null_value = {0}; |
331 result = null_value; | 333 result = null_value; |
332 break; | 334 break; |
333 } | 335 } |
334 case JavaType::TypeChar: | 336 case JavaType::TypeChar: |
335 // LIVECONNECT_COMPLIANCE: Convert to 0 to maintain existing behavior. we | 337 // LIVECONNECT_COMPLIANCE: Existing behavior is to convert to 0. Spec |
336 // should use java.lang.Short.decode(). | 338 // requires using java.lang.Short.decode(). |
337 result.c = 0; | 339 result.c = 0; |
338 break; | 340 break; |
339 case JavaType::TypeBoolean: | 341 case JavaType::TypeBoolean: |
340 // LIVECONNECT_COMPLIANCE: Convert to false to maintain existing behavior. | 342 // LIVECONNECT_COMPLIANCE: Existing behavior is to convert to false. Spec |
341 // We should convert the empty string to false, otherwise true. | 343 // requires converting the empty string to false, otherwise true. |
342 result.z = JNI_FALSE; | 344 result.z = JNI_FALSE; |
343 break; | 345 break; |
344 case JavaType::TypeArray: | 346 case JavaType::TypeArray: |
345 // LIVECONNECT_COMPLIANCE: Convert to NULL to maintain existing behavior. | 347 // LIVECONNECT_COMPLIANCE: Existing behavior is to convert to NULL. Spec |
346 // We should raise a JavaScript exception. | 348 // requires raising a JavaScript exception. |
347 result.l = NULL; | 349 result.l = NULL; |
348 break; | 350 break; |
349 case JavaType::TypeVoid: | 351 case JavaType::TypeVoid: |
350 // Conversion to void must never happen. | 352 // Conversion to void must never happen. |
351 NOTREACHED(); | 353 NOTREACHED(); |
352 break; | 354 break; |
353 } | 355 } |
354 return result; | 356 return result; |
355 } | 357 } |
356 | 358 |
357 jvalue CoerceJavaScriptObjectToJavaValue(const NPVariant& variant, | 359 jvalue CoerceJavaScriptObjectToJavaValue(const NPVariant& variant, |
358 JavaType::Type target_type) { | 360 JavaType::Type target_type) { |
359 // We only handle Java objects. See | 361 // We only handle Java objects. See |
360 // http://jdk6.java.net/plugin2/liveconnect/#JS_JAVA_OBJECTS. | 362 // http://jdk6.java.net/plugin2/liveconnect/#JS_JAVA_OBJECTS. |
361 // TODO(steveblock): Handle arrays. | 363 // TODO(steveblock): Handle arrays. |
362 // TODO(steveblock): Handle JavaScript objects. | 364 // TODO(steveblock): Handle JavaScript objects. |
363 DCHECK_EQ(NPVariantType_Object, variant.type); | 365 DCHECK_EQ(NPVariantType_Object, variant.type); |
364 | 366 |
365 // The only type of object we should encounter is a Java object, as | 367 // The only type of object we should encounter is a Java object, as |
366 // other objects should have been converted to NULL in the renderer. | 368 // other objects should have been converted to NULL in the renderer. |
367 // See CreateNPVariantParam(). | 369 // See CreateNPVariantParam(). |
368 // TODO(steveblock): This will have to change once we support arrays and | 370 // TODO(steveblock): This will have to change once we support arrays and |
369 // JavaScript objects. | 371 // JavaScript objects. |
370 NPObject* object = NPVARIANT_TO_OBJECT(variant); | 372 NPObject* object = NPVARIANT_TO_OBJECT(variant); |
371 DCHECK_EQ(&JavaNPObject::kNPClass, object->_class); | 373 DCHECK_EQ(&JavaNPObject::kNPClass, object->_class); |
372 | 374 |
373 jvalue result; | 375 jvalue result; |
374 switch (target_type) { | 376 switch (target_type) { |
375 case JavaType::TypeObject: | 377 case JavaType::TypeObject: |
376 // LIVECONNECT_COMPLIANCE: Pass all Java objects to maintain existing | 378 // LIVECONNECT_COMPLIANCE: Existing behavior is to pass all Java objects. |
377 // behavior. We should pass only Java objects which are | 379 // Spec requires passing only Java objects which are |
378 // assignment-compatibile. | 380 // assignment-compatibile. |
379 result.l = AttachCurrentThread()->NewLocalRef( | 381 result.l = AttachCurrentThread()->NewLocalRef( |
380 JavaBoundObject::GetJavaObject(object)); | 382 JavaBoundObject::GetJavaObject(object)); |
381 break; | 383 break; |
382 case JavaType::TypeString: | 384 case JavaType::TypeString: |
383 // LIVECONNECT_COMPLIANCE: Convert to "undefined" to maintain existing | 385 // LIVECONNECT_COMPLIANCE: Existing behavior is to convert to |
384 // behavior. We should call toString() on the Java object. | 386 // "undefined". Spec requires calling toString() on the Java object. |
385 result.l = ConvertUTF8ToJavaString(AttachCurrentThread(), "undefined"); | 387 result.l = ConvertUTF8ToJavaString(AttachCurrentThread(), "undefined"); |
386 break; | 388 break; |
387 case JavaType::TypeByte: | 389 case JavaType::TypeByte: |
388 case JavaType::TypeShort: | 390 case JavaType::TypeShort: |
389 case JavaType::TypeInt: | 391 case JavaType::TypeInt: |
390 case JavaType::TypeLong: | 392 case JavaType::TypeLong: |
391 case JavaType::TypeFloat: | 393 case JavaType::TypeFloat: |
392 case JavaType::TypeDouble: | 394 case JavaType::TypeDouble: |
393 case JavaType::TypeChar: { | 395 case JavaType::TypeChar: { |
394 // LIVECONNECT_COMPLIANCE: Convert to 0 to maintain existing behavior. We | 396 // LIVECONNECT_COMPLIANCE: Existing behavior is to convert to 0. Spec |
395 // should raise a JavaScript exception. | 397 // requires raising a JavaScript exception. |
396 jvalue null_value = {0}; | 398 jvalue null_value = {0}; |
397 result = null_value; | 399 result = null_value; |
398 break; | 400 break; |
399 } | 401 } |
400 case JavaType::TypeBoolean: | 402 case JavaType::TypeBoolean: |
401 // LIVECONNECT_COMPLIANCE: Convert to false to maintain existing behavior. | 403 // LIVECONNECT_COMPLIANCE: Existing behavior is to convert to false. Spec |
402 // We should raise a JavaScript exception. | 404 // requires raising a JavaScript exception. |
403 result.z = JNI_FALSE; | 405 result.z = JNI_FALSE; |
404 break; | 406 break; |
405 case JavaType::TypeArray: | 407 case JavaType::TypeArray: |
406 // LIVECONNECT_COMPLIANCE: Convert to NULL to maintain existing behavior. | 408 // LIVECONNECT_COMPLIANCE: Existing behavior is to convert to NULL. Spec |
407 // We should raise a JavaScript exception. | 409 // requires raising a JavaScript exception. |
408 result.l = NULL; | 410 result.l = NULL; |
409 break; | 411 break; |
410 case JavaType::TypeVoid: | 412 case JavaType::TypeVoid: |
411 // Conversion to void must never happen. | 413 // Conversion to void must never happen. |
412 NOTREACHED(); | 414 NOTREACHED(); |
413 break; | 415 break; |
414 } | 416 } |
415 return result; | 417 return result; |
416 } | 418 } |
417 | 419 |
418 jvalue CoerceJavaScriptNullOrUndefinedToJavaValue(const NPVariant& variant, | 420 jvalue CoerceJavaScriptNullOrUndefinedToJavaValue(const NPVariant& variant, |
419 JavaType::Type target_type) { | 421 JavaType::Type target_type) { |
420 // See http://jdk6.java.net/plugin2/liveconnect/#JS_NULL. | 422 // See http://jdk6.java.net/plugin2/liveconnect/#JS_NULL. |
421 DCHECK(variant.type == NPVariantType_Null || | 423 DCHECK(variant.type == NPVariantType_Null || |
422 variant.type == NPVariantType_Void); | 424 variant.type == NPVariantType_Void); |
423 jvalue result; | 425 jvalue result; |
424 switch (target_type) { | 426 switch (target_type) { |
425 case JavaType::TypeObject: | 427 case JavaType::TypeObject: |
426 result.l = NULL; | 428 result.l = NULL; |
427 break; | 429 break; |
428 case JavaType::TypeString: | 430 case JavaType::TypeString: |
429 if (variant.type == NPVariantType_Void) { | 431 if (variant.type == NPVariantType_Void) { |
430 // LIVECONNECT_COMPLIANCE: Convert undefined to "undefined" to maintain | 432 // LIVECONNECT_COMPLIANCE: Existing behavior is to convert undefined to |
431 // existing behavior. We should convert undefined to NULL. | 433 // "undefined". Spec requires converting undefined to NULL. |
432 result.l = ConvertUTF8ToJavaString(AttachCurrentThread(), "undefined"); | 434 result.l = ConvertUTF8ToJavaString(AttachCurrentThread(), "undefined"); |
433 } else { | 435 } else { |
434 result.l = NULL; | 436 result.l = NULL; |
435 } | 437 } |
436 break; | 438 break; |
437 case JavaType::TypeByte: | 439 case JavaType::TypeByte: |
438 case JavaType::TypeChar: | 440 case JavaType::TypeChar: |
439 case JavaType::TypeShort: | 441 case JavaType::TypeShort: |
440 case JavaType::TypeInt: | 442 case JavaType::TypeInt: |
441 case JavaType::TypeLong: | 443 case JavaType::TypeLong: |
442 case JavaType::TypeFloat: | 444 case JavaType::TypeFloat: |
443 case JavaType::TypeDouble: { | 445 case JavaType::TypeDouble: { |
444 jvalue null_value = {0}; | 446 jvalue null_value = {0}; |
445 result = null_value; | 447 result = null_value; |
446 break; | 448 break; |
447 } | 449 } |
448 case JavaType::TypeBoolean: | 450 case JavaType::TypeBoolean: |
449 result.z = JNI_FALSE; | 451 result.z = JNI_FALSE; |
450 break; | 452 break; |
451 case JavaType::TypeArray: | 453 case JavaType::TypeArray: |
452 // LIVECONNECT_COMPLIANCE: Convert to NULL to maintain existing behavior. | 454 // LIVECONNECT_COMPLIANCE: Existing behavior is to convert to NULL. Spec |
453 // We should raise a JavaScript exception. | 455 // requires raising a JavaScript exception. |
454 result.l = NULL; | 456 result.l = NULL; |
455 break; | 457 break; |
456 case JavaType::TypeVoid: | 458 case JavaType::TypeVoid: |
457 // Conversion to void must never happen. | 459 // Conversion to void must never happen. |
458 NOTREACHED(); | 460 NOTREACHED(); |
459 break; | 461 break; |
460 } | 462 } |
461 return result; | 463 return result; |
462 } | 464 } |
463 | 465 |
(...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
605 size_t num_methods = env->GetArrayLength(methods.obj()); | 607 size_t num_methods = env->GetArrayLength(methods.obj()); |
606 DCHECK(num_methods) << "Java objects always have public methods"; | 608 DCHECK(num_methods) << "Java objects always have public methods"; |
607 for (size_t i = 0; i < num_methods; ++i) { | 609 for (size_t i = 0; i < num_methods; ++i) { |
608 ScopedJavaLocalRef<jobject> java_method( | 610 ScopedJavaLocalRef<jobject> java_method( |
609 env, | 611 env, |
610 env->GetObjectArrayElement(methods.obj(), i)); | 612 env->GetObjectArrayElement(methods.obj(), i)); |
611 JavaMethod* method = new JavaMethod(java_method); | 613 JavaMethod* method = new JavaMethod(java_method); |
612 methods_.insert(std::make_pair(method->name(), method)); | 614 methods_.insert(std::make_pair(method->name(), method)); |
613 } | 615 } |
614 } | 616 } |
OLD | NEW |