JavaBridgeArrayCoercionTest.java revision 116680a4aac90f2aa7413d9095a592090648e557
1// Copyright 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;
10
11/**
12 * Part of the test suite for the Java Bridge. This class tests that we correctly convert
13 * JavaScript arrays to Java arrays when passing them to the methods of injected Java objects.
14 *
15 * The conversions should follow
16 * http://jdk6.java.net/plugin2/liveconnect/#JS_JAVA_CONVERSIONS. Places in
17 * which the implementation differs from the spec are marked with
18 * LIVECONNECT_COMPLIANCE.
19 * FIXME: Consider making our implementation more compliant, if it will not
20 * break backwards-compatibility. See b/4408210.
21 */
22public class JavaBridgeArrayCoercionTest extends JavaBridgeTestBase {
23    private class TestObject extends Controller {
24        private final Object mObjectInstance;
25        private final CustomType mCustomTypeInstance;
26
27        private boolean[] mBooleanArray;
28        private byte[] mByteArray;
29        private char[] mCharArray;
30        private short[] mShortArray;
31        private int[] mIntArray;
32        private long[] mLongArray;
33        private float[] mFloatArray;
34        private double[] mDoubleArray;
35        private String[] mStringArray;
36        private Object[] mObjectArray;
37        private CustomType[] mCustomTypeArray;
38
39        public TestObject() {
40            mObjectInstance = new Object();
41            mCustomTypeInstance = new CustomType();
42        }
43
44        public Object getObjectInstance() {
45            return mObjectInstance;
46        }
47        public CustomType getCustomTypeInstance() {
48            return mCustomTypeInstance;
49        }
50
51        public synchronized void setBooleanArray(boolean[] x) {
52            mBooleanArray = x;
53            notifyResultIsReady();
54        }
55        public synchronized void setByteArray(byte[] x) {
56            mByteArray = x;
57            notifyResultIsReady();
58        }
59        public synchronized void setCharArray(char[] x) {
60            mCharArray = x;
61            notifyResultIsReady();
62        }
63        public synchronized void setShortArray(short[] x) {
64            mShortArray = x;
65            notifyResultIsReady();
66        }
67        public synchronized void setIntArray(int[] x) {
68            mIntArray = x;
69            notifyResultIsReady();
70        }
71        public synchronized void setLongArray(long[] x) {
72            mLongArray = x;
73            notifyResultIsReady();
74        }
75        public synchronized void setFloatArray(float[] x) {
76            mFloatArray = x;
77            notifyResultIsReady();
78        }
79        public synchronized void setDoubleArray(double[] x) {
80            mDoubleArray = x;
81            notifyResultIsReady();
82        }
83        public synchronized void setStringArray(String[] x) {
84            mStringArray = x;
85            notifyResultIsReady();
86        }
87        public synchronized void setObjectArray(Object[] x) {
88            mObjectArray = x;
89            notifyResultIsReady();
90        }
91        public synchronized void setCustomTypeArray(CustomType[] x) {
92            mCustomTypeArray = x;
93            notifyResultIsReady();
94        }
95
96        public synchronized boolean[] waitForBooleanArray() {
97            waitForResult();
98            return mBooleanArray;
99        }
100        public synchronized byte[] waitForByteArray() {
101            waitForResult();
102            return mByteArray;
103        }
104        public synchronized char[] waitForCharArray() {
105            waitForResult();
106            return mCharArray;
107        }
108        public synchronized short[] waitForShortArray() {
109            waitForResult();
110            return mShortArray;
111        }
112        public synchronized int[] waitForIntArray() {
113            waitForResult();
114            return mIntArray;
115        }
116        public synchronized long[] waitForLongArray() {
117            waitForResult();
118            return mLongArray;
119        }
120        public synchronized float[] waitForFloatArray() {
121            waitForResult();
122            return mFloatArray;
123        }
124        public synchronized double[] waitForDoubleArray() {
125            waitForResult();
126            return mDoubleArray;
127        }
128        public synchronized String[] waitForStringArray() {
129            waitForResult();
130            return mStringArray;
131        }
132        public synchronized Object[] waitForObjectArray() {
133            waitForResult();
134            return mObjectArray;
135        }
136        public synchronized CustomType[] waitForCustomTypeArray() {
137            waitForResult();
138            return mCustomTypeArray;
139        }
140    }
141
142    // Two custom types used when testing passing objects.
143    private static class CustomType {
144    }
145
146    private TestObject mTestObject;
147
148    @Override
149    protected void setUp() throws Exception {
150        super.setUp();
151        mTestObject = new TestObject();
152        setUpContentView(mTestObject, "testObject");
153    }
154
155    // Note that all tests use a single element array for simplicity. We test
156    // multiple elements elsewhere.
157
158    // Test passing an array of JavaScript numbers in the int32 range to a
159    // method which takes a Java array.
160    @SmallTest
161    @Feature({"AndroidWebView", "Android-JavaBridge"})
162    public void testPassNumberInt32() throws Throwable {
163        executeJavaScript("testObject.setBooleanArray([0]);");
164        assertFalse(mTestObject.waitForBooleanArray()[0]);
165        // LIVECONNECT_COMPLIANCE: Should convert to boolean.
166        executeJavaScript("testObject.setBooleanArray([42]);");
167        assertFalse(mTestObject.waitForBooleanArray()[0]);
168
169        executeJavaScript("testObject.setByteArray([42]);");
170        assertEquals(42, mTestObject.waitForByteArray()[0]);
171
172        executeJavaScript("testObject.setCharArray([42]);");
173        assertEquals(42, mTestObject.waitForCharArray()[0]);
174
175        executeJavaScript("testObject.setShortArray([42]);");
176        assertEquals(42, mTestObject.waitForShortArray()[0]);
177
178        executeJavaScript("testObject.setIntArray([42]);");
179        assertEquals(42, mTestObject.waitForIntArray()[0]);
180
181        executeJavaScript("testObject.setLongArray([42]);");
182        assertEquals(42L, mTestObject.waitForLongArray()[0]);
183
184        executeJavaScript("testObject.setFloatArray([42]);");
185        assertEquals(42.0f, mTestObject.waitForFloatArray()[0]);
186
187        executeJavaScript("testObject.setDoubleArray([42]);");
188        assertEquals(42.0, mTestObject.waitForDoubleArray()[0]);
189
190        // LIVECONNECT_COMPLIANCE: Should create array and create instances of java.lang.Number.
191        executeJavaScript("testObject.setObjectArray([42]);");
192        assertNull(mTestObject.waitForObjectArray());
193
194        // LIVECONNECT_COMPLIANCE: Should create instances of java.lang.String.
195        executeJavaScript("testObject.setStringArray([42]);");
196        assertNull(mTestObject.waitForStringArray()[0]);
197
198        // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
199        executeJavaScript("testObject.setCustomTypeArray([42]);");
200        assertNull(mTestObject.waitForCustomTypeArray());
201    }
202
203    // Test passing an array of JavaScript numbers in the double range to a
204    // method which takes a Java array.
205    @SmallTest
206    @Feature({"AndroidWebView", "Android-JavaBridge"})
207    public void testPassNumberDouble() throws Throwable {
208        // LIVECONNECT_COMPLIANCE: Should convert to boolean.
209        executeJavaScript("testObject.setBooleanArray([42.1]);");
210        assertFalse(mTestObject.waitForBooleanArray()[0]);
211
212        executeJavaScript("testObject.setByteArray([42.1]);");
213        assertEquals(42, mTestObject.waitForByteArray()[0]);
214
215        // LIVECONNECT_COMPLIANCE: Should convert to numeric char value.
216        executeJavaScript("testObject.setCharArray([42.1]);");
217        assertEquals('\u0000', mTestObject.waitForCharArray()[0]);
218
219        executeJavaScript("testObject.setShortArray([42.1]);");
220        assertEquals(42, mTestObject.waitForShortArray()[0]);
221
222        executeJavaScript("testObject.setIntArray([42.1]);");
223        assertEquals(42, mTestObject.waitForIntArray()[0]);
224
225        executeJavaScript("testObject.setLongArray([42.1]);");
226        assertEquals(42L, mTestObject.waitForLongArray()[0]);
227
228        executeJavaScript("testObject.setFloatArray([42.1]);");
229        assertEquals(42.1f, mTestObject.waitForFloatArray()[0]);
230
231        executeJavaScript("testObject.setDoubleArray([42.1]);");
232        assertEquals(42.1, mTestObject.waitForDoubleArray()[0]);
233
234        // LIVECONNECT_COMPLIANCE: Should create array and create instances of java.lang.Number.
235        executeJavaScript("testObject.setObjectArray([42.1]);");
236        assertNull(mTestObject.waitForObjectArray());
237
238        // LIVECONNECT_COMPLIANCE: Should create instances of java.lang.String.
239        executeJavaScript("testObject.setStringArray([42.1]);");
240        assertNull(mTestObject.waitForStringArray()[0]);
241
242        // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
243        executeJavaScript("testObject.setCustomTypeArray([42.1]);");
244        assertNull(mTestObject.waitForCustomTypeArray());
245    }
246
247    // Test passing an array of JavaScript NaN values to a method which takes a
248    // Java array.
249    @SmallTest
250    @Feature({"AndroidWebView", "Android-JavaBridge"})
251    public void testPassNumberNaN() throws Throwable {
252        executeJavaScript("testObject.setBooleanArray([Number.NaN]);");
253        assertFalse(mTestObject.waitForBooleanArray()[0]);
254
255        executeJavaScript("testObject.setByteArray([Number.NaN]);");
256        assertEquals(0, mTestObject.waitForByteArray()[0]);
257
258        executeJavaScript("testObject.setCharArray([Number.NaN]);");
259        assertEquals('\u0000', mTestObject.waitForCharArray()[0]);
260
261        executeJavaScript("testObject.setShortArray([Number.NaN]);");
262        assertEquals(0, mTestObject.waitForShortArray()[0]);
263
264        executeJavaScript("testObject.setIntArray([Number.NaN]);");
265        assertEquals(0, mTestObject.waitForIntArray()[0]);
266
267        executeJavaScript("testObject.setLongArray([Number.NaN]);");
268        assertEquals(0L, mTestObject.waitForLongArray()[0]);
269
270        executeJavaScript("testObject.setFloatArray([Number.NaN]);");
271        assertEquals(Float.NaN, mTestObject.waitForFloatArray()[0]);
272
273        executeJavaScript("testObject.setDoubleArray([Number.NaN]);");
274        assertEquals(Double.NaN, mTestObject.waitForDoubleArray()[0]);
275
276        // LIVECONNECT_COMPLIANCE: Should create array and create instances of java.lang.Number.
277        executeJavaScript("testObject.setObjectArray([Number.NaN]);");
278        assertNull(mTestObject.waitForObjectArray());
279
280        // LIVECONNECT_COMPLIANCE: Should create instances of java.lang.String.
281        executeJavaScript("testObject.setStringArray([Number.NaN]);");
282        assertNull(mTestObject.waitForStringArray()[0]);
283
284        // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
285        executeJavaScript("testObject.setCustomTypeArray([Number.NaN]);");
286        assertNull(mTestObject.waitForCustomTypeArray());
287    }
288
289    // Test passing an array of JavaScript infinity values to a method which
290    // takes a Java array.
291    @SmallTest
292    @Feature({"AndroidWebView", "Android-JavaBridge"})
293    public void testPassNumberInfinity() throws Throwable {
294        executeJavaScript("testObject.setBooleanArray([Infinity]);");
295        assertFalse(mTestObject.waitForBooleanArray()[0]);
296
297        executeJavaScript("testObject.setByteArray([Infinity]);");
298        assertEquals(-1, mTestObject.waitForByteArray()[0]);
299
300        // LIVECONNECT_COMPLIANCE: Should convert to maximum numeric char value.
301        executeJavaScript("testObject.setCharArray([Infinity]);");
302        assertEquals('\u0000', mTestObject.waitForCharArray()[0]);
303
304        executeJavaScript("testObject.setShortArray([Infinity]);");
305        assertEquals(-1, mTestObject.waitForShortArray()[0]);
306
307        executeJavaScript("testObject.setIntArray([Infinity]);");
308        assertEquals(Integer.MAX_VALUE, mTestObject.waitForIntArray()[0]);
309
310        executeJavaScript("testObject.setLongArray([Infinity]);");
311        assertEquals(Long.MAX_VALUE, mTestObject.waitForLongArray()[0]);
312
313        executeJavaScript("testObject.setFloatArray([Infinity]);");
314        assertEquals(Float.POSITIVE_INFINITY, mTestObject.waitForFloatArray()[0]);
315
316        executeJavaScript("testObject.setDoubleArray([Infinity]);");
317        assertEquals(Double.POSITIVE_INFINITY, mTestObject.waitForDoubleArray()[0]);
318
319        // LIVECONNECT_COMPLIANCE: Should create array and create instances of java.lang.Number.
320        executeJavaScript("testObject.setObjectArray([Infinity]);");
321        assertNull(mTestObject.waitForObjectArray());
322
323        // LIVECONNECT_COMPLIANCE: Should create instances of java.lang.String.
324        executeJavaScript("testObject.setStringArray([Infinity]);");
325        assertNull(mTestObject.waitForStringArray()[0]);
326
327        // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
328        executeJavaScript("testObject.setCustomTypeArray([Infinity]);");
329        assertNull(mTestObject.waitForCustomTypeArray());
330    }
331
332    // Test passing an array of JavaScript boolean values to a method which
333    // takes a Java array.
334    @SmallTest
335    @Feature({"AndroidWebView", "Android-JavaBridge"})
336    public void testPassBoolean() throws Throwable {
337        executeJavaScript("testObject.setBooleanArray([true]);");
338        assertTrue(mTestObject.waitForBooleanArray()[0]);
339        executeJavaScript("testObject.setBooleanArray([false]);");
340        assertFalse(mTestObject.waitForBooleanArray()[0]);
341
342        // LIVECONNECT_COMPLIANCE: Should be 1.
343        executeJavaScript("testObject.setByteArray([true]);");
344        assertEquals(0, mTestObject.waitForByteArray()[0]);
345        executeJavaScript("testObject.setByteArray([false]);");
346        assertEquals(0, mTestObject.waitForByteArray()[0]);
347
348        // LIVECONNECT_COMPLIANCE: Should convert to numeric char value 1.
349        executeJavaScript("testObject.setCharArray([true]);");
350        assertEquals('\u0000', mTestObject.waitForCharArray()[0]);
351        executeJavaScript("testObject.setCharArray([false]);");
352        assertEquals('\u0000', mTestObject.waitForCharArray()[0]);
353
354        // LIVECONNECT_COMPLIANCE: Should be 1.
355        executeJavaScript("testObject.setShortArray([true]);");
356        assertEquals(0, mTestObject.waitForShortArray()[0]);
357        executeJavaScript("testObject.setShortArray([false]);");
358        assertEquals(0, mTestObject.waitForShortArray()[0]);
359
360        // LIVECONNECT_COMPLIANCE: Should be 1.
361        executeJavaScript("testObject.setIntArray([true]);");
362        assertEquals(0, mTestObject.waitForIntArray()[0]);
363        executeJavaScript("testObject.setIntArray([false]);");
364        assertEquals(0, mTestObject.waitForIntArray()[0]);
365
366        // LIVECONNECT_COMPLIANCE: Should be 1.
367        executeJavaScript("testObject.setLongArray([true]);");
368        assertEquals(0L, mTestObject.waitForLongArray()[0]);
369        executeJavaScript("testObject.setLongArray([false]);");
370        assertEquals(0L, mTestObject.waitForLongArray()[0]);
371
372        // LIVECONNECT_COMPLIANCE: Should be 1.0.
373        executeJavaScript("testObject.setFloatArray([true]);");
374        assertEquals(0.0f, mTestObject.waitForFloatArray()[0]);
375        executeJavaScript("testObject.setFloatArray([false]);");
376        assertEquals(0.0f, mTestObject.waitForFloatArray()[0]);
377
378        // LIVECONNECT_COMPLIANCE: Should be 1.0.
379        executeJavaScript("testObject.setDoubleArray([true]);");
380        assertEquals(0.0, mTestObject.waitForDoubleArray()[0]);
381        executeJavaScript("testObject.setDoubleArray([false]);");
382        assertEquals(0.0, mTestObject.waitForDoubleArray()[0]);
383
384        // LIVECONNECT_COMPLIANCE: Should create array and create instances of java.lang.Number.
385        executeJavaScript("testObject.setObjectArray([true]);");
386        assertNull(mTestObject.waitForObjectArray());
387
388        // LIVECONNECT_COMPLIANCE: Should create instances of java.lang.String.
389        executeJavaScript("testObject.setStringArray([true]);");
390        assertNull(mTestObject.waitForStringArray()[0]);
391
392        // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
393        executeJavaScript("testObject.setCustomTypeArray([true]);");
394        assertNull(mTestObject.waitForCustomTypeArray());
395    }
396
397    // Test passing an array of JavaScript strings to a method which takes a
398    // Java array.
399    @SmallTest
400    @Feature({"AndroidWebView", "Android-JavaBridge"})
401    public void testPassString() throws Throwable {
402        // LIVECONNECT_COMPLIANCE: Non-empty string should convert to true.
403        executeJavaScript("testObject.setBooleanArray([\"+042.10\"]);");
404        assertFalse(mTestObject.waitForBooleanArray()[0]);
405
406        // LIVECONNECT_COMPLIANCE: Should use valueOf() of appropriate type.
407        executeJavaScript("testObject.setByteArray([\"+042.10\"]);");
408        assertEquals(0, mTestObject.waitForByteArray()[0]);
409
410        // LIVECONNECT_COMPLIANCE: Should decode and convert to numeric char value.
411        executeJavaScript("testObject.setCharArray([\"+042.10\"]);");
412        assertEquals(0, mTestObject.waitForCharArray()[0]);
413
414        // LIVECONNECT_COMPLIANCE: Should use valueOf() of appropriate type.
415        executeJavaScript("testObject.setShortArray([\"+042.10\"]);");
416        assertEquals(0, mTestObject.waitForShortArray()[0]);
417
418        // LIVECONNECT_COMPLIANCE: Should use valueOf() of appropriate type.
419        executeJavaScript("testObject.setIntArray([\"+042.10\"]);");
420        assertEquals(0, mTestObject.waitForIntArray()[0]);
421
422        // LIVECONNECT_COMPLIANCE: Should use valueOf() of appropriate type.
423        executeJavaScript("testObject.setLongArray([\"+042.10\"]);");
424        assertEquals(0L, mTestObject.waitForLongArray()[0]);
425
426        // LIVECONNECT_COMPLIANCE: Should use valueOf() of appropriate type.
427        executeJavaScript("testObject.setFloatArray([\"+042.10\"]);");
428        assertEquals(0.0f, mTestObject.waitForFloatArray()[0]);
429
430        // LIVECONNECT_COMPLIANCE: Should use valueOf() of appropriate type.
431        executeJavaScript("testObject.setDoubleArray([\"+042.10\"]);");
432        assertEquals(0.0, mTestObject.waitForDoubleArray()[0]);
433
434        // LIVECONNECT_COMPLIANCE: Should create array and create instances of java.lang.Number.
435        executeJavaScript("testObject.setObjectArray([\"+042.10\"]);");
436        assertNull(mTestObject.waitForObjectArray());
437
438        executeJavaScript("testObject.setStringArray([\"+042.10\"]);");
439        assertEquals("+042.10", mTestObject.waitForStringArray()[0]);
440
441        // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
442        executeJavaScript("testObject.setCustomTypeArray([\"+042.10\"]);");
443        assertNull(mTestObject.waitForCustomTypeArray());
444    }
445
446    // Test passing an array of JavaScript objects to a method which takes a
447    // Java array.
448    @SmallTest
449    @Feature({"AndroidWebView", "Android-JavaBridge"})
450    public void testPassJavaScriptObject() throws Throwable {
451        // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
452        executeJavaScript("testObject.setBooleanArray([{foo: 42}]);");
453        assertFalse(mTestObject.waitForBooleanArray()[0]);
454
455        // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
456        executeJavaScript("testObject.setByteArray([{foo: 42}]);");
457        assertEquals(0, mTestObject.waitForByteArray()[0]);
458
459        // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
460        executeJavaScript("testObject.setCharArray([{foo: 42}]);");
461        assertEquals('\u0000', mTestObject.waitForCharArray()[0]);
462
463        // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
464        executeJavaScript("testObject.setShortArray([{foo: 42}]);");
465        assertEquals(0, mTestObject.waitForShortArray()[0]);
466
467        // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
468        executeJavaScript("testObject.setIntArray([{foo: 42}]);");
469        assertEquals(0, mTestObject.waitForIntArray()[0]);
470
471        // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
472        executeJavaScript("testObject.setLongArray([{foo: 42}]);");
473        assertEquals(0L, mTestObject.waitForLongArray()[0]);
474
475        // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
476        executeJavaScript("testObject.setFloatArray([{foo: 42}]);");
477        assertEquals(0.0f, mTestObject.waitForFloatArray()[0]);
478
479        // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
480        executeJavaScript("testObject.setDoubleArray([{foo: 42}]);");
481        assertEquals(0.0, mTestObject.waitForDoubleArray()[0]);
482
483        // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
484        executeJavaScript("testObject.setObjectArray([{foo: 42}]);");
485        assertNull(mTestObject.waitForObjectArray());
486
487        // LIVECONNECT_COMPLIANCE: Should call toString() on object.
488        executeJavaScript("testObject.setStringArray([{foo: 42}]);");
489        assertNull(mTestObject.waitForStringArray()[0]);
490
491        // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
492        executeJavaScript("testObject.setCustomTypeArray([{foo: 42}]);");
493        assertNull(mTestObject.waitForCustomTypeArray());
494    }
495
496    // Test passing an array of Java objects to a method which takes a Java
497    // array.
498    @SmallTest
499    @Feature({"AndroidWebView", "Android-JavaBridge"})
500    public void testPassJavaObject() throws Throwable {
501        // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
502        executeJavaScript("testObject.setBooleanArray([testObject.getObjectInstance()]);");
503        assertFalse(mTestObject.waitForBooleanArray()[0]);
504
505        // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
506        executeJavaScript("testObject.setByteArray([testObject.getObjectInstance()]);");
507        assertEquals(0, mTestObject.waitForByteArray()[0]);
508
509        // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
510        executeJavaScript("testObject.setCharArray([testObject.getObjectInstance()]);");
511        assertEquals('\u0000', mTestObject.waitForCharArray()[0]);
512
513        // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
514        executeJavaScript("testObject.setShortArray([testObject.getObjectInstance()]);");
515        assertEquals(0, mTestObject.waitForShortArray()[0]);
516
517        // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
518        executeJavaScript("testObject.setIntArray([testObject.getObjectInstance()]);");
519        assertEquals(0, mTestObject.waitForIntArray()[0]);
520
521        // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
522        executeJavaScript("testObject.setLongArray([testObject.getObjectInstance()]);");
523        assertEquals(0L, mTestObject.waitForLongArray()[0]);
524
525        // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
526        executeJavaScript("testObject.setFloatArray([testObject.getObjectInstance()]);");
527        assertEquals(0.0f, mTestObject.waitForFloatArray()[0]);
528
529        // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
530        executeJavaScript("testObject.setDoubleArray([testObject.getObjectInstance()]);");
531        assertEquals(0.0, mTestObject.waitForDoubleArray()[0]);
532
533        // LIVECONNECT_COMPLIANCE: Should create an array and pass Java object.
534        executeJavaScript("testObject.setObjectArray([testObject.getObjectInstance()]);");
535        assertNull(mTestObject.waitForObjectArray());
536
537        // LIVECONNECT_COMPLIANCE: Should call toString() on object.
538        executeJavaScript("testObject.setStringArray([testObject.getObjectInstance()]);");
539        assertNull(mTestObject.waitForStringArray()[0]);
540
541        // LIVECONNECT_COMPLIANCE: Should create array and pass Java object.
542        executeJavaScript("testObject.setCustomTypeArray([testObject.getObjectInstance()]);");
543        assertNull(mTestObject.waitForCustomTypeArray());
544        executeJavaScript("testObject.setCustomTypeArray([testObject.getCustomTypeInstance()]);");
545        assertNull(mTestObject.waitForCustomTypeArray());
546    }
547
548    // Test passing an array of JavaScript null values to a method which takes
549    // a Java array.
550    @SmallTest
551    @Feature({"AndroidWebView", "Android-JavaBridge"})
552    public void testPassNull() throws Throwable {
553        executeJavaScript("testObject.setByteArray([null]);");
554        assertEquals(0, mTestObject.waitForByteArray()[0]);
555
556        executeJavaScript("testObject.setCharArray([null]);");
557        assertEquals('\u0000', mTestObject.waitForCharArray()[0]);
558
559        executeJavaScript("testObject.setShortArray([null]);");
560        assertEquals(0, mTestObject.waitForShortArray()[0]);
561
562        executeJavaScript("testObject.setIntArray([null]);");
563        assertEquals(0, mTestObject.waitForIntArray()[0]);
564
565        executeJavaScript("testObject.setLongArray([null]);");
566        assertEquals(0L, mTestObject.waitForLongArray()[0]);
567
568        executeJavaScript("testObject.setFloatArray([null]);");
569        assertEquals(0.0f, mTestObject.waitForFloatArray()[0]);
570
571        executeJavaScript("testObject.setDoubleArray([null]);");
572        assertEquals(0.0, mTestObject.waitForDoubleArray()[0]);
573
574        executeJavaScript("testObject.setBooleanArray([null]);");
575        assertFalse(mTestObject.waitForBooleanArray()[0]);
576
577        // LIVECONNECT_COMPLIANCE: Should create array and pass null.
578        executeJavaScript("testObject.setObjectArray([null]);");
579        assertNull(mTestObject.waitForObjectArray());
580
581        executeJavaScript("testObject.setStringArray([null]);");
582        assertNull(mTestObject.waitForStringArray()[0]);
583
584        // LIVECONNECT_COMPLIANCE: Should create array and pass null.
585        executeJavaScript("testObject.setCustomTypeArray([null]);");
586        assertNull(mTestObject.waitForCustomTypeArray());
587    }
588
589    // Test passing an array of JavaScript undefined values to a method which
590    // takes a Java array.
591    @SmallTest
592    @Feature({"AndroidWebView", "Android-JavaBridge"})
593    public void testPassUndefined() throws Throwable {
594        executeJavaScript("testObject.setByteArray([undefined]);");
595        assertEquals(0, mTestObject.waitForByteArray()[0]);
596
597        executeJavaScript("testObject.setCharArray([undefined]);");
598        assertEquals(0, mTestObject.waitForCharArray()[0]);
599
600        executeJavaScript("testObject.setShortArray([undefined]);");
601        assertEquals(0, mTestObject.waitForShortArray()[0]);
602
603        executeJavaScript("testObject.setIntArray([undefined]);");
604        assertEquals(0, mTestObject.waitForIntArray()[0]);
605
606        executeJavaScript("testObject.setLongArray([undefined]);");
607        assertEquals(0L, mTestObject.waitForLongArray()[0]);
608
609        executeJavaScript("testObject.setFloatArray([undefined]);");
610        assertEquals(0.0f, mTestObject.waitForFloatArray()[0]);
611
612        executeJavaScript("testObject.setDoubleArray([undefined]);");
613        assertEquals(0.0, mTestObject.waitForDoubleArray()[0]);
614
615        executeJavaScript("testObject.setBooleanArray([undefined]);");
616        assertEquals(false, mTestObject.waitForBooleanArray()[0]);
617
618        // LIVECONNECT_COMPLIANCE: Should create array and pass null.
619        executeJavaScript("testObject.setObjectArray([undefined]);");
620        assertNull(mTestObject.waitForObjectArray());
621
622        executeJavaScript("testObject.setStringArray([undefined]);");
623        assertNull(mTestObject.waitForStringArray()[0]);
624
625        // LIVECONNECT_COMPLIANCE: Should create array and pass null.
626        executeJavaScript("testObject.setCustomTypeArray([undefined]);");
627        assertNull(mTestObject.waitForCustomTypeArray());
628    }
629
630    // Test passing a typed Int8Array to a method which takes a Java array.
631    @SmallTest
632    @Feature({"AndroidWebView", "Android-JavaBridge"})
633    public void testPassInt8Array() throws Throwable {
634        executeJavaScript("buffer = new ArrayBuffer(1);");
635        executeJavaScript("int8_array = new Int8Array(buffer);");
636        executeJavaScript("int8_array[0] = 42;");
637
638        executeJavaScript("testObject.setBooleanArray(int8_array);");
639        assertFalse(mTestObject.waitForBooleanArray()[0]);
640
641        executeJavaScript("testObject.setByteArray(int8_array);");
642        assertEquals(42, mTestObject.waitForByteArray()[0]);
643
644        executeJavaScript("testObject.setCharArray(int8_array);");
645        assertEquals(42, mTestObject.waitForCharArray()[0]);
646
647        executeJavaScript("testObject.setShortArray(int8_array);");
648        assertEquals(42, mTestObject.waitForShortArray()[0]);
649
650        executeJavaScript("testObject.setIntArray(int8_array);");
651        assertEquals(42, mTestObject.waitForIntArray()[0]);
652
653        executeJavaScript("testObject.setLongArray(int8_array);");
654        assertEquals(42L, mTestObject.waitForLongArray()[0]);
655
656        executeJavaScript("testObject.setFloatArray(int8_array);");
657        assertEquals(42.0f, mTestObject.waitForFloatArray()[0]);
658
659        executeJavaScript("testObject.setDoubleArray(int8_array);");
660        assertEquals(42.0, mTestObject.waitForDoubleArray()[0]);
661
662        executeJavaScript("testObject.setObjectArray(int8_array);");
663        assertNull(mTestObject.waitForObjectArray());
664
665        executeJavaScript("testObject.setStringArray(int8_array);");
666        assertNull(mTestObject.waitForStringArray()[0]);
667
668        executeJavaScript("testObject.setCustomTypeArray(int8_array);");
669        assertNull(mTestObject.waitForCustomTypeArray());
670    }
671
672    // Test passing a typed Uint8Array to a method which takes a Java array.
673    @SmallTest
674    @Feature({"AndroidWebView", "Android-JavaBridge"})
675    public void testPassUint8Array() throws Throwable {
676        executeJavaScript("buffer = new ArrayBuffer(1);");
677        executeJavaScript("uint8_array = new Uint8Array(buffer);");
678        executeJavaScript("uint8_array[0] = 42;");
679
680        executeJavaScript("testObject.setBooleanArray(uint8_array);");
681        assertFalse(mTestObject.waitForBooleanArray()[0]);
682
683        executeJavaScript("testObject.setByteArray(uint8_array);");
684        assertEquals(42, mTestObject.waitForByteArray()[0]);
685
686        executeJavaScript("testObject.setCharArray(uint8_array);");
687        assertEquals(42, mTestObject.waitForCharArray()[0]);
688
689        executeJavaScript("testObject.setShortArray(uint8_array);");
690        assertEquals(42, mTestObject.waitForShortArray()[0]);
691
692        executeJavaScript("testObject.setIntArray(uint8_array);");
693        assertEquals(42, mTestObject.waitForIntArray()[0]);
694
695        executeJavaScript("testObject.setLongArray(uint8_array);");
696        assertEquals(42L, mTestObject.waitForLongArray()[0]);
697
698        executeJavaScript("testObject.setFloatArray(uint8_array);");
699        assertEquals(42.0f, mTestObject.waitForFloatArray()[0]);
700
701        executeJavaScript("testObject.setDoubleArray(uint8_array);");
702        assertEquals(42.0, mTestObject.waitForDoubleArray()[0]);
703
704        executeJavaScript("testObject.setObjectArray(uint8_array);");
705        assertNull(mTestObject.waitForObjectArray());
706
707        executeJavaScript("testObject.setStringArray(uint8_array);");
708        assertNull(mTestObject.waitForStringArray()[0]);
709
710        executeJavaScript("testObject.setCustomTypeArray(uint8_array);");
711        assertNull(mTestObject.waitForCustomTypeArray());
712    }
713
714    // Test passing a typed Int16Array to a method which takes a Java array.
715    @SmallTest
716    @Feature({"AndroidWebView", "Android-JavaBridge"})
717    public void testPassInt16Array() throws Throwable {
718        executeJavaScript("buffer = new ArrayBuffer(2);");
719        executeJavaScript("int16_array = new Int16Array(buffer);");
720        executeJavaScript("int16_array[0] = 42;");
721
722        executeJavaScript("testObject.setBooleanArray(int16_array);");
723        assertFalse(mTestObject.waitForBooleanArray()[0]);
724
725        executeJavaScript("testObject.setByteArray(int16_array);");
726        assertEquals(42, mTestObject.waitForByteArray()[0]);
727
728        executeJavaScript("testObject.setCharArray(int16_array);");
729        assertEquals(42, mTestObject.waitForCharArray()[0]);
730
731        executeJavaScript("testObject.setShortArray(int16_array);");
732        assertEquals(42, mTestObject.waitForShortArray()[0]);
733
734        executeJavaScript("testObject.setIntArray(int16_array);");
735        assertEquals(42, mTestObject.waitForIntArray()[0]);
736
737        executeJavaScript("testObject.setLongArray(int16_array);");
738        assertEquals(42L, mTestObject.waitForLongArray()[0]);
739
740        executeJavaScript("testObject.setFloatArray(int16_array);");
741        assertEquals(42.0f, mTestObject.waitForFloatArray()[0]);
742
743        executeJavaScript("testObject.setDoubleArray(int16_array);");
744        assertEquals(42.0, mTestObject.waitForDoubleArray()[0]);
745
746        executeJavaScript("testObject.setObjectArray(int16_array);");
747        assertNull(mTestObject.waitForObjectArray());
748
749        executeJavaScript("testObject.setStringArray(int16_array);");
750        assertNull(mTestObject.waitForStringArray()[0]);
751
752        executeJavaScript("testObject.setCustomTypeArray(int16_array);");
753        assertNull(mTestObject.waitForCustomTypeArray());
754    }
755
756    // Test passing a typed Uint16Array to a method which takes a Java array.
757    @SmallTest
758    @Feature({"AndroidWebView", "Android-JavaBridge"})
759    public void testPassUint16Array() throws Throwable {
760        executeJavaScript("buffer = new ArrayBuffer(2);");
761        executeJavaScript("uint16_array = new Uint16Array(buffer);");
762        executeJavaScript("uint16_array[0] = 42;");
763
764        executeJavaScript("testObject.setBooleanArray(uint16_array);");
765        assertFalse(mTestObject.waitForBooleanArray()[0]);
766
767        executeJavaScript("testObject.setByteArray(uint16_array);");
768        assertEquals(42, mTestObject.waitForByteArray()[0]);
769
770        executeJavaScript("testObject.setCharArray(uint16_array);");
771        assertEquals(42, mTestObject.waitForCharArray()[0]);
772
773        executeJavaScript("testObject.setShortArray(uint16_array);");
774        assertEquals(42, mTestObject.waitForShortArray()[0]);
775
776        executeJavaScript("testObject.setIntArray(uint16_array);");
777        assertEquals(42, mTestObject.waitForIntArray()[0]);
778
779        executeJavaScript("testObject.setLongArray(uint16_array);");
780        assertEquals(42L, mTestObject.waitForLongArray()[0]);
781
782        executeJavaScript("testObject.setFloatArray(uint16_array);");
783        assertEquals(42.0f, mTestObject.waitForFloatArray()[0]);
784
785        executeJavaScript("testObject.setDoubleArray(uint16_array);");
786        assertEquals(42.0, mTestObject.waitForDoubleArray()[0]);
787
788        executeJavaScript("testObject.setObjectArray(uint16_array);");
789        assertNull(mTestObject.waitForObjectArray());
790
791        executeJavaScript("testObject.setStringArray(uint16_array);");
792        assertNull(mTestObject.waitForStringArray()[0]);
793
794        executeJavaScript("testObject.setCustomTypeArray(uint16_array);");
795        assertNull(mTestObject.waitForCustomTypeArray());
796    }
797
798    // Test passing a typed Int32Array to a method which takes a Java array.
799    @SmallTest
800    @Feature({"AndroidWebView", "Android-JavaBridge"})
801    public void testPassInt32Array() throws Throwable {
802        executeJavaScript("buffer = new ArrayBuffer(4);");
803        executeJavaScript("int32_array = new Int32Array(buffer);");
804        executeJavaScript("int32_array[0] = 42;");
805
806        executeJavaScript("testObject.setBooleanArray(int32_array);");
807        assertFalse(mTestObject.waitForBooleanArray()[0]);
808
809        executeJavaScript("testObject.setByteArray(int32_array);");
810        assertEquals(42, mTestObject.waitForByteArray()[0]);
811
812        executeJavaScript("testObject.setCharArray(int32_array);");
813        assertEquals(42, mTestObject.waitForCharArray()[0]);
814
815        executeJavaScript("testObject.setShortArray(int32_array);");
816        assertEquals(42, mTestObject.waitForShortArray()[0]);
817
818        executeJavaScript("testObject.setIntArray(int32_array);");
819        assertEquals(42, mTestObject.waitForIntArray()[0]);
820
821        executeJavaScript("testObject.setLongArray(int32_array);");
822        assertEquals(42L, mTestObject.waitForLongArray()[0]);
823
824        executeJavaScript("testObject.setFloatArray(int32_array);");
825        assertEquals(42.0f, mTestObject.waitForFloatArray()[0]);
826
827        executeJavaScript("testObject.setDoubleArray(int32_array);");
828        assertEquals(42.0, mTestObject.waitForDoubleArray()[0]);
829
830        executeJavaScript("testObject.setObjectArray(int32_array);");
831        assertNull(mTestObject.waitForObjectArray());
832
833        executeJavaScript("testObject.setStringArray(int32_array);");
834        assertNull(mTestObject.waitForStringArray()[0]);
835
836        executeJavaScript("testObject.setCustomTypeArray(int32_array);");
837        assertNull(mTestObject.waitForCustomTypeArray());
838    }
839
840    // Test passing a typed Uint32Array to a method which takes a Java array.
841    @SmallTest
842    @Feature({"AndroidWebView", "Android-JavaBridge"})
843    public void testPassUint32Array() throws Throwable {
844        executeJavaScript("buffer = new ArrayBuffer(4);");
845        executeJavaScript("uint32_array = new Uint32Array(buffer);");
846        executeJavaScript("uint32_array[0] = 42;");
847
848        executeJavaScript("testObject.setBooleanArray(uint32_array);");
849        assertFalse(mTestObject.waitForBooleanArray()[0]);
850
851        executeJavaScript("testObject.setByteArray(uint32_array);");
852        assertEquals(42, mTestObject.waitForByteArray()[0]);
853
854        executeJavaScript("testObject.setCharArray(uint32_array);");
855        assertEquals(42, mTestObject.waitForCharArray()[0]);
856
857        executeJavaScript("testObject.setShortArray(uint32_array);");
858        assertEquals(42, mTestObject.waitForShortArray()[0]);
859
860        executeJavaScript("testObject.setIntArray(uint32_array);");
861        assertEquals(42, mTestObject.waitForIntArray()[0]);
862
863        executeJavaScript("testObject.setLongArray(uint32_array);");
864        assertEquals(42L, mTestObject.waitForLongArray()[0]);
865
866        executeJavaScript("testObject.setFloatArray(uint32_array);");
867        assertEquals(42.0f, mTestObject.waitForFloatArray()[0]);
868
869        executeJavaScript("testObject.setDoubleArray(uint32_array);");
870        assertEquals(42.0, mTestObject.waitForDoubleArray()[0]);
871
872        executeJavaScript("testObject.setObjectArray(uint32_array);");
873        assertNull(mTestObject.waitForObjectArray());
874
875        executeJavaScript("testObject.setStringArray(uint32_array);");
876        assertNull(mTestObject.waitForStringArray()[0]);
877
878        executeJavaScript("testObject.setCustomTypeArray(uint32_array);");
879        assertNull(mTestObject.waitForCustomTypeArray());
880    }
881
882    // Test passing a typed Float32Array to a method which takes a Java array.
883    @SmallTest
884    @Feature({"AndroidWebView", "Android-JavaBridge"})
885    public void testPassFloat32Array() throws Throwable {
886        executeJavaScript("buffer = new ArrayBuffer(4);");
887        executeJavaScript("float32_array = new Float32Array(buffer);");
888        executeJavaScript("float32_array[0] = 42.0;");
889
890        executeJavaScript("testObject.setBooleanArray(float32_array);");
891        assertFalse(mTestObject.waitForBooleanArray()[0]);
892
893        executeJavaScript("testObject.setByteArray(float32_array);");
894        assertEquals(42, mTestObject.waitForByteArray()[0]);
895
896        executeJavaScript("testObject.setCharArray(float32_array);");
897        assertEquals('\u0000', mTestObject.waitForCharArray()[0]);
898
899        executeJavaScript("testObject.setShortArray(float32_array);");
900        assertEquals(42, mTestObject.waitForShortArray()[0]);
901
902        executeJavaScript("testObject.setIntArray(float32_array);");
903        assertEquals(42, mTestObject.waitForIntArray()[0]);
904
905        executeJavaScript("testObject.setLongArray(float32_array);");
906        assertEquals(42L, mTestObject.waitForLongArray()[0]);
907
908        executeJavaScript("testObject.setFloatArray(float32_array);");
909        assertEquals(42.0f, mTestObject.waitForFloatArray()[0]);
910
911        executeJavaScript("testObject.setDoubleArray(float32_array);");
912        assertEquals(42.0, mTestObject.waitForDoubleArray()[0]);
913
914        executeJavaScript("testObject.setObjectArray(float32_array);");
915        assertNull(mTestObject.waitForObjectArray());
916
917        executeJavaScript("testObject.setStringArray(float32_array);");
918        assertNull(mTestObject.waitForStringArray()[0]);
919
920        executeJavaScript("testObject.setCustomTypeArray(float32_array);");
921        assertNull(mTestObject.waitForCustomTypeArray());
922    }
923
924    // Test passing a typed Float64Array to a method which takes a Java array.
925    @SmallTest
926    @Feature({"AndroidWebView", "Android-JavaBridge"})
927    public void testPassFloat64Array() throws Throwable {
928        executeJavaScript("buffer = new ArrayBuffer(8);");
929        executeJavaScript("float64_array = new Float64Array(buffer);");
930        executeJavaScript("float64_array[0] = 42.0;");
931
932        executeJavaScript("testObject.setBooleanArray(float64_array);");
933        assertFalse(mTestObject.waitForBooleanArray()[0]);
934
935        executeJavaScript("testObject.setByteArray(float64_array);");
936        assertEquals(42, mTestObject.waitForByteArray()[0]);
937
938        executeJavaScript("testObject.setCharArray(float64_array);");
939        assertEquals('\u0000', mTestObject.waitForCharArray()[0]);
940
941        executeJavaScript("testObject.setShortArray(float64_array);");
942        assertEquals(42, mTestObject.waitForShortArray()[0]);
943
944        executeJavaScript("testObject.setIntArray(float64_array);");
945        assertEquals(42, mTestObject.waitForIntArray()[0]);
946
947        executeJavaScript("testObject.setLongArray(float64_array);");
948        assertEquals(42L, mTestObject.waitForLongArray()[0]);
949
950        executeJavaScript("testObject.setFloatArray(float64_array);");
951        assertEquals(42.0f, mTestObject.waitForFloatArray()[0]);
952
953        executeJavaScript("testObject.setDoubleArray(float64_array);");
954        assertEquals(42.0, mTestObject.waitForDoubleArray()[0]);
955
956        executeJavaScript("testObject.setObjectArray(float64_array);");
957        assertNull(mTestObject.waitForObjectArray());
958
959        executeJavaScript("testObject.setStringArray(float64_array);");
960        assertNull(mTestObject.waitForStringArray()[0]);
961
962        executeJavaScript("testObject.setCustomTypeArray(float64_array);");
963        assertNull(mTestObject.waitForCustomTypeArray());
964    }
965}
966