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