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