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

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

Issue 1278593004: Introduce ThreadedInputConnection behind a switch (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: fixed a crash for LatinIME Created 4 years, 11 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 704441b743a5ac6465a3e649ad94fb057d1d0aa8..0746c2c21e4c6b710e83a4265f7d1fab5aa24a55 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
@@ -11,10 +11,12 @@ import android.content.Context;
import android.content.res.Configuration;
import android.test.suitebuilder.annotation.MediumTest;
import android.test.suitebuilder.annotation.SmallTest;
+import android.text.Editable;
import android.text.TextUtils;
import android.view.KeyEvent;
import android.view.View;
import android.view.inputmethod.EditorInfo;
+import android.view.inputmethod.InputConnection;
import org.chromium.base.ThreadUtils;
import org.chromium.base.test.util.Feature;
@@ -55,8 +57,8 @@ public class ImeTest extends ContentShellTestBase {
+ "<br/><p><span id=\"plain_text\">This is Plain Text One</span></p>"
+ "</form></body></html>");
- private TestAdapterInputConnection mConnection;
- private TestAdapterInputConnectionFactory mConnectionFactory;
+ private TestInputConnection mConnection;
+ private TestInputConnectionFactory mConnectionFactory;
private ImeAdapter mImeAdapter;
private ContentViewCore mContentViewCore;
@@ -76,7 +78,7 @@ public class ImeTest extends ContentShellTestBase {
mInputMethodManagerWrapper = new TestInputMethodManagerWrapper(mContentViewCore);
getImeAdapter().setInputMethodManagerWrapperForTest(mInputMethodManagerWrapper);
assertEquals(0, mInputMethodManagerWrapper.getShowSoftInputCounter());
- mConnectionFactory = new TestAdapterInputConnectionFactory();
+ mConnectionFactory = new TestInputConnectionFactory();
getImeAdapter().setInputConnectionFactory(mConnectionFactory);
mCallbackContainer = new TestCallbackHelperContainer(mContentViewCore);
@@ -86,13 +88,13 @@ public class ImeTest extends ContentShellTestBase {
DOMUtils.clickNode(this, mContentViewCore, "input_text");
assertWaitForKeyboardStatus(true);
- mConnection = (TestAdapterInputConnection) getAdapterInputConnection();
+ mConnection = (TestInputConnection) getInputConnection();
mImeAdapter = getImeAdapter();
waitAndVerifyStatesAndCalls(0, "", 0, 0, -1, -1);
waitForKeyboardStates(1, 0, 1, new Integer[] {TextInputType.TEXT});
- assertEquals(0, mInputMethodManagerWrapper.getEditorInfo().initialSelStart);
- assertEquals(0, mInputMethodManagerWrapper.getEditorInfo().initialSelEnd);
+ assertEquals(0, mConnectionFactory.getOutAttrs().initialSelStart);
+ assertEquals(0, mConnectionFactory.getOutAttrs().initialSelEnd);
resetAllStates();
}
@@ -182,15 +184,12 @@ public class ImeTest extends ContentShellTestBase {
public void testEnterTextAndRefocus() throws Exception {
commitText("hello", 1);
waitAndVerifyStatesAndCalls(0, "hello", 5, 5, -1, -1);
-
- DOMUtils.clickNode(this, mContentViewCore, "input_radio");
- assertWaitForKeyboardStatus(false);
-
+ restartInput();
DOMUtils.clickNode(this, mContentViewCore, "input_text");
assertWaitForKeyboardStatus(true);
- assertEquals(5, mInputMethodManagerWrapper.getEditorInfo().initialSelStart);
- assertEquals(5, mInputMethodManagerWrapper.getEditorInfo().initialSelEnd);
+ assertEquals(5, mConnectionFactory.getOutAttrs().initialSelStart);
+ assertEquals(5, mConnectionFactory.getOutAttrs().initialSelEnd);
}
@SmallTest
@@ -252,21 +251,11 @@ public class ImeTest extends ContentShellTestBase {
}
private String getKeyboardStates() {
- try {
- return ThreadUtils.runOnUiThreadBlocking(new Callable<String>() {
- @Override
- public String call() throws Exception {
- int showCount = mInputMethodManagerWrapper.getShowSoftInputCounter();
- int hideCount = mInputMethodManagerWrapper.getHideSoftInputCounter();
- int restartCount = mInputMethodManagerWrapper.getRestartInputCounter();
- Integer[] history = mConnectionFactory.getTextInputTypeHistory();
- return stringifyKeyboardStates(showCount, hideCount, restartCount, history);
- }
- });
- } catch (ExecutionException e) {
- e.printStackTrace();
- return null;
- }
+ int showCount = mInputMethodManagerWrapper.getShowSoftInputCounter();
+ int hideCount = mInputMethodManagerWrapper.getHideSoftInputCounter();
+ int restartCount = mInputMethodManagerWrapper.getRestartInputCounter();
+ Integer[] history = mConnectionFactory.getTextInputTypeHistory();
+ return stringifyKeyboardStates(showCount, hideCount, restartCount, history);
}
private String stringifyKeyboardStates(int show, int hide, int restart, Integer[] history) {
@@ -1013,21 +1002,44 @@ public class ImeTest extends ContentShellTestBase {
public void testRestartInputWhileComposingText() throws Throwable {
setComposingText("abc", 1);
waitAndVerifyStatesAndCalls(0, "abc", 3, 3, 0, 3);
- ThreadUtils.runOnUiThreadBlocking(new Runnable() {
- @Override
- public void run() {
- mImeAdapter.restartInput();
- }
- });
+ restartInput();
// We don't do anything when input gets restarted. But we depend on Android's
// InputMethodManager and/or input methods to call finishComposingText() in setting
// current input connection as active or finishing the current input connection.
assertNoFurtherStateUpdate(1);
}
+ @MediumTest
+ @Feature({"TextInput"})
+ public void testRestartInputKeepsTextAndCursor() throws Exception {
+ commitText("ab", 2);
+ restartInput();
+ assertEquals("ab", getTextBeforeCursor(10, 0));
+ }
+
+ private CharSequence getTextBeforeCursor(final int length, final int flags)
+ throws ExecutionException {
+ return ThreadUtils.runOnUiThreadBlocking(new Callable<CharSequence>() {
+ @Override
+ public CharSequence call() {
+ return mConnection.getTextBeforeCursor(length, flags);
+ }
+ });
+ }
+
+ private CharSequence getTextAfterCursor(final int length, final int flags)
+ throws ExecutionException {
+ return ThreadUtils.runOnUiThreadBlocking(new Callable<CharSequence>() {
+ @Override
+ public CharSequence call() {
+ return mConnection.getTextAfterCursor(length, flags);
+ }
+ });
+ }
+
private void performGo(TestCallbackHelperContainer testCallbackHelperContainer)
throws Throwable {
- final AdapterInputConnection inputConnection = mConnection;
+ final InputConnection inputConnection = mConnection;
handleBlockingCallbackAction(
testCallbackHelperContainer.getOnPageFinishedHelper(),
new Runnable() {
@@ -1045,7 +1057,7 @@ public class ImeTest extends ContentShellTestBase {
// We do not check the other way around: in some cases we need to keep
// input connection even when the last known status is 'hidden'.
// See crbug.com/569332 for more details.
- if (show && getAdapterInputConnection() == null) {
+ if (show && getInputConnection() == null) {
updateFailureReason("input connection should not be null.");
return false;
}
@@ -1135,10 +1147,19 @@ public class ImeTest extends ContentShellTestBase {
return mContentViewCore.getImeAdapterForTest();
}
- private AdapterInputConnection getAdapterInputConnection() {
+ private ChromiumBaseInputConnection getInputConnection() {
return mContentViewCore.getImeAdapterForTest().getInputConnectionForTest();
}
+ private void restartInput() {
+ ThreadUtils.runOnUiThreadBlocking(new Runnable() {
+ @Override
+ public void run() {
+ mImeAdapter.restartInput();
+ }
+ });
+ }
+
private void copy() {
final WebContents webContents = mWebContents;
ThreadUtils.runOnUiThreadBlocking(new Runnable() {
@@ -1190,7 +1211,7 @@ public class ImeTest extends ContentShellTestBase {
}
private void commitText(final CharSequence text, final int newCursorPosition) {
- final AdapterInputConnection connection = mConnection;
+ final InputConnection connection = mConnection;
ThreadUtils.runOnUiThreadBlocking(new Runnable() {
@Override
public void run() {
@@ -1200,7 +1221,7 @@ public class ImeTest extends ContentShellTestBase {
}
private void setSelection(final int start, final int end) {
- final AdapterInputConnection connection = mConnection;
+ final InputConnection connection = mConnection;
ThreadUtils.runOnUiThreadBlocking(new Runnable() {
@Override
public void run() {
@@ -1210,7 +1231,7 @@ public class ImeTest extends ContentShellTestBase {
}
private void setComposingRegion(final int start, final int end) {
- final AdapterInputConnection connection = mConnection;
+ final InputConnection connection = mConnection;
ThreadUtils.runOnUiThreadBlocking(new Runnable() {
@Override
public void run() {
@@ -1220,7 +1241,7 @@ public class ImeTest extends ContentShellTestBase {
}
private void setComposingText(final CharSequence text, final int newCursorPosition) {
- final AdapterInputConnection connection = mConnection;
+ final InputConnection connection = mConnection;
ThreadUtils.runOnUiThreadBlocking(new Runnable() {
@Override
public void run() {
@@ -1230,7 +1251,7 @@ public class ImeTest extends ContentShellTestBase {
}
private void finishComposingText() {
- final AdapterInputConnection connection = mConnection;
+ final InputConnection connection = mConnection;
ThreadUtils.runOnUiThreadBlocking(new Runnable() {
@Override
public void run() {
@@ -1240,7 +1261,7 @@ public class ImeTest extends ContentShellTestBase {
}
private void deleteSurroundingText(final int before, final int after) {
- final AdapterInputConnection connection = mConnection;
+ final InputConnection connection = mConnection;
ThreadUtils.runOnUiThreadBlocking(new Runnable() {
@Override
public void run() {
@@ -1288,20 +1309,21 @@ public class ImeTest extends ContentShellTestBase {
}
});
// When we focus another element, the connection may be recreated.
- mConnection = (TestAdapterInputConnection) getAdapterInputConnection();
+ mConnection = (TestInputConnection) getInputConnection();
}
- private static class TestAdapterInputConnectionFactory extends
- ImeAdapter.AdapterInputConnectionFactory {
+ private static class TestInputConnectionFactory extends ReplicaInputConnection.Factory {
private final List<TestImeState> mImeStateList = new ArrayList<>();
private final List<Integer> mTextInputTypeList = new ArrayList<>();
+ private EditorInfo mOutAttrs;
@Override
- public AdapterInputConnection get(View view, ImeAdapter imeAdapter, int initialSelStart,
- int initialSelEnd, EditorInfo outAttrs) {
- mTextInputTypeList.add(imeAdapter.getTextInputType());
- return new TestAdapterInputConnection(
- mImeStateList, view, imeAdapter, initialSelStart, initialSelEnd, outAttrs);
+ public ReplicaInputConnection initializeAndGet(View view, ImeAdapter imeAdapter,
+ int inputType, int inputFlags, EditorInfo outAttrs) {
+ mTextInputTypeList.add(inputType);
+ mOutAttrs = outAttrs;
+ return new TestInputConnection(
+ mImeStateList, view, imeAdapter, mEditable, inputType, inputFlags, outAttrs);
}
public List<TestImeState> getImeStateList() {
@@ -1317,25 +1339,29 @@ public class ImeTest extends ContentShellTestBase {
public void clearTextInputTypeHistory() {
mTextInputTypeList.clear();
}
+
+ public EditorInfo getOutAttrs() {
+ return mOutAttrs;
+ }
}
- private static class TestAdapterInputConnection extends AdapterInputConnection {
+ private static class TestInputConnection extends ReplicaInputConnection {
private final List<TestImeState> mImeStateList;
- public TestAdapterInputConnection(List<TestImeState> imeStateList, View view,
- ImeAdapter imeAdapter, int initialSelStart, int initialSelEnd,
+ public TestInputConnection(List<TestImeState> imeStateList, View view,
+ ImeAdapter imeAdapter, Editable editable, int inputType, int inputFlags,
EditorInfo outAttrs) {
- super(view, imeAdapter, initialSelStart, initialSelEnd, outAttrs);
+ super(view, imeAdapter, new ThreadManager(), editable, inputType, inputFlags, outAttrs);
mImeStateList = imeStateList;
}
@Override
- public void updateState(String text, int selectionStart, int selectionEnd,
- int compositionStart, int compositionEnd, boolean requiredAck) {
+ public void updateStateOnUiThread(String text, int selectionStart, int selectionEnd,
+ int compositionStart, int compositionEnd, boolean singleLine, boolean requiredAck) {
mImeStateList.add(new TestImeState(
text, selectionStart, selectionEnd, compositionStart, compositionEnd));
- super.updateState(text, selectionStart, selectionEnd, compositionStart,
- compositionEnd, requiredAck);
+ super.updateStateOnUiThread(text, selectionStart, selectionEnd, compositionStart,
+ compositionEnd, singleLine, requiredAck);
}
}

Powered by Google App Engine
This is Rietveld 408576698