diff options
author | Changwan Ryu <changwan@google.com> | 2015-06-26 10:48:46 +0900 |
---|---|---|
committer | Changwan Ryu <changwan@google.com> | 2015-06-26 01:49:53 +0000 |
commit | 8cd0432bc4e6cdcbfa3b2cbed72a35335266b938 (patch) | |
tree | 863fba24d54a5b4287d0f2ec109a9395955e22a0 | |
parent | ad0dad5c0dcb9a3a41296922d5dfe51e4608e10a (diff) | |
download | chromium_src-8cd0432bc4e6cdcbfa3b2cbed72a35335266b938.zip chromium_src-8cd0432bc4e6cdcbfa3b2cbed72a35335266b938.tar.gz chromium_src-8cd0432bc4e6cdcbfa3b2cbed72a35335266b938.tar.bz2 |
Finish composing text when a new input connection is made
When we lock the screen, View#onCreateInputConnection() is called
and a new input connection is made. At the initialization, we remove
the composing spans to avoid keyboard status conflict.
However, since we do not tell the Blink editor about the removal,
the Blink editor thinks that we are still composing something.
IME calls finishComposingText() on the input connection, but we never
update the composing region because of the empty composing span check
in finishComposingText().
Now the sync between Blink editor and browser editor is completely broken,
so some badness may follow after the user unlocks the screen.
It is not desirable to remove composing spans arbitrarily. We can
replace this by finishComposingText().
BUG=503501
Review URL: https://codereview.chromium.org/1196183005
Cr-Commit-Position: refs/heads/master@{#336309}
(cherry picked from commit 8402ae722c480237949e2e219a4bcfbe0146b77c)
Review URL: https://codereview.chromium.org/1212183003.
Cr-Commit-Position: refs/branch-heads/2403@{#404}
Cr-Branched-From: f54b8097a9c45ed4ad308133d49f05325d6c5070-refs/heads/master@{#330231}
3 files changed, 29 insertions, 2 deletions
diff --git a/content/public/android/java/src/org/chromium/content/browser/input/AdapterInputConnection.java b/content/public/android/java/src/org/chromium/content/browser/input/AdapterInputConnection.java index ee242e4..2157095 100644 --- a/content/public/android/java/src/org/chromium/content/browser/input/AdapterInputConnection.java +++ b/content/public/android/java/src/org/chromium/content/browser/input/AdapterInputConnection.java @@ -58,10 +58,12 @@ public class AdapterInputConnection extends BaseInputConnection { mImeAdapter = imeAdapter; mImeAdapter.setInputConnection(this); mEditable = editable; + // The editable passed in might have been in use by a prior keyboard and could have had // prior composition spans set. To avoid keyboard conflicts, remove all composing spans // when taking ownership of an existing Editable. - removeComposingSpans(mEditable); + finishComposingText(); + mSingleLine = true; outAttrs.imeOptions = EditorInfo.IME_FLAG_NO_FULLSCREEN | EditorInfo.IME_FLAG_NO_EXTRACT_UI; @@ -140,6 +142,7 @@ public class AdapterInputConnection extends BaseInputConnection { outAttrs.initialSelEnd = Selection.getSelectionEnd(mEditable); mLastUpdateSelectionStart = outAttrs.initialSelStart; mLastUpdateSelectionEnd = outAttrs.initialSelEnd; + if (DEBUG) Log.w(TAG, "Constructor called with outAttrs: " + outAttrs); Selection.setSelection(mEditable, outAttrs.initialSelStart, outAttrs.initialSelEnd); updateSelectionIfRequired(); diff --git a/content/public/android/java/src/org/chromium/content/browser/input/ImeAdapter.java b/content/public/android/java/src/org/chromium/content/browser/input/ImeAdapter.java index b75c95a..bc01eca 100644 --- a/content/public/android/java/src/org/chromium/content/browser/input/ImeAdapter.java +++ b/content/public/android/java/src/org/chromium/content/browser/input/ImeAdapter.java @@ -477,7 +477,8 @@ public class ImeAdapter { return true; } - void finishComposingText() { + @VisibleForTesting + protected void finishComposingText() { mLastComposeText = null; if (mNativeImeAdapterAndroid == 0) return; nativeFinishComposingText(mNativeImeAdapterAndroid); diff --git a/content/public/android/javatests/src/org/chromium/content/browser/input/AdapterInputConnectionTest.java b/content/public/android/javatests/src/org/chromium/content/browser/input/AdapterInputConnectionTest.java index 9b0f072..a565020 100644 --- a/content/public/android/javatests/src/org/chromium/content/browser/input/AdapterInputConnectionTest.java +++ b/content/public/android/javatests/src/org/chromium/content/browser/input/AdapterInputConnectionTest.java @@ -13,6 +13,7 @@ import android.text.Editable; import android.text.Selection; import android.view.KeyEvent; import android.view.View; +import android.view.inputmethod.BaseInputConnection; import android.view.inputmethod.EditorInfo; import org.chromium.base.test.util.Feature; @@ -130,9 +131,25 @@ public class AdapterInputConnectionTest extends ContentShellTestBase { assertEquals(2, mImeAdapter.getKeyEvents().length); } + @MediumTest + @Feature({"TextInput", "Main"}) + public void testNewConnectionFinishesComposingText() throws Throwable { + mConnection.setComposingText("abc", 1); + assertEquals(0, BaseInputConnection.getComposingSpanStart(mEditable)); + assertEquals(3, BaseInputConnection.getComposingSpanEnd(mEditable)); + + mConnection = new AdapterInputConnection( + getContentViewCore().getContainerView(), mImeAdapter, mEditable, new EditorInfo()); + + assertEquals(1, mImeAdapter.mFinishComposingTextCounter); + assertEquals(-1, BaseInputConnection.getComposingSpanStart(mEditable)); + assertEquals(-1, BaseInputConnection.getComposingSpanEnd(mEditable)); + } + private static class TestImeAdapter extends ImeAdapter { private final ArrayList<Integer> mKeyEventQueue = new ArrayList<Integer>(); private int mDeleteSurroundingTextCounter; + private int mFinishComposingTextCounter; public TestImeAdapter(InputMethodManagerWrapper wrapper, ImeAdapterDelegate embedder) { super(wrapper, embedder); @@ -149,6 +166,12 @@ public class AdapterInputConnectionTest extends ContentShellTestBase { mKeyEventQueue.add(keyCode); } + @Override + protected void finishComposingText() { + ++mFinishComposingTextCounter; + super.finishComposingText(); + } + public int getDeleteSurroundingTextCallCount() { return mDeleteSurroundingTextCounter; } |