Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1642)

Unified Diff: content/public/android/javatests/src/org/chromium/content/browser/input/ImeTest.java

Issue 1840993002: Reland "Add InputConnection-to-JavaScript tests for key input" (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: fixed flakiness Created 4 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: content/public/android/javatests/src/org/chromium/content/browser/input/ImeTest.java
diff --git a/content/public/android/javatests/src/org/chromium/content/browser/input/ImeTest.java b/content/public/android/javatests/src/org/chromium/content/browser/input/ImeTest.java
index 75809c5eed25af2fe6f5d46f93d4f5d330b78796..d754f6e43f13d70f90f30c35469dabcd90c1a5f2 100644
--- a/content/public/android/javatests/src/org/chromium/content/browser/input/ImeTest.java
+++ b/content/public/android/javatests/src/org/chromium/content/browser/input/ImeTest.java
@@ -23,11 +23,11 @@ import android.view.inputmethod.InputConnection;
import org.chromium.base.ThreadUtils;
import org.chromium.base.test.util.Feature;
import org.chromium.base.test.util.FlakyTest;
-import org.chromium.base.test.util.UrlUtils;
import org.chromium.content.browser.ContentViewCore;
import org.chromium.content.browser.test.util.Criteria;
import org.chromium.content.browser.test.util.CriteriaHelper;
import org.chromium.content.browser.test.util.DOMUtils;
+import org.chromium.content.browser.test.util.JavaScriptUtils;
import org.chromium.content.browser.test.util.TestCallbackHelperContainer;
import org.chromium.content.browser.test.util.TestInputMethodManagerWrapper;
import org.chromium.content_public.browser.WebContents;
@@ -45,24 +45,13 @@ import java.util.concurrent.TimeoutException;
* Integration tests for text input using cases based on fixed regressions.
*/
public class ImeTest extends ContentShellTestBase {
- private static final String DATA_URL = UrlUtils.encodeHtmlDataUri(
- "<html><head><meta name=\"viewport\""
- + "content=\"width=device-width\" /></head>"
- + "<body><form action=\"about:blank\">"
- + "<input id=\"input_text\" type=\"text\" /><br/></form><form>"
- + "<br/><input id=\"input_radio\" type=\"radio\" style=\"width:50px;height:50px\" />"
- + "<br/><textarea id=\"textarea\" rows=\"4\" cols=\"20\"></textarea>"
- + "<br/><textarea id=\"textarea2\" rows=\"4\" cols=\"20\" autocomplete=\"off\">"
- + "</textarea>"
- + "<br/><input id=\"input_number1\" type=\"number\" /><br/>"
- + "<br/><input id=\"input_number2\" type=\"number\" /><br/>"
- + "<br/><p><span id=\"plain_text\">This is Plain Text One</span></p>"
- + "</form></body></html>");
-
protected ChromiumBaseInputConnection mConnection;
private TestInputConnectionFactory mConnectionFactory;
private ImeAdapter mImeAdapter;
+ private static final String INPUT_FORM_HTML =
+ "content/test/data/android/input/input_forms.html";
+
private ContentViewCore mContentViewCore;
private WebContents mWebContents;
private TestCallbackHelperContainer mCallbackContainer;
@@ -71,9 +60,7 @@ public class ImeTest extends ContentShellTestBase {
@Override
public void setUp() throws Exception {
super.setUp();
-
- launchContentShellWithUrl(DATA_URL);
- waitForActiveShellToBeDoneLoading();
+ startActivityWithTestUrl(INPUT_FORM_HTML);
mContentViewCore = getContentViewCore();
mWebContents = getWebContents();
@@ -442,6 +429,17 @@ public class ImeTest extends ContentShellTestBase {
});
}
+ private void reloadPage() {
+ // Reload the page, then focus will be lost and keyboard should be hidden.
+ ThreadUtils.runOnUiThreadBlocking(new Runnable() {
+ @Override
+ public void run() {
+ final String currentUrl = getContentViewCore().getWebContents().getUrl();
+ getActivity().getActiveShell().loadUrl(currentUrl);
+ }
+ });
+ }
+
@SmallTest
@Feature({"TextInput"})
public void testPhysicalKeyboard_AttachDetach() throws Exception {
@@ -455,13 +453,8 @@ public class ImeTest extends ContentShellTestBase {
// Now we really show soft keyboard. We also call restartInput when configuration changes.
waitForKeyboardStates(2, 0, 2, new Integer[] {TextInputType.TEXT, TextInputType.TEXT});
- // Reload the page, then focus will be lost and keyboard should be hidden.
- getInstrumentation().runOnMainSync(new Runnable() {
- @Override
- public void run() {
- getActivity().getActiveShell().loadUrl(DATA_URL);
- }
- });
+ reloadPage();
+
// Depending on the timing, hideSoftInput and restartInput call counts may vary here
// because render widget gets restarted. But the end result should be the same.
assertWaitForKeyboardStatus(false);
@@ -1071,6 +1064,60 @@ public class ImeTest extends ContentShellTestBase {
assertEquals("ab", getTextBeforeCursor(10, 0));
}
+ @MediumTest
+ @Feature({"TextInput"})
+ public void testContentEditableEvents_SetComposingText() throws Throwable {
+ focusElementAndWaitForStateUpdate("contenteditable_event");
+ beginBatchEdit();
+ setComposingText("a", 1);
+ finishComposingText();
+ endBatchEdit();
+ waitAndVerifyUpdateSelection(0, 1, 1, -1, -1);
+
+ // TODO(changwan): reduce the number of selection changes
+ waitForEventLogs("selectionchange,selectionchange,selectionchange,"
+ + "keydown(229),compositionstart(),compositionupdate(a),input,"
+ + "keyup(229),compositionend(a),input,selectionchange,selectionchange,"
+ + "selectionchange,selectionchange,selectionchange");
+ }
+
+ @MediumTest
+ @Feature({"TextInput"})
+ public void testContentEditableEvents_CommitText() throws Throwable {
+ focusElementAndWaitForStateUpdate("contenteditable_event");
+ commitText("a", 1);
+ waitAndVerifyUpdateSelection(0, 1, 1, -1, -1);
+
+ // TODO(changwan): reduce the number of selection changes
+ waitForEventLogs("selectionchange,selectionchange,selectionchange,keydown(229),input,"
+ + "keyup(229),selectionchange");
+ }
+
+ private void waitForEventLogs(String expectedLogs) throws Throwable {
+ final String code = "getEventLogs()";
+ final String sanitizedExpectedLogs = "\"" + expectedLogs + "\"";
+ if (usingReplicaInputConnection()) {
+ // When using replica input connection, JavaScript update will lands later.
+ CriteriaHelper.pollInstrumentationThread(new Criteria() {
+ @Override
+ public boolean isSatisfied() {
+ try {
+ String eventLogs = JavaScriptUtils.executeJavaScriptAndWaitForResult(
+ getContentViewCore().getWebContents(), code);
+ updateFailureReason(eventLogs);
+ return sanitizedExpectedLogs.equals(eventLogs);
+ } catch (InterruptedException | TimeoutException e) {
+ updateFailureReason(e.getMessage());
+ return false;
+ }
+ }
+ });
+ } else {
+ assertEquals(sanitizedExpectedLogs, JavaScriptUtils.executeJavaScriptAndWaitForResult(
+ getContentViewCore().getWebContents(), code));
+ }
+ }
+
private void performGo(TestCallbackHelperContainer testCallbackHelperContainer)
throws Throwable {
final InputConnection inputConnection = mConnection;
@@ -1240,6 +1287,26 @@ public class ImeTest extends ContentShellTestBase {
return ImeTestUtils.runBlockingOnHandler(mConnectionFactory.getHandler(), c);
}
+ private boolean beginBatchEdit() throws Exception {
+ final ChromiumBaseInputConnection connection = mConnection;
+ return runBlockingOnImeThread(new Callable<Boolean>() {
+ @Override
+ public Boolean call() {
+ return connection.beginBatchEdit();
+ }
+ });
+ }
+
+ private boolean endBatchEdit() throws Exception {
+ final ChromiumBaseInputConnection connection = mConnection;
+ return runBlockingOnImeThread(new Callable<Boolean>() {
+ @Override
+ public Boolean call() {
+ return connection.endBatchEdit();
+ }
+ });
+ }
+
private boolean commitText(final CharSequence text, final int newCursorPosition)
throws Exception {
final ChromiumBaseInputConnection connection = mConnection;

Powered by Google App Engine
This is Rietveld 408576698