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