| OLD | NEW |
| (Empty) | |
| 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 |
| 5 package org.chromium.content_shell; |
| 6 |
| 7 import android.test.suitebuilder.annotation.SmallTest; |
| 8 |
| 9 import org.chromium.base.test.Feature; |
| 10 import org.chromium.base.test.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 */ |
| 24 public 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({"Android-WebView", "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({"Android-WebView", "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 + " + 4
2.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({"Android-WebView", "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({"Android-WebView", "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({"Android-WebView", "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.Boolea
n. |
| 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({"Android-WebView", "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 val
ue. |
| 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({"Android-WebView", "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({"Android-WebView", "Android-JavaBridge"}) |
| 538 public void testPassJavaObject() throws Throwable { |
| 539 executeJavaScript("testObject.setObjectValue(testObject.getObjectInstanc
e());"); |
| 540 assertTrue(mTestObject.getObjectInstance() == mTestObject.waitForObjectV
alue()); |
| 541 executeJavaScript("testObject.setObjectValue(testObject.getCustomTypeIns
tance());"); |
| 542 assertTrue(mTestObject.getCustomTypeInstance() == mTestObject.waitForObj
ectValue()); |
| 543 |
| 544 executeJavaScript("testObject.setCustomTypeValue(testObject.getObjectIns
tance());"); |
| 545 assertTrue(mTestObject.getObjectInstance() == mTestObject.waitForCustomT
ypeValue()); |
| 546 executeJavaScript("testObject.setCustomTypeValue(testObject.getCustomTyp
eInstance());"); |
| 547 assertTrue(mTestObject.getCustomTypeInstance() == mTestObject.waitForCus
tomTypeValue()); |
| 548 // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception, as the t
ypes are unrelated. |
| 549 executeJavaScript("testObject.setCustomTypeValue(testObject.getCustomTyp
e2Instance());"); |
| 550 assertTrue(mTestObject.getCustomType2Instance() == |
| 551 (Object)mTestObject.waitForCustomTypeValue()); |
| 552 |
| 553 // LIVECONNECT_COMPLIANCE: Should call toString() on object. |
| 554 executeJavaScript("testObject.setStringValue(testObject.getObjectInstanc
e());"); |
| 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.getObjectInstanc
e());"); |
| 583 assertEquals(0.0, mTestObject.waitForDoubleValue()); |
| 584 |
| 585 // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception. |
| 586 executeJavaScript("testObject.setBooleanValue(testObject.getObjectInstan
ce());"); |
| 587 assertFalse(mTestObject.waitForBooleanValue()); |
| 588 } |
| 589 |
| 590 // Test passing JavaScript null to a method of an injected object. |
| 591 @SmallTest |
| 592 @Feature({"Android-WebView", "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({"Android-WebView", "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 } |
| OLD | NEW |