Merge "Remove Webviewtests in frameworks" into mnc-dev
This commit is contained in:
@@ -1,27 +0,0 @@
|
||||
#
|
||||
# Copyright (C) 2011 The Android Open Source Project
|
||||
#
|
||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||
# you may not use this file except in compliance with the License.
|
||||
# You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
# See the License for the specific language governing permissions and
|
||||
# limitations under the License.
|
||||
#
|
||||
LOCAL_PATH:= $(call my-dir)
|
||||
include $(CLEAR_VARS)
|
||||
|
||||
LOCAL_MODULE_TAGS := tests
|
||||
|
||||
LOCAL_SRC_FILES := $(call all-subdir-java-files)
|
||||
|
||||
LOCAL_JAVA_LIBRARIES := android.test.runner
|
||||
|
||||
LOCAL_PACKAGE_NAME := WebViewTests
|
||||
|
||||
include $(BUILD_PACKAGE)
|
||||
@@ -1,32 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!--
|
||||
Copyright (C) 2011 The Android Open Source Project
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
-->
|
||||
|
||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.android.webviewtests">
|
||||
<application>
|
||||
<uses-library android:name="android.test.runner" />
|
||||
<activity android:name="WebViewStubActivity" android:label="WebViewStubActivity">
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.MAIN" />
|
||||
<category android:name="android.intent.category.TEST" />
|
||||
</intent-filter>
|
||||
</activity>
|
||||
</application>
|
||||
|
||||
<instrumentation android:name="android.test.InstrumentationTestRunner"
|
||||
android:targetPackage="com.android.webviewtests"
|
||||
android:label="Tests for android.webkit.WebView" />
|
||||
</manifest>
|
||||
@@ -1,25 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!--
|
||||
* Copyright (C) 2009 The Android Open Source Project
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
-->
|
||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:orientation="vertical"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent">
|
||||
|
||||
<WebView android:id="@+id/web_page"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent" />
|
||||
</LinearLayout>
|
||||
@@ -1,625 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2011 The Android Open Source Project
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
/**
|
||||
* Part of the test suite for the WebView's Java Bridge. This class tests that
|
||||
* we correctly convert JavaScript arrays to Java arrays 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.JavaBridgeArrayCoercionTest \
|
||||
* com.android.webviewtests/android.test.InstrumentationTestRunner
|
||||
*/
|
||||
|
||||
package com.android.webviewtests;
|
||||
|
||||
public class JavaBridgeArrayCoercionTest extends JavaBridgeTestBase {
|
||||
private class TestObject extends Controller {
|
||||
private Object mObjectInstance;
|
||||
private CustomType mCustomTypeInstance;
|
||||
|
||||
private boolean[] mBooleanArray;
|
||||
private byte[] mByteArray;
|
||||
private char[] mCharArray;
|
||||
private short[] mShortArray;
|
||||
private int[] mIntArray;
|
||||
private long[] mLongArray;
|
||||
private float[] mFloatArray;
|
||||
private double[] mDoubleArray;
|
||||
private String[] mStringArray;
|
||||
private Object[] mObjectArray;
|
||||
private CustomType[] mCustomTypeArray;
|
||||
|
||||
public TestObject() {
|
||||
mObjectInstance = new Object();
|
||||
mCustomTypeInstance = new CustomType();
|
||||
}
|
||||
|
||||
public Object getObjectInstance() {
|
||||
return mObjectInstance;
|
||||
}
|
||||
public CustomType getCustomTypeInstance() {
|
||||
return mCustomTypeInstance;
|
||||
}
|
||||
|
||||
public synchronized void setBooleanArray(boolean[] x) {
|
||||
mBooleanArray = x;
|
||||
notifyResultIsReady();
|
||||
}
|
||||
public synchronized void setByteArray(byte[] x) {
|
||||
mByteArray = x;
|
||||
notifyResultIsReady();
|
||||
}
|
||||
public synchronized void setCharArray(char[] x) {
|
||||
mCharArray = x;
|
||||
notifyResultIsReady();
|
||||
}
|
||||
public synchronized void setShortArray(short[] x) {
|
||||
mShortArray = x;
|
||||
notifyResultIsReady();
|
||||
}
|
||||
public synchronized void setIntArray(int[] x) {
|
||||
mIntArray = x;
|
||||
notifyResultIsReady();
|
||||
}
|
||||
public synchronized void setLongArray(long[] x) {
|
||||
mLongArray = x;
|
||||
notifyResultIsReady();
|
||||
}
|
||||
public synchronized void setFloatArray(float[] x) {
|
||||
mFloatArray = x;
|
||||
notifyResultIsReady();
|
||||
}
|
||||
public synchronized void setDoubleArray(double[] x) {
|
||||
mDoubleArray = x;
|
||||
notifyResultIsReady();
|
||||
}
|
||||
public synchronized void setStringArray(String[] x) {
|
||||
mStringArray = x;
|
||||
notifyResultIsReady();
|
||||
}
|
||||
public synchronized void setObjectArray(Object[] x) {
|
||||
mObjectArray = x;
|
||||
notifyResultIsReady();
|
||||
}
|
||||
public synchronized void setCustomTypeArray(CustomType[] x) {
|
||||
mCustomTypeArray = x;
|
||||
notifyResultIsReady();
|
||||
}
|
||||
|
||||
public synchronized boolean[] waitForBooleanArray() {
|
||||
waitForResult();
|
||||
return mBooleanArray;
|
||||
}
|
||||
public synchronized byte[] waitForByteArray() {
|
||||
waitForResult();
|
||||
return mByteArray;
|
||||
}
|
||||
public synchronized char[] waitForCharArray() {
|
||||
waitForResult();
|
||||
return mCharArray;
|
||||
}
|
||||
public synchronized short[] waitForShortArray() {
|
||||
waitForResult();
|
||||
return mShortArray;
|
||||
}
|
||||
public synchronized int[] waitForIntArray() {
|
||||
waitForResult();
|
||||
return mIntArray;
|
||||
}
|
||||
public synchronized long[] waitForLongArray() {
|
||||
waitForResult();
|
||||
return mLongArray;
|
||||
}
|
||||
public synchronized float[] waitForFloatArray() {
|
||||
waitForResult();
|
||||
return mFloatArray;
|
||||
}
|
||||
public synchronized double[] waitForDoubleArray() {
|
||||
waitForResult();
|
||||
return mDoubleArray;
|
||||
}
|
||||
public synchronized String[] waitForStringArray() {
|
||||
waitForResult();
|
||||
return mStringArray;
|
||||
}
|
||||
public synchronized Object[] waitForObjectArray() {
|
||||
waitForResult();
|
||||
return mObjectArray;
|
||||
}
|
||||
public synchronized CustomType[] waitForCustomTypeArray() {
|
||||
waitForResult();
|
||||
return mCustomTypeArray;
|
||||
}
|
||||
}
|
||||
|
||||
// Two custom types used when testing passing objects.
|
||||
private class CustomType {
|
||||
}
|
||||
|
||||
private TestObject mTestObject;
|
||||
|
||||
@Override
|
||||
protected void setUp() throws Exception {
|
||||
super.setUp();
|
||||
mTestObject = new TestObject();
|
||||
setUpWebView(mTestObject, "testObject");
|
||||
}
|
||||
|
||||
// Note that all tests use a single element array for simplicity. We test
|
||||
// multiple elements elsewhere.
|
||||
|
||||
// Test passing an array of JavaScript numbers in the int32 range to a
|
||||
// method which takes a Java array.
|
||||
public void testPassNumberInt32() throws Throwable {
|
||||
executeJavaScript("testObject.setBooleanArray([0]);");
|
||||
assertFalse(mTestObject.waitForBooleanArray()[0]);
|
||||
// LIVECONNECT_COMPLIANCE: Should convert to boolean.
|
||||
executeJavaScript("testObject.setBooleanArray([42]);");
|
||||
assertFalse(mTestObject.waitForBooleanArray()[0]);
|
||||
|
||||
executeJavaScript("testObject.setByteArray([42]);");
|
||||
assertEquals(42, mTestObject.waitForByteArray()[0]);
|
||||
|
||||
// LIVECONNECT_COMPLIANCE: Should convert to numeric char value.
|
||||
executeJavaScript("testObject.setCharArray([42]);");
|
||||
assertEquals('\u0000', mTestObject.waitForCharArray()[0]);
|
||||
|
||||
executeJavaScript("testObject.setShortArray([42]);");
|
||||
assertEquals(42, mTestObject.waitForShortArray()[0]);
|
||||
|
||||
executeJavaScript("testObject.setIntArray([42]);");
|
||||
assertEquals(42, mTestObject.waitForIntArray()[0]);
|
||||
|
||||
executeJavaScript("testObject.setLongArray([42]);");
|
||||
assertEquals(42L, mTestObject.waitForLongArray()[0]);
|
||||
|
||||
executeJavaScript("testObject.setFloatArray([42]);");
|
||||
assertEquals(42.0f, mTestObject.waitForFloatArray()[0]);
|
||||
|
||||
executeJavaScript("testObject.setDoubleArray([42]);");
|
||||
assertEquals(42.0, mTestObject.waitForDoubleArray()[0]);
|
||||
|
||||
// LIVECONNECT_COMPLIANCE: Should create array and create instances of java.lang.Number.
|
||||
executeJavaScript("testObject.setObjectArray([42]);");
|
||||
assertNull(mTestObject.waitForObjectArray());
|
||||
|
||||
// LIVECONNECT_COMPLIANCE: Should create instances of java.lang.String.
|
||||
executeJavaScript("testObject.setStringArray([42]);");
|
||||
assertNull(mTestObject.waitForStringArray()[0]);
|
||||
|
||||
// LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
|
||||
executeJavaScript("testObject.setCustomTypeArray([42]);");
|
||||
assertNull(mTestObject.waitForCustomTypeArray());
|
||||
}
|
||||
|
||||
// Test passing an array of JavaScript numbers in the double range to a
|
||||
// method which takes a Java array.
|
||||
public void testPassNumberDouble() throws Throwable {
|
||||
// LIVECONNECT_COMPLIANCE: Should convert to boolean.
|
||||
executeJavaScript("testObject.setBooleanArray([42.1]);");
|
||||
assertFalse(mTestObject.waitForBooleanArray()[0]);
|
||||
|
||||
executeJavaScript("testObject.setByteArray([42.1]);");
|
||||
assertEquals(42, mTestObject.waitForByteArray()[0]);
|
||||
|
||||
// LIVECONNECT_COMPLIANCE: Should convert to numeric char value.
|
||||
executeJavaScript("testObject.setCharArray([42.1]);");
|
||||
assertEquals('\u0000', mTestObject.waitForCharArray()[0]);
|
||||
|
||||
executeJavaScript("testObject.setShortArray([42.1]);");
|
||||
assertEquals(42, mTestObject.waitForShortArray()[0]);
|
||||
|
||||
executeJavaScript("testObject.setIntArray([42.1]);");
|
||||
assertEquals(42, mTestObject.waitForIntArray()[0]);
|
||||
|
||||
executeJavaScript("testObject.setLongArray([42.1]);");
|
||||
assertEquals(42L, mTestObject.waitForLongArray()[0]);
|
||||
|
||||
executeJavaScript("testObject.setFloatArray([42.1]);");
|
||||
assertEquals(42.1f, mTestObject.waitForFloatArray()[0]);
|
||||
|
||||
executeJavaScript("testObject.setDoubleArray([42.1]);");
|
||||
assertEquals(42.1, mTestObject.waitForDoubleArray()[0]);
|
||||
|
||||
// LIVECONNECT_COMPLIANCE: Should create array and create instances of java.lang.Number.
|
||||
executeJavaScript("testObject.setObjectArray([42.1]);");
|
||||
assertNull(mTestObject.waitForObjectArray());
|
||||
|
||||
// LIVECONNECT_COMPLIANCE: Should create instances of java.lang.String.
|
||||
executeJavaScript("testObject.setStringArray([42.1]);");
|
||||
assertNull(mTestObject.waitForStringArray()[0]);
|
||||
|
||||
// LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
|
||||
executeJavaScript("testObject.setCustomTypeArray([42.1]);");
|
||||
assertNull(mTestObject.waitForCustomTypeArray());
|
||||
}
|
||||
|
||||
// Test passing an array of JavaScript NaN values to a method which takes a
|
||||
// Java array.
|
||||
public void testPassNumberNaN() throws Throwable {
|
||||
executeJavaScript("testObject.setBooleanArray([Number.NaN]);");
|
||||
assertFalse(mTestObject.waitForBooleanArray()[0]);
|
||||
|
||||
executeJavaScript("testObject.setByteArray([Number.NaN]);");
|
||||
assertEquals(0, mTestObject.waitForByteArray()[0]);
|
||||
|
||||
executeJavaScript("testObject.setCharArray([Number.NaN]);");
|
||||
assertEquals('\u0000', mTestObject.waitForCharArray()[0]);
|
||||
|
||||
executeJavaScript("testObject.setShortArray([Number.NaN]);");
|
||||
assertEquals(0, mTestObject.waitForShortArray()[0]);
|
||||
|
||||
executeJavaScript("testObject.setIntArray([Number.NaN]);");
|
||||
assertEquals(0, mTestObject.waitForIntArray()[0]);
|
||||
|
||||
executeJavaScript("testObject.setLongArray([Number.NaN]);");
|
||||
assertEquals(0L, mTestObject.waitForLongArray()[0]);
|
||||
|
||||
executeJavaScript("testObject.setFloatArray([Number.NaN]);");
|
||||
assertEquals(Float.NaN, mTestObject.waitForFloatArray()[0]);
|
||||
|
||||
executeJavaScript("testObject.setDoubleArray([Number.NaN]);");
|
||||
assertEquals(Double.NaN, mTestObject.waitForDoubleArray()[0]);
|
||||
|
||||
// LIVECONNECT_COMPLIANCE: Should create array and create instances of java.lang.Number.
|
||||
executeJavaScript("testObject.setObjectArray([Number.NaN]);");
|
||||
assertNull(mTestObject.waitForObjectArray());
|
||||
|
||||
// LIVECONNECT_COMPLIANCE: Should create instances of java.lang.String.
|
||||
executeJavaScript("testObject.setStringArray([Number.NaN]);");
|
||||
assertNull(mTestObject.waitForStringArray()[0]);
|
||||
|
||||
// LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
|
||||
executeJavaScript("testObject.setCustomTypeArray([Number.NaN]);");
|
||||
assertNull(mTestObject.waitForCustomTypeArray());
|
||||
}
|
||||
|
||||
// Test passing an array of JavaScript infinity values to a method which
|
||||
// takes a Java array.
|
||||
public void testPassNumberInfinity() throws Throwable {
|
||||
executeJavaScript("testObject.setBooleanArray([Infinity]);");
|
||||
assertFalse(mTestObject.waitForBooleanArray()[0]);
|
||||
|
||||
executeJavaScript("testObject.setByteArray([Infinity]);");
|
||||
assertEquals(-1, mTestObject.waitForByteArray()[0]);
|
||||
|
||||
// LIVECONNECT_COMPLIANCE: Should convert to maximum numeric char value.
|
||||
executeJavaScript("testObject.setCharArray([Infinity]);");
|
||||
assertEquals('\u0000', mTestObject.waitForCharArray()[0]);
|
||||
|
||||
executeJavaScript("testObject.setShortArray([Infinity]);");
|
||||
assertEquals(-1, mTestObject.waitForShortArray()[0]);
|
||||
|
||||
executeJavaScript("testObject.setIntArray([Infinity]);");
|
||||
assertEquals(Integer.MAX_VALUE, mTestObject.waitForIntArray()[0]);
|
||||
|
||||
// LIVECONNECT_COMPLIANCE: Should be Long.MAX_VALUE.
|
||||
executeJavaScript("testObject.setLongArray([Infinity]);");
|
||||
assertEquals(-1L, mTestObject.waitForLongArray()[0]);
|
||||
|
||||
executeJavaScript("testObject.setFloatArray([Infinity]);");
|
||||
assertEquals(Float.POSITIVE_INFINITY, mTestObject.waitForFloatArray()[0]);
|
||||
|
||||
executeJavaScript("testObject.setDoubleArray([Infinity]);");
|
||||
assertEquals(Double.POSITIVE_INFINITY, mTestObject.waitForDoubleArray()[0]);
|
||||
|
||||
// LIVECONNECT_COMPLIANCE: Should create array and create instances of java.lang.Number.
|
||||
executeJavaScript("testObject.setObjectArray([Infinity]);");
|
||||
assertNull(mTestObject.waitForObjectArray());
|
||||
|
||||
// LIVECONNECT_COMPLIANCE: Should create instances of java.lang.String.
|
||||
executeJavaScript("testObject.setStringArray([Infinity]);");
|
||||
assertNull(mTestObject.waitForStringArray()[0]);
|
||||
|
||||
// LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
|
||||
executeJavaScript("testObject.setCustomTypeArray([Infinity]);");
|
||||
assertNull(mTestObject.waitForCustomTypeArray());
|
||||
}
|
||||
|
||||
// Test passing an array of JavaScript boolean values to a method which
|
||||
// takes a Java array.
|
||||
public void testPassBoolean() throws Throwable {
|
||||
executeJavaScript("testObject.setBooleanArray([true]);");
|
||||
assertTrue(mTestObject.waitForBooleanArray()[0]);
|
||||
executeJavaScript("testObject.setBooleanArray([false]);");
|
||||
assertFalse(mTestObject.waitForBooleanArray()[0]);
|
||||
|
||||
// LIVECONNECT_COMPLIANCE: Should be 1.
|
||||
executeJavaScript("testObject.setByteArray([true]);");
|
||||
assertEquals(0, mTestObject.waitForByteArray()[0]);
|
||||
executeJavaScript("testObject.setByteArray([false]);");
|
||||
assertEquals(0, mTestObject.waitForByteArray()[0]);
|
||||
|
||||
// LIVECONNECT_COMPLIANCE: Should convert to numeric char value 1.
|
||||
executeJavaScript("testObject.setCharArray([true]);");
|
||||
assertEquals('\u0000', mTestObject.waitForCharArray()[0]);
|
||||
executeJavaScript("testObject.setCharArray([false]);");
|
||||
assertEquals('\u0000', mTestObject.waitForCharArray()[0]);
|
||||
|
||||
// LIVECONNECT_COMPLIANCE: Should be 1.
|
||||
executeJavaScript("testObject.setShortArray([true]);");
|
||||
assertEquals(0, mTestObject.waitForShortArray()[0]);
|
||||
executeJavaScript("testObject.setShortArray([false]);");
|
||||
assertEquals(0, mTestObject.waitForShortArray()[0]);
|
||||
|
||||
// LIVECONNECT_COMPLIANCE: Should be 1.
|
||||
executeJavaScript("testObject.setIntArray([true]);");
|
||||
assertEquals(0, mTestObject.waitForIntArray()[0]);
|
||||
executeJavaScript("testObject.setIntArray([false]);");
|
||||
assertEquals(0, mTestObject.waitForIntArray()[0]);
|
||||
|
||||
// LIVECONNECT_COMPLIANCE: Should be 1.
|
||||
executeJavaScript("testObject.setLongArray([true]);");
|
||||
assertEquals(0L, mTestObject.waitForLongArray()[0]);
|
||||
executeJavaScript("testObject.setLongArray([false]);");
|
||||
assertEquals(0L, mTestObject.waitForLongArray()[0]);
|
||||
|
||||
// LIVECONNECT_COMPLIANCE: Should be 1.0.
|
||||
executeJavaScript("testObject.setFloatArray([true]);");
|
||||
assertEquals(0.0f, mTestObject.waitForFloatArray()[0]);
|
||||
executeJavaScript("testObject.setFloatArray([false]);");
|
||||
assertEquals(0.0f, mTestObject.waitForFloatArray()[0]);
|
||||
|
||||
// LIVECONNECT_COMPLIANCE: Should be 1.0.
|
||||
executeJavaScript("testObject.setDoubleArray([true]);");
|
||||
assertEquals(0.0, mTestObject.waitForDoubleArray()[0]);
|
||||
executeJavaScript("testObject.setDoubleArray([false]);");
|
||||
assertEquals(0.0, mTestObject.waitForDoubleArray()[0]);
|
||||
|
||||
// LIVECONNECT_COMPLIANCE: Should create array and create instances of java.lang.Number.
|
||||
executeJavaScript("testObject.setObjectArray([true]);");
|
||||
assertNull(mTestObject.waitForObjectArray());
|
||||
|
||||
// LIVECONNECT_COMPLIANCE: Should create instances of java.lang.String.
|
||||
executeJavaScript("testObject.setStringArray([true]);");
|
||||
assertNull(mTestObject.waitForStringArray()[0]);
|
||||
|
||||
// LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
|
||||
executeJavaScript("testObject.setCustomTypeArray([true]);");
|
||||
assertNull(mTestObject.waitForCustomTypeArray());
|
||||
}
|
||||
|
||||
// Test passing an array of JavaScript strings to a method which takes a
|
||||
// Java array.
|
||||
public void testPassString() throws Throwable {
|
||||
// LIVECONNECT_COMPLIANCE: Non-empty string should convert to true.
|
||||
executeJavaScript("testObject.setBooleanArray([\"+042.10\"]);");
|
||||
assertFalse(mTestObject.waitForBooleanArray()[0]);
|
||||
|
||||
// LIVECONNECT_COMPLIANCE: Should use valueOf() of appropriate type.
|
||||
executeJavaScript("testObject.setByteArray([\"+042.10\"]);");
|
||||
assertEquals(0, mTestObject.waitForByteArray()[0]);
|
||||
|
||||
// LIVECONNECT_COMPLIANCE: Should decode and convert to numeric char value.
|
||||
executeJavaScript("testObject.setCharArray([\"+042.10\"]);");
|
||||
assertEquals(0, mTestObject.waitForCharArray()[0]);
|
||||
|
||||
// LIVECONNECT_COMPLIANCE: Should use valueOf() of appropriate type.
|
||||
executeJavaScript("testObject.setShortArray([\"+042.10\"]);");
|
||||
assertEquals(0, mTestObject.waitForShortArray()[0]);
|
||||
|
||||
// LIVECONNECT_COMPLIANCE: Should use valueOf() of appropriate type.
|
||||
executeJavaScript("testObject.setIntArray([\"+042.10\"]);");
|
||||
assertEquals(0, mTestObject.waitForIntArray()[0]);
|
||||
|
||||
// LIVECONNECT_COMPLIANCE: Should use valueOf() of appropriate type.
|
||||
executeJavaScript("testObject.setLongArray([\"+042.10\"]);");
|
||||
assertEquals(0L, mTestObject.waitForLongArray()[0]);
|
||||
|
||||
// LIVECONNECT_COMPLIANCE: Should use valueOf() of appropriate type.
|
||||
executeJavaScript("testObject.setFloatArray([\"+042.10\"]);");
|
||||
assertEquals(0.0f, mTestObject.waitForFloatArray()[0]);
|
||||
|
||||
// LIVECONNECT_COMPLIANCE: Should use valueOf() of appropriate type.
|
||||
executeJavaScript("testObject.setDoubleArray([\"+042.10\"]);");
|
||||
assertEquals(0.0, mTestObject.waitForDoubleArray()[0]);
|
||||
|
||||
// LIVECONNECT_COMPLIANCE: Should create array and create instances of java.lang.Number.
|
||||
executeJavaScript("testObject.setObjectArray([\"+042.10\"]);");
|
||||
assertNull(mTestObject.waitForObjectArray());
|
||||
|
||||
executeJavaScript("testObject.setStringArray([\"+042.10\"]);");
|
||||
assertEquals("+042.10", mTestObject.waitForStringArray()[0]);
|
||||
|
||||
// LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
|
||||
executeJavaScript("testObject.setCustomTypeArray([\"+042.10\"]);");
|
||||
assertNull(mTestObject.waitForCustomTypeArray());
|
||||
}
|
||||
|
||||
// Test passing an array of JavaScript objects to a method which takes a
|
||||
// Java array.
|
||||
public void testPassJavaScriptObject() throws Throwable {
|
||||
// LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
|
||||
executeJavaScript("testObject.setBooleanArray([{foo: 42}]);");
|
||||
assertFalse(mTestObject.waitForBooleanArray()[0]);
|
||||
|
||||
// LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
|
||||
executeJavaScript("testObject.setByteArray([{foo: 42}]);");
|
||||
assertEquals(0, mTestObject.waitForByteArray()[0]);
|
||||
|
||||
// LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
|
||||
executeJavaScript("testObject.setCharArray([{foo: 42}]);");
|
||||
assertEquals('\u0000', mTestObject.waitForCharArray()[0]);
|
||||
|
||||
// LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
|
||||
executeJavaScript("testObject.setShortArray([{foo: 42}]);");
|
||||
assertEquals(0, mTestObject.waitForShortArray()[0]);
|
||||
|
||||
// LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
|
||||
executeJavaScript("testObject.setIntArray([{foo: 42}]);");
|
||||
assertEquals(0, mTestObject.waitForIntArray()[0]);
|
||||
|
||||
// LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
|
||||
executeJavaScript("testObject.setLongArray([{foo: 42}]);");
|
||||
assertEquals(0L, mTestObject.waitForLongArray()[0]);
|
||||
|
||||
// LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
|
||||
executeJavaScript("testObject.setFloatArray([{foo: 42}]);");
|
||||
assertEquals(0.0f, mTestObject.waitForFloatArray()[0]);
|
||||
|
||||
// LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
|
||||
executeJavaScript("testObject.setDoubleArray([{foo: 42}]);");
|
||||
assertEquals(0.0, mTestObject.waitForDoubleArray()[0]);
|
||||
|
||||
// LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
|
||||
executeJavaScript("testObject.setObjectArray([{foo: 42}]);");
|
||||
assertNull(mTestObject.waitForObjectArray());
|
||||
|
||||
// LIVECONNECT_COMPLIANCE: Should call toString() on object.
|
||||
executeJavaScript("testObject.setStringArray([{foo: 42}]);");
|
||||
assertNull(mTestObject.waitForStringArray()[0]);
|
||||
|
||||
// LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
|
||||
executeJavaScript("testObject.setCustomTypeArray([{foo: 42}]);");
|
||||
assertNull(mTestObject.waitForCustomTypeArray());
|
||||
}
|
||||
|
||||
// Test passing an array of Java objects to a method which takes a Java
|
||||
// array.
|
||||
public void testPassJavaObject() throws Throwable {
|
||||
// LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
|
||||
executeJavaScript("testObject.setBooleanArray([testObject.getObjectInstance()]);");
|
||||
assertFalse(mTestObject.waitForBooleanArray()[0]);
|
||||
|
||||
// LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
|
||||
executeJavaScript("testObject.setByteArray([testObject.getObjectInstance()]);");
|
||||
assertEquals(0, mTestObject.waitForByteArray()[0]);
|
||||
|
||||
// LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
|
||||
executeJavaScript("testObject.setCharArray([testObject.getObjectInstance()]);");
|
||||
assertEquals('\u0000', mTestObject.waitForCharArray()[0]);
|
||||
|
||||
// LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
|
||||
executeJavaScript("testObject.setShortArray([testObject.getObjectInstance()]);");
|
||||
assertEquals(0, mTestObject.waitForShortArray()[0]);
|
||||
|
||||
// LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
|
||||
executeJavaScript("testObject.setIntArray([testObject.getObjectInstance()]);");
|
||||
assertEquals(0, mTestObject.waitForIntArray()[0]);
|
||||
|
||||
// LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
|
||||
executeJavaScript("testObject.setLongArray([testObject.getObjectInstance()]);");
|
||||
assertEquals(0L, mTestObject.waitForLongArray()[0]);
|
||||
|
||||
// LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
|
||||
executeJavaScript("testObject.setFloatArray([testObject.getObjectInstance()]);");
|
||||
assertEquals(0.0f, mTestObject.waitForFloatArray()[0]);
|
||||
|
||||
// LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
|
||||
executeJavaScript("testObject.setDoubleArray([testObject.getObjectInstance()]);");
|
||||
assertEquals(0.0, mTestObject.waitForDoubleArray()[0]);
|
||||
|
||||
// LIVECONNECT_COMPLIANCE: Should create an array and pass Java object.
|
||||
executeJavaScript("testObject.setObjectArray([testObject.getObjectInstance()]);");
|
||||
assertNull(mTestObject.waitForObjectArray());
|
||||
|
||||
// LIVECONNECT_COMPLIANCE: Should call toString() on object.
|
||||
executeJavaScript("testObject.setStringArray([testObject.getObjectInstance()]);");
|
||||
assertNull(mTestObject.waitForStringArray()[0]);
|
||||
|
||||
// LIVECONNECT_COMPLIANCE: Should create array and pass Java object.
|
||||
executeJavaScript("testObject.setCustomTypeArray([testObject.getObjectInstance()]);");
|
||||
assertNull(mTestObject.waitForCustomTypeArray());
|
||||
executeJavaScript("testObject.setCustomTypeArray([testObject.getCustomTypeInstance()]);");
|
||||
assertNull(mTestObject.waitForCustomTypeArray());
|
||||
}
|
||||
|
||||
// Test passing an array of JavaScript null values to a method which takes
|
||||
// a Java array.
|
||||
public void testPassNull() throws Throwable {
|
||||
executeJavaScript("testObject.setByteArray([null]);");
|
||||
assertEquals(0, mTestObject.waitForByteArray()[0]);
|
||||
|
||||
executeJavaScript("testObject.setCharArray([null]);");
|
||||
assertEquals('\u0000', mTestObject.waitForCharArray()[0]);
|
||||
|
||||
executeJavaScript("testObject.setShortArray([null]);");
|
||||
assertEquals(0, mTestObject.waitForShortArray()[0]);
|
||||
|
||||
executeJavaScript("testObject.setIntArray([null]);");
|
||||
assertEquals(0, mTestObject.waitForIntArray()[0]);
|
||||
|
||||
executeJavaScript("testObject.setLongArray([null]);");
|
||||
assertEquals(0L, mTestObject.waitForLongArray()[0]);
|
||||
|
||||
executeJavaScript("testObject.setFloatArray([null]);");
|
||||
assertEquals(0.0f, mTestObject.waitForFloatArray()[0]);
|
||||
|
||||
executeJavaScript("testObject.setDoubleArray([null]);");
|
||||
assertEquals(0.0, mTestObject.waitForDoubleArray()[0]);
|
||||
|
||||
executeJavaScript("testObject.setBooleanArray([null]);");
|
||||
assertFalse(mTestObject.waitForBooleanArray()[0]);
|
||||
|
||||
// LIVECONNECT_COMPLIANCE: Should create array and pass null.
|
||||
executeJavaScript("testObject.setObjectArray([null]);");
|
||||
assertNull(mTestObject.waitForObjectArray());
|
||||
|
||||
executeJavaScript("testObject.setStringArray([null]);");
|
||||
assertNull(mTestObject.waitForStringArray()[0]);
|
||||
|
||||
// LIVECONNECT_COMPLIANCE: Should create array and pass null.
|
||||
executeJavaScript("testObject.setCustomTypeArray([null]);");
|
||||
assertNull(mTestObject.waitForCustomTypeArray());
|
||||
}
|
||||
|
||||
// Test passing an array of JavaScript undefined values to a method which
|
||||
// takes a Java array.
|
||||
public void testPassUndefined() throws Throwable {
|
||||
executeJavaScript("testObject.setByteArray([undefined]);");
|
||||
assertEquals(0, mTestObject.waitForByteArray()[0]);
|
||||
|
||||
executeJavaScript("testObject.setCharArray([undefined]);");
|
||||
assertEquals(0, mTestObject.waitForCharArray()[0]);
|
||||
|
||||
executeJavaScript("testObject.setShortArray([undefined]);");
|
||||
assertEquals(0, mTestObject.waitForShortArray()[0]);
|
||||
|
||||
executeJavaScript("testObject.setIntArray([undefined]);");
|
||||
assertEquals(0, mTestObject.waitForIntArray()[0]);
|
||||
|
||||
executeJavaScript("testObject.setLongArray([undefined]);");
|
||||
assertEquals(0L, mTestObject.waitForLongArray()[0]);
|
||||
|
||||
executeJavaScript("testObject.setFloatArray([undefined]);");
|
||||
assertEquals(0.0f, mTestObject.waitForFloatArray()[0]);
|
||||
|
||||
executeJavaScript("testObject.setDoubleArray([undefined]);");
|
||||
assertEquals(0.0, mTestObject.waitForDoubleArray()[0]);
|
||||
|
||||
executeJavaScript("testObject.setBooleanArray([undefined]);");
|
||||
assertEquals(false, mTestObject.waitForBooleanArray()[0]);
|
||||
|
||||
// LIVECONNECT_COMPLIANCE: Should create array and pass null.
|
||||
executeJavaScript("testObject.setObjectArray([undefined]);");
|
||||
assertNull(mTestObject.waitForObjectArray());
|
||||
|
||||
executeJavaScript("testObject.setStringArray([undefined]);");
|
||||
assertNull(mTestObject.waitForStringArray()[0]);
|
||||
|
||||
// LIVECONNECT_COMPLIANCE: Should create array and pass null.
|
||||
executeJavaScript("testObject.setCustomTypeArray([undefined]);");
|
||||
assertNull(mTestObject.waitForCustomTypeArray());
|
||||
}
|
||||
}
|
||||
@@ -1,226 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2011 The Android Open Source Project
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
/**
|
||||
* Part of the test suite for the WebView's Java Bridge. This class tests the
|
||||
* general use of arrays.
|
||||
*
|
||||
* 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.JavaBridgeArrayTest \
|
||||
* com.android.webviewtests/android.test.InstrumentationTestRunner
|
||||
*/
|
||||
|
||||
package com.android.webviewtests;
|
||||
|
||||
public class JavaBridgeArrayTest extends JavaBridgeTestBase {
|
||||
private class TestObject extends Controller {
|
||||
private boolean mBooleanValue;
|
||||
private int mIntValue;
|
||||
private String mStringValue;
|
||||
|
||||
private int[] mIntArray;
|
||||
private int[][] mIntIntArray;
|
||||
|
||||
private boolean mWasArrayMethodCalled;
|
||||
|
||||
public synchronized void setBooleanValue(boolean x) {
|
||||
mBooleanValue = x;
|
||||
notifyResultIsReady();
|
||||
}
|
||||
public synchronized void setIntValue(int x) {
|
||||
mIntValue = x;
|
||||
notifyResultIsReady();
|
||||
}
|
||||
public synchronized void setStringValue(String x) {
|
||||
mStringValue = x;
|
||||
notifyResultIsReady();
|
||||
}
|
||||
|
||||
public synchronized boolean waitForBooleanValue() {
|
||||
waitForResult();
|
||||
return mBooleanValue;
|
||||
}
|
||||
public synchronized int waitForIntValue() {
|
||||
waitForResult();
|
||||
return mIntValue;
|
||||
}
|
||||
public synchronized String waitForStringValue() {
|
||||
waitForResult();
|
||||
return mStringValue;
|
||||
}
|
||||
|
||||
public synchronized void setIntArray(int[] x) {
|
||||
mIntArray = x;
|
||||
notifyResultIsReady();
|
||||
}
|
||||
public synchronized void setIntIntArray(int[][] x) {
|
||||
mIntIntArray = x;
|
||||
notifyResultIsReady();
|
||||
}
|
||||
|
||||
public synchronized int[] waitForIntArray() {
|
||||
waitForResult();
|
||||
return mIntArray;
|
||||
}
|
||||
public synchronized int[][] waitForIntIntArray() {
|
||||
waitForResult();
|
||||
return mIntIntArray;
|
||||
}
|
||||
|
||||
public synchronized int[] arrayMethod() {
|
||||
mWasArrayMethodCalled = true;
|
||||
return new int[] {42, 43, 44};
|
||||
}
|
||||
|
||||
public synchronized boolean wasArrayMethodCalled() {
|
||||
return mWasArrayMethodCalled;
|
||||
}
|
||||
}
|
||||
|
||||
private TestObject mTestObject;
|
||||
|
||||
@Override
|
||||
protected void setUp() throws Exception {
|
||||
super.setUp();
|
||||
mTestObject = new TestObject();
|
||||
setUpWebView(mTestObject, "testObject");
|
||||
}
|
||||
|
||||
public void testArrayLength() throws Throwable {
|
||||
executeJavaScript("testObject.setIntArray([42, 43, 44]);");
|
||||
int[] result = mTestObject.waitForIntArray();
|
||||
assertEquals(3, result.length);
|
||||
assertEquals(42, result[0]);
|
||||
assertEquals(43, result[1]);
|
||||
assertEquals(44, result[2]);
|
||||
}
|
||||
|
||||
public void testPassNull() throws Throwable {
|
||||
executeJavaScript("testObject.setIntArray(null);");
|
||||
assertNull(mTestObject.waitForIntArray());
|
||||
}
|
||||
|
||||
public void testPassUndefined() throws Throwable {
|
||||
executeJavaScript("testObject.setIntArray(undefined);");
|
||||
assertNull(mTestObject.waitForIntArray());
|
||||
}
|
||||
|
||||
public void testPassEmptyArray() throws Throwable {
|
||||
executeJavaScript("testObject.setIntArray([]);");
|
||||
assertEquals(0, mTestObject.waitForIntArray().length);
|
||||
}
|
||||
|
||||
// Note that this requires being able to pass a string from JavaScript to
|
||||
// Java.
|
||||
public void testPassArrayToStringMethod() throws Throwable {
|
||||
// LIVECONNECT_COMPLIANCE: Should call toString() on array.
|
||||
executeJavaScript("testObject.setStringValue([42, 42, 42]);");
|
||||
assertEquals("undefined", mTestObject.waitForStringValue());
|
||||
}
|
||||
|
||||
// Note that this requires being able to pass an integer from JavaScript to
|
||||
// Java.
|
||||
public void testPassArrayToNonStringNonArrayMethod() throws Throwable {
|
||||
// LIVECONNECT_COMPLIANCE: Should raise JavaScript exception.
|
||||
executeJavaScript("testObject.setIntValue([42, 42, 42]);");
|
||||
assertEquals(0, mTestObject.waitForIntValue());
|
||||
}
|
||||
|
||||
public void testPassNonArrayToArrayMethod() throws Throwable {
|
||||
// LIVECONNECT_COMPLIANCE: Should raise JavaScript exception.
|
||||
executeJavaScript("testObject.setIntArray(42);");
|
||||
assertNull(mTestObject.waitForIntArray());
|
||||
}
|
||||
|
||||
public void testObjectWithLengthProperty() throws Throwable {
|
||||
executeJavaScript("testObject.setIntArray({length: 3, 1: 42});");
|
||||
int[] result = mTestObject.waitForIntArray();
|
||||
assertEquals(3, result.length);
|
||||
assertEquals(0, result[0]);
|
||||
assertEquals(42, result[1]);
|
||||
assertEquals(0, result[2]);
|
||||
}
|
||||
|
||||
public void testNonNumericLengthProperty() throws Throwable {
|
||||
// LIVECONNECT_COMPLIANCE: This should not count as an array, so we
|
||||
// should raise a JavaScript exception.
|
||||
executeJavaScript("testObject.setIntArray({length: \"foo\"});");
|
||||
assertNull(mTestObject.waitForIntArray());
|
||||
}
|
||||
|
||||
public void testLengthOutOfBounds() throws Throwable {
|
||||
// LIVECONNECT_COMPLIANCE: This should not count as an array, so we
|
||||
// should raise a JavaScript exception.
|
||||
executeJavaScript("testObject.setIntArray({length: -1});");
|
||||
assertNull(mTestObject.waitForIntArray());
|
||||
|
||||
// LIVECONNECT_COMPLIANCE: This should not count as an array, so we
|
||||
// should raise a JavaScript exception.
|
||||
long length = (long)Integer.MAX_VALUE + 1L;
|
||||
executeJavaScript("testObject.setIntArray({length: " + length + "});");
|
||||
assertNull(mTestObject.waitForIntArray());
|
||||
|
||||
// LIVECONNECT_COMPLIANCE: This should not count as an array, so we
|
||||
// should raise a JavaScript exception.
|
||||
length = (long)Integer.MAX_VALUE + 1L - (long)Integer.MIN_VALUE + 1L;
|
||||
executeJavaScript("testObject.setIntArray({length: " + length + "});");
|
||||
assertNull(mTestObject.waitForIntArray());
|
||||
}
|
||||
|
||||
public void testSparseArray() throws Throwable {
|
||||
executeJavaScript("var x = [42, 43]; x[3] = 45; testObject.setIntArray(x);");
|
||||
int[] result = mTestObject.waitForIntArray();
|
||||
assertEquals(4, result.length);
|
||||
assertEquals(42, result[0]);
|
||||
assertEquals(43, result[1]);
|
||||
assertEquals(0, result[2]);
|
||||
assertEquals(45, result[3]);
|
||||
}
|
||||
|
||||
// Note that this requires being able to pass a boolean from JavaScript to
|
||||
// Java.
|
||||
public void testMethodReturningArrayNotCalled() throws Throwable {
|
||||
// We don't invoke methods which return arrays, but note that no
|
||||
// exception is raised.
|
||||
// LIVECONNECT_COMPLIANCE: Should call method and convert result to
|
||||
// JavaScript array.
|
||||
executeJavaScript("testObject.setBooleanValue(undefined === testObject.arrayMethod())");
|
||||
assertTrue(mTestObject.waitForBooleanValue());
|
||||
assertFalse(mTestObject.wasArrayMethodCalled());
|
||||
}
|
||||
|
||||
public void testMultiDimensionalArrayMethod() throws Throwable {
|
||||
// LIVECONNECT_COMPLIANCE: Should handle multi-dimensional arrays.
|
||||
executeJavaScript("testObject.setIntIntArray([ [42, 43], [44, 45] ]);");
|
||||
assertNull(mTestObject.waitForIntIntArray());
|
||||
}
|
||||
|
||||
public void testPassMultiDimensionalArray() throws Throwable {
|
||||
// LIVECONNECT_COMPLIANCE: Should handle multi-dimensional arrays.
|
||||
executeJavaScript("testObject.setIntArray([ [42, 43], [44, 45] ]);");
|
||||
int[] result = mTestObject.waitForIntArray();
|
||||
assertEquals(2, result.length);
|
||||
assertEquals(0, result[0]);
|
||||
assertEquals(0, result[1]);
|
||||
}
|
||||
}
|
||||
@@ -1,442 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2011 The Android Open Source Project
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
/**
|
||||
* Part of the test suite for the WebView's Java Bridge. Tests a number of features including ...
|
||||
* - The type of injected objects
|
||||
* - The type of their methods
|
||||
* - Replacing objects
|
||||
* - Removing objects
|
||||
* - Access control
|
||||
* - Calling methods on returned objects
|
||||
* - Multiply injected objects
|
||||
* - Threading
|
||||
* - Inheritance
|
||||
*
|
||||
* To run this test ...
|
||||
* adb shell am instrument -w -e class com.android.webviewtests.JavaBridgeBasicsTest \
|
||||
* com.android.webviewtests/android.test.InstrumentationTestRunner
|
||||
*/
|
||||
|
||||
package com.android.webviewtests;
|
||||
|
||||
public class JavaBridgeBasicsTest extends JavaBridgeTestBase {
|
||||
private class TestController extends Controller {
|
||||
private int mIntValue;
|
||||
private long mLongValue;
|
||||
private String mStringValue;
|
||||
private boolean mBooleanValue;
|
||||
|
||||
public synchronized void setIntValue(int x) {
|
||||
mIntValue = x;
|
||||
notifyResultIsReady();
|
||||
}
|
||||
public synchronized void setLongValue(long x) {
|
||||
mLongValue = x;
|
||||
notifyResultIsReady();
|
||||
}
|
||||
public synchronized void setStringValue(String x) {
|
||||
mStringValue = x;
|
||||
notifyResultIsReady();
|
||||
}
|
||||
public synchronized void setBooleanValue(boolean x) {
|
||||
mBooleanValue = x;
|
||||
notifyResultIsReady();
|
||||
}
|
||||
|
||||
public synchronized int waitForIntValue() {
|
||||
waitForResult();
|
||||
return mIntValue;
|
||||
}
|
||||
public synchronized long waitForLongValue() {
|
||||
waitForResult();
|
||||
return mLongValue;
|
||||
}
|
||||
public synchronized String waitForStringValue() {
|
||||
waitForResult();
|
||||
return mStringValue;
|
||||
}
|
||||
public synchronized boolean waitForBooleanValue() {
|
||||
waitForResult();
|
||||
return mBooleanValue;
|
||||
}
|
||||
}
|
||||
|
||||
private static class ObjectWithStaticMethod {
|
||||
public static String staticMethod() {
|
||||
return "foo";
|
||||
}
|
||||
}
|
||||
|
||||
TestController mTestController;
|
||||
|
||||
@Override
|
||||
protected void setUp() throws Exception {
|
||||
super.setUp();
|
||||
mTestController = new TestController();
|
||||
setUpWebView(mTestController, "testController");
|
||||
}
|
||||
|
||||
// Note that this requires that we can pass a JavaScript string to Java.
|
||||
protected String executeJavaScriptAndGetStringResult(String script) throws Throwable {
|
||||
executeJavaScript("testController.setStringValue(" + script + ");");
|
||||
return mTestController.waitForStringValue();
|
||||
}
|
||||
|
||||
protected void injectObjectAndReload(final Object object, final String name) throws Throwable {
|
||||
runTestOnUiThread(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
getWebView().addJavascriptInterface(object, name);
|
||||
getWebView().reload();
|
||||
}
|
||||
});
|
||||
mWebViewClient.waitForOnPageFinished();
|
||||
}
|
||||
|
||||
// Note that this requires that we can pass a JavaScript boolean to Java.
|
||||
private void assertRaisesException(String script) throws Throwable {
|
||||
executeJavaScript("try {" +
|
||||
script + ";" +
|
||||
" testController.setBooleanValue(false);" +
|
||||
"} catch (exception) {" +
|
||||
" testController.setBooleanValue(true);" +
|
||||
"}");
|
||||
assertTrue(mTestController.waitForBooleanValue());
|
||||
}
|
||||
|
||||
public void testTypeOfInjectedObject() throws Throwable {
|
||||
assertEquals("object", executeJavaScriptAndGetStringResult("typeof testController"));
|
||||
}
|
||||
|
||||
public void testAdditionNotReflectedUntilReload() throws Throwable {
|
||||
assertEquals("undefined", executeJavaScriptAndGetStringResult("typeof testObject"));
|
||||
runTestOnUiThread(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
getWebView().addJavascriptInterface(new Object(), "testObject");
|
||||
}
|
||||
});
|
||||
assertEquals("undefined", executeJavaScriptAndGetStringResult("typeof testObject"));
|
||||
runTestOnUiThread(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
getWebView().reload();
|
||||
}
|
||||
});
|
||||
mWebViewClient.waitForOnPageFinished();
|
||||
assertEquals("object", executeJavaScriptAndGetStringResult("typeof testObject"));
|
||||
}
|
||||
|
||||
public void testRemovalNotReflectedUntilReload() throws Throwable {
|
||||
injectObjectAndReload(new Object(), "testObject");
|
||||
assertEquals("object", executeJavaScriptAndGetStringResult("typeof testObject"));
|
||||
runTestOnUiThread(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
getWebView().removeJavascriptInterface("testObject");
|
||||
}
|
||||
});
|
||||
assertEquals("object", executeJavaScriptAndGetStringResult("typeof testObject"));
|
||||
runTestOnUiThread(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
getWebView().reload();
|
||||
}
|
||||
});
|
||||
mWebViewClient.waitForOnPageFinished();
|
||||
assertEquals("undefined", executeJavaScriptAndGetStringResult("typeof testObject"));
|
||||
}
|
||||
|
||||
public void testRemoveObjectNotAdded() throws Throwable {
|
||||
runTestOnUiThread(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
getWebView().removeJavascriptInterface("foo");
|
||||
getWebView().reload();
|
||||
}
|
||||
});
|
||||
mWebViewClient.waitForOnPageFinished();
|
||||
assertEquals("undefined", executeJavaScriptAndGetStringResult("typeof foo"));
|
||||
}
|
||||
|
||||
public void testTypeOfMethod() throws Throwable {
|
||||
assertEquals("function",
|
||||
executeJavaScriptAndGetStringResult("typeof testController.setStringValue"));
|
||||
}
|
||||
|
||||
public void testTypeOfInvalidMethod() throws Throwable {
|
||||
assertEquals("undefined", executeJavaScriptAndGetStringResult("typeof testController.foo"));
|
||||
}
|
||||
|
||||
public void testCallingInvalidMethodRaisesException() throws Throwable {
|
||||
assertRaisesException("testController.foo()");
|
||||
}
|
||||
|
||||
public void testUncaughtJavaExceptionRaisesJavaException() throws Throwable {
|
||||
injectObjectAndReload(new Object() {
|
||||
public void method() { throw new RuntimeException("foo"); }
|
||||
}, "testObject");
|
||||
assertRaisesException("testObject.method()");
|
||||
}
|
||||
|
||||
// Note that this requires that we can pass a JavaScript string to Java.
|
||||
public void testTypeOfStaticMethod() throws Throwable {
|
||||
injectObjectAndReload(new ObjectWithStaticMethod(), "testObject");
|
||||
executeJavaScript("testController.setStringValue(typeof testObject.staticMethod)");
|
||||
assertEquals("function", mTestController.waitForStringValue());
|
||||
}
|
||||
|
||||
// Note that this requires that we can pass a JavaScript string to Java.
|
||||
public void testCallStaticMethod() throws Throwable {
|
||||
injectObjectAndReload(new ObjectWithStaticMethod(), "testObject");
|
||||
executeJavaScript("testController.setStringValue(testObject.staticMethod())");
|
||||
assertEquals("foo", mTestController.waitForStringValue());
|
||||
}
|
||||
|
||||
public void testPrivateMethodNotExposed() throws Throwable {
|
||||
injectObjectAndReload(new Object() {
|
||||
private void method() {}
|
||||
}, "testObject");
|
||||
assertEquals("undefined",
|
||||
executeJavaScriptAndGetStringResult("typeof testObject.method"));
|
||||
}
|
||||
|
||||
public void testReplaceInjectedObject() throws Throwable {
|
||||
injectObjectAndReload(new Object() {
|
||||
public void method() { mTestController.setStringValue("object 1"); }
|
||||
}, "testObject");
|
||||
executeJavaScript("testObject.method()");
|
||||
assertEquals("object 1", mTestController.waitForStringValue());
|
||||
|
||||
injectObjectAndReload(new Object() {
|
||||
public void method() { mTestController.setStringValue("object 2"); }
|
||||
}, "testObject");
|
||||
executeJavaScript("testObject.method()");
|
||||
assertEquals("object 2", mTestController.waitForStringValue());
|
||||
}
|
||||
|
||||
public void testInjectNullObjectIsIgnored() throws Throwable {
|
||||
injectObjectAndReload(null, "testObject");
|
||||
assertEquals("undefined", executeJavaScriptAndGetStringResult("typeof testObject"));
|
||||
}
|
||||
|
||||
public void testReplaceInjectedObjectWithNullObjectIsIgnored() throws Throwable {
|
||||
injectObjectAndReload(new Object(), "testObject");
|
||||
assertEquals("object", executeJavaScriptAndGetStringResult("typeof testObject"));
|
||||
injectObjectAndReload(null, "testObject");
|
||||
assertEquals("object", executeJavaScriptAndGetStringResult("typeof testObject"));
|
||||
}
|
||||
|
||||
public void testCallOverloadedMethodWithDifferentNumberOfArguments() throws Throwable {
|
||||
injectObjectAndReload(new Object() {
|
||||
public void method() { mTestController.setStringValue("0 args"); }
|
||||
public void method(int x) { mTestController.setStringValue("1 arg"); }
|
||||
public void method(int x, int y) { mTestController.setStringValue("2 args"); }
|
||||
}, "testObject");
|
||||
executeJavaScript("testObject.method()");
|
||||
assertEquals("0 args", mTestController.waitForStringValue());
|
||||
executeJavaScript("testObject.method(42)");
|
||||
assertEquals("1 arg", mTestController.waitForStringValue());
|
||||
executeJavaScript("testObject.method(null)");
|
||||
assertEquals("1 arg", mTestController.waitForStringValue());
|
||||
executeJavaScript("testObject.method(undefined)");
|
||||
assertEquals("1 arg", mTestController.waitForStringValue());
|
||||
executeJavaScript("testObject.method(42, 42)");
|
||||
assertEquals("2 args", mTestController.waitForStringValue());
|
||||
}
|
||||
|
||||
public void testCallMethodWithWrongNumberOfArgumentsRaisesException() throws Throwable {
|
||||
assertRaisesException("testController.setIntValue()");
|
||||
assertRaisesException("testController.setIntValue(42, 42)");
|
||||
}
|
||||
|
||||
public void testObjectPersistsAcrossPageLoads() throws Throwable {
|
||||
assertEquals("object", executeJavaScriptAndGetStringResult("typeof testController"));
|
||||
runTestOnUiThread(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
getWebView().reload();
|
||||
}
|
||||
});
|
||||
mWebViewClient.waitForOnPageFinished();
|
||||
assertEquals("object", executeJavaScriptAndGetStringResult("typeof testController"));
|
||||
}
|
||||
|
||||
public void testSameObjectInjectedMultipleTimes() throws Throwable {
|
||||
class TestObject {
|
||||
private int mNumMethodInvocations;
|
||||
public void method() { mTestController.setIntValue(++mNumMethodInvocations); }
|
||||
}
|
||||
final TestObject testObject = new TestObject();
|
||||
runTestOnUiThread(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
getWebView().addJavascriptInterface(testObject, "testObject1");
|
||||
getWebView().addJavascriptInterface(testObject, "testObject2");
|
||||
getWebView().reload();
|
||||
}
|
||||
});
|
||||
mWebViewClient.waitForOnPageFinished();
|
||||
executeJavaScript("testObject1.method()");
|
||||
assertEquals(1, mTestController.waitForIntValue());
|
||||
executeJavaScript("testObject2.method()");
|
||||
assertEquals(2, mTestController.waitForIntValue());
|
||||
}
|
||||
|
||||
public void testCallMethodOnReturnedObject() throws Throwable {
|
||||
injectObjectAndReload(new Object() {
|
||||
public Object getInnerObject() {
|
||||
return new Object() {
|
||||
public void method(int x) { mTestController.setIntValue(x); }
|
||||
};
|
||||
}
|
||||
}, "testObject");
|
||||
executeJavaScript("testObject.getInnerObject().method(42)");
|
||||
assertEquals(42, mTestController.waitForIntValue());
|
||||
}
|
||||
|
||||
public void testReturnedObjectInjectedElsewhere() throws Throwable {
|
||||
class InnerObject {
|
||||
private int mNumMethodInvocations;
|
||||
public void method() { mTestController.setIntValue(++mNumMethodInvocations); }
|
||||
}
|
||||
final InnerObject innerObject = new InnerObject();
|
||||
final Object object = new Object() {
|
||||
public InnerObject getInnerObject() {
|
||||
return innerObject;
|
||||
}
|
||||
};
|
||||
runTestOnUiThread(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
getWebView().addJavascriptInterface(object, "testObject");
|
||||
getWebView().addJavascriptInterface(innerObject, "innerObject");
|
||||
getWebView().reload();
|
||||
}
|
||||
});
|
||||
mWebViewClient.waitForOnPageFinished();
|
||||
executeJavaScript("testObject.getInnerObject().method()");
|
||||
assertEquals(1, mTestController.waitForIntValue());
|
||||
executeJavaScript("innerObject.method()");
|
||||
assertEquals(2, mTestController.waitForIntValue());
|
||||
}
|
||||
|
||||
public void testMethodInvokedOnBackgroundThread() throws Throwable {
|
||||
injectObjectAndReload(new Object() {
|
||||
public void captureThreadId() {
|
||||
mTestController.setLongValue(Thread.currentThread().getId());
|
||||
}
|
||||
}, "testObject");
|
||||
executeJavaScript("testObject.captureThreadId()");
|
||||
final long threadId = mTestController.waitForLongValue();
|
||||
assertFalse(threadId == Thread.currentThread().getId());
|
||||
runTestOnUiThread(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
assertFalse(threadId == Thread.currentThread().getId());
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
public void testPublicInheritedMethod() throws Throwable {
|
||||
class Base {
|
||||
public void method(int x) { mTestController.setIntValue(x); }
|
||||
}
|
||||
class Derived extends Base {
|
||||
}
|
||||
injectObjectAndReload(new Derived(), "testObject");
|
||||
assertEquals("function", executeJavaScriptAndGetStringResult("typeof testObject.method"));
|
||||
executeJavaScript("testObject.method(42)");
|
||||
assertEquals(42, mTestController.waitForIntValue());
|
||||
}
|
||||
|
||||
public void testPrivateInheritedMethod() throws Throwable {
|
||||
class Base {
|
||||
private void method() {}
|
||||
}
|
||||
class Derived extends Base {
|
||||
}
|
||||
injectObjectAndReload(new Derived(), "testObject");
|
||||
assertEquals("undefined", executeJavaScriptAndGetStringResult("typeof testObject.method"));
|
||||
}
|
||||
|
||||
public void testOverriddenMethod() throws Throwable {
|
||||
class Base {
|
||||
public void method() { mTestController.setStringValue("base"); }
|
||||
}
|
||||
class Derived extends Base {
|
||||
public void method() { mTestController.setStringValue("derived"); }
|
||||
}
|
||||
injectObjectAndReload(new Derived(), "testObject");
|
||||
executeJavaScript("testObject.method()");
|
||||
assertEquals("derived", mTestController.waitForStringValue());
|
||||
}
|
||||
|
||||
public void testEnumerateMembers() throws Throwable {
|
||||
injectObjectAndReload(new Object() {
|
||||
public void method() {}
|
||||
private void privateMethod() {}
|
||||
public int field;
|
||||
private int privateField;
|
||||
}, "testObject");
|
||||
executeJavaScript(
|
||||
"var result = \"\"; " +
|
||||
"for (x in testObject) { result += \" \" + x } " +
|
||||
"testController.setStringValue(result);");
|
||||
// LIVECONNECT_COMPLIANCE: Should be able to enumerate members.
|
||||
assertEquals("", mTestController.waitForStringValue());
|
||||
}
|
||||
|
||||
public void testReflectPublicMethod() throws Throwable {
|
||||
injectObjectAndReload(new Object() {
|
||||
public String method() { return "foo"; }
|
||||
}, "testObject");
|
||||
assertEquals("foo", executeJavaScriptAndGetStringResult(
|
||||
"testObject.getClass().getMethod('method', null).invoke(testObject, null)" +
|
||||
".toString()"));
|
||||
}
|
||||
|
||||
public void testReflectPublicField() throws Throwable {
|
||||
injectObjectAndReload(new Object() {
|
||||
public String field = "foo";
|
||||
}, "testObject");
|
||||
assertEquals("foo", executeJavaScriptAndGetStringResult(
|
||||
"testObject.getClass().getField('field').get(testObject).toString()"));
|
||||
}
|
||||
|
||||
public void testReflectPrivateMethodRaisesException() throws Throwable {
|
||||
injectObjectAndReload(new Object() {
|
||||
private void method() {};
|
||||
}, "testObject");
|
||||
assertRaisesException("testObject.getClass().getMethod('method', null)");
|
||||
// getDeclaredMethod() is able to access a private method, but invoke()
|
||||
// throws a Java exception.
|
||||
assertRaisesException(
|
||||
"testObject.getClass().getDeclaredMethod('method', null).invoke(testObject, null)");
|
||||
}
|
||||
|
||||
public void testReflectPrivateFieldRaisesException() throws Throwable {
|
||||
injectObjectAndReload(new Object() {
|
||||
private int field;
|
||||
}, "testObject");
|
||||
assertRaisesException("testObject.getClass().getField('field')");
|
||||
// getDeclaredField() is able to access a private field, but getInt()
|
||||
// throws a Java exception.
|
||||
assertRaisesException(
|
||||
"testObject.getClass().getDeclaredField('field').getInt(testObject)");
|
||||
}
|
||||
}
|
||||
@@ -1,63 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2012 The Android Open Source Project
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
/**
|
||||
* Part of the test suite for the WebView's Java Bridge.
|
||||
*
|
||||
* Ensures that injected objects are exposed to child frames as well as the
|
||||
* main frame.
|
||||
*
|
||||
* To run this test ...
|
||||
* adb shell am instrument -w -e class com.android.webviewtests.JavaBridgeChildFrameTest \
|
||||
* com.android.webviewtests/android.test.InstrumentationTestRunner
|
||||
*/
|
||||
|
||||
package com.android.webviewtests;
|
||||
|
||||
public class JavaBridgeChildFrameTest extends JavaBridgeTestBase {
|
||||
private class TestController extends Controller {
|
||||
private String mStringValue;
|
||||
|
||||
public synchronized void setStringValue(String x) {
|
||||
mStringValue = x;
|
||||
notifyResultIsReady();
|
||||
}
|
||||
public synchronized String waitForStringValue() {
|
||||
waitForResult();
|
||||
return mStringValue;
|
||||
}
|
||||
}
|
||||
|
||||
TestController mTestController;
|
||||
|
||||
@Override
|
||||
protected void setUp() throws Exception {
|
||||
super.setUp();
|
||||
mTestController = new TestController();
|
||||
setUpWebView(mTestController, "testController");
|
||||
}
|
||||
|
||||
public void testInjectedObjectPresentInChildFrame() throws Throwable {
|
||||
// In the case that the test fails (i.e. the child frame doesn't get the injected object,
|
||||
// the call to testController.setStringValue in the child frame's onload handler will
|
||||
// not be made.
|
||||
getActivity().getWebView().loadData(
|
||||
"<html><head></head><body>" +
|
||||
"<iframe id=\"childFrame\" onload=\"testController.setStringValue('PASS');\" />" +
|
||||
"</body></html>", "text/html", null);
|
||||
assertEquals("PASS", mTestController.waitForStringValue());
|
||||
}
|
||||
}
|
||||
@@ -1,646 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2011 The Android Open Source Project
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
/**
|
||||
* 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
|
||||
*/
|
||||
|
||||
package com.android.webviewtests;
|
||||
|
||||
public class JavaBridgeCoercionTest extends JavaBridgeTestBase {
|
||||
private class TestObject extends Controller {
|
||||
private Object objectInstance;
|
||||
private CustomType customTypeInstance;
|
||||
private CustomType2 customType2Instance;
|
||||
|
||||
private boolean mBooleanValue;
|
||||
private byte mByteValue;
|
||||
private char mCharValue;
|
||||
private short mShortValue;
|
||||
private int mIntValue;
|
||||
private long mLongValue;
|
||||
private float mFloatValue;
|
||||
private double mDoubleValue;
|
||||
private String mStringValue;
|
||||
private Object mObjectValue;
|
||||
private CustomType mCustomTypeValue;
|
||||
|
||||
public TestObject() {
|
||||
objectInstance = new Object();
|
||||
customTypeInstance = new CustomType();
|
||||
customType2Instance = new CustomType2();
|
||||
}
|
||||
|
||||
public Object getObjectInstance() {
|
||||
return objectInstance;
|
||||
}
|
||||
public CustomType getCustomTypeInstance() {
|
||||
return customTypeInstance;
|
||||
}
|
||||
public CustomType2 getCustomType2Instance() {
|
||||
return customType2Instance;
|
||||
}
|
||||
|
||||
public synchronized void setBooleanValue(boolean x) {
|
||||
mBooleanValue = x;
|
||||
notifyResultIsReady();
|
||||
}
|
||||
public synchronized void setByteValue(byte x) {
|
||||
mByteValue = x;
|
||||
notifyResultIsReady();
|
||||
}
|
||||
public synchronized void setCharValue(char x) {
|
||||
mCharValue = x;
|
||||
notifyResultIsReady();
|
||||
}
|
||||
public synchronized void setShortValue(short x) {
|
||||
mShortValue = x;
|
||||
notifyResultIsReady();
|
||||
}
|
||||
public synchronized void setIntValue(int x) {
|
||||
mIntValue = x;
|
||||
notifyResultIsReady();
|
||||
}
|
||||
public synchronized void setLongValue(long x) {
|
||||
mLongValue = x;
|
||||
notifyResultIsReady();
|
||||
}
|
||||
public synchronized void setFloatValue(float x) {
|
||||
mFloatValue = x;
|
||||
notifyResultIsReady();
|
||||
}
|
||||
public synchronized void setDoubleValue(double x) {
|
||||
mDoubleValue = x;
|
||||
notifyResultIsReady();
|
||||
}
|
||||
public synchronized void setStringValue(String x) {
|
||||
mStringValue = x;
|
||||
notifyResultIsReady();
|
||||
}
|
||||
public synchronized void setObjectValue(Object x) {
|
||||
mObjectValue = x;
|
||||
notifyResultIsReady();
|
||||
}
|
||||
public synchronized void setCustomTypeValue(CustomType x) {
|
||||
mCustomTypeValue = x;
|
||||
notifyResultIsReady();
|
||||
}
|
||||
|
||||
public synchronized boolean waitForBooleanValue() {
|
||||
waitForResult();
|
||||
return mBooleanValue;
|
||||
}
|
||||
public synchronized byte waitForByteValue() {
|
||||
waitForResult();
|
||||
return mByteValue;
|
||||
}
|
||||
public synchronized char waitForCharValue() {
|
||||
waitForResult();
|
||||
return mCharValue;
|
||||
}
|
||||
public synchronized short waitForShortValue() {
|
||||
waitForResult();
|
||||
return mShortValue;
|
||||
}
|
||||
public synchronized int waitForIntValue() {
|
||||
waitForResult();
|
||||
return mIntValue;
|
||||
}
|
||||
public synchronized long waitForLongValue() {
|
||||
waitForResult();
|
||||
return mLongValue;
|
||||
}
|
||||
public synchronized float waitForFloatValue() {
|
||||
waitForResult();
|
||||
return mFloatValue;
|
||||
}
|
||||
public synchronized double waitForDoubleValue() {
|
||||
waitForResult();
|
||||
return mDoubleValue;
|
||||
}
|
||||
public synchronized String waitForStringValue() {
|
||||
waitForResult();
|
||||
return mStringValue;
|
||||
}
|
||||
public synchronized Object waitForObjectValue() {
|
||||
waitForResult();
|
||||
return mObjectValue;
|
||||
}
|
||||
public synchronized CustomType waitForCustomTypeValue() {
|
||||
waitForResult();
|
||||
return mCustomTypeValue;
|
||||
}
|
||||
}
|
||||
|
||||
// Two custom types used when testing passing objects.
|
||||
private static class CustomType {
|
||||
}
|
||||
private static class CustomType2 {
|
||||
}
|
||||
|
||||
private TestObject mTestObject;
|
||||
|
||||
@Override
|
||||
protected void setUp() throws Exception {
|
||||
super.setUp();
|
||||
mTestObject = new TestObject();
|
||||
setUpWebView(mTestObject, "testObject");
|
||||
}
|
||||
|
||||
// Test passing a JavaScript number in the int32 range to a method of an
|
||||
// injected object.
|
||||
public void testPassNumberInt32() throws Throwable {
|
||||
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());
|
||||
}
|
||||
|
||||
// Test passing a JavaScript number in the double range to a method of an
|
||||
// injected object.
|
||||
public void testPassNumberDouble() throws Throwable {
|
||||
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());
|
||||
}
|
||||
|
||||
// Test passing JavaScript NaN to a method of an injected object.
|
||||
public void testPassNumberNaN() throws Throwable {
|
||||
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());
|
||||
}
|
||||
|
||||
// Test passing JavaScript infinity to a method of an injected object.
|
||||
public void testPassNumberInfinity() throws Throwable {
|
||||
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());
|
||||
}
|
||||
|
||||
// Test passing a JavaScript boolean to a method of an injected object.
|
||||
public void testPassBoolean() throws Throwable {
|
||||
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());
|
||||
}
|
||||
|
||||
// Test passing a JavaScript string to a method of an injected object.
|
||||
public void testPassString() throws Throwable {
|
||||
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());
|
||||
}
|
||||
|
||||
// Test passing a JavaScript object to a method of an injected object.
|
||||
public void testPassJavaScriptObject() throws Throwable {
|
||||
// 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());
|
||||
}
|
||||
|
||||
// Test passing a Java object to a method of an injected object. Note that
|
||||
// this test requires being able to return objects from the methods of
|
||||
// injected objects. This is tested elsewhere.
|
||||
public void testPassJavaObject() throws Throwable {
|
||||
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());
|
||||
}
|
||||
|
||||
// Test passing JavaScript null to a method of an injected object.
|
||||
public void testPassNull() throws Throwable {
|
||||
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());
|
||||
}
|
||||
|
||||
// Test passing JavaScript undefined to a method of an injected object.
|
||||
public void testPassUndefined() throws Throwable {
|
||||
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());
|
||||
}
|
||||
}
|
||||
@@ -1,100 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2011 The Android Open Source Project
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
/**
|
||||
* Part of the test suite for the WebView's Java Bridge. This test tests the
|
||||
* use of fields.
|
||||
*
|
||||
* To run this test ...
|
||||
* adb shell am instrument -w -e class com.android.webviewtests.JavaBridgeFieldsTest \
|
||||
* com.android.webviewtests/android.test.InstrumentationTestRunner
|
||||
*/
|
||||
|
||||
package com.android.webviewtests;
|
||||
|
||||
public class JavaBridgeFieldsTest extends JavaBridgeTestBase {
|
||||
private class TestObject extends Controller {
|
||||
private String mStringValue;
|
||||
|
||||
// These methods are used to control the test.
|
||||
public synchronized void setStringValue(String x) {
|
||||
mStringValue = x;
|
||||
notifyResultIsReady();
|
||||
}
|
||||
public synchronized String waitForStringValue() {
|
||||
waitForResult();
|
||||
return mStringValue;
|
||||
}
|
||||
|
||||
public boolean booleanField = true;
|
||||
public byte byteField = 42;
|
||||
public char charField = '\u002A';
|
||||
public short shortField = 42;
|
||||
public int intField = 42;
|
||||
public long longField = 42L;
|
||||
public float floatField = 42.0f;
|
||||
public double doubleField = 42.0;
|
||||
public String stringField = "foo";
|
||||
public Object objectField = new Object();
|
||||
public CustomType customTypeField = new CustomType();
|
||||
}
|
||||
|
||||
// A custom type used when testing passing objects.
|
||||
private class CustomType {
|
||||
}
|
||||
|
||||
TestObject mTestObject;
|
||||
|
||||
@Override
|
||||
protected void setUp() throws Exception {
|
||||
super.setUp();
|
||||
mTestObject = new TestObject();
|
||||
setUpWebView(mTestObject, "testObject");
|
||||
}
|
||||
|
||||
// Note that this requires that we can pass a JavaScript string to Java.
|
||||
protected String executeJavaScriptAndGetStringResult(String script) throws Throwable {
|
||||
executeJavaScript("testObject.setStringValue(" + script + ");");
|
||||
return mTestObject.waitForStringValue();
|
||||
}
|
||||
|
||||
// The Java bridge does not provide access to fields.
|
||||
// FIXME: Consider providing support for this. See See b/4408210.
|
||||
public void testFieldTypes() throws Throwable {
|
||||
assertEquals("undefined",
|
||||
executeJavaScriptAndGetStringResult("typeof testObject.booleanField"));
|
||||
assertEquals("undefined",
|
||||
executeJavaScriptAndGetStringResult("typeof testObject.byteField"));
|
||||
assertEquals("undefined",
|
||||
executeJavaScriptAndGetStringResult("typeof testObject.charField"));
|
||||
assertEquals("undefined",
|
||||
executeJavaScriptAndGetStringResult("typeof testObject.shortField"));
|
||||
assertEquals("undefined",
|
||||
executeJavaScriptAndGetStringResult("typeof testObject.intField"));
|
||||
assertEquals("undefined",
|
||||
executeJavaScriptAndGetStringResult("typeof testObject.longField"));
|
||||
assertEquals("undefined",
|
||||
executeJavaScriptAndGetStringResult("typeof testObject.floatField"));
|
||||
assertEquals("undefined",
|
||||
executeJavaScriptAndGetStringResult("typeof testObject.doubleField"));
|
||||
assertEquals("undefined",
|
||||
executeJavaScriptAndGetStringResult("typeof testObject.objectField"));
|
||||
assertEquals("undefined",
|
||||
executeJavaScriptAndGetStringResult("typeof testObject.stringField"));
|
||||
assertEquals("undefined",
|
||||
executeJavaScriptAndGetStringResult("typeof testObject.customTypeField"));
|
||||
}
|
||||
}
|
||||
@@ -1,199 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2011 The Android Open Source Project
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
/**
|
||||
* Part of the test suite for the WebView's Java Bridge. This test checks that
|
||||
* we correctly convert Java values to JavaScript values when returning them
|
||||
* from 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.JavaBridgeReturnValuesTest \
|
||||
* com.android.webviewtests/android.test.InstrumentationTestRunner
|
||||
*/
|
||||
|
||||
package com.android.webviewtests;
|
||||
|
||||
public class JavaBridgeReturnValuesTest extends JavaBridgeTestBase {
|
||||
// An instance of this class is injected into the page to test returning
|
||||
// Java values to JavaScript.
|
||||
private class TestObject extends Controller {
|
||||
private String mStringValue;
|
||||
private boolean mBooleanValue;
|
||||
|
||||
// These four methods are used to control the test.
|
||||
public synchronized void setStringValue(String x) {
|
||||
mStringValue = x;
|
||||
notifyResultIsReady();
|
||||
}
|
||||
public synchronized String waitForStringValue() {
|
||||
waitForResult();
|
||||
return mStringValue;
|
||||
}
|
||||
public synchronized void setBooleanValue(boolean x) {
|
||||
mBooleanValue = x;
|
||||
notifyResultIsReady();
|
||||
}
|
||||
public synchronized boolean waitForBooleanValue() {
|
||||
waitForResult();
|
||||
return mBooleanValue;
|
||||
}
|
||||
|
||||
public boolean getBooleanValue() {
|
||||
return true;
|
||||
}
|
||||
public byte getByteValue() {
|
||||
return 42;
|
||||
}
|
||||
public char getCharValue() {
|
||||
return '\u002A';
|
||||
}
|
||||
public short getShortValue() {
|
||||
return 42;
|
||||
}
|
||||
public int getIntValue() {
|
||||
return 42;
|
||||
}
|
||||
public long getLongValue() {
|
||||
return 42L;
|
||||
}
|
||||
public float getFloatValue() {
|
||||
return 42.1f;
|
||||
}
|
||||
public float getFloatValueNoDecimal() {
|
||||
return 42.0f;
|
||||
}
|
||||
public double getDoubleValue() {
|
||||
return 42.1;
|
||||
}
|
||||
public double getDoubleValueNoDecimal() {
|
||||
return 42.0;
|
||||
}
|
||||
public String getStringValue() {
|
||||
return "foo";
|
||||
}
|
||||
public String getEmptyStringValue() {
|
||||
return "";
|
||||
}
|
||||
public String getNullStringValue() {
|
||||
return null;
|
||||
}
|
||||
public Object getObjectValue() {
|
||||
return new Object();
|
||||
}
|
||||
public Object getNullObjectValue() {
|
||||
return null;
|
||||
}
|
||||
public CustomType getCustomTypeValue() {
|
||||
return new CustomType();
|
||||
}
|
||||
public void getVoidValue() {
|
||||
}
|
||||
}
|
||||
|
||||
// A custom type used when testing passing objects.
|
||||
private class CustomType {
|
||||
}
|
||||
|
||||
TestObject mTestObject;
|
||||
|
||||
@Override
|
||||
protected void setUp() throws Exception {
|
||||
super.setUp();
|
||||
mTestObject = new TestObject();
|
||||
setUpWebView(mTestObject, "testObject");
|
||||
}
|
||||
|
||||
// Note that this requires that we can pass a JavaScript string to Java.
|
||||
protected String executeJavaScriptAndGetStringResult(String script) throws Throwable {
|
||||
executeJavaScript("testObject.setStringValue(" + script + ");");
|
||||
return mTestObject.waitForStringValue();
|
||||
}
|
||||
|
||||
// Note that this requires that we can pass a JavaScript boolean to Java.
|
||||
private boolean executeJavaScriptAndGetBooleanResult(String script) throws Throwable {
|
||||
executeJavaScript("testObject.setBooleanValue(" + script + ");");
|
||||
return mTestObject.waitForBooleanValue();
|
||||
}
|
||||
|
||||
public void testMethodReturnTypes() throws Throwable {
|
||||
assertEquals("boolean",
|
||||
executeJavaScriptAndGetStringResult("typeof testObject.getBooleanValue()"));
|
||||
assertEquals("number",
|
||||
executeJavaScriptAndGetStringResult("typeof testObject.getByteValue()"));
|
||||
// char values are returned to JavaScript as numbers.
|
||||
assertEquals("number",
|
||||
executeJavaScriptAndGetStringResult("typeof testObject.getCharValue()"));
|
||||
assertEquals("number",
|
||||
executeJavaScriptAndGetStringResult("typeof testObject.getShortValue()"));
|
||||
assertEquals("number",
|
||||
executeJavaScriptAndGetStringResult("typeof testObject.getIntValue()"));
|
||||
assertEquals("number",
|
||||
executeJavaScriptAndGetStringResult("typeof testObject.getLongValue()"));
|
||||
assertEquals("number",
|
||||
executeJavaScriptAndGetStringResult("typeof testObject.getFloatValue()"));
|
||||
assertEquals("number",
|
||||
executeJavaScriptAndGetStringResult("typeof testObject.getFloatValueNoDecimal()"));
|
||||
assertEquals("number",
|
||||
executeJavaScriptAndGetStringResult("typeof testObject.getDoubleValue()"));
|
||||
assertEquals("number",
|
||||
executeJavaScriptAndGetStringResult("typeof testObject.getDoubleValueNoDecimal()"));
|
||||
assertEquals("string",
|
||||
executeJavaScriptAndGetStringResult("typeof testObject.getStringValue()"));
|
||||
assertEquals("string",
|
||||
executeJavaScriptAndGetStringResult("typeof testObject.getEmptyStringValue()"));
|
||||
// LIVECONNECT_COMPLIANCE: This should have type object.
|
||||
assertEquals("undefined",
|
||||
executeJavaScriptAndGetStringResult("typeof testObject.getNullStringValue()"));
|
||||
assertEquals("object",
|
||||
executeJavaScriptAndGetStringResult("typeof testObject.getObjectValue()"));
|
||||
assertEquals("object",
|
||||
executeJavaScriptAndGetStringResult("typeof testObject.getNullObjectValue()"));
|
||||
assertEquals("object",
|
||||
executeJavaScriptAndGetStringResult("typeof testObject.getCustomTypeValue()"));
|
||||
assertEquals("undefined",
|
||||
executeJavaScriptAndGetStringResult("typeof testObject.getVoidValue()"));
|
||||
}
|
||||
|
||||
public void testMethodReturnValues() throws Throwable {
|
||||
// We do the string comparison in JavaScript, to avoid relying on the
|
||||
// coercion algorithm from JavaScript to Java.
|
||||
assertTrue(executeJavaScriptAndGetBooleanResult("testObject.getBooleanValue()"));
|
||||
assertTrue(executeJavaScriptAndGetBooleanResult("42 === testObject.getByteValue()"));
|
||||
// char values are returned to JavaScript as numbers.
|
||||
assertTrue(executeJavaScriptAndGetBooleanResult("42 === testObject.getCharValue()"));
|
||||
assertTrue(executeJavaScriptAndGetBooleanResult("42 === testObject.getShortValue()"));
|
||||
assertTrue(executeJavaScriptAndGetBooleanResult("42 === testObject.getIntValue()"));
|
||||
assertTrue(executeJavaScriptAndGetBooleanResult("42 === testObject.getLongValue()"));
|
||||
assertTrue(executeJavaScriptAndGetBooleanResult(
|
||||
"Math.abs(42.1 - testObject.getFloatValue()) < 0.001"));
|
||||
assertTrue(executeJavaScriptAndGetBooleanResult(
|
||||
"42.0 === testObject.getFloatValueNoDecimal()"));
|
||||
assertTrue(executeJavaScriptAndGetBooleanResult(
|
||||
"Math.abs(42.1 - testObject.getDoubleValue()) < 0.001"));
|
||||
assertTrue(executeJavaScriptAndGetBooleanResult(
|
||||
"42.0 === testObject.getDoubleValueNoDecimal()"));
|
||||
assertEquals("foo", executeJavaScriptAndGetStringResult("testObject.getStringValue()"));
|
||||
assertEquals("", executeJavaScriptAndGetStringResult("testObject.getEmptyStringValue()"));
|
||||
assertTrue(executeJavaScriptAndGetBooleanResult("undefined === testObject.getVoidValue()"));
|
||||
}
|
||||
}
|
||||
@@ -1,122 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2011 The Android Open Source Project
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
/**
|
||||
* Common functionality for testing the WebView's Java Bridge.
|
||||
*/
|
||||
|
||||
package com.android.webviewtests;
|
||||
|
||||
import android.test.ActivityInstrumentationTestCase2;
|
||||
import android.util.Log;
|
||||
import android.webkit.WebView;
|
||||
import android.webkit.WebViewClient;
|
||||
|
||||
import junit.framework.Assert;
|
||||
|
||||
public class JavaBridgeTestBase extends ActivityInstrumentationTestCase2<WebViewStubActivity> {
|
||||
protected class TestWebViewClient extends WebViewClient {
|
||||
private boolean mIsPageFinished;
|
||||
@Override
|
||||
public synchronized void onPageFinished(WebView webView, String url) {
|
||||
mIsPageFinished = true;
|
||||
notify();
|
||||
}
|
||||
public synchronized void waitForOnPageFinished() throws RuntimeException {
|
||||
while (!mIsPageFinished) {
|
||||
try {
|
||||
wait(5000);
|
||||
} catch (Exception e) {
|
||||
continue;
|
||||
}
|
||||
if (!mIsPageFinished) {
|
||||
throw new RuntimeException("Timed out waiting for onPageFinished()");
|
||||
}
|
||||
}
|
||||
mIsPageFinished = false;
|
||||
}
|
||||
}
|
||||
|
||||
protected class Controller {
|
||||
private boolean mIsResultReady;
|
||||
|
||||
protected synchronized void notifyResultIsReady() {
|
||||
mIsResultReady = true;
|
||||
notify();
|
||||
}
|
||||
protected synchronized void waitForResult() {
|
||||
while (!mIsResultReady) {
|
||||
try {
|
||||
wait(5000);
|
||||
} catch (Exception e) {
|
||||
continue;
|
||||
}
|
||||
if (!mIsResultReady) {
|
||||
Assert.fail("Wait timed out");
|
||||
}
|
||||
}
|
||||
mIsResultReady = false;
|
||||
}
|
||||
}
|
||||
|
||||
protected TestWebViewClient mWebViewClient;
|
||||
|
||||
public JavaBridgeTestBase() {
|
||||
super(WebViewStubActivity.class);
|
||||
}
|
||||
|
||||
// Sets up the WebView and injects the supplied object. Intended to be called from setUp().
|
||||
protected void setUpWebView(final Object object, final String name) throws Exception {
|
||||
mWebViewClient = new TestWebViewClient();
|
||||
// This starts the activity, so must be called on the test thread.
|
||||
final WebViewStubActivity activity = getActivity();
|
||||
// On the UI thread, load an empty page and wait for it to finish
|
||||
// loading so that the Java object is injected.
|
||||
try {
|
||||
runTestOnUiThread(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
WebView webView = activity.getWebView();
|
||||
webView.addJavascriptInterface(object, name);
|
||||
webView.getSettings().setJavaScriptEnabled(true);
|
||||
webView.setWebViewClient(mWebViewClient);
|
||||
webView.loadData("<!DOCTYPE html><title></title>", "text/html", null);
|
||||
}
|
||||
});
|
||||
mWebViewClient.waitForOnPageFinished();
|
||||
} catch (Throwable e) {
|
||||
throw new RuntimeException("Failed to set up WebView: " + Log.getStackTraceString(e));
|
||||
}
|
||||
}
|
||||
|
||||
protected void executeJavaScript(final String script) throws Throwable {
|
||||
runTestOnUiThread(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
// When a JavaScript URL is executed, if the value of the last
|
||||
// expression evaluated is not 'undefined', this value is
|
||||
// converted to a string and used as the new document for the
|
||||
// frame. We don't want this behaviour, so wrap the script in
|
||||
// an anonymous function.
|
||||
getWebView().loadUrl("javascript:(function() { " + script + " })()");
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
protected WebView getWebView() {
|
||||
return getActivity().getWebView();
|
||||
}
|
||||
}
|
||||
@@ -1,38 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2011 The Android Open Source Project
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package com.android.webviewtests;
|
||||
|
||||
import com.android.webviewtests.R;
|
||||
|
||||
import android.app.Activity;
|
||||
import android.os.Bundle;
|
||||
import android.webkit.WebView;
|
||||
|
||||
public class WebViewStubActivity extends Activity {
|
||||
private WebView mWebView;
|
||||
|
||||
@Override
|
||||
public void onCreate(Bundle savedInstanceState) {
|
||||
super.onCreate(savedInstanceState);
|
||||
setContentView(R.layout.webview_layout);
|
||||
mWebView = (WebView) findViewById(R.id.web_page);
|
||||
}
|
||||
|
||||
public WebView getWebView() {
|
||||
return mWebView;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user