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