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.
5 package org.chromium.content.browser;
7 import android.test.suitebuilder.annotation.SmallTest;
9 import org.chromium.base.test.util.Feature;
12 * Part of the test suite for the Java Bridge. This class tests that we correctly convert
13 * JavaScript arrays to Java arrays when passing them to the methods of injected Java objects.
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.
22 public class JavaBridgeArrayCoercionTest extends JavaBridgeTestBase {
23 private class TestObject extends Controller {
24 private final Object mObjectInstance;
25 private final CustomType mCustomTypeInstance;
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;
40 mObjectInstance = new Object();
41 mCustomTypeInstance = new CustomType();
44 public Object getObjectInstance() {
45 return mObjectInstance;
47 public CustomType getCustomTypeInstance() {
48 return mCustomTypeInstance;
51 public synchronized void setBooleanArray(boolean[] x) {
53 notifyResultIsReady();
55 public synchronized void setByteArray(byte[] x) {
57 notifyResultIsReady();
59 public synchronized void setCharArray(char[] x) {
61 notifyResultIsReady();
63 public synchronized void setShortArray(short[] x) {
65 notifyResultIsReady();
67 public synchronized void setIntArray(int[] x) {
69 notifyResultIsReady();
71 public synchronized void setLongArray(long[] x) {
73 notifyResultIsReady();
75 public synchronized void setFloatArray(float[] x) {
77 notifyResultIsReady();
79 public synchronized void setDoubleArray(double[] x) {
81 notifyResultIsReady();
83 public synchronized void setStringArray(String[] x) {
85 notifyResultIsReady();
87 public synchronized void setObjectArray(Object[] x) {
89 notifyResultIsReady();
91 public synchronized void setCustomTypeArray(CustomType[] x) {
93 notifyResultIsReady();
96 public synchronized boolean[] waitForBooleanArray() {
100 public synchronized byte[] waitForByteArray() {
104 public synchronized char[] waitForCharArray() {
108 public synchronized short[] waitForShortArray() {
112 public synchronized int[] waitForIntArray() {
116 public synchronized long[] waitForLongArray() {
120 public synchronized float[] waitForFloatArray() {
124 public synchronized double[] waitForDoubleArray() {
128 public synchronized String[] waitForStringArray() {
132 public synchronized Object[] waitForObjectArray() {
136 public synchronized CustomType[] waitForCustomTypeArray() {
138 return mCustomTypeArray;
142 // Two custom types used when testing passing objects.
143 private static class CustomType {
146 private TestObject mTestObject;
149 protected void setUp() throws Exception {
151 mTestObject = new TestObject();
152 setUpContentView(mTestObject, "testObject");
155 // Note that all tests use a single element array for simplicity. We test
156 // multiple elements elsewhere.
158 // Test passing an array of JavaScript numbers in the int32 range to a
159 // method which takes a Java array.
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]);
169 executeJavaScript("testObject.setByteArray([42]);");
170 assertEquals(42, mTestObject.waitForByteArray()[0]);
172 // LIVECONNECT_COMPLIANCE: Should convert to numeric char value.
173 executeJavaScript("testObject.setCharArray([42]);");
174 assertEquals('\u0000', mTestObject.waitForCharArray()[0]);
176 executeJavaScript("testObject.setShortArray([42]);");
177 assertEquals(42, mTestObject.waitForShortArray()[0]);
179 executeJavaScript("testObject.setIntArray([42]);");
180 assertEquals(42, mTestObject.waitForIntArray()[0]);
182 executeJavaScript("testObject.setLongArray([42]);");
183 assertEquals(42L, mTestObject.waitForLongArray()[0]);
185 executeJavaScript("testObject.setFloatArray([42]);");
186 assertEquals(42.0f, mTestObject.waitForFloatArray()[0]);
188 executeJavaScript("testObject.setDoubleArray([42]);");
189 assertEquals(42.0, mTestObject.waitForDoubleArray()[0]);
191 // LIVECONNECT_COMPLIANCE: Should create array and create instances of java.lang.Number.
192 executeJavaScript("testObject.setObjectArray([42]);");
193 assertNull(mTestObject.waitForObjectArray());
195 // LIVECONNECT_COMPLIANCE: Should create instances of java.lang.String.
196 executeJavaScript("testObject.setStringArray([42]);");
197 assertNull(mTestObject.waitForStringArray()[0]);
199 // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
200 executeJavaScript("testObject.setCustomTypeArray([42]);");
201 assertNull(mTestObject.waitForCustomTypeArray());
204 // Test passing an array of JavaScript numbers in the double range to a
205 // method which takes a Java array.
207 @Feature({"AndroidWebView", "Android-JavaBridge"})
208 public void testPassNumberDouble() throws Throwable {
209 // LIVECONNECT_COMPLIANCE: Should convert to boolean.
210 executeJavaScript("testObject.setBooleanArray([42.1]);");
211 assertFalse(mTestObject.waitForBooleanArray()[0]);
213 executeJavaScript("testObject.setByteArray([42.1]);");
214 assertEquals(42, mTestObject.waitForByteArray()[0]);
216 // LIVECONNECT_COMPLIANCE: Should convert to numeric char value.
217 executeJavaScript("testObject.setCharArray([42.1]);");
218 assertEquals('\u0000', mTestObject.waitForCharArray()[0]);
220 executeJavaScript("testObject.setShortArray([42.1]);");
221 assertEquals(42, mTestObject.waitForShortArray()[0]);
223 executeJavaScript("testObject.setIntArray([42.1]);");
224 assertEquals(42, mTestObject.waitForIntArray()[0]);
226 executeJavaScript("testObject.setLongArray([42.1]);");
227 assertEquals(42L, mTestObject.waitForLongArray()[0]);
229 executeJavaScript("testObject.setFloatArray([42.1]);");
230 assertEquals(42.1f, mTestObject.waitForFloatArray()[0]);
232 executeJavaScript("testObject.setDoubleArray([42.1]);");
233 assertEquals(42.1, mTestObject.waitForDoubleArray()[0]);
235 // LIVECONNECT_COMPLIANCE: Should create array and create instances of java.lang.Number.
236 executeJavaScript("testObject.setObjectArray([42.1]);");
237 assertNull(mTestObject.waitForObjectArray());
239 // LIVECONNECT_COMPLIANCE: Should create instances of java.lang.String.
240 executeJavaScript("testObject.setStringArray([42.1]);");
241 assertNull(mTestObject.waitForStringArray()[0]);
243 // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
244 executeJavaScript("testObject.setCustomTypeArray([42.1]);");
245 assertNull(mTestObject.waitForCustomTypeArray());
248 // Test passing an array of JavaScript NaN values to a method which takes a
251 @Feature({"AndroidWebView", "Android-JavaBridge"})
252 public void testPassNumberNaN() throws Throwable {
253 executeJavaScript("testObject.setBooleanArray([Number.NaN]);");
254 assertFalse(mTestObject.waitForBooleanArray()[0]);
256 executeJavaScript("testObject.setByteArray([Number.NaN]);");
257 assertEquals(0, mTestObject.waitForByteArray()[0]);
259 executeJavaScript("testObject.setCharArray([Number.NaN]);");
260 assertEquals('\u0000', mTestObject.waitForCharArray()[0]);
262 executeJavaScript("testObject.setShortArray([Number.NaN]);");
263 assertEquals(0, mTestObject.waitForShortArray()[0]);
265 executeJavaScript("testObject.setIntArray([Number.NaN]);");
266 assertEquals(0, mTestObject.waitForIntArray()[0]);
268 executeJavaScript("testObject.setLongArray([Number.NaN]);");
269 assertEquals(0L, mTestObject.waitForLongArray()[0]);
271 executeJavaScript("testObject.setFloatArray([Number.NaN]);");
272 assertEquals(Float.NaN, mTestObject.waitForFloatArray()[0]);
274 executeJavaScript("testObject.setDoubleArray([Number.NaN]);");
275 assertEquals(Double.NaN, mTestObject.waitForDoubleArray()[0]);
277 // LIVECONNECT_COMPLIANCE: Should create array and create instances of java.lang.Number.
278 executeJavaScript("testObject.setObjectArray([Number.NaN]);");
279 assertNull(mTestObject.waitForObjectArray());
281 // LIVECONNECT_COMPLIANCE: Should create instances of java.lang.String.
282 executeJavaScript("testObject.setStringArray([Number.NaN]);");
283 assertNull(mTestObject.waitForStringArray()[0]);
285 // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
286 executeJavaScript("testObject.setCustomTypeArray([Number.NaN]);");
287 assertNull(mTestObject.waitForCustomTypeArray());
290 // Test passing an array of JavaScript infinity values to a method which
291 // takes a Java array.
293 @Feature({"AndroidWebView", "Android-JavaBridge"})
294 public void testPassNumberInfinity() throws Throwable {
295 executeJavaScript("testObject.setBooleanArray([Infinity]);");
296 assertFalse(mTestObject.waitForBooleanArray()[0]);
298 executeJavaScript("testObject.setByteArray([Infinity]);");
299 assertEquals(-1, mTestObject.waitForByteArray()[0]);
301 // LIVECONNECT_COMPLIANCE: Should convert to maximum numeric char value.
302 executeJavaScript("testObject.setCharArray([Infinity]);");
303 assertEquals('\u0000', mTestObject.waitForCharArray()[0]);
305 executeJavaScript("testObject.setShortArray([Infinity]);");
306 assertEquals(-1, mTestObject.waitForShortArray()[0]);
308 executeJavaScript("testObject.setIntArray([Infinity]);");
309 assertEquals(Integer.MAX_VALUE, mTestObject.waitForIntArray()[0]);
311 executeJavaScript("testObject.setLongArray([Infinity]);");
312 assertEquals(Long.MAX_VALUE, mTestObject.waitForLongArray()[0]);
314 executeJavaScript("testObject.setFloatArray([Infinity]);");
315 assertEquals(Float.POSITIVE_INFINITY, mTestObject.waitForFloatArray()[0]);
317 executeJavaScript("testObject.setDoubleArray([Infinity]);");
318 assertEquals(Double.POSITIVE_INFINITY, mTestObject.waitForDoubleArray()[0]);
320 // LIVECONNECT_COMPLIANCE: Should create array and create instances of java.lang.Number.
321 executeJavaScript("testObject.setObjectArray([Infinity]);");
322 assertNull(mTestObject.waitForObjectArray());
324 // LIVECONNECT_COMPLIANCE: Should create instances of java.lang.String.
325 executeJavaScript("testObject.setStringArray([Infinity]);");
326 assertNull(mTestObject.waitForStringArray()[0]);
328 // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
329 executeJavaScript("testObject.setCustomTypeArray([Infinity]);");
330 assertNull(mTestObject.waitForCustomTypeArray());
333 // Test passing an array of JavaScript boolean values to a method which
334 // takes a Java array.
336 @Feature({"AndroidWebView", "Android-JavaBridge"})
337 public void testPassBoolean() throws Throwable {
338 executeJavaScript("testObject.setBooleanArray([true]);");
339 assertTrue(mTestObject.waitForBooleanArray()[0]);
340 executeJavaScript("testObject.setBooleanArray([false]);");
341 assertFalse(mTestObject.waitForBooleanArray()[0]);
343 // LIVECONNECT_COMPLIANCE: Should be 1.
344 executeJavaScript("testObject.setByteArray([true]);");
345 assertEquals(0, mTestObject.waitForByteArray()[0]);
346 executeJavaScript("testObject.setByteArray([false]);");
347 assertEquals(0, mTestObject.waitForByteArray()[0]);
349 // LIVECONNECT_COMPLIANCE: Should convert to numeric char value 1.
350 executeJavaScript("testObject.setCharArray([true]);");
351 assertEquals('\u0000', mTestObject.waitForCharArray()[0]);
352 executeJavaScript("testObject.setCharArray([false]);");
353 assertEquals('\u0000', mTestObject.waitForCharArray()[0]);
355 // LIVECONNECT_COMPLIANCE: Should be 1.
356 executeJavaScript("testObject.setShortArray([true]);");
357 assertEquals(0, mTestObject.waitForShortArray()[0]);
358 executeJavaScript("testObject.setShortArray([false]);");
359 assertEquals(0, mTestObject.waitForShortArray()[0]);
361 // LIVECONNECT_COMPLIANCE: Should be 1.
362 executeJavaScript("testObject.setIntArray([true]);");
363 assertEquals(0, mTestObject.waitForIntArray()[0]);
364 executeJavaScript("testObject.setIntArray([false]);");
365 assertEquals(0, mTestObject.waitForIntArray()[0]);
367 // LIVECONNECT_COMPLIANCE: Should be 1.
368 executeJavaScript("testObject.setLongArray([true]);");
369 assertEquals(0L, mTestObject.waitForLongArray()[0]);
370 executeJavaScript("testObject.setLongArray([false]);");
371 assertEquals(0L, mTestObject.waitForLongArray()[0]);
373 // LIVECONNECT_COMPLIANCE: Should be 1.0.
374 executeJavaScript("testObject.setFloatArray([true]);");
375 assertEquals(0.0f, mTestObject.waitForFloatArray()[0]);
376 executeJavaScript("testObject.setFloatArray([false]);");
377 assertEquals(0.0f, mTestObject.waitForFloatArray()[0]);
379 // LIVECONNECT_COMPLIANCE: Should be 1.0.
380 executeJavaScript("testObject.setDoubleArray([true]);");
381 assertEquals(0.0, mTestObject.waitForDoubleArray()[0]);
382 executeJavaScript("testObject.setDoubleArray([false]);");
383 assertEquals(0.0, mTestObject.waitForDoubleArray()[0]);
385 // LIVECONNECT_COMPLIANCE: Should create array and create instances of java.lang.Number.
386 executeJavaScript("testObject.setObjectArray([true]);");
387 assertNull(mTestObject.waitForObjectArray());
389 // LIVECONNECT_COMPLIANCE: Should create instances of java.lang.String.
390 executeJavaScript("testObject.setStringArray([true]);");
391 assertNull(mTestObject.waitForStringArray()[0]);
393 // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
394 executeJavaScript("testObject.setCustomTypeArray([true]);");
395 assertNull(mTestObject.waitForCustomTypeArray());
398 // Test passing an array of JavaScript strings to a method which takes a
401 @Feature({"AndroidWebView", "Android-JavaBridge"})
402 public void testPassString() throws Throwable {
403 // LIVECONNECT_COMPLIANCE: Non-empty string should convert to true.
404 executeJavaScript("testObject.setBooleanArray([\"+042.10\"]);");
405 assertFalse(mTestObject.waitForBooleanArray()[0]);
407 // LIVECONNECT_COMPLIANCE: Should use valueOf() of appropriate type.
408 executeJavaScript("testObject.setByteArray([\"+042.10\"]);");
409 assertEquals(0, mTestObject.waitForByteArray()[0]);
411 // LIVECONNECT_COMPLIANCE: Should decode and convert to numeric char value.
412 executeJavaScript("testObject.setCharArray([\"+042.10\"]);");
413 assertEquals(0, mTestObject.waitForCharArray()[0]);
415 // LIVECONNECT_COMPLIANCE: Should use valueOf() of appropriate type.
416 executeJavaScript("testObject.setShortArray([\"+042.10\"]);");
417 assertEquals(0, mTestObject.waitForShortArray()[0]);
419 // LIVECONNECT_COMPLIANCE: Should use valueOf() of appropriate type.
420 executeJavaScript("testObject.setIntArray([\"+042.10\"]);");
421 assertEquals(0, mTestObject.waitForIntArray()[0]);
423 // LIVECONNECT_COMPLIANCE: Should use valueOf() of appropriate type.
424 executeJavaScript("testObject.setLongArray([\"+042.10\"]);");
425 assertEquals(0L, mTestObject.waitForLongArray()[0]);
427 // LIVECONNECT_COMPLIANCE: Should use valueOf() of appropriate type.
428 executeJavaScript("testObject.setFloatArray([\"+042.10\"]);");
429 assertEquals(0.0f, mTestObject.waitForFloatArray()[0]);
431 // LIVECONNECT_COMPLIANCE: Should use valueOf() of appropriate type.
432 executeJavaScript("testObject.setDoubleArray([\"+042.10\"]);");
433 assertEquals(0.0, mTestObject.waitForDoubleArray()[0]);
435 // LIVECONNECT_COMPLIANCE: Should create array and create instances of java.lang.Number.
436 executeJavaScript("testObject.setObjectArray([\"+042.10\"]);");
437 assertNull(mTestObject.waitForObjectArray());
439 executeJavaScript("testObject.setStringArray([\"+042.10\"]);");
440 assertEquals("+042.10", mTestObject.waitForStringArray()[0]);
442 // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
443 executeJavaScript("testObject.setCustomTypeArray([\"+042.10\"]);");
444 assertNull(mTestObject.waitForCustomTypeArray());
447 // Test passing an array of JavaScript objects to a method which takes a
450 @Feature({"AndroidWebView", "Android-JavaBridge"})
451 public void testPassJavaScriptObject() throws Throwable {
452 // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
453 executeJavaScript("testObject.setBooleanArray([{foo: 42}]);");
454 assertFalse(mTestObject.waitForBooleanArray()[0]);
456 // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
457 executeJavaScript("testObject.setByteArray([{foo: 42}]);");
458 assertEquals(0, mTestObject.waitForByteArray()[0]);
460 // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
461 executeJavaScript("testObject.setCharArray([{foo: 42}]);");
462 assertEquals('\u0000', mTestObject.waitForCharArray()[0]);
464 // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
465 executeJavaScript("testObject.setShortArray([{foo: 42}]);");
466 assertEquals(0, mTestObject.waitForShortArray()[0]);
468 // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
469 executeJavaScript("testObject.setIntArray([{foo: 42}]);");
470 assertEquals(0, mTestObject.waitForIntArray()[0]);
472 // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
473 executeJavaScript("testObject.setLongArray([{foo: 42}]);");
474 assertEquals(0L, mTestObject.waitForLongArray()[0]);
476 // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
477 executeJavaScript("testObject.setFloatArray([{foo: 42}]);");
478 assertEquals(0.0f, mTestObject.waitForFloatArray()[0]);
480 // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
481 executeJavaScript("testObject.setDoubleArray([{foo: 42}]);");
482 assertEquals(0.0, mTestObject.waitForDoubleArray()[0]);
484 // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
485 executeJavaScript("testObject.setObjectArray([{foo: 42}]);");
486 assertNull(mTestObject.waitForObjectArray());
488 // LIVECONNECT_COMPLIANCE: Should call toString() on object.
489 executeJavaScript("testObject.setStringArray([{foo: 42}]);");
490 assertNull(mTestObject.waitForStringArray()[0]);
492 // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
493 executeJavaScript("testObject.setCustomTypeArray([{foo: 42}]);");
494 assertNull(mTestObject.waitForCustomTypeArray());
497 // Test passing an array of Java objects to a method which takes a Java
500 @Feature({"AndroidWebView", "Android-JavaBridge"})
501 public void testPassJavaObject() throws Throwable {
502 // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
503 executeJavaScript("testObject.setBooleanArray([testObject.getObjectInstance()]);");
504 assertFalse(mTestObject.waitForBooleanArray()[0]);
506 // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
507 executeJavaScript("testObject.setByteArray([testObject.getObjectInstance()]);");
508 assertEquals(0, mTestObject.waitForByteArray()[0]);
510 // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
511 executeJavaScript("testObject.setCharArray([testObject.getObjectInstance()]);");
512 assertEquals('\u0000', mTestObject.waitForCharArray()[0]);
514 // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
515 executeJavaScript("testObject.setShortArray([testObject.getObjectInstance()]);");
516 assertEquals(0, mTestObject.waitForShortArray()[0]);
518 // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
519 executeJavaScript("testObject.setIntArray([testObject.getObjectInstance()]);");
520 assertEquals(0, mTestObject.waitForIntArray()[0]);
522 // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
523 executeJavaScript("testObject.setLongArray([testObject.getObjectInstance()]);");
524 assertEquals(0L, mTestObject.waitForLongArray()[0]);
526 // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
527 executeJavaScript("testObject.setFloatArray([testObject.getObjectInstance()]);");
528 assertEquals(0.0f, mTestObject.waitForFloatArray()[0]);
530 // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
531 executeJavaScript("testObject.setDoubleArray([testObject.getObjectInstance()]);");
532 assertEquals(0.0, mTestObject.waitForDoubleArray()[0]);
534 // LIVECONNECT_COMPLIANCE: Should create an array and pass Java object.
535 executeJavaScript("testObject.setObjectArray([testObject.getObjectInstance()]);");
536 assertNull(mTestObject.waitForObjectArray());
538 // LIVECONNECT_COMPLIANCE: Should call toString() on object.
539 executeJavaScript("testObject.setStringArray([testObject.getObjectInstance()]);");
540 assertNull(mTestObject.waitForStringArray()[0]);
542 // LIVECONNECT_COMPLIANCE: Should create array and pass Java object.
543 executeJavaScript("testObject.setCustomTypeArray([testObject.getObjectInstance()]);");
544 assertNull(mTestObject.waitForCustomTypeArray());
545 executeJavaScript("testObject.setCustomTypeArray([testObject.getCustomTypeInstance()]);");
546 assertNull(mTestObject.waitForCustomTypeArray());
549 // Test passing an array of JavaScript null values to a method which takes
552 @Feature({"AndroidWebView", "Android-JavaBridge"})
553 public void testPassNull() throws Throwable {
554 executeJavaScript("testObject.setByteArray([null]);");
555 assertEquals(0, mTestObject.waitForByteArray()[0]);
557 executeJavaScript("testObject.setCharArray([null]);");
558 assertEquals('\u0000', mTestObject.waitForCharArray()[0]);
560 executeJavaScript("testObject.setShortArray([null]);");
561 assertEquals(0, mTestObject.waitForShortArray()[0]);
563 executeJavaScript("testObject.setIntArray([null]);");
564 assertEquals(0, mTestObject.waitForIntArray()[0]);
566 executeJavaScript("testObject.setLongArray([null]);");
567 assertEquals(0L, mTestObject.waitForLongArray()[0]);
569 executeJavaScript("testObject.setFloatArray([null]);");
570 assertEquals(0.0f, mTestObject.waitForFloatArray()[0]);
572 executeJavaScript("testObject.setDoubleArray([null]);");
573 assertEquals(0.0, mTestObject.waitForDoubleArray()[0]);
575 executeJavaScript("testObject.setBooleanArray([null]);");
576 assertFalse(mTestObject.waitForBooleanArray()[0]);
578 // LIVECONNECT_COMPLIANCE: Should create array and pass null.
579 executeJavaScript("testObject.setObjectArray([null]);");
580 assertNull(mTestObject.waitForObjectArray());
582 executeJavaScript("testObject.setStringArray([null]);");
583 assertNull(mTestObject.waitForStringArray()[0]);
585 // LIVECONNECT_COMPLIANCE: Should create array and pass null.
586 executeJavaScript("testObject.setCustomTypeArray([null]);");
587 assertNull(mTestObject.waitForCustomTypeArray());
590 // Test passing an array of JavaScript undefined values to a method which
591 // takes a Java array.
593 @Feature({"AndroidWebView", "Android-JavaBridge"})
594 public void testPassUndefined() throws Throwable {
595 executeJavaScript("testObject.setByteArray([undefined]);");
596 assertEquals(0, mTestObject.waitForByteArray()[0]);
598 executeJavaScript("testObject.setCharArray([undefined]);");
599 assertEquals(0, mTestObject.waitForCharArray()[0]);
601 executeJavaScript("testObject.setShortArray([undefined]);");
602 assertEquals(0, mTestObject.waitForShortArray()[0]);
604 executeJavaScript("testObject.setIntArray([undefined]);");
605 assertEquals(0, mTestObject.waitForIntArray()[0]);
607 executeJavaScript("testObject.setLongArray([undefined]);");
608 assertEquals(0L, mTestObject.waitForLongArray()[0]);
610 executeJavaScript("testObject.setFloatArray([undefined]);");
611 assertEquals(0.0f, mTestObject.waitForFloatArray()[0]);
613 executeJavaScript("testObject.setDoubleArray([undefined]);");
614 assertEquals(0.0, mTestObject.waitForDoubleArray()[0]);
616 executeJavaScript("testObject.setBooleanArray([undefined]);");
617 assertEquals(false, mTestObject.waitForBooleanArray()[0]);
619 // LIVECONNECT_COMPLIANCE: Should create array and pass null.
620 executeJavaScript("testObject.setObjectArray([undefined]);");
621 assertNull(mTestObject.waitForObjectArray());
623 executeJavaScript("testObject.setStringArray([undefined]);");
624 assertNull(mTestObject.waitForStringArray()[0]);
626 // LIVECONNECT_COMPLIANCE: Should create array and pass null.
627 executeJavaScript("testObject.setCustomTypeArray([undefined]);");
628 assertNull(mTestObject.waitForCustomTypeArray());
631 // Test passing a typed Int8Array to a method which takes a Java array.
633 @Feature({"AndroidWebView", "Android-JavaBridge"})
634 public void testPassInt8Array() throws Throwable {
635 executeJavaScript("buffer = new ArrayBuffer(1);");
636 executeJavaScript("int8_array = new Int8Array(buffer);");
637 executeJavaScript("int8_array[0] = 42;");
639 executeJavaScript("testObject.setBooleanArray(int8_array);");
640 assertFalse(mTestObject.waitForBooleanArray()[0]);
642 executeJavaScript("testObject.setByteArray(int8_array);");
643 assertEquals(42, mTestObject.waitForByteArray()[0]);
645 executeJavaScript("testObject.setCharArray(int8_array);");
646 assertEquals('\u0000', mTestObject.waitForCharArray()[0]);
648 executeJavaScript("testObject.setShortArray(int8_array);");
649 assertEquals(42, mTestObject.waitForShortArray()[0]);
651 executeJavaScript("testObject.setIntArray(int8_array);");
652 assertEquals(42, mTestObject.waitForIntArray()[0]);
654 executeJavaScript("testObject.setLongArray(int8_array);");
655 assertEquals(42L, mTestObject.waitForLongArray()[0]);
657 executeJavaScript("testObject.setFloatArray(int8_array);");
658 assertEquals(42.0f, mTestObject.waitForFloatArray()[0]);
660 executeJavaScript("testObject.setDoubleArray(int8_array);");
661 assertEquals(42.0, mTestObject.waitForDoubleArray()[0]);
663 executeJavaScript("testObject.setObjectArray(int8_array);");
664 assertNull(mTestObject.waitForObjectArray());
666 executeJavaScript("testObject.setStringArray(int8_array);");
667 assertNull(mTestObject.waitForStringArray()[0]);
669 executeJavaScript("testObject.setCustomTypeArray(int8_array);");
670 assertNull(mTestObject.waitForCustomTypeArray());
673 // Test passing a typed Uint8Array to a method which takes a Java array.
675 @Feature({"AndroidWebView", "Android-JavaBridge"})
676 public void testPassUint8Array() throws Throwable {
677 executeJavaScript("buffer = new ArrayBuffer(1);");
678 executeJavaScript("uint8_array = new Uint8Array(buffer);");
679 executeJavaScript("uint8_array[0] = 42;");
681 executeJavaScript("testObject.setBooleanArray(uint8_array);");
682 assertFalse(mTestObject.waitForBooleanArray()[0]);
684 executeJavaScript("testObject.setByteArray(uint8_array);");
685 assertEquals(42, mTestObject.waitForByteArray()[0]);
687 executeJavaScript("testObject.setCharArray(uint8_array);");
688 assertEquals('\u0000', mTestObject.waitForCharArray()[0]);
690 executeJavaScript("testObject.setShortArray(uint8_array);");
691 assertEquals(42, mTestObject.waitForShortArray()[0]);
693 executeJavaScript("testObject.setIntArray(uint8_array);");
694 assertEquals(42, mTestObject.waitForIntArray()[0]);
696 executeJavaScript("testObject.setLongArray(uint8_array);");
697 assertEquals(42L, mTestObject.waitForLongArray()[0]);
699 executeJavaScript("testObject.setFloatArray(uint8_array);");
700 assertEquals(42.0f, mTestObject.waitForFloatArray()[0]);
702 executeJavaScript("testObject.setDoubleArray(uint8_array);");
703 assertEquals(42.0, mTestObject.waitForDoubleArray()[0]);
705 executeJavaScript("testObject.setObjectArray(uint8_array);");
706 assertNull(mTestObject.waitForObjectArray());
708 executeJavaScript("testObject.setStringArray(uint8_array);");
709 assertNull(mTestObject.waitForStringArray()[0]);
711 executeJavaScript("testObject.setCustomTypeArray(uint8_array);");
712 assertNull(mTestObject.waitForCustomTypeArray());
715 // Test passing a typed Int16Array to a method which takes a Java array.
717 @Feature({"AndroidWebView", "Android-JavaBridge"})
718 public void testPassInt16Array() throws Throwable {
719 executeJavaScript("buffer = new ArrayBuffer(2);");
720 executeJavaScript("int16_array = new Int16Array(buffer);");
721 executeJavaScript("int16_array[0] = 42;");
723 executeJavaScript("testObject.setBooleanArray(int16_array);");
724 assertFalse(mTestObject.waitForBooleanArray()[0]);
726 executeJavaScript("testObject.setByteArray(int16_array);");
727 assertEquals(42, mTestObject.waitForByteArray()[0]);
729 executeJavaScript("testObject.setCharArray(int16_array);");
730 assertEquals('\u0000', mTestObject.waitForCharArray()[0]);
732 executeJavaScript("testObject.setShortArray(int16_array);");
733 assertEquals(42, mTestObject.waitForShortArray()[0]);
735 executeJavaScript("testObject.setIntArray(int16_array);");
736 assertEquals(42, mTestObject.waitForIntArray()[0]);
738 executeJavaScript("testObject.setLongArray(int16_array);");
739 assertEquals(42L, mTestObject.waitForLongArray()[0]);
741 executeJavaScript("testObject.setFloatArray(int16_array);");
742 assertEquals(42.0f, mTestObject.waitForFloatArray()[0]);
744 executeJavaScript("testObject.setDoubleArray(int16_array);");
745 assertEquals(42.0, mTestObject.waitForDoubleArray()[0]);
747 executeJavaScript("testObject.setObjectArray(int16_array);");
748 assertNull(mTestObject.waitForObjectArray());
750 executeJavaScript("testObject.setStringArray(int16_array);");
751 assertNull(mTestObject.waitForStringArray()[0]);
753 executeJavaScript("testObject.setCustomTypeArray(int16_array);");
754 assertNull(mTestObject.waitForCustomTypeArray());
757 // Test passing a typed Uint16Array to a method which takes a Java array.
759 @Feature({"AndroidWebView", "Android-JavaBridge"})
760 public void testPassUint16Array() throws Throwable {
761 executeJavaScript("buffer = new ArrayBuffer(2);");
762 executeJavaScript("uint16_array = new Uint16Array(buffer);");
763 executeJavaScript("uint16_array[0] = 42;");
765 executeJavaScript("testObject.setBooleanArray(uint16_array);");
766 assertFalse(mTestObject.waitForBooleanArray()[0]);
768 executeJavaScript("testObject.setByteArray(uint16_array);");
769 assertEquals(42, mTestObject.waitForByteArray()[0]);
771 executeJavaScript("testObject.setCharArray(uint16_array);");
772 assertEquals('\u0000', mTestObject.waitForCharArray()[0]);
774 executeJavaScript("testObject.setShortArray(uint16_array);");
775 assertEquals(42, mTestObject.waitForShortArray()[0]);
777 executeJavaScript("testObject.setIntArray(uint16_array);");
778 assertEquals(42, mTestObject.waitForIntArray()[0]);
780 executeJavaScript("testObject.setLongArray(uint16_array);");
781 assertEquals(42L, mTestObject.waitForLongArray()[0]);
783 executeJavaScript("testObject.setFloatArray(uint16_array);");
784 assertEquals(42.0f, mTestObject.waitForFloatArray()[0]);
786 executeJavaScript("testObject.setDoubleArray(uint16_array);");
787 assertEquals(42.0, mTestObject.waitForDoubleArray()[0]);
789 executeJavaScript("testObject.setObjectArray(uint16_array);");
790 assertNull(mTestObject.waitForObjectArray());
792 executeJavaScript("testObject.setStringArray(uint16_array);");
793 assertNull(mTestObject.waitForStringArray()[0]);
795 executeJavaScript("testObject.setCustomTypeArray(uint16_array);");
796 assertNull(mTestObject.waitForCustomTypeArray());
799 // Test passing a typed Int32Array to a method which takes a Java array.
801 @Feature({"AndroidWebView", "Android-JavaBridge"})
802 public void testPassInt32Array() throws Throwable {
803 executeJavaScript("buffer = new ArrayBuffer(4);");
804 executeJavaScript("int32_array = new Int32Array(buffer);");
805 executeJavaScript("int32_array[0] = 42;");
807 executeJavaScript("testObject.setBooleanArray(int32_array);");
808 assertFalse(mTestObject.waitForBooleanArray()[0]);
810 executeJavaScript("testObject.setByteArray(int32_array);");
811 assertEquals(42, mTestObject.waitForByteArray()[0]);
813 executeJavaScript("testObject.setCharArray(int32_array);");
814 assertEquals('\u0000', mTestObject.waitForCharArray()[0]);
816 executeJavaScript("testObject.setShortArray(int32_array);");
817 assertEquals(42, mTestObject.waitForShortArray()[0]);
819 executeJavaScript("testObject.setIntArray(int32_array);");
820 assertEquals(42, mTestObject.waitForIntArray()[0]);
822 executeJavaScript("testObject.setLongArray(int32_array);");
823 assertEquals(42L, mTestObject.waitForLongArray()[0]);
825 executeJavaScript("testObject.setFloatArray(int32_array);");
826 assertEquals(42.0f, mTestObject.waitForFloatArray()[0]);
828 executeJavaScript("testObject.setDoubleArray(int32_array);");
829 assertEquals(42.0, mTestObject.waitForDoubleArray()[0]);
831 executeJavaScript("testObject.setObjectArray(int32_array);");
832 assertNull(mTestObject.waitForObjectArray());
834 executeJavaScript("testObject.setStringArray(int32_array);");
835 assertNull(mTestObject.waitForStringArray()[0]);
837 executeJavaScript("testObject.setCustomTypeArray(int32_array);");
838 assertNull(mTestObject.waitForCustomTypeArray());
841 // Test passing a typed Uint32Array to a method which takes a Java array.
843 @Feature({"AndroidWebView", "Android-JavaBridge"})
844 public void testPassUint32Array() throws Throwable {
845 executeJavaScript("buffer = new ArrayBuffer(4);");
846 executeJavaScript("uint32_array = new Uint32Array(buffer);");
847 executeJavaScript("uint32_array[0] = 42;");
849 executeJavaScript("testObject.setBooleanArray(uint32_array);");
850 assertFalse(mTestObject.waitForBooleanArray()[0]);
852 executeJavaScript("testObject.setByteArray(uint32_array);");
853 assertEquals(42, mTestObject.waitForByteArray()[0]);
855 executeJavaScript("testObject.setCharArray(uint32_array);");
856 assertEquals('\u0000', mTestObject.waitForCharArray()[0]);
858 executeJavaScript("testObject.setShortArray(uint32_array);");
859 assertEquals(42, mTestObject.waitForShortArray()[0]);
861 executeJavaScript("testObject.setIntArray(uint32_array);");
862 assertEquals(42, mTestObject.waitForIntArray()[0]);
864 executeJavaScript("testObject.setLongArray(uint32_array);");
865 assertEquals(42L, mTestObject.waitForLongArray()[0]);
867 executeJavaScript("testObject.setFloatArray(uint32_array);");
868 assertEquals(42.0f, mTestObject.waitForFloatArray()[0]);
870 executeJavaScript("testObject.setDoubleArray(uint32_array);");
871 assertEquals(42.0, mTestObject.waitForDoubleArray()[0]);
873 executeJavaScript("testObject.setObjectArray(uint32_array);");
874 assertNull(mTestObject.waitForObjectArray());
876 executeJavaScript("testObject.setStringArray(uint32_array);");
877 assertNull(mTestObject.waitForStringArray()[0]);
879 executeJavaScript("testObject.setCustomTypeArray(uint32_array);");
880 assertNull(mTestObject.waitForCustomTypeArray());
883 // Test passing a typed Float32Array to a method which takes a Java array.
885 @Feature({"AndroidWebView", "Android-JavaBridge"})
886 public void testPassFloat32Array() throws Throwable {
887 executeJavaScript("buffer = new ArrayBuffer(4);");
888 executeJavaScript("float32_array = new Float32Array(buffer);");
889 executeJavaScript("float32_array[0] = 42.0;");
891 executeJavaScript("testObject.setBooleanArray(float32_array);");
892 assertFalse(mTestObject.waitForBooleanArray()[0]);
894 executeJavaScript("testObject.setByteArray(float32_array);");
895 assertEquals(42, mTestObject.waitForByteArray()[0]);
897 executeJavaScript("testObject.setCharArray(float32_array);");
898 assertEquals('\u0000', mTestObject.waitForCharArray()[0]);
900 executeJavaScript("testObject.setShortArray(float32_array);");
901 assertEquals(42, mTestObject.waitForShortArray()[0]);
903 executeJavaScript("testObject.setIntArray(float32_array);");
904 assertEquals(42, mTestObject.waitForIntArray()[0]);
906 executeJavaScript("testObject.setLongArray(float32_array);");
907 assertEquals(42L, mTestObject.waitForLongArray()[0]);
909 executeJavaScript("testObject.setFloatArray(float32_array);");
910 assertEquals(42.0f, mTestObject.waitForFloatArray()[0]);
912 executeJavaScript("testObject.setDoubleArray(float32_array);");
913 assertEquals(42.0, mTestObject.waitForDoubleArray()[0]);
915 executeJavaScript("testObject.setObjectArray(float32_array);");
916 assertNull(mTestObject.waitForObjectArray());
918 executeJavaScript("testObject.setStringArray(float32_array);");
919 assertNull(mTestObject.waitForStringArray()[0]);
921 executeJavaScript("testObject.setCustomTypeArray(float32_array);");
922 assertNull(mTestObject.waitForCustomTypeArray());
925 // Test passing a typed Float64Array to a method which takes a Java array.
927 @Feature({"AndroidWebView", "Android-JavaBridge"})
928 public void testPassFloat64Array() throws Throwable {
929 executeJavaScript("buffer = new ArrayBuffer(8);");
930 executeJavaScript("float64_array = new Float64Array(buffer);");
931 executeJavaScript("float64_array[0] = 42.0;");
933 executeJavaScript("testObject.setBooleanArray(float64_array);");
934 assertFalse(mTestObject.waitForBooleanArray()[0]);
936 executeJavaScript("testObject.setByteArray(float64_array);");
937 assertEquals(42, mTestObject.waitForByteArray()[0]);
939 executeJavaScript("testObject.setCharArray(float64_array);");
940 assertEquals('\u0000', mTestObject.waitForCharArray()[0]);
942 executeJavaScript("testObject.setShortArray(float64_array);");
943 assertEquals(42, mTestObject.waitForShortArray()[0]);
945 executeJavaScript("testObject.setIntArray(float64_array);");
946 assertEquals(42, mTestObject.waitForIntArray()[0]);
948 executeJavaScript("testObject.setLongArray(float64_array);");
949 assertEquals(42L, mTestObject.waitForLongArray()[0]);
951 executeJavaScript("testObject.setFloatArray(float64_array);");
952 assertEquals(42.0f, mTestObject.waitForFloatArray()[0]);
954 executeJavaScript("testObject.setDoubleArray(float64_array);");
955 assertEquals(42.0, mTestObject.waitForDoubleArray()[0]);
957 executeJavaScript("testObject.setObjectArray(float64_array);");
958 assertNull(mTestObject.waitForObjectArray());
960 executeJavaScript("testObject.setStringArray(float64_array);");
961 assertNull(mTestObject.waitForStringArray()[0]);
963 executeJavaScript("testObject.setCustomTypeArray(float64_array);");
964 assertNull(mTestObject.waitForCustomTypeArray());