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