JavaBridgeArrayCoercionTest.java revision 116680a4aac90f2aa7413d9095a592090648e557
1// Copyright 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; 10 11/** 12 * Part of the test suite for the Java Bridge. This class tests that we correctly convert 13 * JavaScript arrays to Java arrays when passing them to the methods of injected Java objects. 14 * 15 * The conversions should follow 16 * http://jdk6.java.net/plugin2/liveconnect/#JS_JAVA_CONVERSIONS. Places in 17 * which the implementation differs from the spec are marked with 18 * LIVECONNECT_COMPLIANCE. 19 * FIXME: Consider making our implementation more compliant, if it will not 20 * break backwards-compatibility. See b/4408210. 21 */ 22public class JavaBridgeArrayCoercionTest extends JavaBridgeTestBase { 23 private class TestObject extends Controller { 24 private final Object mObjectInstance; 25 private final CustomType mCustomTypeInstance; 26 27 private boolean[] mBooleanArray; 28 private byte[] mByteArray; 29 private char[] mCharArray; 30 private short[] mShortArray; 31 private int[] mIntArray; 32 private long[] mLongArray; 33 private float[] mFloatArray; 34 private double[] mDoubleArray; 35 private String[] mStringArray; 36 private Object[] mObjectArray; 37 private CustomType[] mCustomTypeArray; 38 39 public TestObject() { 40 mObjectInstance = new Object(); 41 mCustomTypeInstance = new CustomType(); 42 } 43 44 public Object getObjectInstance() { 45 return mObjectInstance; 46 } 47 public CustomType getCustomTypeInstance() { 48 return mCustomTypeInstance; 49 } 50 51 public synchronized void setBooleanArray(boolean[] x) { 52 mBooleanArray = x; 53 notifyResultIsReady(); 54 } 55 public synchronized void setByteArray(byte[] x) { 56 mByteArray = x; 57 notifyResultIsReady(); 58 } 59 public synchronized void setCharArray(char[] x) { 60 mCharArray = x; 61 notifyResultIsReady(); 62 } 63 public synchronized void setShortArray(short[] x) { 64 mShortArray = x; 65 notifyResultIsReady(); 66 } 67 public synchronized void setIntArray(int[] x) { 68 mIntArray = x; 69 notifyResultIsReady(); 70 } 71 public synchronized void setLongArray(long[] x) { 72 mLongArray = x; 73 notifyResultIsReady(); 74 } 75 public synchronized void setFloatArray(float[] x) { 76 mFloatArray = x; 77 notifyResultIsReady(); 78 } 79 public synchronized void setDoubleArray(double[] x) { 80 mDoubleArray = x; 81 notifyResultIsReady(); 82 } 83 public synchronized void setStringArray(String[] x) { 84 mStringArray = x; 85 notifyResultIsReady(); 86 } 87 public synchronized void setObjectArray(Object[] x) { 88 mObjectArray = x; 89 notifyResultIsReady(); 90 } 91 public synchronized void setCustomTypeArray(CustomType[] x) { 92 mCustomTypeArray = x; 93 notifyResultIsReady(); 94 } 95 96 public synchronized boolean[] waitForBooleanArray() { 97 waitForResult(); 98 return mBooleanArray; 99 } 100 public synchronized byte[] waitForByteArray() { 101 waitForResult(); 102 return mByteArray; 103 } 104 public synchronized char[] waitForCharArray() { 105 waitForResult(); 106 return mCharArray; 107 } 108 public synchronized short[] waitForShortArray() { 109 waitForResult(); 110 return mShortArray; 111 } 112 public synchronized int[] waitForIntArray() { 113 waitForResult(); 114 return mIntArray; 115 } 116 public synchronized long[] waitForLongArray() { 117 waitForResult(); 118 return mLongArray; 119 } 120 public synchronized float[] waitForFloatArray() { 121 waitForResult(); 122 return mFloatArray; 123 } 124 public synchronized double[] waitForDoubleArray() { 125 waitForResult(); 126 return mDoubleArray; 127 } 128 public synchronized String[] waitForStringArray() { 129 waitForResult(); 130 return mStringArray; 131 } 132 public synchronized Object[] waitForObjectArray() { 133 waitForResult(); 134 return mObjectArray; 135 } 136 public synchronized CustomType[] waitForCustomTypeArray() { 137 waitForResult(); 138 return mCustomTypeArray; 139 } 140 } 141 142 // Two custom types used when testing passing objects. 143 private static class CustomType { 144 } 145 146 private TestObject mTestObject; 147 148 @Override 149 protected void setUp() throws Exception { 150 super.setUp(); 151 mTestObject = new TestObject(); 152 setUpContentView(mTestObject, "testObject"); 153 } 154 155 // Note that all tests use a single element array for simplicity. We test 156 // multiple elements elsewhere. 157 158 // Test passing an array of JavaScript numbers in the int32 range to a 159 // method which takes a Java array. 160 @SmallTest 161 @Feature({"AndroidWebView", "Android-JavaBridge"}) 162 public void testPassNumberInt32() throws Throwable { 163 executeJavaScript("testObject.setBooleanArray([0]);"); 164 assertFalse(mTestObject.waitForBooleanArray()[0]); 165 // LIVECONNECT_COMPLIANCE: Should convert to boolean. 166 executeJavaScript("testObject.setBooleanArray([42]);"); 167 assertFalse(mTestObject.waitForBooleanArray()[0]); 168 169 executeJavaScript("testObject.setByteArray([42]);"); 170 assertEquals(42, mTestObject.waitForByteArray()[0]); 171 172 executeJavaScript("testObject.setCharArray([42]);"); 173 assertEquals(42, mTestObject.waitForCharArray()[0]); 174 175 executeJavaScript("testObject.setShortArray([42]);"); 176 assertEquals(42, mTestObject.waitForShortArray()[0]); 177 178 executeJavaScript("testObject.setIntArray([42]);"); 179 assertEquals(42, mTestObject.waitForIntArray()[0]); 180 181 executeJavaScript("testObject.setLongArray([42]);"); 182 assertEquals(42L, mTestObject.waitForLongArray()[0]); 183 184 executeJavaScript("testObject.setFloatArray([42]);"); 185 assertEquals(42.0f, mTestObject.waitForFloatArray()[0]); 186 187 executeJavaScript("testObject.setDoubleArray([42]);"); 188 assertEquals(42.0, mTestObject.waitForDoubleArray()[0]); 189 190 // LIVECONNECT_COMPLIANCE: Should create array and create instances of java.lang.Number. 191 executeJavaScript("testObject.setObjectArray([42]);"); 192 assertNull(mTestObject.waitForObjectArray()); 193 194 // LIVECONNECT_COMPLIANCE: Should create instances of java.lang.String. 195 executeJavaScript("testObject.setStringArray([42]);"); 196 assertNull(mTestObject.waitForStringArray()[0]); 197 198 // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception. 199 executeJavaScript("testObject.setCustomTypeArray([42]);"); 200 assertNull(mTestObject.waitForCustomTypeArray()); 201 } 202 203 // Test passing an array of JavaScript numbers in the double range to a 204 // method which takes a Java array. 205 @SmallTest 206 @Feature({"AndroidWebView", "Android-JavaBridge"}) 207 public void testPassNumberDouble() throws Throwable { 208 // LIVECONNECT_COMPLIANCE: Should convert to boolean. 209 executeJavaScript("testObject.setBooleanArray([42.1]);"); 210 assertFalse(mTestObject.waitForBooleanArray()[0]); 211 212 executeJavaScript("testObject.setByteArray([42.1]);"); 213 assertEquals(42, mTestObject.waitForByteArray()[0]); 214 215 // LIVECONNECT_COMPLIANCE: Should convert to numeric char value. 216 executeJavaScript("testObject.setCharArray([42.1]);"); 217 assertEquals('\u0000', mTestObject.waitForCharArray()[0]); 218 219 executeJavaScript("testObject.setShortArray([42.1]);"); 220 assertEquals(42, mTestObject.waitForShortArray()[0]); 221 222 executeJavaScript("testObject.setIntArray([42.1]);"); 223 assertEquals(42, mTestObject.waitForIntArray()[0]); 224 225 executeJavaScript("testObject.setLongArray([42.1]);"); 226 assertEquals(42L, mTestObject.waitForLongArray()[0]); 227 228 executeJavaScript("testObject.setFloatArray([42.1]);"); 229 assertEquals(42.1f, mTestObject.waitForFloatArray()[0]); 230 231 executeJavaScript("testObject.setDoubleArray([42.1]);"); 232 assertEquals(42.1, mTestObject.waitForDoubleArray()[0]); 233 234 // LIVECONNECT_COMPLIANCE: Should create array and create instances of java.lang.Number. 235 executeJavaScript("testObject.setObjectArray([42.1]);"); 236 assertNull(mTestObject.waitForObjectArray()); 237 238 // LIVECONNECT_COMPLIANCE: Should create instances of java.lang.String. 239 executeJavaScript("testObject.setStringArray([42.1]);"); 240 assertNull(mTestObject.waitForStringArray()[0]); 241 242 // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception. 243 executeJavaScript("testObject.setCustomTypeArray([42.1]);"); 244 assertNull(mTestObject.waitForCustomTypeArray()); 245 } 246 247 // Test passing an array of JavaScript NaN values to a method which takes a 248 // Java array. 249 @SmallTest 250 @Feature({"AndroidWebView", "Android-JavaBridge"}) 251 public void testPassNumberNaN() throws Throwable { 252 executeJavaScript("testObject.setBooleanArray([Number.NaN]);"); 253 assertFalse(mTestObject.waitForBooleanArray()[0]); 254 255 executeJavaScript("testObject.setByteArray([Number.NaN]);"); 256 assertEquals(0, mTestObject.waitForByteArray()[0]); 257 258 executeJavaScript("testObject.setCharArray([Number.NaN]);"); 259 assertEquals('\u0000', mTestObject.waitForCharArray()[0]); 260 261 executeJavaScript("testObject.setShortArray([Number.NaN]);"); 262 assertEquals(0, mTestObject.waitForShortArray()[0]); 263 264 executeJavaScript("testObject.setIntArray([Number.NaN]);"); 265 assertEquals(0, mTestObject.waitForIntArray()[0]); 266 267 executeJavaScript("testObject.setLongArray([Number.NaN]);"); 268 assertEquals(0L, mTestObject.waitForLongArray()[0]); 269 270 executeJavaScript("testObject.setFloatArray([Number.NaN]);"); 271 assertEquals(Float.NaN, mTestObject.waitForFloatArray()[0]); 272 273 executeJavaScript("testObject.setDoubleArray([Number.NaN]);"); 274 assertEquals(Double.NaN, mTestObject.waitForDoubleArray()[0]); 275 276 // LIVECONNECT_COMPLIANCE: Should create array and create instances of java.lang.Number. 277 executeJavaScript("testObject.setObjectArray([Number.NaN]);"); 278 assertNull(mTestObject.waitForObjectArray()); 279 280 // LIVECONNECT_COMPLIANCE: Should create instances of java.lang.String. 281 executeJavaScript("testObject.setStringArray([Number.NaN]);"); 282 assertNull(mTestObject.waitForStringArray()[0]); 283 284 // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception. 285 executeJavaScript("testObject.setCustomTypeArray([Number.NaN]);"); 286 assertNull(mTestObject.waitForCustomTypeArray()); 287 } 288 289 // Test passing an array of JavaScript infinity values to a method which 290 // takes a Java array. 291 @SmallTest 292 @Feature({"AndroidWebView", "Android-JavaBridge"}) 293 public void testPassNumberInfinity() throws Throwable { 294 executeJavaScript("testObject.setBooleanArray([Infinity]);"); 295 assertFalse(mTestObject.waitForBooleanArray()[0]); 296 297 executeJavaScript("testObject.setByteArray([Infinity]);"); 298 assertEquals(-1, mTestObject.waitForByteArray()[0]); 299 300 // LIVECONNECT_COMPLIANCE: Should convert to maximum numeric char value. 301 executeJavaScript("testObject.setCharArray([Infinity]);"); 302 assertEquals('\u0000', mTestObject.waitForCharArray()[0]); 303 304 executeJavaScript("testObject.setShortArray([Infinity]);"); 305 assertEquals(-1, mTestObject.waitForShortArray()[0]); 306 307 executeJavaScript("testObject.setIntArray([Infinity]);"); 308 assertEquals(Integer.MAX_VALUE, mTestObject.waitForIntArray()[0]); 309 310 executeJavaScript("testObject.setLongArray([Infinity]);"); 311 assertEquals(Long.MAX_VALUE, mTestObject.waitForLongArray()[0]); 312 313 executeJavaScript("testObject.setFloatArray([Infinity]);"); 314 assertEquals(Float.POSITIVE_INFINITY, mTestObject.waitForFloatArray()[0]); 315 316 executeJavaScript("testObject.setDoubleArray([Infinity]);"); 317 assertEquals(Double.POSITIVE_INFINITY, mTestObject.waitForDoubleArray()[0]); 318 319 // LIVECONNECT_COMPLIANCE: Should create array and create instances of java.lang.Number. 320 executeJavaScript("testObject.setObjectArray([Infinity]);"); 321 assertNull(mTestObject.waitForObjectArray()); 322 323 // LIVECONNECT_COMPLIANCE: Should create instances of java.lang.String. 324 executeJavaScript("testObject.setStringArray([Infinity]);"); 325 assertNull(mTestObject.waitForStringArray()[0]); 326 327 // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception. 328 executeJavaScript("testObject.setCustomTypeArray([Infinity]);"); 329 assertNull(mTestObject.waitForCustomTypeArray()); 330 } 331 332 // Test passing an array of JavaScript boolean values to a method which 333 // takes a Java array. 334 @SmallTest 335 @Feature({"AndroidWebView", "Android-JavaBridge"}) 336 public void testPassBoolean() throws Throwable { 337 executeJavaScript("testObject.setBooleanArray([true]);"); 338 assertTrue(mTestObject.waitForBooleanArray()[0]); 339 executeJavaScript("testObject.setBooleanArray([false]);"); 340 assertFalse(mTestObject.waitForBooleanArray()[0]); 341 342 // LIVECONNECT_COMPLIANCE: Should be 1. 343 executeJavaScript("testObject.setByteArray([true]);"); 344 assertEquals(0, mTestObject.waitForByteArray()[0]); 345 executeJavaScript("testObject.setByteArray([false]);"); 346 assertEquals(0, mTestObject.waitForByteArray()[0]); 347 348 // LIVECONNECT_COMPLIANCE: Should convert to numeric char value 1. 349 executeJavaScript("testObject.setCharArray([true]);"); 350 assertEquals('\u0000', mTestObject.waitForCharArray()[0]); 351 executeJavaScript("testObject.setCharArray([false]);"); 352 assertEquals('\u0000', mTestObject.waitForCharArray()[0]); 353 354 // LIVECONNECT_COMPLIANCE: Should be 1. 355 executeJavaScript("testObject.setShortArray([true]);"); 356 assertEquals(0, mTestObject.waitForShortArray()[0]); 357 executeJavaScript("testObject.setShortArray([false]);"); 358 assertEquals(0, mTestObject.waitForShortArray()[0]); 359 360 // LIVECONNECT_COMPLIANCE: Should be 1. 361 executeJavaScript("testObject.setIntArray([true]);"); 362 assertEquals(0, mTestObject.waitForIntArray()[0]); 363 executeJavaScript("testObject.setIntArray([false]);"); 364 assertEquals(0, mTestObject.waitForIntArray()[0]); 365 366 // LIVECONNECT_COMPLIANCE: Should be 1. 367 executeJavaScript("testObject.setLongArray([true]);"); 368 assertEquals(0L, mTestObject.waitForLongArray()[0]); 369 executeJavaScript("testObject.setLongArray([false]);"); 370 assertEquals(0L, mTestObject.waitForLongArray()[0]); 371 372 // LIVECONNECT_COMPLIANCE: Should be 1.0. 373 executeJavaScript("testObject.setFloatArray([true]);"); 374 assertEquals(0.0f, mTestObject.waitForFloatArray()[0]); 375 executeJavaScript("testObject.setFloatArray([false]);"); 376 assertEquals(0.0f, mTestObject.waitForFloatArray()[0]); 377 378 // LIVECONNECT_COMPLIANCE: Should be 1.0. 379 executeJavaScript("testObject.setDoubleArray([true]);"); 380 assertEquals(0.0, mTestObject.waitForDoubleArray()[0]); 381 executeJavaScript("testObject.setDoubleArray([false]);"); 382 assertEquals(0.0, mTestObject.waitForDoubleArray()[0]); 383 384 // LIVECONNECT_COMPLIANCE: Should create array and create instances of java.lang.Number. 385 executeJavaScript("testObject.setObjectArray([true]);"); 386 assertNull(mTestObject.waitForObjectArray()); 387 388 // LIVECONNECT_COMPLIANCE: Should create instances of java.lang.String. 389 executeJavaScript("testObject.setStringArray([true]);"); 390 assertNull(mTestObject.waitForStringArray()[0]); 391 392 // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception. 393 executeJavaScript("testObject.setCustomTypeArray([true]);"); 394 assertNull(mTestObject.waitForCustomTypeArray()); 395 } 396 397 // Test passing an array of JavaScript strings to a method which takes a 398 // Java array. 399 @SmallTest 400 @Feature({"AndroidWebView", "Android-JavaBridge"}) 401 public void testPassString() throws Throwable { 402 // LIVECONNECT_COMPLIANCE: Non-empty string should convert to true. 403 executeJavaScript("testObject.setBooleanArray([\"+042.10\"]);"); 404 assertFalse(mTestObject.waitForBooleanArray()[0]); 405 406 // LIVECONNECT_COMPLIANCE: Should use valueOf() of appropriate type. 407 executeJavaScript("testObject.setByteArray([\"+042.10\"]);"); 408 assertEquals(0, mTestObject.waitForByteArray()[0]); 409 410 // LIVECONNECT_COMPLIANCE: Should decode and convert to numeric char value. 411 executeJavaScript("testObject.setCharArray([\"+042.10\"]);"); 412 assertEquals(0, mTestObject.waitForCharArray()[0]); 413 414 // LIVECONNECT_COMPLIANCE: Should use valueOf() of appropriate type. 415 executeJavaScript("testObject.setShortArray([\"+042.10\"]);"); 416 assertEquals(0, mTestObject.waitForShortArray()[0]); 417 418 // LIVECONNECT_COMPLIANCE: Should use valueOf() of appropriate type. 419 executeJavaScript("testObject.setIntArray([\"+042.10\"]);"); 420 assertEquals(0, mTestObject.waitForIntArray()[0]); 421 422 // LIVECONNECT_COMPLIANCE: Should use valueOf() of appropriate type. 423 executeJavaScript("testObject.setLongArray([\"+042.10\"]);"); 424 assertEquals(0L, mTestObject.waitForLongArray()[0]); 425 426 // LIVECONNECT_COMPLIANCE: Should use valueOf() of appropriate type. 427 executeJavaScript("testObject.setFloatArray([\"+042.10\"]);"); 428 assertEquals(0.0f, mTestObject.waitForFloatArray()[0]); 429 430 // LIVECONNECT_COMPLIANCE: Should use valueOf() of appropriate type. 431 executeJavaScript("testObject.setDoubleArray([\"+042.10\"]);"); 432 assertEquals(0.0, mTestObject.waitForDoubleArray()[0]); 433 434 // LIVECONNECT_COMPLIANCE: Should create array and create instances of java.lang.Number. 435 executeJavaScript("testObject.setObjectArray([\"+042.10\"]);"); 436 assertNull(mTestObject.waitForObjectArray()); 437 438 executeJavaScript("testObject.setStringArray([\"+042.10\"]);"); 439 assertEquals("+042.10", mTestObject.waitForStringArray()[0]); 440 441 // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception. 442 executeJavaScript("testObject.setCustomTypeArray([\"+042.10\"]);"); 443 assertNull(mTestObject.waitForCustomTypeArray()); 444 } 445 446 // Test passing an array of JavaScript objects to a method which takes a 447 // Java array. 448 @SmallTest 449 @Feature({"AndroidWebView", "Android-JavaBridge"}) 450 public void testPassJavaScriptObject() throws Throwable { 451 // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception. 452 executeJavaScript("testObject.setBooleanArray([{foo: 42}]);"); 453 assertFalse(mTestObject.waitForBooleanArray()[0]); 454 455 // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception. 456 executeJavaScript("testObject.setByteArray([{foo: 42}]);"); 457 assertEquals(0, mTestObject.waitForByteArray()[0]); 458 459 // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception. 460 executeJavaScript("testObject.setCharArray([{foo: 42}]);"); 461 assertEquals('\u0000', mTestObject.waitForCharArray()[0]); 462 463 // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception. 464 executeJavaScript("testObject.setShortArray([{foo: 42}]);"); 465 assertEquals(0, mTestObject.waitForShortArray()[0]); 466 467 // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception. 468 executeJavaScript("testObject.setIntArray([{foo: 42}]);"); 469 assertEquals(0, mTestObject.waitForIntArray()[0]); 470 471 // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception. 472 executeJavaScript("testObject.setLongArray([{foo: 42}]);"); 473 assertEquals(0L, mTestObject.waitForLongArray()[0]); 474 475 // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception. 476 executeJavaScript("testObject.setFloatArray([{foo: 42}]);"); 477 assertEquals(0.0f, mTestObject.waitForFloatArray()[0]); 478 479 // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception. 480 executeJavaScript("testObject.setDoubleArray([{foo: 42}]);"); 481 assertEquals(0.0, mTestObject.waitForDoubleArray()[0]); 482 483 // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception. 484 executeJavaScript("testObject.setObjectArray([{foo: 42}]);"); 485 assertNull(mTestObject.waitForObjectArray()); 486 487 // LIVECONNECT_COMPLIANCE: Should call toString() on object. 488 executeJavaScript("testObject.setStringArray([{foo: 42}]);"); 489 assertNull(mTestObject.waitForStringArray()[0]); 490 491 // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception. 492 executeJavaScript("testObject.setCustomTypeArray([{foo: 42}]);"); 493 assertNull(mTestObject.waitForCustomTypeArray()); 494 } 495 496 // Test passing an array of Java objects to a method which takes a Java 497 // array. 498 @SmallTest 499 @Feature({"AndroidWebView", "Android-JavaBridge"}) 500 public void testPassJavaObject() throws Throwable { 501 // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception. 502 executeJavaScript("testObject.setBooleanArray([testObject.getObjectInstance()]);"); 503 assertFalse(mTestObject.waitForBooleanArray()[0]); 504 505 // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception. 506 executeJavaScript("testObject.setByteArray([testObject.getObjectInstance()]);"); 507 assertEquals(0, mTestObject.waitForByteArray()[0]); 508 509 // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception. 510 executeJavaScript("testObject.setCharArray([testObject.getObjectInstance()]);"); 511 assertEquals('\u0000', mTestObject.waitForCharArray()[0]); 512 513 // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception. 514 executeJavaScript("testObject.setShortArray([testObject.getObjectInstance()]);"); 515 assertEquals(0, mTestObject.waitForShortArray()[0]); 516 517 // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception. 518 executeJavaScript("testObject.setIntArray([testObject.getObjectInstance()]);"); 519 assertEquals(0, mTestObject.waitForIntArray()[0]); 520 521 // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception. 522 executeJavaScript("testObject.setLongArray([testObject.getObjectInstance()]);"); 523 assertEquals(0L, mTestObject.waitForLongArray()[0]); 524 525 // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception. 526 executeJavaScript("testObject.setFloatArray([testObject.getObjectInstance()]);"); 527 assertEquals(0.0f, mTestObject.waitForFloatArray()[0]); 528 529 // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception. 530 executeJavaScript("testObject.setDoubleArray([testObject.getObjectInstance()]);"); 531 assertEquals(0.0, mTestObject.waitForDoubleArray()[0]); 532 533 // LIVECONNECT_COMPLIANCE: Should create an array and pass Java object. 534 executeJavaScript("testObject.setObjectArray([testObject.getObjectInstance()]);"); 535 assertNull(mTestObject.waitForObjectArray()); 536 537 // LIVECONNECT_COMPLIANCE: Should call toString() on object. 538 executeJavaScript("testObject.setStringArray([testObject.getObjectInstance()]);"); 539 assertNull(mTestObject.waitForStringArray()[0]); 540 541 // LIVECONNECT_COMPLIANCE: Should create array and pass Java object. 542 executeJavaScript("testObject.setCustomTypeArray([testObject.getObjectInstance()]);"); 543 assertNull(mTestObject.waitForCustomTypeArray()); 544 executeJavaScript("testObject.setCustomTypeArray([testObject.getCustomTypeInstance()]);"); 545 assertNull(mTestObject.waitForCustomTypeArray()); 546 } 547 548 // Test passing an array of JavaScript null values to a method which takes 549 // a Java array. 550 @SmallTest 551 @Feature({"AndroidWebView", "Android-JavaBridge"}) 552 public void testPassNull() throws Throwable { 553 executeJavaScript("testObject.setByteArray([null]);"); 554 assertEquals(0, mTestObject.waitForByteArray()[0]); 555 556 executeJavaScript("testObject.setCharArray([null]);"); 557 assertEquals('\u0000', mTestObject.waitForCharArray()[0]); 558 559 executeJavaScript("testObject.setShortArray([null]);"); 560 assertEquals(0, mTestObject.waitForShortArray()[0]); 561 562 executeJavaScript("testObject.setIntArray([null]);"); 563 assertEquals(0, mTestObject.waitForIntArray()[0]); 564 565 executeJavaScript("testObject.setLongArray([null]);"); 566 assertEquals(0L, mTestObject.waitForLongArray()[0]); 567 568 executeJavaScript("testObject.setFloatArray([null]);"); 569 assertEquals(0.0f, mTestObject.waitForFloatArray()[0]); 570 571 executeJavaScript("testObject.setDoubleArray([null]);"); 572 assertEquals(0.0, mTestObject.waitForDoubleArray()[0]); 573 574 executeJavaScript("testObject.setBooleanArray([null]);"); 575 assertFalse(mTestObject.waitForBooleanArray()[0]); 576 577 // LIVECONNECT_COMPLIANCE: Should create array and pass null. 578 executeJavaScript("testObject.setObjectArray([null]);"); 579 assertNull(mTestObject.waitForObjectArray()); 580 581 executeJavaScript("testObject.setStringArray([null]);"); 582 assertNull(mTestObject.waitForStringArray()[0]); 583 584 // LIVECONNECT_COMPLIANCE: Should create array and pass null. 585 executeJavaScript("testObject.setCustomTypeArray([null]);"); 586 assertNull(mTestObject.waitForCustomTypeArray()); 587 } 588 589 // Test passing an array of JavaScript undefined values to a method which 590 // takes a Java array. 591 @SmallTest 592 @Feature({"AndroidWebView", "Android-JavaBridge"}) 593 public void testPassUndefined() throws Throwable { 594 executeJavaScript("testObject.setByteArray([undefined]);"); 595 assertEquals(0, mTestObject.waitForByteArray()[0]); 596 597 executeJavaScript("testObject.setCharArray([undefined]);"); 598 assertEquals(0, mTestObject.waitForCharArray()[0]); 599 600 executeJavaScript("testObject.setShortArray([undefined]);"); 601 assertEquals(0, mTestObject.waitForShortArray()[0]); 602 603 executeJavaScript("testObject.setIntArray([undefined]);"); 604 assertEquals(0, mTestObject.waitForIntArray()[0]); 605 606 executeJavaScript("testObject.setLongArray([undefined]);"); 607 assertEquals(0L, mTestObject.waitForLongArray()[0]); 608 609 executeJavaScript("testObject.setFloatArray([undefined]);"); 610 assertEquals(0.0f, mTestObject.waitForFloatArray()[0]); 611 612 executeJavaScript("testObject.setDoubleArray([undefined]);"); 613 assertEquals(0.0, mTestObject.waitForDoubleArray()[0]); 614 615 executeJavaScript("testObject.setBooleanArray([undefined]);"); 616 assertEquals(false, mTestObject.waitForBooleanArray()[0]); 617 618 // LIVECONNECT_COMPLIANCE: Should create array and pass null. 619 executeJavaScript("testObject.setObjectArray([undefined]);"); 620 assertNull(mTestObject.waitForObjectArray()); 621 622 executeJavaScript("testObject.setStringArray([undefined]);"); 623 assertNull(mTestObject.waitForStringArray()[0]); 624 625 // LIVECONNECT_COMPLIANCE: Should create array and pass null. 626 executeJavaScript("testObject.setCustomTypeArray([undefined]);"); 627 assertNull(mTestObject.waitForCustomTypeArray()); 628 } 629 630 // Test passing a typed Int8Array to a method which takes a Java array. 631 @SmallTest 632 @Feature({"AndroidWebView", "Android-JavaBridge"}) 633 public void testPassInt8Array() throws Throwable { 634 executeJavaScript("buffer = new ArrayBuffer(1);"); 635 executeJavaScript("int8_array = new Int8Array(buffer);"); 636 executeJavaScript("int8_array[0] = 42;"); 637 638 executeJavaScript("testObject.setBooleanArray(int8_array);"); 639 assertFalse(mTestObject.waitForBooleanArray()[0]); 640 641 executeJavaScript("testObject.setByteArray(int8_array);"); 642 assertEquals(42, mTestObject.waitForByteArray()[0]); 643 644 executeJavaScript("testObject.setCharArray(int8_array);"); 645 assertEquals(42, mTestObject.waitForCharArray()[0]); 646 647 executeJavaScript("testObject.setShortArray(int8_array);"); 648 assertEquals(42, mTestObject.waitForShortArray()[0]); 649 650 executeJavaScript("testObject.setIntArray(int8_array);"); 651 assertEquals(42, mTestObject.waitForIntArray()[0]); 652 653 executeJavaScript("testObject.setLongArray(int8_array);"); 654 assertEquals(42L, mTestObject.waitForLongArray()[0]); 655 656 executeJavaScript("testObject.setFloatArray(int8_array);"); 657 assertEquals(42.0f, mTestObject.waitForFloatArray()[0]); 658 659 executeJavaScript("testObject.setDoubleArray(int8_array);"); 660 assertEquals(42.0, mTestObject.waitForDoubleArray()[0]); 661 662 executeJavaScript("testObject.setObjectArray(int8_array);"); 663 assertNull(mTestObject.waitForObjectArray()); 664 665 executeJavaScript("testObject.setStringArray(int8_array);"); 666 assertNull(mTestObject.waitForStringArray()[0]); 667 668 executeJavaScript("testObject.setCustomTypeArray(int8_array);"); 669 assertNull(mTestObject.waitForCustomTypeArray()); 670 } 671 672 // Test passing a typed Uint8Array to a method which takes a Java array. 673 @SmallTest 674 @Feature({"AndroidWebView", "Android-JavaBridge"}) 675 public void testPassUint8Array() throws Throwable { 676 executeJavaScript("buffer = new ArrayBuffer(1);"); 677 executeJavaScript("uint8_array = new Uint8Array(buffer);"); 678 executeJavaScript("uint8_array[0] = 42;"); 679 680 executeJavaScript("testObject.setBooleanArray(uint8_array);"); 681 assertFalse(mTestObject.waitForBooleanArray()[0]); 682 683 executeJavaScript("testObject.setByteArray(uint8_array);"); 684 assertEquals(42, mTestObject.waitForByteArray()[0]); 685 686 executeJavaScript("testObject.setCharArray(uint8_array);"); 687 assertEquals(42, mTestObject.waitForCharArray()[0]); 688 689 executeJavaScript("testObject.setShortArray(uint8_array);"); 690 assertEquals(42, mTestObject.waitForShortArray()[0]); 691 692 executeJavaScript("testObject.setIntArray(uint8_array);"); 693 assertEquals(42, mTestObject.waitForIntArray()[0]); 694 695 executeJavaScript("testObject.setLongArray(uint8_array);"); 696 assertEquals(42L, mTestObject.waitForLongArray()[0]); 697 698 executeJavaScript("testObject.setFloatArray(uint8_array);"); 699 assertEquals(42.0f, mTestObject.waitForFloatArray()[0]); 700 701 executeJavaScript("testObject.setDoubleArray(uint8_array);"); 702 assertEquals(42.0, mTestObject.waitForDoubleArray()[0]); 703 704 executeJavaScript("testObject.setObjectArray(uint8_array);"); 705 assertNull(mTestObject.waitForObjectArray()); 706 707 executeJavaScript("testObject.setStringArray(uint8_array);"); 708 assertNull(mTestObject.waitForStringArray()[0]); 709 710 executeJavaScript("testObject.setCustomTypeArray(uint8_array);"); 711 assertNull(mTestObject.waitForCustomTypeArray()); 712 } 713 714 // Test passing a typed Int16Array to a method which takes a Java array. 715 @SmallTest 716 @Feature({"AndroidWebView", "Android-JavaBridge"}) 717 public void testPassInt16Array() throws Throwable { 718 executeJavaScript("buffer = new ArrayBuffer(2);"); 719 executeJavaScript("int16_array = new Int16Array(buffer);"); 720 executeJavaScript("int16_array[0] = 42;"); 721 722 executeJavaScript("testObject.setBooleanArray(int16_array);"); 723 assertFalse(mTestObject.waitForBooleanArray()[0]); 724 725 executeJavaScript("testObject.setByteArray(int16_array);"); 726 assertEquals(42, mTestObject.waitForByteArray()[0]); 727 728 executeJavaScript("testObject.setCharArray(int16_array);"); 729 assertEquals(42, mTestObject.waitForCharArray()[0]); 730 731 executeJavaScript("testObject.setShortArray(int16_array);"); 732 assertEquals(42, mTestObject.waitForShortArray()[0]); 733 734 executeJavaScript("testObject.setIntArray(int16_array);"); 735 assertEquals(42, mTestObject.waitForIntArray()[0]); 736 737 executeJavaScript("testObject.setLongArray(int16_array);"); 738 assertEquals(42L, mTestObject.waitForLongArray()[0]); 739 740 executeJavaScript("testObject.setFloatArray(int16_array);"); 741 assertEquals(42.0f, mTestObject.waitForFloatArray()[0]); 742 743 executeJavaScript("testObject.setDoubleArray(int16_array);"); 744 assertEquals(42.0, mTestObject.waitForDoubleArray()[0]); 745 746 executeJavaScript("testObject.setObjectArray(int16_array);"); 747 assertNull(mTestObject.waitForObjectArray()); 748 749 executeJavaScript("testObject.setStringArray(int16_array);"); 750 assertNull(mTestObject.waitForStringArray()[0]); 751 752 executeJavaScript("testObject.setCustomTypeArray(int16_array);"); 753 assertNull(mTestObject.waitForCustomTypeArray()); 754 } 755 756 // Test passing a typed Uint16Array to a method which takes a Java array. 757 @SmallTest 758 @Feature({"AndroidWebView", "Android-JavaBridge"}) 759 public void testPassUint16Array() throws Throwable { 760 executeJavaScript("buffer = new ArrayBuffer(2);"); 761 executeJavaScript("uint16_array = new Uint16Array(buffer);"); 762 executeJavaScript("uint16_array[0] = 42;"); 763 764 executeJavaScript("testObject.setBooleanArray(uint16_array);"); 765 assertFalse(mTestObject.waitForBooleanArray()[0]); 766 767 executeJavaScript("testObject.setByteArray(uint16_array);"); 768 assertEquals(42, mTestObject.waitForByteArray()[0]); 769 770 executeJavaScript("testObject.setCharArray(uint16_array);"); 771 assertEquals(42, mTestObject.waitForCharArray()[0]); 772 773 executeJavaScript("testObject.setShortArray(uint16_array);"); 774 assertEquals(42, mTestObject.waitForShortArray()[0]); 775 776 executeJavaScript("testObject.setIntArray(uint16_array);"); 777 assertEquals(42, mTestObject.waitForIntArray()[0]); 778 779 executeJavaScript("testObject.setLongArray(uint16_array);"); 780 assertEquals(42L, mTestObject.waitForLongArray()[0]); 781 782 executeJavaScript("testObject.setFloatArray(uint16_array);"); 783 assertEquals(42.0f, mTestObject.waitForFloatArray()[0]); 784 785 executeJavaScript("testObject.setDoubleArray(uint16_array);"); 786 assertEquals(42.0, mTestObject.waitForDoubleArray()[0]); 787 788 executeJavaScript("testObject.setObjectArray(uint16_array);"); 789 assertNull(mTestObject.waitForObjectArray()); 790 791 executeJavaScript("testObject.setStringArray(uint16_array);"); 792 assertNull(mTestObject.waitForStringArray()[0]); 793 794 executeJavaScript("testObject.setCustomTypeArray(uint16_array);"); 795 assertNull(mTestObject.waitForCustomTypeArray()); 796 } 797 798 // Test passing a typed Int32Array to a method which takes a Java array. 799 @SmallTest 800 @Feature({"AndroidWebView", "Android-JavaBridge"}) 801 public void testPassInt32Array() throws Throwable { 802 executeJavaScript("buffer = new ArrayBuffer(4);"); 803 executeJavaScript("int32_array = new Int32Array(buffer);"); 804 executeJavaScript("int32_array[0] = 42;"); 805 806 executeJavaScript("testObject.setBooleanArray(int32_array);"); 807 assertFalse(mTestObject.waitForBooleanArray()[0]); 808 809 executeJavaScript("testObject.setByteArray(int32_array);"); 810 assertEquals(42, mTestObject.waitForByteArray()[0]); 811 812 executeJavaScript("testObject.setCharArray(int32_array);"); 813 assertEquals(42, mTestObject.waitForCharArray()[0]); 814 815 executeJavaScript("testObject.setShortArray(int32_array);"); 816 assertEquals(42, mTestObject.waitForShortArray()[0]); 817 818 executeJavaScript("testObject.setIntArray(int32_array);"); 819 assertEquals(42, mTestObject.waitForIntArray()[0]); 820 821 executeJavaScript("testObject.setLongArray(int32_array);"); 822 assertEquals(42L, mTestObject.waitForLongArray()[0]); 823 824 executeJavaScript("testObject.setFloatArray(int32_array);"); 825 assertEquals(42.0f, mTestObject.waitForFloatArray()[0]); 826 827 executeJavaScript("testObject.setDoubleArray(int32_array);"); 828 assertEquals(42.0, mTestObject.waitForDoubleArray()[0]); 829 830 executeJavaScript("testObject.setObjectArray(int32_array);"); 831 assertNull(mTestObject.waitForObjectArray()); 832 833 executeJavaScript("testObject.setStringArray(int32_array);"); 834 assertNull(mTestObject.waitForStringArray()[0]); 835 836 executeJavaScript("testObject.setCustomTypeArray(int32_array);"); 837 assertNull(mTestObject.waitForCustomTypeArray()); 838 } 839 840 // Test passing a typed Uint32Array to a method which takes a Java array. 841 @SmallTest 842 @Feature({"AndroidWebView", "Android-JavaBridge"}) 843 public void testPassUint32Array() throws Throwable { 844 executeJavaScript("buffer = new ArrayBuffer(4);"); 845 executeJavaScript("uint32_array = new Uint32Array(buffer);"); 846 executeJavaScript("uint32_array[0] = 42;"); 847 848 executeJavaScript("testObject.setBooleanArray(uint32_array);"); 849 assertFalse(mTestObject.waitForBooleanArray()[0]); 850 851 executeJavaScript("testObject.setByteArray(uint32_array);"); 852 assertEquals(42, mTestObject.waitForByteArray()[0]); 853 854 executeJavaScript("testObject.setCharArray(uint32_array);"); 855 assertEquals(42, mTestObject.waitForCharArray()[0]); 856 857 executeJavaScript("testObject.setShortArray(uint32_array);"); 858 assertEquals(42, mTestObject.waitForShortArray()[0]); 859 860 executeJavaScript("testObject.setIntArray(uint32_array);"); 861 assertEquals(42, mTestObject.waitForIntArray()[0]); 862 863 executeJavaScript("testObject.setLongArray(uint32_array);"); 864 assertEquals(42L, mTestObject.waitForLongArray()[0]); 865 866 executeJavaScript("testObject.setFloatArray(uint32_array);"); 867 assertEquals(42.0f, mTestObject.waitForFloatArray()[0]); 868 869 executeJavaScript("testObject.setDoubleArray(uint32_array);"); 870 assertEquals(42.0, mTestObject.waitForDoubleArray()[0]); 871 872 executeJavaScript("testObject.setObjectArray(uint32_array);"); 873 assertNull(mTestObject.waitForObjectArray()); 874 875 executeJavaScript("testObject.setStringArray(uint32_array);"); 876 assertNull(mTestObject.waitForStringArray()[0]); 877 878 executeJavaScript("testObject.setCustomTypeArray(uint32_array);"); 879 assertNull(mTestObject.waitForCustomTypeArray()); 880 } 881 882 // Test passing a typed Float32Array to a method which takes a Java array. 883 @SmallTest 884 @Feature({"AndroidWebView", "Android-JavaBridge"}) 885 public void testPassFloat32Array() throws Throwable { 886 executeJavaScript("buffer = new ArrayBuffer(4);"); 887 executeJavaScript("float32_array = new Float32Array(buffer);"); 888 executeJavaScript("float32_array[0] = 42.0;"); 889 890 executeJavaScript("testObject.setBooleanArray(float32_array);"); 891 assertFalse(mTestObject.waitForBooleanArray()[0]); 892 893 executeJavaScript("testObject.setByteArray(float32_array);"); 894 assertEquals(42, mTestObject.waitForByteArray()[0]); 895 896 executeJavaScript("testObject.setCharArray(float32_array);"); 897 assertEquals('\u0000', mTestObject.waitForCharArray()[0]); 898 899 executeJavaScript("testObject.setShortArray(float32_array);"); 900 assertEquals(42, mTestObject.waitForShortArray()[0]); 901 902 executeJavaScript("testObject.setIntArray(float32_array);"); 903 assertEquals(42, mTestObject.waitForIntArray()[0]); 904 905 executeJavaScript("testObject.setLongArray(float32_array);"); 906 assertEquals(42L, mTestObject.waitForLongArray()[0]); 907 908 executeJavaScript("testObject.setFloatArray(float32_array);"); 909 assertEquals(42.0f, mTestObject.waitForFloatArray()[0]); 910 911 executeJavaScript("testObject.setDoubleArray(float32_array);"); 912 assertEquals(42.0, mTestObject.waitForDoubleArray()[0]); 913 914 executeJavaScript("testObject.setObjectArray(float32_array);"); 915 assertNull(mTestObject.waitForObjectArray()); 916 917 executeJavaScript("testObject.setStringArray(float32_array);"); 918 assertNull(mTestObject.waitForStringArray()[0]); 919 920 executeJavaScript("testObject.setCustomTypeArray(float32_array);"); 921 assertNull(mTestObject.waitForCustomTypeArray()); 922 } 923 924 // Test passing a typed Float64Array to a method which takes a Java array. 925 @SmallTest 926 @Feature({"AndroidWebView", "Android-JavaBridge"}) 927 public void testPassFloat64Array() throws Throwable { 928 executeJavaScript("buffer = new ArrayBuffer(8);"); 929 executeJavaScript("float64_array = new Float64Array(buffer);"); 930 executeJavaScript("float64_array[0] = 42.0;"); 931 932 executeJavaScript("testObject.setBooleanArray(float64_array);"); 933 assertFalse(mTestObject.waitForBooleanArray()[0]); 934 935 executeJavaScript("testObject.setByteArray(float64_array);"); 936 assertEquals(42, mTestObject.waitForByteArray()[0]); 937 938 executeJavaScript("testObject.setCharArray(float64_array);"); 939 assertEquals('\u0000', mTestObject.waitForCharArray()[0]); 940 941 executeJavaScript("testObject.setShortArray(float64_array);"); 942 assertEquals(42, mTestObject.waitForShortArray()[0]); 943 944 executeJavaScript("testObject.setIntArray(float64_array);"); 945 assertEquals(42, mTestObject.waitForIntArray()[0]); 946 947 executeJavaScript("testObject.setLongArray(float64_array);"); 948 assertEquals(42L, mTestObject.waitForLongArray()[0]); 949 950 executeJavaScript("testObject.setFloatArray(float64_array);"); 951 assertEquals(42.0f, mTestObject.waitForFloatArray()[0]); 952 953 executeJavaScript("testObject.setDoubleArray(float64_array);"); 954 assertEquals(42.0, mTestObject.waitForDoubleArray()[0]); 955 956 executeJavaScript("testObject.setObjectArray(float64_array);"); 957 assertNull(mTestObject.waitForObjectArray()); 958 959 executeJavaScript("testObject.setStringArray(float64_array);"); 960 assertNull(mTestObject.waitForStringArray()[0]); 961 962 executeJavaScript("testObject.setCustomTypeArray(float64_array);"); 963 assertNull(mTestObject.waitForCustomTypeArray()); 964 } 965} 966