1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 package org.chromium.content.browser;
7 import android.test.suitebuilder.annotation.SmallTest;
9 import org.chromium.base.test.util.Feature;
12 * Part of the test suite for the Java Bridge. This class tests that
13 * we correctly convert JavaScript values to Java values when passing them to
14 * the methods of injected Java objects.
16 * The conversions should follow
17 * http://jdk6.java.net/plugin2/liveconnect/#JS_JAVA_CONVERSIONS. Places in
18 * which the implementation differs from the spec are marked with
19 * LIVECONNECT_COMPLIANCE.
20 * FIXME: Consider making our implementation more compliant, if it will not
21 * break backwards-compatibility. See b/4408210.
23 public class JavaBridgeCoercionTest extends JavaBridgeTestBase {
24 private class TestObject extends Controller {
25 private Object objectInstance;
26 private CustomType customTypeInstance;
27 private CustomType2 customType2Instance;
29 private boolean mBooleanValue;
30 private byte mByteValue;
31 private char mCharValue;
32 private short mShortValue;
33 private int mIntValue;
34 private long mLongValue;
35 private float mFloatValue;
36 private double mDoubleValue;
37 private String mStringValue;
38 private Object mObjectValue;
39 private CustomType mCustomTypeValue;
42 objectInstance = new Object();
43 customTypeInstance = new CustomType();
44 customType2Instance = new CustomType2();
47 public Object getObjectInstance() {
48 return objectInstance;
50 public CustomType getCustomTypeInstance() {
51 return customTypeInstance;
53 public CustomType2 getCustomType2Instance() {
54 return customType2Instance;
57 public synchronized void setBooleanValue(boolean x) {
59 notifyResultIsReady();
61 public synchronized void setByteValue(byte x) {
63 notifyResultIsReady();
65 public synchronized void setCharValue(char x) {
67 notifyResultIsReady();
69 public synchronized void setShortValue(short x) {
71 notifyResultIsReady();
73 public synchronized void setIntValue(int x) {
75 notifyResultIsReady();
77 public synchronized void setLongValue(long x) {
79 notifyResultIsReady();
81 public synchronized void setFloatValue(float x) {
83 notifyResultIsReady();
85 public synchronized void setDoubleValue(double x) {
87 notifyResultIsReady();
89 public synchronized void setStringValue(String x) {
91 notifyResultIsReady();
93 public synchronized void setObjectValue(Object x) {
95 notifyResultIsReady();
97 public synchronized void setCustomTypeValue(CustomType x) {
99 notifyResultIsReady();
102 public synchronized boolean waitForBooleanValue() {
104 return mBooleanValue;
106 public synchronized byte waitForByteValue() {
110 public synchronized char waitForCharValue() {
114 public synchronized short waitForShortValue() {
118 public synchronized int waitForIntValue() {
122 public synchronized long waitForLongValue() {
126 public synchronized float waitForFloatValue() {
130 public synchronized double waitForDoubleValue() {
134 public synchronized String waitForStringValue() {
138 public synchronized Object waitForObjectValue() {
142 public synchronized CustomType waitForCustomTypeValue() {
144 return mCustomTypeValue;
148 // Two custom types used when testing passing objects.
149 private static class CustomType {
151 private static class CustomType2 {
154 private TestObject mTestObject;
157 protected void setUp() throws Exception {
159 mTestObject = new TestObject();
160 setUpContentView(mTestObject, "testObject");
163 // Test passing a 32-bit integer JavaScript number to a method of an
164 // injected object. Note that JavaScript may choose to represent these
165 // values as either 32-bit integers or doubles, though this should not
166 // affect the result.
168 @Feature({"AndroidWebView", "Android-JavaBridge"})
169 public void testPassNumberInt32() throws Throwable {
170 executeJavaScript("testObject.setByteValue(42);");
171 assertEquals(42, mTestObject.waitForByteValue());
172 executeJavaScript("testObject.setByteValue(" + Byte.MAX_VALUE + " + 42);");
173 assertEquals(Byte.MIN_VALUE + 42 - 1, mTestObject.waitForByteValue());
175 // LIVECONNECT_COMPLIANCE: Should convert to numeric char value.
176 executeJavaScript("testObject.setCharValue(42);");
177 assertEquals('\u0000', mTestObject.waitForCharValue());
179 executeJavaScript("testObject.setShortValue(42);");
180 assertEquals(42, mTestObject.waitForShortValue());
181 executeJavaScript("testObject.setShortValue(" + Short.MAX_VALUE + " + 42);");
182 assertEquals(Short.MIN_VALUE + 42 - 1, mTestObject.waitForShortValue());
184 executeJavaScript("testObject.setIntValue(42);");
185 assertEquals(42, mTestObject.waitForIntValue());
187 executeJavaScript("testObject.setLongValue(42);");
188 assertEquals(42L, mTestObject.waitForLongValue());
190 executeJavaScript("testObject.setFloatValue(42);");
191 assertEquals(42.0f, mTestObject.waitForFloatValue());
193 executeJavaScript("testObject.setDoubleValue(42);");
194 assertEquals(42.0, mTestObject.waitForDoubleValue());
196 // LIVECONNECT_COMPLIANCE: Should create an instance of java.lang.Number.
197 executeJavaScript("testObject.setObjectValue(42);");
198 assertNull(mTestObject.waitForObjectValue());
200 // The spec allows the JS engine flexibility in how to format the number.
201 executeJavaScript("testObject.setStringValue(42);");
202 String str = mTestObject.waitForStringValue();
203 assertTrue("42".equals(str) || "42.0".equals(str));
205 executeJavaScript("testObject.setBooleanValue(0);");
206 assertFalse(mTestObject.waitForBooleanValue());
207 // LIVECONNECT_COMPLIANCE: Should be true;
208 executeJavaScript("testObject.setBooleanValue(42);");
209 assertFalse(mTestObject.waitForBooleanValue());
211 // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
212 executeJavaScript("testObject.setCustomTypeValue(42);");
213 assertNull(mTestObject.waitForCustomTypeValue());
216 // Test passing a floating-point JavaScript number to a method of an
217 // injected object. JavaScript represents these values as doubles.
219 @Feature({"AndroidWebView", "Android-JavaBridge"})
220 public void testPassNumberDouble() throws Throwable {
221 executeJavaScript("testObject.setByteValue(42.1);");
222 assertEquals(42, mTestObject.waitForByteValue());
223 executeJavaScript("testObject.setByteValue(" + Byte.MAX_VALUE + " + 42.1);");
224 assertEquals(Byte.MIN_VALUE + 42 - 1, mTestObject.waitForByteValue());
225 executeJavaScript("testObject.setByteValue(" + Byte.MIN_VALUE + " - 42.1);");
226 assertEquals(Byte.MAX_VALUE - 42 + 1, mTestObject.waitForByteValue());
227 executeJavaScript("testObject.setByteValue(" + Integer.MAX_VALUE + " + 42.1);");
228 assertEquals(-1, mTestObject.waitForByteValue());
229 executeJavaScript("testObject.setByteValue(" + Integer.MIN_VALUE + " - 42.1);");
230 assertEquals(0, mTestObject.waitForByteValue());
232 // LIVECONNECT_COMPLIANCE: Should convert to numeric char value.
233 executeJavaScript("testObject.setCharValue(42.1);");
234 assertEquals('\u0000', mTestObject.waitForCharValue());
236 executeJavaScript("testObject.setShortValue(42.1);");
237 assertEquals(42, mTestObject.waitForShortValue());
238 executeJavaScript("testObject.setShortValue(" + Short.MAX_VALUE + " + 42.1);");
239 assertEquals(Short.MIN_VALUE + 42 - 1, mTestObject.waitForShortValue());
240 executeJavaScript("testObject.setShortValue(" + Short.MIN_VALUE + " - 42.1);");
241 assertEquals(Short.MAX_VALUE - 42 + 1, mTestObject.waitForShortValue());
242 executeJavaScript("testObject.setShortValue(" + Integer.MAX_VALUE + " + 42.1);");
243 assertEquals(-1, mTestObject.waitForShortValue());
244 executeJavaScript("testObject.setShortValue(" + Integer.MIN_VALUE + " - 42.1);");
245 assertEquals(0, mTestObject.waitForShortValue());
247 executeJavaScript("testObject.setIntValue(42.1);");
248 assertEquals(42, mTestObject.waitForIntValue());
249 executeJavaScript("testObject.setIntValue(" + Integer.MAX_VALUE + " + 42.1);");
250 assertEquals(Integer.MAX_VALUE, mTestObject.waitForIntValue());
251 executeJavaScript("testObject.setIntValue(" + Integer.MIN_VALUE + " - 42.1);");
252 assertEquals(Integer.MIN_VALUE, mTestObject.waitForIntValue());
254 executeJavaScript("testObject.setLongValue(42.1);");
255 assertEquals(42L, mTestObject.waitForLongValue());
256 executeJavaScript("testObject.setLongValue(" + Long.MAX_VALUE + " + 42.1);");
257 assertEquals(Long.MAX_VALUE, mTestObject.waitForLongValue());
258 executeJavaScript("testObject.setLongValue(" + Long.MIN_VALUE + " - 42.1);");
259 assertEquals(Long.MIN_VALUE, mTestObject.waitForLongValue());
261 executeJavaScript("testObject.setFloatValue(42.1);");
262 assertEquals(42.1f, mTestObject.waitForFloatValue());
264 executeJavaScript("testObject.setDoubleValue(42.1);");
265 assertEquals(42.1, mTestObject.waitForDoubleValue());
267 // LIVECONNECT_COMPLIANCE: Should create an instance of java.lang.Number.
268 executeJavaScript("testObject.setObjectValue(42.1);");
269 assertNull(mTestObject.waitForObjectValue());
271 executeJavaScript("testObject.setStringValue(42.1);");
272 assertEquals("42.1", mTestObject.waitForStringValue());
274 executeJavaScript("testObject.setBooleanValue(0.0);");
275 assertFalse(mTestObject.waitForBooleanValue());
276 // LIVECONNECT_COMPLIANCE: Should be true.
277 executeJavaScript("testObject.setBooleanValue(42.1);");
278 assertFalse(mTestObject.waitForBooleanValue());
280 // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
281 executeJavaScript("testObject.setCustomTypeValue(42.1);");
282 assertNull(mTestObject.waitForCustomTypeValue());
285 // Test passing JavaScript NaN to a method of an injected object.
287 @Feature({"AndroidWebView", "Android-JavaBridge"})
288 public void testPassNumberNaN() throws Throwable {
289 executeJavaScript("testObject.setByteValue(Number.NaN);");
290 assertEquals(0, mTestObject.waitForByteValue());
292 executeJavaScript("testObject.setCharValue(Number.NaN);");
293 assertEquals('\u0000', mTestObject.waitForCharValue());
295 executeJavaScript("testObject.setShortValue(Number.NaN);");
296 assertEquals(0, mTestObject.waitForShortValue());
298 executeJavaScript("testObject.setIntValue(Number.NaN);");
299 assertEquals(0, mTestObject.waitForIntValue());
301 executeJavaScript("testObject.setLongValue(Number.NaN);");
302 assertEquals(0L, mTestObject.waitForLongValue());
304 executeJavaScript("testObject.setFloatValue(Number.NaN);");
305 assertEquals(Float.NaN, mTestObject.waitForFloatValue());
307 executeJavaScript("testObject.setDoubleValue(Number.NaN);");
308 assertEquals(Double.NaN, mTestObject.waitForDoubleValue());
310 // LIVECONNECT_COMPLIANCE: Should create an instance of java.lang.Number.
311 executeJavaScript("testObject.setObjectValue(Number.NaN);");
312 assertNull(mTestObject.waitForObjectValue());
314 executeJavaScript("testObject.setStringValue(Number.NaN);");
315 assertEquals("NaN", mTestObject.waitForStringValue());
317 executeJavaScript("testObject.setBooleanValue(Number.NaN);");
318 assertFalse(mTestObject.waitForBooleanValue());
320 // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
321 executeJavaScript("testObject.setCustomTypeValue(Number.NaN);");
322 assertNull(mTestObject.waitForCustomTypeValue());
325 // Test passing JavaScript infinity to a method of an injected object.
327 @Feature({"AndroidWebView", "Android-JavaBridge"})
328 public void testPassNumberInfinity() throws Throwable {
329 executeJavaScript("testObject.setByteValue(Infinity);");
330 assertEquals(-1, mTestObject.waitForByteValue());
332 // LIVECONNECT_COMPLIANCE: Should convert to maximum numeric char value.
333 executeJavaScript("testObject.setCharValue(Infinity);");
334 assertEquals('\u0000', mTestObject.waitForCharValue());
336 executeJavaScript("testObject.setShortValue(Infinity);");
337 assertEquals(-1, mTestObject.waitForShortValue());
339 executeJavaScript("testObject.setIntValue(Infinity);");
340 assertEquals(Integer.MAX_VALUE, mTestObject.waitForIntValue());
342 executeJavaScript("testObject.setLongValue(Infinity);");
343 assertEquals(Long.MAX_VALUE, mTestObject.waitForLongValue());
345 executeJavaScript("testObject.setFloatValue(Infinity);");
346 assertEquals(Float.POSITIVE_INFINITY, mTestObject.waitForFloatValue());
348 executeJavaScript("testObject.setDoubleValue(Infinity);");
349 assertEquals(Double.POSITIVE_INFINITY, mTestObject.waitForDoubleValue());
351 // LIVECONNECT_COMPLIANCE: Should create an instance of java.lang.Number.
352 executeJavaScript("testObject.setObjectValue(Infinity);");
353 assertNull(mTestObject.waitForObjectValue());
355 executeJavaScript("testObject.setStringValue(Infinity);");
356 assertEquals("Inf", mTestObject.waitForStringValue());
358 executeJavaScript("testObject.setBooleanValue(Infinity);");
359 assertFalse(mTestObject.waitForBooleanValue());
361 // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
362 executeJavaScript("testObject.setCustomTypeValue(Infinity);");
363 assertNull(mTestObject.waitForCustomTypeValue());
366 // Test passing a JavaScript boolean to a method of an injected object.
368 @Feature({"AndroidWebView", "Android-JavaBridge"})
369 public void testPassBoolean() throws Throwable {
370 executeJavaScript("testObject.setBooleanValue(true);");
371 assertTrue(mTestObject.waitForBooleanValue());
372 executeJavaScript("testObject.setBooleanValue(false);");
373 assertFalse(mTestObject.waitForBooleanValue());
375 // LIVECONNECT_COMPLIANCE: Should create an instance of java.lang.Boolean.
376 executeJavaScript("testObject.setObjectValue(true);");
377 assertNull(mTestObject.waitForObjectValue());
379 executeJavaScript("testObject.setStringValue(false);");
380 assertEquals("false", mTestObject.waitForStringValue());
381 executeJavaScript("testObject.setStringValue(true);");
382 assertEquals("true", mTestObject.waitForStringValue());
384 // LIVECONNECT_COMPLIANCE: Should be 1.
385 executeJavaScript("testObject.setByteValue(true);");
386 assertEquals(0, mTestObject.waitForByteValue());
387 executeJavaScript("testObject.setByteValue(false);");
388 assertEquals(0, mTestObject.waitForByteValue());
390 // LIVECONNECT_COMPLIANCE: Should convert to numeric char value 1.
391 executeJavaScript("testObject.setCharValue(true);");
392 assertEquals('\u0000', mTestObject.waitForCharValue());
393 executeJavaScript("testObject.setCharValue(false);");
394 assertEquals('\u0000', mTestObject.waitForCharValue());
396 // LIVECONNECT_COMPLIANCE: Should be 1.
397 executeJavaScript("testObject.setShortValue(true);");
398 assertEquals(0, mTestObject.waitForShortValue());
399 executeJavaScript("testObject.setShortValue(false);");
400 assertEquals(0, mTestObject.waitForShortValue());
402 // LIVECONNECT_COMPLIANCE: Should be 1.
403 executeJavaScript("testObject.setIntValue(true);");
404 assertEquals(0, mTestObject.waitForIntValue());
405 executeJavaScript("testObject.setIntValue(false);");
406 assertEquals(0, mTestObject.waitForIntValue());
408 // LIVECONNECT_COMPLIANCE: Should be 1.
409 executeJavaScript("testObject.setLongValue(true);");
410 assertEquals(0L, mTestObject.waitForLongValue());
411 executeJavaScript("testObject.setLongValue(false);");
412 assertEquals(0L, mTestObject.waitForLongValue());
414 // LIVECONNECT_COMPLIANCE: Should be 1.0.
415 executeJavaScript("testObject.setFloatValue(true);");
416 assertEquals(0.0f, mTestObject.waitForFloatValue());
417 executeJavaScript("testObject.setFloatValue(false);");
418 assertEquals(0.0f, mTestObject.waitForFloatValue());
420 // LIVECONNECT_COMPLIANCE: Should be 1.0.
421 executeJavaScript("testObject.setDoubleValue(true);");
422 assertEquals(0.0, mTestObject.waitForDoubleValue());
423 executeJavaScript("testObject.setDoubleValue(false);");
424 assertEquals(0.0, mTestObject.waitForDoubleValue());
426 // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
427 executeJavaScript("testObject.setCustomTypeValue(true);");
428 assertNull(mTestObject.waitForCustomTypeValue());
431 // Test passing a JavaScript string to a method of an injected object.
433 @Feature({"AndroidWebView", "Android-JavaBridge"})
434 public void testPassString() throws Throwable {
435 executeJavaScript("testObject.setStringValue(\"+042.10\");");
436 assertEquals("+042.10", mTestObject.waitForStringValue());
438 // Make sure that we distinguish between the empty string and NULL.
439 executeJavaScript("testObject.setStringValue(\"\");");
440 assertEquals("", mTestObject.waitForStringValue());
442 // LIVECONNECT_COMPLIANCE: Should create an instance of java.lang.String.
443 executeJavaScript("testObject.setObjectValue(\"+042.10\");");
444 assertNull(mTestObject.waitForObjectValue());
446 // LIVECONNECT_COMPLIANCE: Should use valueOf() of appropriate type.
447 executeJavaScript("testObject.setByteValue(\"+042.10\");");
448 assertEquals(0, mTestObject.waitForByteValue());
450 // LIVECONNECT_COMPLIANCE: Should use valueOf() of appropriate type.
451 executeJavaScript("testObject.setShortValue(\"+042.10\");");
452 assertEquals(0, mTestObject.waitForShortValue());
454 // LIVECONNECT_COMPLIANCE: Should use valueOf() of appropriate type.
455 executeJavaScript("testObject.setIntValue(\"+042.10\");");
456 assertEquals(0, mTestObject.waitForIntValue());
458 // LIVECONNECT_COMPLIANCE: Should use valueOf() of appropriate type.
459 executeJavaScript("testObject.setLongValue(\"+042.10\");");
460 assertEquals(0L, mTestObject.waitForLongValue());
462 // LIVECONNECT_COMPLIANCE: Should use valueOf() of appropriate type.
463 executeJavaScript("testObject.setFloatValue(\"+042.10\");");
464 assertEquals(0.0f, mTestObject.waitForFloatValue());
466 // LIVECONNECT_COMPLIANCE: Should use valueOf() of appropriate type.
467 executeJavaScript("testObject.setDoubleValue(\"+042.10\");");
468 assertEquals(0.0, mTestObject.waitForDoubleValue());
470 // LIVECONNECT_COMPLIANCE: Should decode and convert to numeric char value.
471 executeJavaScript("testObject.setCharValue(\"+042.10\");");
472 assertEquals('\u0000', mTestObject.waitForCharValue());
474 // LIVECONNECT_COMPLIANCE: Non-empty string should convert to true.
475 executeJavaScript("testObject.setBooleanValue(\"+042.10\");");
476 assertFalse(mTestObject.waitForBooleanValue());
478 // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
479 executeJavaScript("testObject.setCustomTypeValue(\"+042.10\");");
480 assertNull(mTestObject.waitForCustomTypeValue());
483 // Test passing a JavaScript object to a method of an injected object.
485 @Feature({"AndroidWebView", "Android-JavaBridge"})
486 public void testPassJavaScriptObject() throws Throwable {
487 // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
488 executeJavaScript("testObject.setObjectValue({foo: 42});");
489 assertNull(mTestObject.waitForObjectValue());
491 // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
492 executeJavaScript("testObject.setCustomTypeValue({foo: 42});");
493 assertNull(mTestObject.waitForCustomTypeValue());
495 // LIVECONNECT_COMPLIANCE: Should call toString() on object.
496 executeJavaScript("testObject.setStringValue({foo: 42});");
497 assertEquals("undefined", mTestObject.waitForStringValue());
499 // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
500 executeJavaScript("testObject.setByteValue({foo: 42});");
501 assertEquals(0, mTestObject.waitForByteValue());
503 // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
504 executeJavaScript("testObject.setCharValue({foo: 42});");
505 assertEquals('\u0000', mTestObject.waitForCharValue());
507 // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
508 executeJavaScript("testObject.setShortValue({foo: 42});");
509 assertEquals(0, mTestObject.waitForShortValue());
511 // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
512 executeJavaScript("testObject.setIntValue({foo: 42});");
513 assertEquals(0, mTestObject.waitForIntValue());
515 // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
516 executeJavaScript("testObject.setLongValue({foo: 42});");
517 assertEquals(0L, mTestObject.waitForLongValue());
519 // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
520 executeJavaScript("testObject.setFloatValue({foo: 42});");
521 assertEquals(0.0f, mTestObject.waitForFloatValue());
523 // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
524 executeJavaScript("testObject.setDoubleValue({foo: 42});");
525 assertEquals(0.0, mTestObject.waitForDoubleValue());
527 // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
528 executeJavaScript("testObject.setBooleanValue({foo: 42});");
529 assertFalse(mTestObject.waitForBooleanValue());
532 // Test passing a Java object to a method of an injected object. Note that
533 // this test requires being able to return objects from the methods of
534 // injected objects. This is tested elsewhere.
536 @Feature({"AndroidWebView", "Android-JavaBridge"})
537 public void testPassJavaObject() throws Throwable {
538 executeJavaScript("testObject.setObjectValue(testObject.getObjectInstance());");
539 assertTrue(mTestObject.getObjectInstance() == mTestObject.waitForObjectValue());
540 executeJavaScript("testObject.setObjectValue(testObject.getCustomTypeInstance());");
541 assertTrue(mTestObject.getCustomTypeInstance() == mTestObject.waitForObjectValue());
543 executeJavaScript("testObject.setCustomTypeValue(testObject.getObjectInstance());");
544 assertTrue(mTestObject.getObjectInstance() == mTestObject.waitForCustomTypeValue());
545 executeJavaScript("testObject.setCustomTypeValue(testObject.getCustomTypeInstance());");
546 assertTrue(mTestObject.getCustomTypeInstance() == mTestObject.waitForCustomTypeValue());
547 // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception, as the types are unrelated.
548 executeJavaScript("testObject.setCustomTypeValue(testObject.getCustomType2Instance());");
549 assertTrue(mTestObject.getCustomType2Instance() ==
550 (Object)mTestObject.waitForCustomTypeValue());
552 // LIVECONNECT_COMPLIANCE: Should call toString() on object.
553 executeJavaScript("testObject.setStringValue(testObject.getObjectInstance());");
554 assertEquals("undefined", mTestObject.waitForStringValue());
556 // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
557 executeJavaScript("testObject.setByteValue(testObject.getObjectInstance());");
558 assertEquals(0, mTestObject.waitForByteValue());
560 // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
561 executeJavaScript("testObject.setCharValue(testObject.getObjectInstance());");
562 assertEquals('\u0000', mTestObject.waitForCharValue());
564 // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
565 executeJavaScript("testObject.setShortValue(testObject.getObjectInstance());");
566 assertEquals(0, mTestObject.waitForShortValue());
568 // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
569 executeJavaScript("testObject.setIntValue(testObject.getObjectInstance());");
570 assertEquals(0, mTestObject.waitForIntValue());
572 // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
573 executeJavaScript("testObject.setLongValue(testObject.getObjectInstance());");
574 assertEquals(0L, mTestObject.waitForLongValue());
576 // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
577 executeJavaScript("testObject.setFloatValue(testObject.getObjectInstance());");
578 assertEquals(0.0f, mTestObject.waitForFloatValue());
580 // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
581 executeJavaScript("testObject.setDoubleValue(testObject.getObjectInstance());");
582 assertEquals(0.0, mTestObject.waitForDoubleValue());
584 // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
585 executeJavaScript("testObject.setBooleanValue(testObject.getObjectInstance());");
586 assertFalse(mTestObject.waitForBooleanValue());
589 // Test passing JavaScript null to a method of an injected object.
591 @Feature({"AndroidWebView", "Android-JavaBridge"})
592 public void testPassNull() throws Throwable {
593 executeJavaScript("testObject.setObjectValue(null);");
594 assertNull(mTestObject.waitForObjectValue());
596 executeJavaScript("testObject.setCustomTypeValue(null);");
597 assertNull(mTestObject.waitForCustomTypeValue());
599 executeJavaScript("testObject.setStringValue(null);");
600 assertNull(mTestObject.waitForStringValue());
602 executeJavaScript("testObject.setByteValue(null);");
603 assertEquals(0, mTestObject.waitForByteValue());
605 executeJavaScript("testObject.setCharValue(null);");
606 assertEquals('\u0000', mTestObject.waitForCharValue());
608 executeJavaScript("testObject.setShortValue(null);");
609 assertEquals(0, mTestObject.waitForShortValue());
611 executeJavaScript("testObject.setIntValue(null);");
612 assertEquals(0, mTestObject.waitForIntValue());
614 executeJavaScript("testObject.setLongValue(null);");
615 assertEquals(0L, mTestObject.waitForLongValue());
617 executeJavaScript("testObject.setFloatValue(null);");
618 assertEquals(0.0f, mTestObject.waitForFloatValue());
620 executeJavaScript("testObject.setDoubleValue(null);");
621 assertEquals(0.0, mTestObject.waitForDoubleValue());
623 executeJavaScript("testObject.setBooleanValue(null);");
624 assertFalse(mTestObject.waitForBooleanValue());
627 // Test passing JavaScript undefined to a method of an injected object.
629 @Feature({"AndroidWebView", "Android-JavaBridge"})
630 public void testPassUndefined() throws Throwable {
631 executeJavaScript("testObject.setObjectValue(undefined);");
632 assertNull(mTestObject.waitForObjectValue());
634 executeJavaScript("testObject.setCustomTypeValue(undefined);");
635 assertNull(mTestObject.waitForCustomTypeValue());
637 // LIVECONNECT_COMPLIANCE: Should be NULL.
638 executeJavaScript("testObject.setStringValue(undefined);");
639 assertEquals("undefined", mTestObject.waitForStringValue());
641 executeJavaScript("testObject.setByteValue(undefined);");
642 assertEquals(0, mTestObject.waitForByteValue());
644 executeJavaScript("testObject.setCharValue(undefined);");
645 assertEquals('\u0000', mTestObject.waitForCharValue());
647 executeJavaScript("testObject.setShortValue(undefined);");
648 assertEquals(0, mTestObject.waitForShortValue());
650 executeJavaScript("testObject.setIntValue(undefined);");
651 assertEquals(0, mTestObject.waitForIntValue());
653 executeJavaScript("testObject.setLongValue(undefined);");
654 assertEquals(0L, mTestObject.waitForLongValue());
656 executeJavaScript("testObject.setFloatValue(undefined);");
657 assertEquals(0.0f, mTestObject.waitForFloatValue());
659 executeJavaScript("testObject.setDoubleValue(undefined);");
660 assertEquals(0.0, mTestObject.waitForDoubleValue());
662 executeJavaScript("testObject.setBooleanValue(undefined);");
663 assertFalse(mTestObject.waitForBooleanValue());