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