Home | History | Annotate | Download | only in webviewtests
      1 /*
      2  * Copyright (C) 2011 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 /**
     18  * Part of the test suite for the WebView's Java Bridge. This class tests that
     19  * we correctly convert JavaScript arrays to Java arrays when passing them to
     20  * the methods of injected Java objects.
     21  *
     22  * The conversions should follow
     23  * http://jdk6.java.net/plugin2/liveconnect/#JS_JAVA_CONVERSIONS. Places in
     24  * which the implementation differs from the spec are marked with
     25  * LIVECONNECT_COMPLIANCE.
     26  * FIXME: Consider making our implementation more compliant, if it will not
     27  * break backwards-compatibility. See b/4408210.
     28  *
     29  * To run this test ...
     30  *  adb shell am instrument -w -e class com.android.webviewtests.JavaBridgeArrayCoercionTest \
     31  *     com.android.webviewtests/android.test.InstrumentationTestRunner
     32  */
     33 
     34 package com.android.webviewtests;
     35 
     36 public class JavaBridgeArrayCoercionTest extends JavaBridgeTestBase {
     37     private class TestObject extends Controller {
     38         private Object mObjectInstance;
     39         private CustomType mCustomTypeInstance;
     40 
     41         private boolean[] mBooleanArray;
     42         private byte[] mByteArray;
     43         private char[] mCharArray;
     44         private short[] mShortArray;
     45         private int[] mIntArray;
     46         private long[] mLongArray;
     47         private float[] mFloatArray;
     48         private double[] mDoubleArray;
     49         private String[] mStringArray;
     50         private Object[] mObjectArray;
     51         private CustomType[] mCustomTypeArray;
     52 
     53         public TestObject() {
     54             mObjectInstance = new Object();
     55             mCustomTypeInstance = new CustomType();
     56         }
     57 
     58         public Object getObjectInstance() {
     59             return mObjectInstance;
     60         }
     61         public CustomType getCustomTypeInstance() {
     62             return mCustomTypeInstance;
     63         }
     64 
     65         public synchronized void setBooleanArray(boolean[] x) {
     66             mBooleanArray = x;
     67             notifyResultIsReady();
     68         }
     69         public synchronized void setByteArray(byte[] x) {
     70             mByteArray = x;
     71             notifyResultIsReady();
     72         }
     73         public synchronized void setCharArray(char[] x) {
     74             mCharArray = x;
     75             notifyResultIsReady();
     76         }
     77         public synchronized void setShortArray(short[] x) {
     78             mShortArray = x;
     79             notifyResultIsReady();
     80         }
     81         public synchronized void setIntArray(int[] x) {
     82             mIntArray = x;
     83             notifyResultIsReady();
     84         }
     85         public synchronized void setLongArray(long[] x) {
     86             mLongArray = x;
     87             notifyResultIsReady();
     88         }
     89         public synchronized void setFloatArray(float[] x) {
     90             mFloatArray = x;
     91             notifyResultIsReady();
     92         }
     93         public synchronized void setDoubleArray(double[] x) {
     94             mDoubleArray = x;
     95             notifyResultIsReady();
     96         }
     97         public synchronized void setStringArray(String[] x) {
     98             mStringArray = x;
     99             notifyResultIsReady();
    100         }
    101         public synchronized void setObjectArray(Object[] x) {
    102             mObjectArray = x;
    103             notifyResultIsReady();
    104         }
    105         public synchronized void setCustomTypeArray(CustomType[] x) {
    106             mCustomTypeArray = x;
    107             notifyResultIsReady();
    108         }
    109 
    110         public synchronized boolean[] waitForBooleanArray() {
    111             waitForResult();
    112             return mBooleanArray;
    113         }
    114         public synchronized byte[] waitForByteArray() {
    115             waitForResult();
    116             return mByteArray;
    117         }
    118         public synchronized char[] waitForCharArray() {
    119             waitForResult();
    120             return mCharArray;
    121         }
    122         public synchronized short[] waitForShortArray() {
    123             waitForResult();
    124             return mShortArray;
    125         }
    126         public synchronized int[] waitForIntArray() {
    127             waitForResult();
    128             return mIntArray;
    129         }
    130         public synchronized long[] waitForLongArray() {
    131             waitForResult();
    132             return mLongArray;
    133         }
    134         public synchronized float[] waitForFloatArray() {
    135             waitForResult();
    136             return mFloatArray;
    137         }
    138         public synchronized double[] waitForDoubleArray() {
    139             waitForResult();
    140             return mDoubleArray;
    141         }
    142         public synchronized String[] waitForStringArray() {
    143             waitForResult();
    144             return mStringArray;
    145         }
    146         public synchronized Object[] waitForObjectArray() {
    147             waitForResult();
    148             return mObjectArray;
    149         }
    150         public synchronized CustomType[] waitForCustomTypeArray() {
    151             waitForResult();
    152             return mCustomTypeArray;
    153         }
    154     }
    155 
    156     // Two custom types used when testing passing objects.
    157     private class CustomType {
    158     }
    159 
    160     private TestObject mTestObject;
    161 
    162     @Override
    163     protected void setUp() throws Exception {
    164         super.setUp();
    165         mTestObject = new TestObject();
    166         setUpWebView(mTestObject, "testObject");
    167     }
    168 
    169     // Note that all tests use a single element array for simplicity. We test
    170     // multiple elements elsewhere.
    171 
    172     // Test passing an array of JavaScript numbers in the int32 range to a
    173     // method which takes a Java array.
    174     public void testPassNumberInt32() throws Throwable {
    175         executeJavaScript("testObject.setBooleanArray([0]);");
    176         assertFalse(mTestObject.waitForBooleanArray()[0]);
    177         // LIVECONNECT_COMPLIANCE: Should convert to boolean.
    178         executeJavaScript("testObject.setBooleanArray([42]);");
    179         assertFalse(mTestObject.waitForBooleanArray()[0]);
    180 
    181         executeJavaScript("testObject.setByteArray([42]);");
    182         assertEquals(42, mTestObject.waitForByteArray()[0]);
    183 
    184         // LIVECONNECT_COMPLIANCE: Should convert to numeric char value.
    185         executeJavaScript("testObject.setCharArray([42]);");
    186         assertEquals('\u0000', mTestObject.waitForCharArray()[0]);
    187 
    188         executeJavaScript("testObject.setShortArray([42]);");
    189         assertEquals(42, mTestObject.waitForShortArray()[0]);
    190 
    191         executeJavaScript("testObject.setIntArray([42]);");
    192         assertEquals(42, mTestObject.waitForIntArray()[0]);
    193 
    194         executeJavaScript("testObject.setLongArray([42]);");
    195         assertEquals(42L, mTestObject.waitForLongArray()[0]);
    196 
    197         executeJavaScript("testObject.setFloatArray([42]);");
    198         assertEquals(42.0f, mTestObject.waitForFloatArray()[0]);
    199 
    200         executeJavaScript("testObject.setDoubleArray([42]);");
    201         assertEquals(42.0, mTestObject.waitForDoubleArray()[0]);
    202 
    203         // LIVECONNECT_COMPLIANCE: Should create array and create instances of java.lang.Number.
    204         executeJavaScript("testObject.setObjectArray([42]);");
    205         assertNull(mTestObject.waitForObjectArray());
    206 
    207         // LIVECONNECT_COMPLIANCE: Should create instances of java.lang.String.
    208         executeJavaScript("testObject.setStringArray([42]);");
    209         assertNull(mTestObject.waitForStringArray()[0]);
    210 
    211         // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
    212         executeJavaScript("testObject.setCustomTypeArray([42]);");
    213         assertNull(mTestObject.waitForCustomTypeArray());
    214     }
    215 
    216     // Test passing an array of JavaScript numbers in the double range to a
    217     // method which takes a Java array.
    218     public void testPassNumberDouble() throws Throwable {
    219         // LIVECONNECT_COMPLIANCE: Should convert to boolean.
    220         executeJavaScript("testObject.setBooleanArray([42.1]);");
    221         assertFalse(mTestObject.waitForBooleanArray()[0]);
    222 
    223         executeJavaScript("testObject.setByteArray([42.1]);");
    224         assertEquals(42, mTestObject.waitForByteArray()[0]);
    225 
    226         // LIVECONNECT_COMPLIANCE: Should convert to numeric char value.
    227         executeJavaScript("testObject.setCharArray([42.1]);");
    228         assertEquals('\u0000', mTestObject.waitForCharArray()[0]);
    229 
    230         executeJavaScript("testObject.setShortArray([42.1]);");
    231         assertEquals(42, mTestObject.waitForShortArray()[0]);
    232 
    233         executeJavaScript("testObject.setIntArray([42.1]);");
    234         assertEquals(42, mTestObject.waitForIntArray()[0]);
    235 
    236         executeJavaScript("testObject.setLongArray([42.1]);");
    237         assertEquals(42L, mTestObject.waitForLongArray()[0]);
    238 
    239         executeJavaScript("testObject.setFloatArray([42.1]);");
    240         assertEquals(42.1f, mTestObject.waitForFloatArray()[0]);
    241 
    242         executeJavaScript("testObject.setDoubleArray([42.1]);");
    243         assertEquals(42.1, mTestObject.waitForDoubleArray()[0]);
    244 
    245         // LIVECONNECT_COMPLIANCE: Should create array and create instances of java.lang.Number.
    246         executeJavaScript("testObject.setObjectArray([42.1]);");
    247         assertNull(mTestObject.waitForObjectArray());
    248 
    249         // LIVECONNECT_COMPLIANCE: Should create instances of java.lang.String.
    250         executeJavaScript("testObject.setStringArray([42.1]);");
    251         assertNull(mTestObject.waitForStringArray()[0]);
    252 
    253         // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
    254         executeJavaScript("testObject.setCustomTypeArray([42.1]);");
    255         assertNull(mTestObject.waitForCustomTypeArray());
    256     }
    257 
    258     // Test passing an array of JavaScript NaN values to a method which takes a
    259     // Java array.
    260     public void testPassNumberNaN() throws Throwable {
    261         executeJavaScript("testObject.setBooleanArray([Number.NaN]);");
    262         assertFalse(mTestObject.waitForBooleanArray()[0]);
    263 
    264         executeJavaScript("testObject.setByteArray([Number.NaN]);");
    265         assertEquals(0, mTestObject.waitForByteArray()[0]);
    266 
    267         executeJavaScript("testObject.setCharArray([Number.NaN]);");
    268         assertEquals('\u0000', mTestObject.waitForCharArray()[0]);
    269 
    270         executeJavaScript("testObject.setShortArray([Number.NaN]);");
    271         assertEquals(0, mTestObject.waitForShortArray()[0]);
    272 
    273         executeJavaScript("testObject.setIntArray([Number.NaN]);");
    274         assertEquals(0, mTestObject.waitForIntArray()[0]);
    275 
    276         executeJavaScript("testObject.setLongArray([Number.NaN]);");
    277         assertEquals(0L, mTestObject.waitForLongArray()[0]);
    278 
    279         executeJavaScript("testObject.setFloatArray([Number.NaN]);");
    280         assertEquals(Float.NaN, mTestObject.waitForFloatArray()[0]);
    281 
    282         executeJavaScript("testObject.setDoubleArray([Number.NaN]);");
    283         assertEquals(Double.NaN, mTestObject.waitForDoubleArray()[0]);
    284 
    285         // LIVECONNECT_COMPLIANCE: Should create array and create instances of java.lang.Number.
    286         executeJavaScript("testObject.setObjectArray([Number.NaN]);");
    287         assertNull(mTestObject.waitForObjectArray());
    288 
    289         // LIVECONNECT_COMPLIANCE: Should create instances of java.lang.String.
    290         executeJavaScript("testObject.setStringArray([Number.NaN]);");
    291         assertNull(mTestObject.waitForStringArray()[0]);
    292 
    293         // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
    294         executeJavaScript("testObject.setCustomTypeArray([Number.NaN]);");
    295         assertNull(mTestObject.waitForCustomTypeArray());
    296     }
    297 
    298     // Test passing an array of JavaScript infinity values to a method which
    299     // takes a Java array.
    300     public void testPassNumberInfinity() throws Throwable {
    301         executeJavaScript("testObject.setBooleanArray([Infinity]);");
    302         assertFalse(mTestObject.waitForBooleanArray()[0]);
    303 
    304         executeJavaScript("testObject.setByteArray([Infinity]);");
    305         assertEquals(-1, mTestObject.waitForByteArray()[0]);
    306 
    307         // LIVECONNECT_COMPLIANCE: Should convert to maximum numeric char value.
    308         executeJavaScript("testObject.setCharArray([Infinity]);");
    309         assertEquals('\u0000', mTestObject.waitForCharArray()[0]);
    310 
    311         executeJavaScript("testObject.setShortArray([Infinity]);");
    312         assertEquals(-1, mTestObject.waitForShortArray()[0]);
    313 
    314         executeJavaScript("testObject.setIntArray([Infinity]);");
    315         assertEquals(Integer.MAX_VALUE, mTestObject.waitForIntArray()[0]);
    316 
    317         // LIVECONNECT_COMPLIANCE: Should be Long.MAX_VALUE.
    318         executeJavaScript("testObject.setLongArray([Infinity]);");
    319         assertEquals(-1L, mTestObject.waitForLongArray()[0]);
    320 
    321         executeJavaScript("testObject.setFloatArray([Infinity]);");
    322         assertEquals(Float.POSITIVE_INFINITY, mTestObject.waitForFloatArray()[0]);
    323 
    324         executeJavaScript("testObject.setDoubleArray([Infinity]);");
    325         assertEquals(Double.POSITIVE_INFINITY, mTestObject.waitForDoubleArray()[0]);
    326 
    327         // LIVECONNECT_COMPLIANCE: Should create array and create instances of java.lang.Number.
    328         executeJavaScript("testObject.setObjectArray([Infinity]);");
    329         assertNull(mTestObject.waitForObjectArray());
    330 
    331         // LIVECONNECT_COMPLIANCE: Should create instances of java.lang.String.
    332         executeJavaScript("testObject.setStringArray([Infinity]);");
    333         assertNull(mTestObject.waitForStringArray()[0]);
    334 
    335         // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
    336         executeJavaScript("testObject.setCustomTypeArray([Infinity]);");
    337         assertNull(mTestObject.waitForCustomTypeArray());
    338     }
    339 
    340     // Test passing an array of JavaScript boolean values to a method which
    341     // takes a Java array.
    342     public void testPassBoolean() throws Throwable {
    343         executeJavaScript("testObject.setBooleanArray([true]);");
    344         assertTrue(mTestObject.waitForBooleanArray()[0]);
    345         executeJavaScript("testObject.setBooleanArray([false]);");
    346         assertFalse(mTestObject.waitForBooleanArray()[0]);
    347 
    348         // LIVECONNECT_COMPLIANCE: Should be 1.
    349         executeJavaScript("testObject.setByteArray([true]);");
    350         assertEquals(0, mTestObject.waitForByteArray()[0]);
    351         executeJavaScript("testObject.setByteArray([false]);");
    352         assertEquals(0, mTestObject.waitForByteArray()[0]);
    353 
    354         // LIVECONNECT_COMPLIANCE: Should convert to numeric char value 1.
    355         executeJavaScript("testObject.setCharArray([true]);");
    356         assertEquals('\u0000', mTestObject.waitForCharArray()[0]);
    357         executeJavaScript("testObject.setCharArray([false]);");
    358         assertEquals('\u0000', mTestObject.waitForCharArray()[0]);
    359 
    360         // LIVECONNECT_COMPLIANCE: Should be 1.
    361         executeJavaScript("testObject.setShortArray([true]);");
    362         assertEquals(0, mTestObject.waitForShortArray()[0]);
    363         executeJavaScript("testObject.setShortArray([false]);");
    364         assertEquals(0, mTestObject.waitForShortArray()[0]);
    365 
    366         // LIVECONNECT_COMPLIANCE: Should be 1.
    367         executeJavaScript("testObject.setIntArray([true]);");
    368         assertEquals(0, mTestObject.waitForIntArray()[0]);
    369         executeJavaScript("testObject.setIntArray([false]);");
    370         assertEquals(0, mTestObject.waitForIntArray()[0]);
    371 
    372         // LIVECONNECT_COMPLIANCE: Should be 1.
    373         executeJavaScript("testObject.setLongArray([true]);");
    374         assertEquals(0L, mTestObject.waitForLongArray()[0]);
    375         executeJavaScript("testObject.setLongArray([false]);");
    376         assertEquals(0L, mTestObject.waitForLongArray()[0]);
    377 
    378         // LIVECONNECT_COMPLIANCE: Should be 1.0.
    379         executeJavaScript("testObject.setFloatArray([true]);");
    380         assertEquals(0.0f, mTestObject.waitForFloatArray()[0]);
    381         executeJavaScript("testObject.setFloatArray([false]);");
    382         assertEquals(0.0f, mTestObject.waitForFloatArray()[0]);
    383 
    384         // LIVECONNECT_COMPLIANCE: Should be 1.0.
    385         executeJavaScript("testObject.setDoubleArray([true]);");
    386         assertEquals(0.0, mTestObject.waitForDoubleArray()[0]);
    387         executeJavaScript("testObject.setDoubleArray([false]);");
    388         assertEquals(0.0, mTestObject.waitForDoubleArray()[0]);
    389 
    390         // LIVECONNECT_COMPLIANCE: Should create array and create instances of java.lang.Number.
    391         executeJavaScript("testObject.setObjectArray([true]);");
    392         assertNull(mTestObject.waitForObjectArray());
    393 
    394         // LIVECONNECT_COMPLIANCE: Should create instances of java.lang.String.
    395         executeJavaScript("testObject.setStringArray([true]);");
    396         assertNull(mTestObject.waitForStringArray()[0]);
    397 
    398         // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
    399         executeJavaScript("testObject.setCustomTypeArray([true]);");
    400         assertNull(mTestObject.waitForCustomTypeArray());
    401     }
    402 
    403     // Test passing an array of JavaScript strings to a method which takes a
    404     // Java array.
    405     public void testPassString() throws Throwable {
    406         // LIVECONNECT_COMPLIANCE: Non-empty string should convert to true.
    407         executeJavaScript("testObject.setBooleanArray([\"+042.10\"]);");
    408         assertFalse(mTestObject.waitForBooleanArray()[0]);
    409 
    410         // LIVECONNECT_COMPLIANCE: Should use valueOf() of appropriate type.
    411         executeJavaScript("testObject.setByteArray([\"+042.10\"]);");
    412         assertEquals(0, mTestObject.waitForByteArray()[0]);
    413 
    414         // LIVECONNECT_COMPLIANCE: Should decode and convert to numeric char value.
    415         executeJavaScript("testObject.setCharArray([\"+042.10\"]);");
    416         assertEquals(0, mTestObject.waitForCharArray()[0]);
    417 
    418         // LIVECONNECT_COMPLIANCE: Should use valueOf() of appropriate type.
    419         executeJavaScript("testObject.setShortArray([\"+042.10\"]);");
    420         assertEquals(0, mTestObject.waitForShortArray()[0]);
    421 
    422         // LIVECONNECT_COMPLIANCE: Should use valueOf() of appropriate type.
    423         executeJavaScript("testObject.setIntArray([\"+042.10\"]);");
    424         assertEquals(0, mTestObject.waitForIntArray()[0]);
    425 
    426         // LIVECONNECT_COMPLIANCE: Should use valueOf() of appropriate type.
    427         executeJavaScript("testObject.setLongArray([\"+042.10\"]);");
    428         assertEquals(0L, mTestObject.waitForLongArray()[0]);
    429 
    430         // LIVECONNECT_COMPLIANCE: Should use valueOf() of appropriate type.
    431         executeJavaScript("testObject.setFloatArray([\"+042.10\"]);");
    432         assertEquals(0.0f, mTestObject.waitForFloatArray()[0]);
    433 
    434         // LIVECONNECT_COMPLIANCE: Should use valueOf() of appropriate type.
    435         executeJavaScript("testObject.setDoubleArray([\"+042.10\"]);");
    436         assertEquals(0.0, mTestObject.waitForDoubleArray()[0]);
    437 
    438         // LIVECONNECT_COMPLIANCE: Should create array and create instances of java.lang.Number.
    439         executeJavaScript("testObject.setObjectArray([\"+042.10\"]);");
    440         assertNull(mTestObject.waitForObjectArray());
    441 
    442         executeJavaScript("testObject.setStringArray([\"+042.10\"]);");
    443         assertEquals("+042.10", mTestObject.waitForStringArray()[0]);
    444 
    445         // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
    446         executeJavaScript("testObject.setCustomTypeArray([\"+042.10\"]);");
    447         assertNull(mTestObject.waitForCustomTypeArray());
    448     }
    449 
    450     // Test passing an array of JavaScript objects to a method which takes a
    451     // Java array.
    452     public void testPassJavaScriptObject() throws Throwable {
    453         // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
    454         executeJavaScript("testObject.setBooleanArray([{foo: 42}]);");
    455         assertFalse(mTestObject.waitForBooleanArray()[0]);
    456 
    457         // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
    458         executeJavaScript("testObject.setByteArray([{foo: 42}]);");
    459         assertEquals(0, mTestObject.waitForByteArray()[0]);
    460 
    461         // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
    462         executeJavaScript("testObject.setCharArray([{foo: 42}]);");
    463         assertEquals('\u0000', mTestObject.waitForCharArray()[0]);
    464 
    465         // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
    466         executeJavaScript("testObject.setShortArray([{foo: 42}]);");
    467         assertEquals(0, mTestObject.waitForShortArray()[0]);
    468 
    469         // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
    470         executeJavaScript("testObject.setIntArray([{foo: 42}]);");
    471         assertEquals(0, mTestObject.waitForIntArray()[0]);
    472 
    473         // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
    474         executeJavaScript("testObject.setLongArray([{foo: 42}]);");
    475         assertEquals(0L, mTestObject.waitForLongArray()[0]);
    476 
    477         // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
    478         executeJavaScript("testObject.setFloatArray([{foo: 42}]);");
    479         assertEquals(0.0f, mTestObject.waitForFloatArray()[0]);
    480 
    481         // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
    482         executeJavaScript("testObject.setDoubleArray([{foo: 42}]);");
    483         assertEquals(0.0, mTestObject.waitForDoubleArray()[0]);
    484 
    485         // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
    486         executeJavaScript("testObject.setObjectArray([{foo: 42}]);");
    487         assertNull(mTestObject.waitForObjectArray());
    488 
    489         // LIVECONNECT_COMPLIANCE: Should call toString() on object.
    490         executeJavaScript("testObject.setStringArray([{foo: 42}]);");
    491         assertNull(mTestObject.waitForStringArray()[0]);
    492 
    493         // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
    494         executeJavaScript("testObject.setCustomTypeArray([{foo: 42}]);");
    495         assertNull(mTestObject.waitForCustomTypeArray());
    496     }
    497 
    498     // Test passing an array of Java objects to a method which takes a Java
    499     // array.
    500     public void testPassJavaObject() throws Throwable {
    501         // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
    502         executeJavaScript("testObject.setBooleanArray([testObject.getObjectInstance()]);");
    503         assertFalse(mTestObject.waitForBooleanArray()[0]);
    504 
    505         // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
    506         executeJavaScript("testObject.setByteArray([testObject.getObjectInstance()]);");
    507         assertEquals(0, mTestObject.waitForByteArray()[0]);
    508 
    509         // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
    510         executeJavaScript("testObject.setCharArray([testObject.getObjectInstance()]);");
    511         assertEquals('\u0000', mTestObject.waitForCharArray()[0]);
    512 
    513         // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
    514         executeJavaScript("testObject.setShortArray([testObject.getObjectInstance()]);");
    515         assertEquals(0, mTestObject.waitForShortArray()[0]);
    516 
    517         // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
    518         executeJavaScript("testObject.setIntArray([testObject.getObjectInstance()]);");
    519         assertEquals(0, mTestObject.waitForIntArray()[0]);
    520 
    521         // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
    522         executeJavaScript("testObject.setLongArray([testObject.getObjectInstance()]);");
    523         assertEquals(0L, mTestObject.waitForLongArray()[0]);
    524 
    525         // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
    526         executeJavaScript("testObject.setFloatArray([testObject.getObjectInstance()]);");
    527         assertEquals(0.0f, mTestObject.waitForFloatArray()[0]);
    528 
    529         // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
    530         executeJavaScript("testObject.setDoubleArray([testObject.getObjectInstance()]);");
    531         assertEquals(0.0, mTestObject.waitForDoubleArray()[0]);
    532 
    533         // LIVECONNECT_COMPLIANCE: Should create an array and pass Java object.
    534         executeJavaScript("testObject.setObjectArray([testObject.getObjectInstance()]);");
    535         assertNull(mTestObject.waitForObjectArray());
    536 
    537         // LIVECONNECT_COMPLIANCE: Should call toString() on object.
    538         executeJavaScript("testObject.setStringArray([testObject.getObjectInstance()]);");
    539         assertNull(mTestObject.waitForStringArray()[0]);
    540 
    541         // LIVECONNECT_COMPLIANCE: Should create array and pass Java object.
    542         executeJavaScript("testObject.setCustomTypeArray([testObject.getObjectInstance()]);");
    543         assertNull(mTestObject.waitForCustomTypeArray());
    544         executeJavaScript("testObject.setCustomTypeArray([testObject.getCustomTypeInstance()]);");
    545         assertNull(mTestObject.waitForCustomTypeArray());
    546     }
    547 
    548     // Test passing an array of JavaScript null values to a method which takes
    549     // a Java array.
    550     public void testPassNull() throws Throwable {
    551         executeJavaScript("testObject.setByteArray([null]);");
    552         assertEquals(0, mTestObject.waitForByteArray()[0]);
    553 
    554         executeJavaScript("testObject.setCharArray([null]);");
    555         assertEquals('\u0000', mTestObject.waitForCharArray()[0]);
    556 
    557         executeJavaScript("testObject.setShortArray([null]);");
    558         assertEquals(0, mTestObject.waitForShortArray()[0]);
    559 
    560         executeJavaScript("testObject.setIntArray([null]);");
    561         assertEquals(0, mTestObject.waitForIntArray()[0]);
    562 
    563         executeJavaScript("testObject.setLongArray([null]);");
    564         assertEquals(0L, mTestObject.waitForLongArray()[0]);
    565 
    566         executeJavaScript("testObject.setFloatArray([null]);");
    567         assertEquals(0.0f, mTestObject.waitForFloatArray()[0]);
    568 
    569         executeJavaScript("testObject.setDoubleArray([null]);");
    570         assertEquals(0.0, mTestObject.waitForDoubleArray()[0]);
    571 
    572         executeJavaScript("testObject.setBooleanArray([null]);");
    573         assertFalse(mTestObject.waitForBooleanArray()[0]);
    574 
    575         // LIVECONNECT_COMPLIANCE: Should create array and pass null.
    576         executeJavaScript("testObject.setObjectArray([null]);");
    577         assertNull(mTestObject.waitForObjectArray());
    578 
    579         executeJavaScript("testObject.setStringArray([null]);");
    580         assertNull(mTestObject.waitForStringArray()[0]);
    581 
    582         // LIVECONNECT_COMPLIANCE: Should create array and pass null.
    583         executeJavaScript("testObject.setCustomTypeArray([null]);");
    584         assertNull(mTestObject.waitForCustomTypeArray());
    585     }
    586 
    587     // Test passing an array of JavaScript undefined values to a method which
    588     // takes a Java array.
    589     public void testPassUndefined() throws Throwable {
    590         executeJavaScript("testObject.setByteArray([undefined]);");
    591         assertEquals(0, mTestObject.waitForByteArray()[0]);
    592 
    593         executeJavaScript("testObject.setCharArray([undefined]);");
    594         assertEquals(0, mTestObject.waitForCharArray()[0]);
    595 
    596         executeJavaScript("testObject.setShortArray([undefined]);");
    597         assertEquals(0, mTestObject.waitForShortArray()[0]);
    598 
    599         executeJavaScript("testObject.setIntArray([undefined]);");
    600         assertEquals(0, mTestObject.waitForIntArray()[0]);
    601 
    602         executeJavaScript("testObject.setLongArray([undefined]);");
    603         assertEquals(0L, mTestObject.waitForLongArray()[0]);
    604 
    605         executeJavaScript("testObject.setFloatArray([undefined]);");
    606         assertEquals(0.0f, mTestObject.waitForFloatArray()[0]);
    607 
    608         executeJavaScript("testObject.setDoubleArray([undefined]);");
    609         assertEquals(0.0, mTestObject.waitForDoubleArray()[0]);
    610 
    611         executeJavaScript("testObject.setBooleanArray([undefined]);");
    612         assertEquals(false, mTestObject.waitForBooleanArray()[0]);
    613 
    614         // LIVECONNECT_COMPLIANCE: Should create array and pass null.
    615         executeJavaScript("testObject.setObjectArray([undefined]);");
    616         assertNull(mTestObject.waitForObjectArray());
    617 
    618         executeJavaScript("testObject.setStringArray([undefined]);");
    619         assertNull(mTestObject.waitForStringArray()[0]);
    620 
    621         // LIVECONNECT_COMPLIANCE: Should create array and pass null.
    622         executeJavaScript("testObject.setCustomTypeArray([undefined]);");
    623         assertNull(mTestObject.waitForCustomTypeArray());
    624     }
    625 }
    626