Index: content/public/android/java/src/org/chromium/content/browser/input/CursorAnchorInfoController.java |
diff --git a/content/public/android/java/src/org/chromium/content/browser/input/CursorAnchorInfoController.java b/content/public/android/java/src/org/chromium/content/browser/input/CursorAnchorInfoController.java |
index 443e7d25a4c660083b3906c8b44f6f471bfc4050..809f6dd062ec55c5db4360bd74674f62f7947099 100644 |
--- a/content/public/android/java/src/org/chromium/content/browser/input/CursorAnchorInfoController.java |
+++ b/content/public/android/java/src/org/chromium/content/browser/input/CursorAnchorInfoController.java |
@@ -9,7 +9,6 @@ import android.graphics.Matrix; |
import android.os.Build; |
import android.view.View; |
import android.view.inputmethod.CursorAnchorInfo; |
-import android.view.inputmethod.InputConnection; |
import org.chromium.base.VisibleForTesting; |
import org.chromium.base.annotations.SuppressFBWarnings; |
@@ -129,14 +128,16 @@ final class CursorAnchorInfoController { |
/** |
* Sets positional information of composing text as an array of character bounds. |
* @param compositionCharacterBounds Array of character bounds in local coordinates. |
+ * @param view The attached view. |
*/ |
- public void setCompositionCharacterBounds(float[] compositionCharacterBounds) { |
+ public void setCompositionCharacterBounds(float[] compositionCharacterBounds, View view) { |
if (!mIsEditable) return; |
if (!Arrays.equals(compositionCharacterBounds, mCompositionCharacterBounds)) { |
mLastCursorAnchorInfo = null; |
mCompositionCharacterBounds = compositionCharacterBounds; |
} |
+ updateCursorAnchorInfo(view); |
} |
/** |
@@ -198,14 +199,6 @@ final class CursorAnchorInfoController { |
} |
} |
- /** |
- * Resets the current state on update monitoring mode to the default (= do nothing.) |
- */ |
- public void resetMonitoringState() { |
- mMonitorModeEnabled = false; |
- mHasPendingImmediateRequest = false; |
- } |
- |
public void focusedNodeChanged(boolean isEditable) { |
mIsEditable = isEditable; |
mCompositionCharacterBounds = null; |
@@ -213,11 +206,18 @@ final class CursorAnchorInfoController { |
mLastCursorAnchorInfo = null; |
} |
- public boolean onRequestCursorUpdates(int cursorUpdateMode, View view) { |
+ public boolean onRequestCursorUpdates(boolean immediateRequest, boolean monitorRequest, |
+ View view) { |
if (!mIsEditable) return false; |
- mMonitorModeEnabled = (cursorUpdateMode & InputConnection.CURSOR_UPDATE_MONITOR) != 0; |
- if ((cursorUpdateMode & InputConnection.CURSOR_UPDATE_IMMEDIATE) != 0) { |
+ if (mMonitorModeEnabled && !monitorRequest) { |
+ // Invalidate saved cursor anchor info if monitor request is cancelled since no longer |
+ // new values will be arrived from renderer and immediate request may return too old |
+ // position. |
+ invalidateLastCursorAnchorInfo(); |
+ } |
+ mMonitorModeEnabled = monitorRequest; |
+ if (immediateRequest) { |
mHasPendingImmediateRequest = true; |
updateCursorAnchorInfo(view); |
} |