| OLD | NEW |
| 1 // Copyright 2012 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 package org.chromium.android_webview.test; | 5 package org.chromium.android_webview.test; |
| 6 | 6 |
| 7 import android.os.Handler; | 7 import android.os.Handler; |
| 8 import android.os.Message; | 8 import android.os.Message; |
| 9 import android.os.SystemClock; | |
| 10 import android.test.suitebuilder.annotation.LargeTest; | 9 import android.test.suitebuilder.annotation.LargeTest; |
| 11 import android.test.suitebuilder.annotation.SmallTest; | 10 import android.test.suitebuilder.annotation.SmallTest; |
| 12 import android.view.KeyEvent; | 11 import android.view.KeyEvent; |
| 13 import android.view.MotionEvent; | |
| 14 import android.webkit.WebView.HitTestResult; | 12 import android.webkit.WebView.HitTestResult; |
| 15 | 13 |
| 16 import org.chromium.android_webview.AwContents; | 14 import org.chromium.android_webview.AwContents; |
| 15 import org.chromium.android_webview.test.util.AwTestTouchUtils; |
| 17 import org.chromium.android_webview.test.util.CommonResources; | 16 import org.chromium.android_webview.test.util.CommonResources; |
| 18 import org.chromium.base.ThreadUtils; | 17 import org.chromium.base.ThreadUtils; |
| 19 import org.chromium.base.test.util.Feature; | 18 import org.chromium.base.test.util.Feature; |
| 20 import org.chromium.net.test.util.TestWebServer; | 19 import org.chromium.net.test.util.TestWebServer; |
| 21 | 20 |
| 22 import java.util.concurrent.Callable; | 21 import java.util.concurrent.Callable; |
| 23 | 22 |
| 24 /** | 23 /** |
| 25 * Test for getHitTestResult, requestFocusNodeHref, and requestImageRef methods | 24 * Test for getHitTestResult, requestFocusNodeHref, and requestImageRef methods |
| 26 */ | 25 */ |
| (...skipping 28 matching lines...) Expand all Loading... |
| 55 loadUrlSync(mAwContents, | 54 loadUrlSync(mAwContents, |
| 56 mContentsClient.getOnPageFinishedHelper(), | 55 mContentsClient.getOnPageFinishedHelper(), |
| 57 url); | 56 url); |
| 58 } | 57 } |
| 59 | 58 |
| 60 private static String fullPageLink(String href, String anchorText) { | 59 private static String fullPageLink(String href, String anchorText) { |
| 61 return CommonResources.makeHtmlPageFrom("", "<a class=\"full_view\" href
=\"" + | 60 return CommonResources.makeHtmlPageFrom("", "<a class=\"full_view\" href
=\"" + |
| 62 href + "\" " + "onclick=\"return false;\">" + anchorText + "</a>
"); | 61 href + "\" " + "onclick=\"return false;\">" + anchorText + "</a>
"); |
| 63 } | 62 } |
| 64 | 63 |
| 65 private void simulateTouchCenterOfWebViewOnUiThread() throws Throwable { | |
| 66 runTestOnUiThread(new Runnable() { | |
| 67 @Override | |
| 68 public void run() { | |
| 69 long eventTime = SystemClock.uptimeMillis(); | |
| 70 float x = (float) (mTestView.getRight() - mTestView.getLeft()) /
2; | |
| 71 float y = (float) (mTestView.getBottom() - mTestView.getTop()) /
2; | |
| 72 mAwContents.onTouchEvent(MotionEvent.obtain( | |
| 73 eventTime, eventTime, MotionEvent.ACTION_DOWN, | |
| 74 x, y, 0)); | |
| 75 mAwContents.onTouchEvent(MotionEvent.obtain( | |
| 76 eventTime, eventTime, MotionEvent.ACTION_UP, | |
| 77 x, y, 0)); | |
| 78 } | |
| 79 }); | |
| 80 } | |
| 81 | |
| 82 private void simulateTabDownUpOnUiThread() throws Throwable { | 64 private void simulateTabDownUpOnUiThread() throws Throwable { |
| 83 runTestOnUiThread(new Runnable() { | 65 runTestOnUiThread(new Runnable() { |
| 84 @Override | 66 @Override |
| 85 public void run() { | 67 public void run() { |
| 86 mAwContents.getContentViewCore().dispatchKeyEvent( | 68 mAwContents.getContentViewCore().dispatchKeyEvent( |
| 87 new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_TAB)
); | 69 new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_TAB)
); |
| 88 mAwContents.getContentViewCore().dispatchKeyEvent( | 70 mAwContents.getContentViewCore().dispatchKeyEvent( |
| 89 new KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_TAB)); | 71 new KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_TAB)); |
| 90 } | 72 } |
| 91 }); | 73 }); |
| 92 } | 74 } |
| 93 | 75 |
| 94 private void simulateInput(boolean byTouch) throws Throwable { | 76 private void simulateInput(boolean byTouch) throws Throwable { |
| 95 // Send a touch click event if byTouch is true. Otherwise, send a TAB | 77 // Send a touch click event if byTouch is true. Otherwise, send a TAB |
| 96 // key event to change the focused element of the page. | 78 // key event to change the focused element of the page. |
| 97 if (byTouch) { | 79 if (byTouch) { |
| 98 simulateTouchCenterOfWebViewOnUiThread(); | 80 AwTestTouchUtils.simulateTouchCenterOfView(mTestView); |
| 99 } else { | 81 } else { |
| 100 simulateTabDownUpOnUiThread(); | 82 simulateTabDownUpOnUiThread(); |
| 101 } | 83 } |
| 102 } | 84 } |
| 103 | 85 |
| 104 private static boolean stringEquals(String a, String b) { | 86 private static boolean stringEquals(String a, String b) { |
| 105 return a == null ? b == null : a.equals(b); | 87 return a == null ? b == null : a.equals(b); |
| 106 } | 88 } |
| 107 | 89 |
| 108 private void pollForHitTestDataOnUiThread( | 90 private void pollForHitTestDataOnUiThread( |
| (...skipping 218 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 327 } | 309 } |
| 328 | 310 |
| 329 @SmallTest | 311 @SmallTest |
| 330 @Feature({"AndroidWebView", "WebKitHitTest"}) | 312 @Feature({"AndroidWebView", "WebKitHitTest"}) |
| 331 public void testImgeType() throws Throwable { | 313 public void testImgeType() throws Throwable { |
| 332 String relImageSrc = "/nonexistent2.jpg"; | 314 String relImageSrc = "/nonexistent2.jpg"; |
| 333 String fullImageSrc = mWebServer.getResponseUrl(relImageSrc); | 315 String fullImageSrc = mWebServer.getResponseUrl(relImageSrc); |
| 334 String page = CommonResources.makeHtmlPageFrom("", | 316 String page = CommonResources.makeHtmlPageFrom("", |
| 335 "<img class=\"full_view\" src=\"" + relImageSrc + "\">"); | 317 "<img class=\"full_view\" src=\"" + relImageSrc + "\">"); |
| 336 setServerResponseAndLoad(page); | 318 setServerResponseAndLoad(page); |
| 337 simulateTouchCenterOfWebViewOnUiThread(); | 319 AwTestTouchUtils.simulateTouchCenterOfView(mTestView); |
| 338 pollForHitTestDataOnUiThread(HitTestResult.IMAGE_TYPE, fullImageSrc); | 320 pollForHitTestDataOnUiThread(HitTestResult.IMAGE_TYPE, fullImageSrc); |
| 339 pollForHrefAndImageSrcOnUiThread(null, null, fullImageSrc); | 321 pollForHrefAndImageSrcOnUiThread(null, null, fullImageSrc); |
| 340 } | 322 } |
| 341 | 323 |
| 342 private void editTextTypeTestBody(boolean byTouch) throws Throwable { | 324 private void editTextTypeTestBody(boolean byTouch) throws Throwable { |
| 343 String page = CommonResources.makeHtmlPageFrom("", | 325 String page = CommonResources.makeHtmlPageFrom("", |
| 344 "<form><input class=\"full_view\" type=\"text\" name=\"test\"></
form>"); | 326 "<form><input class=\"full_view\" type=\"text\" name=\"test\"></
form>"); |
| 345 setServerResponseAndLoad(page); | 327 setServerResponseAndLoad(page); |
| 346 simulateInput(byTouch); | 328 simulateInput(byTouch); |
| 347 pollForHitTestDataOnUiThread(HitTestResult.EDIT_TEXT_TYPE, null); | 329 pollForHitTestDataOnUiThread(HitTestResult.EDIT_TEXT_TYPE, null); |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 396 "<div class=\"full_view\">div text</div>"); | 378 "<div class=\"full_view\">div text</div>"); |
| 397 setServerResponseAndLoad(page); | 379 setServerResponseAndLoad(page); |
| 398 | 380 |
| 399 // Wait for the new page to be loaded before trying hit test. | 381 // Wait for the new page to be loaded before trying hit test. |
| 400 pollOnUiThread(new Callable<Boolean>() { | 382 pollOnUiThread(new Callable<Boolean>() { |
| 401 @Override | 383 @Override |
| 402 public Boolean call() { | 384 public Boolean call() { |
| 403 return mAwContents.getContentViewCore().getTitle().equals(title)
; | 385 return mAwContents.getContentViewCore().getTitle().equals(title)
; |
| 404 } | 386 } |
| 405 }); | 387 }); |
| 406 simulateTouchCenterOfWebViewOnUiThread(); | 388 AwTestTouchUtils.simulateTouchCenterOfView(mTestView); |
| 407 pollForHitTestDataOnUiThread(HitTestResult.UNKNOWN_TYPE, null); | 389 pollForHitTestDataOnUiThread(HitTestResult.UNKNOWN_TYPE, null); |
| 408 } | 390 } |
| 409 | 391 |
| 410 @LargeTest | 392 @LargeTest |
| 411 @Feature({"AndroidWebView", "WebKitHitTest"}) | 393 @Feature({"AndroidWebView", "WebKitHitTest"}) |
| 412 public void testUnfocusedNodeAndTouchRace() throws Throwable { | 394 public void testUnfocusedNodeAndTouchRace() throws Throwable { |
| 413 // Test when the touch and focus paths racing with setting different | 395 // Test when the touch and focus paths racing with setting different |
| 414 // results. | 396 // results. |
| 415 | 397 |
| 416 String relImageSrc = "/nonexistent3.jpg"; | 398 String relImageSrc = "/nonexistent3.jpg"; |
| (...skipping 10 matching lines...) Expand all Loading... |
| 427 setServerResponseAndLoad(html); | 409 setServerResponseAndLoad(html); |
| 428 | 410 |
| 429 // Focus on input element and check the hit test results. | 411 // Focus on input element and check the hit test results. |
| 430 simulateTabDownUpOnUiThread(); | 412 simulateTabDownUpOnUiThread(); |
| 431 pollForHitTestDataOnUiThread(HitTestResult.EDIT_TEXT_TYPE, null); | 413 pollForHitTestDataOnUiThread(HitTestResult.EDIT_TEXT_TYPE, null); |
| 432 pollForHrefAndImageSrcOnUiThread(null, null, null); | 414 pollForHrefAndImageSrcOnUiThread(null, null, null); |
| 433 | 415 |
| 434 // Touch image. Now the focus based hit test path will try to null out | 416 // Touch image. Now the focus based hit test path will try to null out |
| 435 // the results and the touch based path will update with the result of | 417 // the results and the touch based path will update with the result of |
| 436 // the image. | 418 // the image. |
| 437 simulateTouchCenterOfWebViewOnUiThread(); | 419 AwTestTouchUtils.simulateTouchCenterOfView(mTestView); |
| 438 | 420 |
| 439 // Make sure the result of image sticks. | 421 // Make sure the result of image sticks. |
| 440 for (int i = 0; i < 2; ++i) { | 422 for (int i = 0; i < 2; ++i) { |
| 441 Thread.sleep(500); | 423 Thread.sleep(500); |
| 442 pollForHitTestDataOnUiThread(HitTestResult.IMAGE_TYPE, fullImageSrc)
; | 424 pollForHitTestDataOnUiThread(HitTestResult.IMAGE_TYPE, fullImageSrc)
; |
| 443 pollForHrefAndImageSrcOnUiThread(null, null, fullImageSrc); | 425 pollForHrefAndImageSrcOnUiThread(null, null, fullImageSrc); |
| 444 } | 426 } |
| 445 } | 427 } |
| 446 } | 428 } |
| OLD | NEW |