FileDocCategorySizeDatePackage
JavaBridgeCoercionTest.javaAPI DocAndroid 5.1 API28974Thu Mar 12 22:22:44 GMT 2015com.android.webviewtests

JavaBridgeCoercionTest

public class JavaBridgeCoercionTest extends JavaBridgeTestBase
Part of the test suite for the WebView's Java Bridge. This class tests that we correctly convert JavaScript values to Java values when passing them to the methods of injected Java objects. The conversions should follow http://jdk6.java.net/plugin2/liveconnect/#JS_JAVA_CONVERSIONS. Places in which the implementation differs from the spec are marked with LIVECONNECT_COMPLIANCE. FIXME: Consider making our implementation more compliant, if it will not break backwards-compatibility. See b/4408210. To run this test ... adb shell am instrument -w -e class com.android.webviewtests.JavaBridgeCoercionTest \ com.android.webviewtests/android.test.InstrumentationTestRunner

Fields Summary
private TestObject
mTestObject
Constructors Summary
Methods Summary
protected voidsetUp()

        super.setUp();
        mTestObject = new TestObject();
        setUpWebView(mTestObject, "testObject");
    
public voidtestPassBoolean()

        executeJavaScript("testObject.setBooleanValue(true);");
        assertTrue(mTestObject.waitForBooleanValue());
        executeJavaScript("testObject.setBooleanValue(false);");
        assertFalse(mTestObject.waitForBooleanValue());

        // LIVECONNECT_COMPLIANCE: Should create an instance of java.lang.Boolean.
        executeJavaScript("testObject.setObjectValue(true);");
        assertNull(mTestObject.waitForObjectValue());

        executeJavaScript("testObject.setStringValue(false);");
        assertEquals("false", mTestObject.waitForStringValue());
        executeJavaScript("testObject.setStringValue(true);");
        assertEquals("true", mTestObject.waitForStringValue());

        // LIVECONNECT_COMPLIANCE: Should be 1.
        executeJavaScript("testObject.setByteValue(true);");
        assertEquals(0, mTestObject.waitForByteValue());
        executeJavaScript("testObject.setByteValue(false);");
        assertEquals(0, mTestObject.waitForByteValue());

        // LIVECONNECT_COMPLIANCE: Should convert to numeric char value 1.
        executeJavaScript("testObject.setCharValue(true);");
        assertEquals('\u0000", mTestObject.waitForCharValue());
        executeJavaScript("testObject.setCharValue(false);");
        assertEquals('\u0000", mTestObject.waitForCharValue());

        // LIVECONNECT_COMPLIANCE: Should be 1.
        executeJavaScript("testObject.setShortValue(true);");
        assertEquals(0, mTestObject.waitForShortValue());
        executeJavaScript("testObject.setShortValue(false);");
        assertEquals(0, mTestObject.waitForShortValue());

        // LIVECONNECT_COMPLIANCE: Should be 1.
        executeJavaScript("testObject.setIntValue(true);");
        assertEquals(0, mTestObject.waitForIntValue());
        executeJavaScript("testObject.setIntValue(false);");
        assertEquals(0, mTestObject.waitForIntValue());

        // LIVECONNECT_COMPLIANCE: Should be 1.
        executeJavaScript("testObject.setLongValue(true);");
        assertEquals(0L, mTestObject.waitForLongValue());
        executeJavaScript("testObject.setLongValue(false);");
        assertEquals(0L, mTestObject.waitForLongValue());

        // LIVECONNECT_COMPLIANCE: Should be 1.0.
        executeJavaScript("testObject.setFloatValue(true);");
        assertEquals(0.0f, mTestObject.waitForFloatValue());
        executeJavaScript("testObject.setFloatValue(false);");
        assertEquals(0.0f, mTestObject.waitForFloatValue());

        // LIVECONNECT_COMPLIANCE: Should be 1.0.
        executeJavaScript("testObject.setDoubleValue(true);");
        assertEquals(0.0, mTestObject.waitForDoubleValue());
        executeJavaScript("testObject.setDoubleValue(false);");
        assertEquals(0.0, mTestObject.waitForDoubleValue());

        // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
        executeJavaScript("testObject.setCustomTypeValue(true);");
        assertNull(mTestObject.waitForCustomTypeValue());
    
public voidtestPassJavaObject()

        executeJavaScript("testObject.setObjectValue(testObject.getObjectInstance());");
        assertTrue(mTestObject.getObjectInstance() == mTestObject.waitForObjectValue());
        executeJavaScript("testObject.setObjectValue(testObject.getCustomTypeInstance());");
        assertTrue(mTestObject.getCustomTypeInstance() == mTestObject.waitForObjectValue());

        executeJavaScript("testObject.setCustomTypeValue(testObject.getObjectInstance());");
        assertTrue(mTestObject.getObjectInstance() == mTestObject.waitForCustomTypeValue());
        executeJavaScript("testObject.setCustomTypeValue(testObject.getCustomTypeInstance());");
        assertTrue(mTestObject.getCustomTypeInstance() == mTestObject.waitForCustomTypeValue());
        // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception, as the types are unrelated.
        executeJavaScript("testObject.setCustomTypeValue(testObject.getCustomType2Instance());");
        assertTrue(mTestObject.getCustomType2Instance() ==
                (Object)mTestObject.waitForCustomTypeValue());

        // LIVECONNECT_COMPLIANCE: Should call toString() on object.
        executeJavaScript("testObject.setStringValue(testObject.getObjectInstance());");
        assertEquals("undefined", mTestObject.waitForStringValue());

        // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
        executeJavaScript("testObject.setByteValue(testObject.getObjectInstance());");
        assertEquals(0, mTestObject.waitForByteValue());

        // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
        executeJavaScript("testObject.setCharValue(testObject.getObjectInstance());");
        assertEquals('\u0000", mTestObject.waitForCharValue());

        // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
        executeJavaScript("testObject.setShortValue(testObject.getObjectInstance());");
        assertEquals(0, mTestObject.waitForShortValue());

        // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
        executeJavaScript("testObject.setIntValue(testObject.getObjectInstance());");
        assertEquals(0, mTestObject.waitForIntValue());

        // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
        executeJavaScript("testObject.setLongValue(testObject.getObjectInstance());");
        assertEquals(0L, mTestObject.waitForLongValue());

        // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
        executeJavaScript("testObject.setFloatValue(testObject.getObjectInstance());");
        assertEquals(0.0f, mTestObject.waitForFloatValue());

        // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
        executeJavaScript("testObject.setDoubleValue(testObject.getObjectInstance());");
        assertEquals(0.0, mTestObject.waitForDoubleValue());

        // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
        executeJavaScript("testObject.setBooleanValue(testObject.getObjectInstance());");
        assertFalse(mTestObject.waitForBooleanValue());
    
public voidtestPassJavaScriptObject()

        // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
        executeJavaScript("testObject.setObjectValue({foo: 42});");
        assertNull(mTestObject.waitForObjectValue());

        // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
        executeJavaScript("testObject.setCustomTypeValue({foo: 42});");
        assertNull(mTestObject.waitForCustomTypeValue());

        // LIVECONNECT_COMPLIANCE: Should call toString() on object.
        executeJavaScript("testObject.setStringValue({foo: 42});");
        assertEquals("undefined", mTestObject.waitForStringValue());

        // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
        executeJavaScript("testObject.setByteValue({foo: 42});");
        assertEquals(0, mTestObject.waitForByteValue());

        // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
        executeJavaScript("testObject.setCharValue({foo: 42});");
        assertEquals('\u0000", mTestObject.waitForCharValue());

        // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
        executeJavaScript("testObject.setShortValue({foo: 42});");
        assertEquals(0, mTestObject.waitForShortValue());

        // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
        executeJavaScript("testObject.setIntValue({foo: 42});");
        assertEquals(0, mTestObject.waitForIntValue());

        // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
        executeJavaScript("testObject.setLongValue({foo: 42});");
        assertEquals(0L, mTestObject.waitForLongValue());

        // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
        executeJavaScript("testObject.setFloatValue({foo: 42});");
        assertEquals(0.0f, mTestObject.waitForFloatValue());

        // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
        executeJavaScript("testObject.setDoubleValue({foo: 42});");
        assertEquals(0.0, mTestObject.waitForDoubleValue());

        // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
        executeJavaScript("testObject.setBooleanValue({foo: 42});");
        assertFalse(mTestObject.waitForBooleanValue());
    
public voidtestPassNull()

        executeJavaScript("testObject.setObjectValue(null);");
        assertNull(mTestObject.waitForObjectValue());

        executeJavaScript("testObject.setCustomTypeValue(null);");
        assertNull(mTestObject.waitForCustomTypeValue());

        executeJavaScript("testObject.setStringValue(null);");
        assertNull(mTestObject.waitForStringValue());

        executeJavaScript("testObject.setByteValue(null);");
        assertEquals(0, mTestObject.waitForByteValue());

        executeJavaScript("testObject.setCharValue(null);");
        assertEquals('\u0000", mTestObject.waitForCharValue());

        executeJavaScript("testObject.setShortValue(null);");
        assertEquals(0, mTestObject.waitForShortValue());

        executeJavaScript("testObject.setIntValue(null);");
        assertEquals(0, mTestObject.waitForIntValue());

        executeJavaScript("testObject.setLongValue(null);");
        assertEquals(0L, mTestObject.waitForLongValue());

        executeJavaScript("testObject.setFloatValue(null);");
        assertEquals(0.0f, mTestObject.waitForFloatValue());

        executeJavaScript("testObject.setDoubleValue(null);");
        assertEquals(0.0, mTestObject.waitForDoubleValue());

        executeJavaScript("testObject.setBooleanValue(null);");
        assertFalse(mTestObject.waitForBooleanValue());
    
public voidtestPassNumberDouble()

        executeJavaScript("testObject.setByteValue(42.1);");
        assertEquals(42, mTestObject.waitForByteValue());
        executeJavaScript("testObject.setByteValue(" + Byte.MAX_VALUE + " + 42.1);");
        assertEquals(Byte.MIN_VALUE + 42 - 1, mTestObject.waitForByteValue());
        executeJavaScript("testObject.setByteValue(" + Integer.MAX_VALUE + " + 42.1);");
        assertEquals(-1, mTestObject.waitForByteValue());

        // LIVECONNECT_COMPLIANCE: Should convert to numeric char value.
        executeJavaScript("testObject.setCharValue(42.1);");
        assertEquals('\u0000", mTestObject.waitForCharValue());

        executeJavaScript("testObject.setShortValue(42.1);");
        assertEquals(42, mTestObject.waitForShortValue());
        executeJavaScript("testObject.setShortValue(" + Short.MAX_VALUE + " + 42.1);");
        assertEquals(Short.MIN_VALUE + 42 - 1, mTestObject.waitForShortValue());
        executeJavaScript("testObject.setShortValue(" + Integer.MAX_VALUE + " + 42.1);");
        assertEquals(-1, mTestObject.waitForShortValue());

        executeJavaScript("testObject.setIntValue(42.1);");
        assertEquals(42, mTestObject.waitForIntValue());
        executeJavaScript("testObject.setIntValue(" + Integer.MAX_VALUE + " + 42.1);");
        assertEquals(Integer.MAX_VALUE, mTestObject.waitForIntValue());

        executeJavaScript("testObject.setLongValue(42.1);");
        assertEquals(42L, mTestObject.waitForLongValue());
        // LIVECONNECT_COMPLIANCE: Should be Long.MAX_VALUE.
        executeJavaScript("testObject.setLongValue(" + Long.MAX_VALUE + " + 42.1);");
        assertEquals(Long.MIN_VALUE, mTestObject.waitForLongValue());

        executeJavaScript("testObject.setFloatValue(42.1);");
        assertEquals(42.1f, mTestObject.waitForFloatValue());

        executeJavaScript("testObject.setDoubleValue(42.1);");
        assertEquals(42.1, mTestObject.waitForDoubleValue());

        // LIVECONNECT_COMPLIANCE: Should create an instance of java.lang.Number.
        executeJavaScript("testObject.setObjectValue(42.1);");
        assertNull(mTestObject.waitForObjectValue());

        executeJavaScript("testObject.setStringValue(42.1);");
        assertEquals("42.1", mTestObject.waitForStringValue());

        executeJavaScript("testObject.setBooleanValue(0.0);");
        assertFalse(mTestObject.waitForBooleanValue());
        // LIVECONNECT_COMPLIANCE: Should be true.
        executeJavaScript("testObject.setBooleanValue(42.1);");
        assertFalse(mTestObject.waitForBooleanValue());

        // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
        executeJavaScript("testObject.setCustomTypeValue(42.1);");
        assertNull(mTestObject.waitForCustomTypeValue());
    
public voidtestPassNumberInfinity()

        executeJavaScript("testObject.setByteValue(Infinity);");
        assertEquals(-1, mTestObject.waitForByteValue());

        // LIVECONNECT_COMPLIANCE: Should convert to maximum numeric char value.
        executeJavaScript("testObject.setCharValue(Infinity);");
        assertEquals('\u0000", mTestObject.waitForCharValue());

        executeJavaScript("testObject.setShortValue(Infinity);");
        assertEquals(-1, mTestObject.waitForShortValue());

        executeJavaScript("testObject.setIntValue(Infinity);");
        assertEquals(Integer.MAX_VALUE, mTestObject.waitForIntValue());

        // LIVECONNECT_COMPLIANCE: Should be Long.MAX_VALUE.
        executeJavaScript("testObject.setLongValue(Infinity);");
        assertEquals(-1L, mTestObject.waitForLongValue());

        executeJavaScript("testObject.setFloatValue(Infinity);");
        assertEquals(Float.POSITIVE_INFINITY, mTestObject.waitForFloatValue());

        executeJavaScript("testObject.setDoubleValue(Infinity);");
        assertEquals(Double.POSITIVE_INFINITY, mTestObject.waitForDoubleValue());

        // LIVECONNECT_COMPLIANCE: Should create an instance of java.lang.Number.
        executeJavaScript("testObject.setObjectValue(Infinity);");
        assertNull(mTestObject.waitForObjectValue());

        executeJavaScript("testObject.setStringValue(Infinity);");
        assertEquals("Inf", mTestObject.waitForStringValue());

        executeJavaScript("testObject.setBooleanValue(Infinity);");
        assertFalse(mTestObject.waitForBooleanValue());

        // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
        executeJavaScript("testObject.setCustomTypeValue(Infinity);");
        assertNull(mTestObject.waitForCustomTypeValue());
    
public voidtestPassNumberInt32()

        executeJavaScript("testObject.setByteValue(42);");
        assertEquals(42, mTestObject.waitForByteValue());
        executeJavaScript("testObject.setByteValue(" + Byte.MAX_VALUE + " + 42);");
        assertEquals(Byte.MIN_VALUE + 42 - 1, mTestObject.waitForByteValue());

        // LIVECONNECT_COMPLIANCE: Should convert to numeric char value.
        executeJavaScript("testObject.setCharValue(42);");
        assertEquals('\u0000", mTestObject.waitForCharValue());

        executeJavaScript("testObject.setShortValue(42);");
        assertEquals(42, mTestObject.waitForShortValue());
        executeJavaScript("testObject.setShortValue(" + Short.MAX_VALUE + " + 42);");
        assertEquals(Short.MIN_VALUE + 42 - 1, mTestObject.waitForShortValue());

        executeJavaScript("testObject.setIntValue(42);");
        assertEquals(42, mTestObject.waitForIntValue());

        executeJavaScript("testObject.setLongValue(42);");
        assertEquals(42L, mTestObject.waitForLongValue());

        executeJavaScript("testObject.setFloatValue(42);");
        assertEquals(42.0f, mTestObject.waitForFloatValue());

        executeJavaScript("testObject.setDoubleValue(42);");
        assertEquals(42.0, mTestObject.waitForDoubleValue());

        // LIVECONNECT_COMPLIANCE: Should create an instance of java.lang.Number.
        executeJavaScript("testObject.setObjectValue(42);");
        assertNull(mTestObject.waitForObjectValue());

        // The spec allows the JS engine flexibility in how to format the number.
        executeJavaScript("testObject.setStringValue(42);");
        String str = mTestObject.waitForStringValue();
        assertTrue("42".equals(str) || "42.0".equals(str));

        executeJavaScript("testObject.setBooleanValue(0);");
        assertFalse(mTestObject.waitForBooleanValue());
        // LIVECONNECT_COMPLIANCE: Should be true;
        executeJavaScript("testObject.setBooleanValue(42);");
        assertFalse(mTestObject.waitForBooleanValue());

        // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
        executeJavaScript("testObject.setCustomTypeValue(42);");
        assertNull(mTestObject.waitForCustomTypeValue());
    
public voidtestPassNumberNaN()

        executeJavaScript("testObject.setByteValue(Number.NaN);");
        assertEquals(0, mTestObject.waitForByteValue());

        executeJavaScript("testObject.setCharValue(Number.NaN);");
        assertEquals('\u0000", mTestObject.waitForCharValue());

        executeJavaScript("testObject.setShortValue(Number.NaN);");
        assertEquals(0, mTestObject.waitForShortValue());

        executeJavaScript("testObject.setIntValue(Number.NaN);");
        assertEquals(0, mTestObject.waitForIntValue());

        executeJavaScript("testObject.setLongValue(Number.NaN);");
        assertEquals(0L, mTestObject.waitForLongValue());

        executeJavaScript("testObject.setFloatValue(Number.NaN);");
        assertEquals(Float.NaN, mTestObject.waitForFloatValue());

        executeJavaScript("testObject.setDoubleValue(Number.NaN);");
        assertEquals(Double.NaN, mTestObject.waitForDoubleValue());

        // LIVECONNECT_COMPLIANCE: Should create an instance of java.lang.Number.
        executeJavaScript("testObject.setObjectValue(Number.NaN);");
        assertNull(mTestObject.waitForObjectValue());

        executeJavaScript("testObject.setStringValue(Number.NaN);");
        assertEquals("NaN", mTestObject.waitForStringValue());

        executeJavaScript("testObject.setBooleanValue(Number.NaN);");
        assertFalse(mTestObject.waitForBooleanValue());

        // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
        executeJavaScript("testObject.setCustomTypeValue(Number.NaN);");
        assertNull(mTestObject.waitForCustomTypeValue());
    
public voidtestPassString()

        executeJavaScript("testObject.setStringValue(\"+042.10\");");
        assertEquals("+042.10", mTestObject.waitForStringValue());

        // Make sure that we distinguish between the empty string and NULL.
        executeJavaScript("testObject.setStringValue(\"\");");
        assertEquals("", mTestObject.waitForStringValue());

        // LIVECONNECT_COMPLIANCE: Should create an instance of java.lang.String.
        executeJavaScript("testObject.setObjectValue(\"+042.10\");");
        assertNull(mTestObject.waitForObjectValue());

        // LIVECONNECT_COMPLIANCE: Should use valueOf() of appropriate type.
        executeJavaScript("testObject.setByteValue(\"+042.10\");");
        assertEquals(0, mTestObject.waitForByteValue());

        // LIVECONNECT_COMPLIANCE: Should use valueOf() of appropriate type.
        executeJavaScript("testObject.setShortValue(\"+042.10\");");
        assertEquals(0, mTestObject.waitForShortValue());

        // LIVECONNECT_COMPLIANCE: Should use valueOf() of appropriate type.
        executeJavaScript("testObject.setIntValue(\"+042.10\");");
        assertEquals(0, mTestObject.waitForIntValue());

        // LIVECONNECT_COMPLIANCE: Should use valueOf() of appropriate type.
        executeJavaScript("testObject.setLongValue(\"+042.10\");");
        assertEquals(0L, mTestObject.waitForLongValue());

        // LIVECONNECT_COMPLIANCE: Should use valueOf() of appropriate type.
        executeJavaScript("testObject.setFloatValue(\"+042.10\");");
        assertEquals(0.0f, mTestObject.waitForFloatValue());

        // LIVECONNECT_COMPLIANCE: Should use valueOf() of appropriate type.
        executeJavaScript("testObject.setDoubleValue(\"+042.10\");");
        assertEquals(0.0, mTestObject.waitForDoubleValue());

        // LIVECONNECT_COMPLIANCE: Should decode and convert to numeric char value.
        executeJavaScript("testObject.setCharValue(\"+042.10\");");
        assertEquals('\u0000", mTestObject.waitForCharValue());

        // LIVECONNECT_COMPLIANCE: Non-empty string should convert to true.
        executeJavaScript("testObject.setBooleanValue(\"+042.10\");");
        assertFalse(mTestObject.waitForBooleanValue());

        // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
        executeJavaScript("testObject.setCustomTypeValue(\"+042.10\");");
        assertNull(mTestObject.waitForCustomTypeValue());
    
public voidtestPassUndefined()

        executeJavaScript("testObject.setObjectValue(undefined);");
        assertNull(mTestObject.waitForObjectValue());

        executeJavaScript("testObject.setCustomTypeValue(undefined);");
        assertNull(mTestObject.waitForCustomTypeValue());

        // LIVECONNECT_COMPLIANCE: Should be NULL.
        executeJavaScript("testObject.setStringValue(undefined);");
        assertEquals("undefined", mTestObject.waitForStringValue());

        executeJavaScript("testObject.setByteValue(undefined);");
        assertEquals(0, mTestObject.waitForByteValue());

        executeJavaScript("testObject.setCharValue(undefined);");
        assertEquals('\u0000", mTestObject.waitForCharValue());

        executeJavaScript("testObject.setShortValue(undefined);");
        assertEquals(0, mTestObject.waitForShortValue());

        executeJavaScript("testObject.setIntValue(undefined);");
        assertEquals(0, mTestObject.waitForIntValue());

        executeJavaScript("testObject.setLongValue(undefined);");
        assertEquals(0L, mTestObject.waitForLongValue());

        executeJavaScript("testObject.setFloatValue(undefined);");
        assertEquals(0.0f, mTestObject.waitForFloatValue());

        executeJavaScript("testObject.setDoubleValue(undefined);");
        assertEquals(0.0, mTestObject.waitForDoubleValue());

        executeJavaScript("testObject.setBooleanValue(undefined);");
        assertFalse(mTestObject.waitForBooleanValue());