Index: content/public/android/junit/src/org/chromium/content/browser/input/ThreadedInputConnectionTest.java |
diff --git a/content/public/android/junit/src/org/chromium/content/browser/input/ThreadedInputConnectionTest.java b/content/public/android/junit/src/org/chromium/content/browser/input/ThreadedInputConnectionTest.java |
index 124e3259f300fd0b7d7993d50870ee54bdd92f72..b7d65feb4c207101a6e39263e385c8bdc12cc607 100644 |
--- a/content/public/android/junit/src/org/chromium/content/browser/input/ThreadedInputConnectionTest.java |
+++ b/content/public/android/junit/src/org/chromium/content/browser/input/ThreadedInputConnectionTest.java |
@@ -6,6 +6,7 @@ package org.chromium.content.browser.input; |
import static org.junit.Assert.assertEquals; |
import static org.junit.Assert.assertFalse; |
+import static org.junit.Assert.assertNotEquals; |
import static org.junit.Assert.assertNull; |
import static org.junit.Assert.assertTrue; |
import static org.junit.Assert.fail; |
@@ -32,6 +33,8 @@ import org.mockito.Mockito; |
import org.mockito.MockitoAnnotations; |
import org.robolectric.annotation.Config; |
+import java.util.concurrent.Callable; |
+ |
/** |
* Unit tests for {@ThreadedInputConnection}. |
*/ |
@@ -44,6 +47,7 @@ public class ThreadedInputConnectionTest { |
InOrder mInOrder; |
View mView; |
Context mContext; |
+ boolean mRunningOnUiThread; |
@Before |
public void setUp() throws Exception { |
@@ -59,7 +63,12 @@ public class ThreadedInputConnectionTest { |
when(mContext.getSystemService(Context.INPUT_METHOD_SERVICE)).thenReturn(Mockito.mock( |
InputMethodManager.class)); |
// Let's create Handler for test thread and pretend that it is running on IME thread. |
- mConnection = new ThreadedInputConnection(mView, mImeAdapter, new Handler()); |
+ mConnection = new ThreadedInputConnection(mView, mImeAdapter, new Handler()) { |
+ @Override |
+ protected boolean runningOnUiThread() { |
+ return mRunningOnUiThread; |
+ } |
+ }; |
} |
@Test |
@@ -103,7 +112,7 @@ public class ThreadedInputConnectionTest { |
@Feature({"TextInput"}) |
public void testPressingDeadKey() { |
// On default keyboard "Alt+i" produces a dead key '\u0302'. |
- mConnection.setCombiningAccent(0x0302); |
+ mConnection.setCombiningAccentOnUiThread(0x0302); |
mConnection.updateComposingText("\u0302", 1, true); |
mInOrder.verify(mImeAdapter) |
.sendCompositionToNative( |
@@ -186,4 +195,31 @@ public class ThreadedInputConnectionTest { |
// Should not hang here. Return null to indicate failure. |
assertEquals(null, mConnection.getTextBeforeCursor(10, 0)); |
} |
+ |
+ // crbug.com/643477 |
+ @Test |
+ @Feature({"TextInput"}) |
+ public void testUiThreadAccess() { |
+ assertTrue(mConnection.commitText("hello", 1)); |
+ mRunningOnUiThread = true; |
+ // Depending on the timing, the result may not be up-to-date. |
+ assertNotEquals("hello", |
+ ThreadUtils.runOnUiThreadBlockingNoException(new Callable<CharSequence>() { |
+ @Override |
+ public CharSequence call() { |
+ return mConnection.getTextBeforeCursor(10, 0); |
+ } |
+ })); |
+ // Or it could be. |
+ mConnection.updateStateOnUiThread("hello", 5, 5, -1, -1, true, true); |
+ assertEquals("hello", |
+ ThreadUtils.runOnUiThreadBlockingNoException(new Callable<CharSequence>() { |
+ @Override |
+ public CharSequence call() { |
+ return mConnection.getTextBeforeCursor(10, 0); |
+ } |
+ })); |
+ |
+ mRunningOnUiThread = false; |
+ } |
} |