Chromium Code Reviews| Index: android_webview/javatests/src/org/chromium/android_webview/test/AwContentsClientOnUnhandledKeyEventTest.java |
| diff --git a/android_webview/javatests/src/org/chromium/android_webview/test/AwContentsClientOnUnhandledKeyEventTest.java b/android_webview/javatests/src/org/chromium/android_webview/test/AwContentsClientOnUnhandledKeyEventTest.java |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..7a2943022766bd92d236f851319dd9cb7b5a8450 |
| --- /dev/null |
| +++ b/android_webview/javatests/src/org/chromium/android_webview/test/AwContentsClientOnUnhandledKeyEventTest.java |
| @@ -0,0 +1,153 @@ |
| +// Copyright 2016 The Chromium Authors. All rights reserved. |
| +// Use of this source code is governed by a BSD-style license that can be |
| +// found in the LICENSE file. |
| + |
| +package org.chromium.android_webview.test; |
| + |
| +import android.os.Build; |
| +import android.test.suitebuilder.annotation.SmallTest; |
| +import android.view.KeyEvent; |
| + |
| +import org.chromium.base.test.util.Feature; |
| +import org.chromium.base.test.util.MinAndroidSdkLevel; |
| +import org.chromium.content.browser.input.ImeAdapter; |
| +import org.chromium.content.browser.test.util.Criteria; |
| +import org.chromium.content.browser.test.util.CriteriaHelper; |
| + |
| +import java.util.ArrayList; |
| +import java.util.Arrays; |
| +import java.util.List; |
| +import java.util.concurrent.Callable; |
| + |
| +/** |
| + * Tests for the WebViewClient.onUnhandledKeyEvent() method. |
| + */ |
| +@MinAndroidSdkLevel(Build.VERSION_CODES.KITKAT) |
| +public class AwContentsClientOnUnhandledKeyEventTest extends AwTestBase { |
| + private KeyEventTestAwContentsClient mContentsClient; |
| + private AwTestContainerView mTestContainerView; |
| + |
| + private static class KeyEventTestAwContentsClient extends TestAwContentsClient { |
| + private final List<KeyEvent> mUnhandledKeyEventList = new ArrayList<>(); |
| + |
| + @Override |
| + public void onUnhandledKeyEvent(KeyEvent event) { |
| + mUnhandledKeyEventList.add(event); |
| + super.onUnhandledKeyEvent(event); |
| + } |
| + |
| + public List<KeyEvent> getUnhandledKeyEventList() { |
| + return mUnhandledKeyEventList; |
| + } |
| + |
| + public void clearUnhandledKeyEventList() { |
| + mUnhandledKeyEventList.clear(); |
| + } |
| + } |
| + |
| + @Override |
| + protected void setUp() throws Exception { |
| + super.setUp(); |
| + mContentsClient = new KeyEventTestAwContentsClient(); |
| + mTestContainerView = createAwTestContainerViewOnMainSync(mContentsClient); |
| + } |
| + |
| + @SmallTest |
| + @Feature({"AndroidWebView", "TextInput"}) |
| + public void testConsumedKeyEvents() throws Throwable { |
| + enableJavaScriptOnUiThread(mTestContainerView.getAwContents()); |
| + final String data = "<html><head></head><body><textarea id='textarea0'></textarea></body>" |
| + + "</html>"; |
| + loadDataSync(mTestContainerView.getAwContents(), mContentsClient.getOnPageFinishedHelper(), |
| + data, "text/html", false); |
| + executeJavaScriptAndWaitForResult(mTestContainerView.getAwContents(), mContentsClient, |
| + "document.getElementById('textarea0').select();"); |
| + |
| + dispatchDownAndUpKeyEvents(KeyEvent.KEYCODE_A); |
| + assertNoUnhandledKeyEvent(); |
|
boliu
2016/08/08 22:41:51
it's kinda impossible to assert that something *do
aelias_OOO_until_Jul13
2016/08/20 01:53:06
I wanted to keep this coverage, so I finessed the
|
| + |
| + dispatchDownAndUpKeyEvents(KeyEvent.KEYCODE_DEL); |
| + assertNoUnhandledKeyEvent(); |
| + |
| + mContentsClient.clearUnhandledKeyEventList(); |
| + |
| + // COMPOSITION_KEY is synthetically created for DOM's onkeydown() event while composing |
| + // text. We don't want to propagate it to WebViewClient. |
| + dispatchDownAndUpKeyEvents(ImeAdapter.COMPOSITION_KEY_CODE); |
| + assertNoUnhandledKeyEvent(); |
| + } |
| + |
| + @SmallTest |
| + @Feature({"AndroidWebView", "TextInput"}) |
| + public void testUnconsumedKeyEvents() throws Throwable { |
| + final String data = "<html><head></head><body><textarea id='textarea0'></textarea></body>" |
| + + "</html>"; |
| + loadDataSync(mTestContainerView.getAwContents(), mContentsClient.getOnPageFinishedHelper(), |
|
boliu
2016/08/08 22:41:51
so only difference in this test is that textarea d
aelias_OOO_until_Jul13
2016/08/20 01:53:06
Done.
|
| + data, "text/html", false); |
| + |
| + dispatchDownAndUpKeyEvents(KeyEvent.KEYCODE_A); |
| + assertUnhandledDownAndUpKeyEventList(KeyEvent.KEYCODE_A); |
| + |
| + mContentsClient.clearUnhandledKeyEventList(); |
| + |
| + dispatchDownAndUpKeyEvents(KeyEvent.KEYCODE_DEL); |
| + assertUnhandledDownAndUpKeyEventList(KeyEvent.KEYCODE_DEL); |
| + |
| + mContentsClient.clearUnhandledKeyEventList(); |
| + |
| + dispatchDownAndUpKeyEvents(KeyEvent.KEYCODE_ALT_LEFT); |
| + assertUnhandledDownAndUpKeyEventList(KeyEvent.KEYCODE_ALT_LEFT); |
| + } |
| + |
| + private boolean dispatchKeyEvent(final KeyEvent event) throws Throwable { |
| + return runTestOnUiThreadAndGetResult(new Callable<Boolean>() { |
| + @Override |
| + public Boolean call() { |
| + return mTestContainerView.dispatchKeyEvent(event); |
| + } |
| + }); |
| + } |
| + |
| + private void dispatchDownAndUpKeyEvents(final int code) throws Throwable { |
| + dispatchKeyEvent(new KeyEvent(KeyEvent.ACTION_DOWN, code)); |
| + dispatchKeyEvent(new KeyEvent(KeyEvent.ACTION_UP, code)); |
| + } |
| + |
| + private List<KeyEvent> getUnhandledKeyEventList() throws Exception { |
| + return runTestOnUiThreadAndGetResult(new Callable<List<KeyEvent>>() { |
| + @Override |
| + public List<KeyEvent> call() throws Exception { |
| + return mContentsClient.getUnhandledKeyEventList(); |
| + } |
| + |
| + }); |
| + } |
| + |
| + private void assertNoUnhandledKeyEvent() throws Throwable { |
| + CriteriaHelper.pollUiThread(new Criteria() { |
| + @Override |
| + public boolean isSatisfied() { |
| + List<KeyEvent> list = mContentsClient.getUnhandledKeyEventList(); |
| + updateFailureReason("KeyEvent list: " |
| + + Arrays.deepToString(list.toArray())); |
| + return list.size() > 0; |
| + } |
| + }); |
| + } |
| + |
| + private void assertUnhandledDownAndUpKeyEventList(final int code) throws Throwable { |
| + CriteriaHelper.pollUiThread(new Criteria() { |
|
boliu
2016/08/08 22:41:51
Prefer CallbackHelper over polling. Looks like Cal
aelias_OOO_until_Jul13
2016/08/20 01:53:06
Done.
|
| + @Override |
| + public boolean isSatisfied() { |
| + List<KeyEvent> list = mContentsClient.getUnhandledKeyEventList(); |
| + updateFailureReason("KeyEvent list: " |
| + + Arrays.deepToString(list.toArray())); |
| + return list.size() == 2 && list.get(0).getAction() == KeyEvent.ACTION_DOWN |
| + && list.get(0).getKeyCode() == code |
| + && list.get(1).getAction() == KeyEvent.ACTION_UP |
| + && list.get(1).getKeyCode() == code; |
| + } |
| + }); |
| + } |
| +} |
| + |