JavaBridgeCoercionTest.java revision 5821806d5e7f356e8fa4b058a389a808ea183019
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.
4
5package org.chromium.content.browser;
6
7import android.test.suitebuilder.annotation.SmallTest;
8
9import org.chromium.base.test.util.Feature;
10import org.chromium.base.test.util.DisabledTest;
11
12/**
13 * Part of the test suite for the Java Bridge. This class tests that
14 * we correctly convert JavaScript values to Java values when passing them to
15 * the methods of injected Java objects.
16 *
17 * The conversions should follow
18 * http://jdk6.java.net/plugin2/liveconnect/#JS_JAVA_CONVERSIONS. Places in
19 * which the implementation differs from the spec are marked with
20 * LIVECONNECT_COMPLIANCE.
21 * FIXME: Consider making our implementation more compliant, if it will not
22 * break backwards-compatibility. See b/4408210.
23 */
24public class JavaBridgeCoercionTest extends JavaBridgeTestBase {
25    private class TestObject extends Controller {
26        private Object objectInstance;
27        private CustomType customTypeInstance;
28        private CustomType2 customType2Instance;
29
30        private boolean mBooleanValue;
31        private byte mByteValue;
32        private char mCharValue;
33        private short mShortValue;
34        private int mIntValue;
35        private long mLongValue;
36        private float mFloatValue;
37        private double mDoubleValue;
38        private String mStringValue;
39        private Object mObjectValue;
40        private CustomType mCustomTypeValue;
41
42        public TestObject() {
43            objectInstance = new Object();
44            customTypeInstance = new CustomType();
45            customType2Instance = new CustomType2();
46        }
47
48        public Object getObjectInstance() {
49            return objectInstance;
50        }
51        public CustomType getCustomTypeInstance() {
52            return customTypeInstance;
53        }
54        public CustomType2 getCustomType2Instance() {
55            return customType2Instance;
56        }
57
58        public synchronized void setBooleanValue(boolean x) {
59            mBooleanValue = x;
60            notifyResultIsReady();
61        }
62        public synchronized void setByteValue(byte x) {
63            mByteValue = x;
64            notifyResultIsReady();
65        }
66        public synchronized void setCharValue(char x) {
67            mCharValue = x;
68            notifyResultIsReady();
69        }
70        public synchronized void setShortValue(short x) {
71            mShortValue = x;
72            notifyResultIsReady();
73        }
74        public synchronized void setIntValue(int x) {
75            mIntValue = x;
76            notifyResultIsReady();
77        }
78        public synchronized void setLongValue(long x) {
79            mLongValue = x;
80            notifyResultIsReady();
81        }
82        public synchronized void setFloatValue(float x) {
83            mFloatValue = x;
84            notifyResultIsReady();
85        }
86        public synchronized void setDoubleValue(double x) {
87            mDoubleValue = x;
88            notifyResultIsReady();
89        }
90        public synchronized void setStringValue(String x) {
91            mStringValue = x;
92            notifyResultIsReady();
93        }
94        public synchronized void setObjectValue(Object x) {
95            mObjectValue = x;
96            notifyResultIsReady();
97        }
98        public synchronized void setCustomTypeValue(CustomType x) {
99            mCustomTypeValue = x;
100            notifyResultIsReady();
101        }
102
103        public synchronized boolean waitForBooleanValue() {
104            waitForResult();
105            return mBooleanValue;
106        }
107        public synchronized byte waitForByteValue() {
108            waitForResult();
109            return mByteValue;
110        }
111        public synchronized char waitForCharValue() {
112            waitForResult();
113            return mCharValue;
114        }
115        public synchronized short waitForShortValue() {
116            waitForResult();
117            return mShortValue;
118        }
119        public synchronized int waitForIntValue() {
120            waitForResult();
121            return mIntValue;
122        }
123        public synchronized long waitForLongValue() {
124            waitForResult();
125            return mLongValue;
126        }
127        public synchronized float waitForFloatValue() {
128            waitForResult();
129            return mFloatValue;
130        }
131        public synchronized double waitForDoubleValue() {
132            waitForResult();
133            return mDoubleValue;
134        }
135        public synchronized String waitForStringValue() {
136            waitForResult();
137            return mStringValue;
138        }
139        public synchronized Object waitForObjectValue() {
140            waitForResult();
141            return mObjectValue;
142        }
143        public synchronized CustomType waitForCustomTypeValue() {
144            waitForResult();
145            return mCustomTypeValue;
146        }
147    }
148
149    // Two custom types used when testing passing objects.
150    private static class CustomType {
151    }
152    private static class CustomType2 {
153    }
154
155    private TestObject mTestObject;
156
157    @Override
158    protected void setUp() throws Exception {
159        super.setUp();
160        mTestObject = new TestObject();
161        setUpContentView(mTestObject, "testObject");
162    }
163
164    // Test passing a JavaScript number in the int32 range to a method of an
165    // injected object.
166    @SmallTest
167    @Feature({"AndroidWebView", "Android-JavaBridge"})
168    public void testPassNumberInt32() throws Throwable {
169        executeJavaScript("testObject.setByteValue(42);");
170        assertEquals(42, mTestObject.waitForByteValue());
171        executeJavaScript("testObject.setByteValue(" + Byte.MAX_VALUE + " + 42);");
172        assertEquals(Byte.MIN_VALUE + 42 - 1, mTestObject.waitForByteValue());
173
174        // LIVECONNECT_COMPLIANCE: Should convert to numeric char value.
175        executeJavaScript("testObject.setCharValue(42);");
176        assertEquals('\u0000', mTestObject.waitForCharValue());
177
178        executeJavaScript("testObject.setShortValue(42);");
179        assertEquals(42, mTestObject.waitForShortValue());
180        executeJavaScript("testObject.setShortValue(" + Short.MAX_VALUE + " + 42);");
181        assertEquals(Short.MIN_VALUE + 42 - 1, mTestObject.waitForShortValue());
182
183        executeJavaScript("testObject.setIntValue(42);");
184        assertEquals(42, mTestObject.waitForIntValue());
185
186        executeJavaScript("testObject.setLongValue(42);");
187        assertEquals(42L, mTestObject.waitForLongValue());
188
189        executeJavaScript("testObject.setFloatValue(42);");
190        assertEquals(42.0f, mTestObject.waitForFloatValue());
191
192        executeJavaScript("testObject.setDoubleValue(42);");
193        assertEquals(42.0, mTestObject.waitForDoubleValue());
194
195        // LIVECONNECT_COMPLIANCE: Should create an instance of java.lang.Number.
196        executeJavaScript("testObject.setObjectValue(42);");
197        assertNull(mTestObject.waitForObjectValue());
198
199        // The spec allows the JS engine flexibility in how to format the number.
200        executeJavaScript("testObject.setStringValue(42);");
201        String str = mTestObject.waitForStringValue();
202        assertTrue("42".equals(str) || "42.0".equals(str));
203
204        executeJavaScript("testObject.setBooleanValue(0);");
205        assertFalse(mTestObject.waitForBooleanValue());
206        // LIVECONNECT_COMPLIANCE: Should be true;
207        executeJavaScript("testObject.setBooleanValue(42);");
208        assertFalse(mTestObject.waitForBooleanValue());
209
210        // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
211        executeJavaScript("testObject.setCustomTypeValue(42);");
212        assertNull(mTestObject.waitForCustomTypeValue());
213    }
214
215    // Test passing a JavaScript number in the double range to a method of an
216    // injected object.
217    /*
218    @SmallTest
219    @Feature({"AndroidWebView", "Android-JavaBridge"})
220      Bug: http://code.google.com/p/chromium/issues/detail?id=145881
221    */
222    @DisabledTest
223    public void testPassNumberDouble() throws Throwable {
224        executeJavaScript("testObject.setByteValue(42.1);");
225        assertEquals(42, mTestObject.waitForByteValue());
226        executeJavaScript("testObject.setByteValue(" + Byte.MAX_VALUE + " + 42.1);");
227        assertEquals(Byte.MIN_VALUE + 42 - 1, mTestObject.waitForByteValue());
228        executeJavaScript("testObject.setByteValue(" + Integer.MAX_VALUE + " + 42.1);");
229        assertEquals(-1, mTestObject.waitForByteValue());
230
231        // LIVECONNECT_COMPLIANCE: Should convert to numeric char value.
232        executeJavaScript("testObject.setCharValue(42.1);");
233        assertEquals('\u0000', mTestObject.waitForCharValue());
234
235        executeJavaScript("testObject.setShortValue(42.1);");
236        assertEquals(42, mTestObject.waitForShortValue());
237        executeJavaScript("testObject.setShortValue(" + Short.MAX_VALUE + " + 42.1);");
238        assertEquals(Short.MIN_VALUE + 42 - 1, mTestObject.waitForShortValue());
239        executeJavaScript("testObject.setShortValue(" + Integer.MAX_VALUE + " + 42.1);");
240        assertEquals(-1, mTestObject.waitForShortValue());
241
242        executeJavaScript("testObject.setIntValue(42.1);");
243        assertEquals(42, mTestObject.waitForIntValue());
244        executeJavaScript("testObject.setIntValue(" + Integer.MAX_VALUE + " + 42.1);");
245        assertEquals(Integer.MAX_VALUE, mTestObject.waitForIntValue());
246
247        executeJavaScript("testObject.setLongValue(42.1);");
248        assertEquals(42L, mTestObject.waitForLongValue());
249        // LIVECONNECT_COMPLIANCE: Should be Long.MAX_VALUE.
250        executeJavaScript("testObject.setLongValue(" + Long.MAX_VALUE + " + 42.1);");
251        assertEquals(Long.MIN_VALUE, mTestObject.waitForLongValue());
252
253        executeJavaScript("testObject.setFloatValue(42.1);");
254        assertEquals(42.1f, mTestObject.waitForFloatValue());
255
256        executeJavaScript("testObject.setDoubleValue(42.1);");
257        assertEquals(42.1, mTestObject.waitForDoubleValue());
258
259        // LIVECONNECT_COMPLIANCE: Should create an instance of java.lang.Number.
260        executeJavaScript("testObject.setObjectValue(42.1);");
261        assertNull(mTestObject.waitForObjectValue());
262
263        executeJavaScript("testObject.setStringValue(42.1);");
264        assertEquals("42.1", mTestObject.waitForStringValue());
265
266        executeJavaScript("testObject.setBooleanValue(0.0);");
267        assertFalse(mTestObject.waitForBooleanValue());
268        // LIVECONNECT_COMPLIANCE: Should be true.
269        executeJavaScript("testObject.setBooleanValue(42.1);");
270        assertFalse(mTestObject.waitForBooleanValue());
271
272        // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
273        executeJavaScript("testObject.setCustomTypeValue(42.1);");
274        assertNull(mTestObject.waitForCustomTypeValue());
275    }
276
277    // Test passing JavaScript NaN to a method of an injected object.
278    /*
279    @SmallTest
280    @Feature({"AndroidWebView", "Android-JavaBridge"})
281      Bug: http://code.google.com/p/chromium/issues/detail?id=145881
282    */
283    @DisabledTest
284    public void testPassNumberNaN() throws Throwable {
285        executeJavaScript("testObject.setByteValue(Number.NaN);");
286        assertEquals(0, mTestObject.waitForByteValue());
287
288        executeJavaScript("testObject.setCharValue(Number.NaN);");
289        assertEquals('\u0000', mTestObject.waitForCharValue());
290
291        executeJavaScript("testObject.setShortValue(Number.NaN);");
292        assertEquals(0, mTestObject.waitForShortValue());
293
294        executeJavaScript("testObject.setIntValue(Number.NaN);");
295        assertEquals(0, mTestObject.waitForIntValue());
296
297        executeJavaScript("testObject.setLongValue(Number.NaN);");
298        assertEquals(0L, mTestObject.waitForLongValue());
299
300        executeJavaScript("testObject.setFloatValue(Number.NaN);");
301        assertEquals(Float.NaN, mTestObject.waitForFloatValue());
302
303        executeJavaScript("testObject.setDoubleValue(Number.NaN);");
304        assertEquals(Double.NaN, mTestObject.waitForDoubleValue());
305
306        // LIVECONNECT_COMPLIANCE: Should create an instance of java.lang.Number.
307        executeJavaScript("testObject.setObjectValue(Number.NaN);");
308        assertNull(mTestObject.waitForObjectValue());
309
310        executeJavaScript("testObject.setStringValue(Number.NaN);");
311        assertEquals("NaN", mTestObject.waitForStringValue());
312
313        executeJavaScript("testObject.setBooleanValue(Number.NaN);");
314        assertFalse(mTestObject.waitForBooleanValue());
315
316        // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
317        executeJavaScript("testObject.setCustomTypeValue(Number.NaN);");
318        assertNull(mTestObject.waitForCustomTypeValue());
319    }
320
321    // Test passing JavaScript infinity to a method of an injected object.
322    /*
323    @SmallTest
324    @Feature({"AndroidWebView", "Android-JavaBridge"})
325      Bug: http://code.google.com/p/chromium/issues/detail?id=145881
326    */
327    @DisabledTest
328    public void testPassNumberInfinity() throws Throwable {
329        executeJavaScript("testObject.setByteValue(Infinity);");
330        assertEquals(-1, mTestObject.waitForByteValue());
331
332        // LIVECONNECT_COMPLIANCE: Should convert to maximum numeric char value.
333        executeJavaScript("testObject.setCharValue(Infinity);");
334        assertEquals('\u0000', mTestObject.waitForCharValue());
335
336        executeJavaScript("testObject.setShortValue(Infinity);");
337        assertEquals(-1, mTestObject.waitForShortValue());
338
339        executeJavaScript("testObject.setIntValue(Infinity);");
340        assertEquals(Integer.MAX_VALUE, mTestObject.waitForIntValue());
341
342        // LIVECONNECT_COMPLIANCE: Should be Long.MAX_VALUE.
343        executeJavaScript("testObject.setLongValue(Infinity);");
344        assertEquals(-1L, mTestObject.waitForLongValue());
345
346        executeJavaScript("testObject.setFloatValue(Infinity);");
347        assertEquals(Float.POSITIVE_INFINITY, mTestObject.waitForFloatValue());
348
349        executeJavaScript("testObject.setDoubleValue(Infinity);");
350        assertEquals(Double.POSITIVE_INFINITY, mTestObject.waitForDoubleValue());
351
352        // LIVECONNECT_COMPLIANCE: Should create an instance of java.lang.Number.
353        executeJavaScript("testObject.setObjectValue(Infinity);");
354        assertNull(mTestObject.waitForObjectValue());
355
356        executeJavaScript("testObject.setStringValue(Infinity);");
357        assertEquals("Inf", mTestObject.waitForStringValue());
358
359        executeJavaScript("testObject.setBooleanValue(Infinity);");
360        assertFalse(mTestObject.waitForBooleanValue());
361
362        // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
363        executeJavaScript("testObject.setCustomTypeValue(Infinity);");
364        assertNull(mTestObject.waitForCustomTypeValue());
365    }
366
367    // Test passing a JavaScript boolean to a method of an injected object.
368    @SmallTest
369    @Feature({"AndroidWebView", "Android-JavaBridge"})
370    public void testPassBoolean() throws Throwable {
371        executeJavaScript("testObject.setBooleanValue(true);");
372        assertTrue(mTestObject.waitForBooleanValue());
373        executeJavaScript("testObject.setBooleanValue(false);");
374        assertFalse(mTestObject.waitForBooleanValue());
375
376        // LIVECONNECT_COMPLIANCE: Should create an instance of java.lang.Boolean.
377        executeJavaScript("testObject.setObjectValue(true);");
378        assertNull(mTestObject.waitForObjectValue());
379
380        executeJavaScript("testObject.setStringValue(false);");
381        assertEquals("false", mTestObject.waitForStringValue());
382        executeJavaScript("testObject.setStringValue(true);");
383        assertEquals("true", mTestObject.waitForStringValue());
384
385        // LIVECONNECT_COMPLIANCE: Should be 1.
386        executeJavaScript("testObject.setByteValue(true);");
387        assertEquals(0, mTestObject.waitForByteValue());
388        executeJavaScript("testObject.setByteValue(false);");
389        assertEquals(0, mTestObject.waitForByteValue());
390
391        // LIVECONNECT_COMPLIANCE: Should convert to numeric char value 1.
392        executeJavaScript("testObject.setCharValue(true);");
393        assertEquals('\u0000', mTestObject.waitForCharValue());
394        executeJavaScript("testObject.setCharValue(false);");
395        assertEquals('\u0000', mTestObject.waitForCharValue());
396
397        // LIVECONNECT_COMPLIANCE: Should be 1.
398        executeJavaScript("testObject.setShortValue(true);");
399        assertEquals(0, mTestObject.waitForShortValue());
400        executeJavaScript("testObject.setShortValue(false);");
401        assertEquals(0, mTestObject.waitForShortValue());
402
403        // LIVECONNECT_COMPLIANCE: Should be 1.
404        executeJavaScript("testObject.setIntValue(true);");
405        assertEquals(0, mTestObject.waitForIntValue());
406        executeJavaScript("testObject.setIntValue(false);");
407        assertEquals(0, mTestObject.waitForIntValue());
408
409        // LIVECONNECT_COMPLIANCE: Should be 1.
410        executeJavaScript("testObject.setLongValue(true);");
411        assertEquals(0L, mTestObject.waitForLongValue());
412        executeJavaScript("testObject.setLongValue(false);");
413        assertEquals(0L, mTestObject.waitForLongValue());
414
415        // LIVECONNECT_COMPLIANCE: Should be 1.0.
416        executeJavaScript("testObject.setFloatValue(true);");
417        assertEquals(0.0f, mTestObject.waitForFloatValue());
418        executeJavaScript("testObject.setFloatValue(false);");
419        assertEquals(0.0f, mTestObject.waitForFloatValue());
420
421        // LIVECONNECT_COMPLIANCE: Should be 1.0.
422        executeJavaScript("testObject.setDoubleValue(true);");
423        assertEquals(0.0, mTestObject.waitForDoubleValue());
424        executeJavaScript("testObject.setDoubleValue(false);");
425        assertEquals(0.0, mTestObject.waitForDoubleValue());
426
427        // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
428        executeJavaScript("testObject.setCustomTypeValue(true);");
429        assertNull(mTestObject.waitForCustomTypeValue());
430    }
431
432    // Test passing a JavaScript string to a method of an injected object.
433    @SmallTest
434    @Feature({"AndroidWebView", "Android-JavaBridge"})
435    public void testPassString() throws Throwable {
436        executeJavaScript("testObject.setStringValue(\"+042.10\");");
437        assertEquals("+042.10", mTestObject.waitForStringValue());
438
439        // Make sure that we distinguish between the empty string and NULL.
440        executeJavaScript("testObject.setStringValue(\"\");");
441        assertEquals("", mTestObject.waitForStringValue());
442
443        // LIVECONNECT_COMPLIANCE: Should create an instance of java.lang.String.
444        executeJavaScript("testObject.setObjectValue(\"+042.10\");");
445        assertNull(mTestObject.waitForObjectValue());
446
447        // LIVECONNECT_COMPLIANCE: Should use valueOf() of appropriate type.
448        executeJavaScript("testObject.setByteValue(\"+042.10\");");
449        assertEquals(0, mTestObject.waitForByteValue());
450
451        // LIVECONNECT_COMPLIANCE: Should use valueOf() of appropriate type.
452        executeJavaScript("testObject.setShortValue(\"+042.10\");");
453        assertEquals(0, mTestObject.waitForShortValue());
454
455        // LIVECONNECT_COMPLIANCE: Should use valueOf() of appropriate type.
456        executeJavaScript("testObject.setIntValue(\"+042.10\");");
457        assertEquals(0, mTestObject.waitForIntValue());
458
459        // LIVECONNECT_COMPLIANCE: Should use valueOf() of appropriate type.
460        executeJavaScript("testObject.setLongValue(\"+042.10\");");
461        assertEquals(0L, mTestObject.waitForLongValue());
462
463        // LIVECONNECT_COMPLIANCE: Should use valueOf() of appropriate type.
464        executeJavaScript("testObject.setFloatValue(\"+042.10\");");
465        assertEquals(0.0f, mTestObject.waitForFloatValue());
466
467        // LIVECONNECT_COMPLIANCE: Should use valueOf() of appropriate type.
468        executeJavaScript("testObject.setDoubleValue(\"+042.10\");");
469        assertEquals(0.0, mTestObject.waitForDoubleValue());
470
471        // LIVECONNECT_COMPLIANCE: Should decode and convert to numeric char value.
472        executeJavaScript("testObject.setCharValue(\"+042.10\");");
473        assertEquals('\u0000', mTestObject.waitForCharValue());
474
475        // LIVECONNECT_COMPLIANCE: Non-empty string should convert to true.
476        executeJavaScript("testObject.setBooleanValue(\"+042.10\");");
477        assertFalse(mTestObject.waitForBooleanValue());
478
479        // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
480        executeJavaScript("testObject.setCustomTypeValue(\"+042.10\");");
481        assertNull(mTestObject.waitForCustomTypeValue());
482    }
483
484    // Test passing a JavaScript object to a method of an injected object.
485    @SmallTest
486    @Feature({"AndroidWebView", "Android-JavaBridge"})
487    public void testPassJavaScriptObject() throws Throwable {
488        // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
489        executeJavaScript("testObject.setObjectValue({foo: 42});");
490        assertNull(mTestObject.waitForObjectValue());
491
492        // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
493        executeJavaScript("testObject.setCustomTypeValue({foo: 42});");
494        assertNull(mTestObject.waitForCustomTypeValue());
495
496        // LIVECONNECT_COMPLIANCE: Should call toString() on object.
497        executeJavaScript("testObject.setStringValue({foo: 42});");
498        assertEquals("undefined", mTestObject.waitForStringValue());
499
500        // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
501        executeJavaScript("testObject.setByteValue({foo: 42});");
502        assertEquals(0, mTestObject.waitForByteValue());
503
504        // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
505        executeJavaScript("testObject.setCharValue({foo: 42});");
506        assertEquals('\u0000', mTestObject.waitForCharValue());
507
508        // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
509        executeJavaScript("testObject.setShortValue({foo: 42});");
510        assertEquals(0, mTestObject.waitForShortValue());
511
512        // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
513        executeJavaScript("testObject.setIntValue({foo: 42});");
514        assertEquals(0, mTestObject.waitForIntValue());
515
516        // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
517        executeJavaScript("testObject.setLongValue({foo: 42});");
518        assertEquals(0L, mTestObject.waitForLongValue());
519
520        // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
521        executeJavaScript("testObject.setFloatValue({foo: 42});");
522        assertEquals(0.0f, mTestObject.waitForFloatValue());
523
524        // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
525        executeJavaScript("testObject.setDoubleValue({foo: 42});");
526        assertEquals(0.0, mTestObject.waitForDoubleValue());
527
528        // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
529        executeJavaScript("testObject.setBooleanValue({foo: 42});");
530        assertFalse(mTestObject.waitForBooleanValue());
531    }
532
533    // Test passing a Java object to a method of an injected object. Note that
534    // this test requires being able to return objects from the methods of
535    // injected objects. This is tested elsewhere.
536    @SmallTest
537    @Feature({"AndroidWebView", "Android-JavaBridge"})
538    public void testPassJavaObject() throws Throwable {
539        executeJavaScript("testObject.setObjectValue(testObject.getObjectInstance());");
540        assertTrue(mTestObject.getObjectInstance() == mTestObject.waitForObjectValue());
541        executeJavaScript("testObject.setObjectValue(testObject.getCustomTypeInstance());");
542        assertTrue(mTestObject.getCustomTypeInstance() == mTestObject.waitForObjectValue());
543
544        executeJavaScript("testObject.setCustomTypeValue(testObject.getObjectInstance());");
545        assertTrue(mTestObject.getObjectInstance() == mTestObject.waitForCustomTypeValue());
546        executeJavaScript("testObject.setCustomTypeValue(testObject.getCustomTypeInstance());");
547        assertTrue(mTestObject.getCustomTypeInstance() == mTestObject.waitForCustomTypeValue());
548        // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception, as the types are unrelated.
549        executeJavaScript("testObject.setCustomTypeValue(testObject.getCustomType2Instance());");
550        assertTrue(mTestObject.getCustomType2Instance() ==
551                (Object)mTestObject.waitForCustomTypeValue());
552
553        // LIVECONNECT_COMPLIANCE: Should call toString() on object.
554        executeJavaScript("testObject.setStringValue(testObject.getObjectInstance());");
555        assertEquals("undefined", mTestObject.waitForStringValue());
556
557        // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
558        executeJavaScript("testObject.setByteValue(testObject.getObjectInstance());");
559        assertEquals(0, mTestObject.waitForByteValue());
560
561        // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
562        executeJavaScript("testObject.setCharValue(testObject.getObjectInstance());");
563        assertEquals('\u0000', mTestObject.waitForCharValue());
564
565        // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
566        executeJavaScript("testObject.setShortValue(testObject.getObjectInstance());");
567        assertEquals(0, mTestObject.waitForShortValue());
568
569        // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
570        executeJavaScript("testObject.setIntValue(testObject.getObjectInstance());");
571        assertEquals(0, mTestObject.waitForIntValue());
572
573        // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
574        executeJavaScript("testObject.setLongValue(testObject.getObjectInstance());");
575        assertEquals(0L, mTestObject.waitForLongValue());
576
577        // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
578        executeJavaScript("testObject.setFloatValue(testObject.getObjectInstance());");
579        assertEquals(0.0f, mTestObject.waitForFloatValue());
580
581        // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
582        executeJavaScript("testObject.setDoubleValue(testObject.getObjectInstance());");
583        assertEquals(0.0, mTestObject.waitForDoubleValue());
584
585        // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
586        executeJavaScript("testObject.setBooleanValue(testObject.getObjectInstance());");
587        assertFalse(mTestObject.waitForBooleanValue());
588    }
589
590    // Test passing JavaScript null to a method of an injected object.
591    @SmallTest
592    @Feature({"AndroidWebView", "Android-JavaBridge"})
593    public void testPassNull() throws Throwable {
594        executeJavaScript("testObject.setObjectValue(null);");
595        assertNull(mTestObject.waitForObjectValue());
596
597        executeJavaScript("testObject.setCustomTypeValue(null);");
598        assertNull(mTestObject.waitForCustomTypeValue());
599
600        executeJavaScript("testObject.setStringValue(null);");
601        assertNull(mTestObject.waitForStringValue());
602
603        executeJavaScript("testObject.setByteValue(null);");
604        assertEquals(0, mTestObject.waitForByteValue());
605
606        executeJavaScript("testObject.setCharValue(null);");
607        assertEquals('\u0000', mTestObject.waitForCharValue());
608
609        executeJavaScript("testObject.setShortValue(null);");
610        assertEquals(0, mTestObject.waitForShortValue());
611
612        executeJavaScript("testObject.setIntValue(null);");
613        assertEquals(0, mTestObject.waitForIntValue());
614
615        executeJavaScript("testObject.setLongValue(null);");
616        assertEquals(0L, mTestObject.waitForLongValue());
617
618        executeJavaScript("testObject.setFloatValue(null);");
619        assertEquals(0.0f, mTestObject.waitForFloatValue());
620
621        executeJavaScript("testObject.setDoubleValue(null);");
622        assertEquals(0.0, mTestObject.waitForDoubleValue());
623
624        executeJavaScript("testObject.setBooleanValue(null);");
625        assertFalse(mTestObject.waitForBooleanValue());
626    }
627
628    // Test passing JavaScript undefined to a method of an injected object.
629    @SmallTest
630    @Feature({"AndroidWebView", "Android-JavaBridge"})
631    public void testPassUndefined() throws Throwable {
632        executeJavaScript("testObject.setObjectValue(undefined);");
633        assertNull(mTestObject.waitForObjectValue());
634
635        executeJavaScript("testObject.setCustomTypeValue(undefined);");
636        assertNull(mTestObject.waitForCustomTypeValue());
637
638        // LIVECONNECT_COMPLIANCE: Should be NULL.
639        executeJavaScript("testObject.setStringValue(undefined);");
640        assertEquals("undefined", mTestObject.waitForStringValue());
641
642        executeJavaScript("testObject.setByteValue(undefined);");
643        assertEquals(0, mTestObject.waitForByteValue());
644
645        executeJavaScript("testObject.setCharValue(undefined);");
646        assertEquals('\u0000', mTestObject.waitForCharValue());
647
648        executeJavaScript("testObject.setShortValue(undefined);");
649        assertEquals(0, mTestObject.waitForShortValue());
650
651        executeJavaScript("testObject.setIntValue(undefined);");
652        assertEquals(0, mTestObject.waitForIntValue());
653
654        executeJavaScript("testObject.setLongValue(undefined);");
655        assertEquals(0L, mTestObject.waitForLongValue());
656
657        executeJavaScript("testObject.setFloatValue(undefined);");
658        assertEquals(0.0f, mTestObject.waitForFloatValue());
659
660        executeJavaScript("testObject.setDoubleValue(undefined);");
661        assertEquals(0.0, mTestObject.waitForDoubleValue());
662
663        executeJavaScript("testObject.setBooleanValue(undefined);");
664        assertFalse(mTestObject.waitForBooleanValue());
665    }
666}
667