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

Side by Side Diff: content/public/android/java/src/org/chromium/content/browser/input/CursorAnchorInfoController.java

Issue 2834343005: Let IME frame update bypass ContentViewCore (Closed)
Patch Set: comment Created 3 years, 8 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 unified diff | Download patch
OLDNEW
1 // Copyright 2016 The Chromium Authors. All rights reserved. 1 // Copyright 2016 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 package org.chromium.content.browser.input; 5 package org.chromium.content.browser.input;
6 6
7 import android.annotation.TargetApi; 7 import android.annotation.TargetApi;
8 import android.graphics.Matrix; 8 import android.graphics.Matrix;
9 import android.os.Build; 9 import android.os.Build;
10 import android.view.View; 10 import android.view.View;
11 import android.view.inputmethod.CursorAnchorInfo; 11 import android.view.inputmethod.CursorAnchorInfo;
12 12
13 import org.chromium.base.VisibleForTesting; 13 import org.chromium.base.VisibleForTesting;
14 import org.chromium.base.annotations.SuppressFBWarnings; 14 import org.chromium.base.annotations.SuppressFBWarnings;
15 import org.chromium.content.browser.RenderCoordinates;
16 15
17 import java.util.Arrays; 16 import java.util.Arrays;
18 17
19 import javax.annotation.Nonnull; 18 import javax.annotation.Nonnull;
20 import javax.annotation.Nullable; 19 import javax.annotation.Nullable;
21 20
22 /** 21 /**
23 * A state machine interface which receives Chromium internal events to determin es when to call 22 * A state machine interface which receives Chromium internal events to determin es when to call
24 * {@link InputMethodManager#updateCursorAnchorInfo(View, CursorAnchorInfo)}. Th is interface is 23 * {@link InputMethodManager#updateCursorAnchorInfo(View, CursorAnchorInfo)}. Th is interface is
25 * also used in unit tests to mock out {@link CursorAnchorInfo}, which is availa ble only in 24 * also used in unit tests to mock out {@link CursorAnchorInfo}, which is availa ble only in
(...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after
137 mLastCursorAnchorInfo = null; 136 mLastCursorAnchorInfo = null;
138 mCompositionCharacterBounds = compositionCharacterBounds; 137 mCompositionCharacterBounds = compositionCharacterBounds;
139 if (mHasCoordinateInfo) { 138 if (mHasCoordinateInfo) {
140 updateCursorAnchorInfo(view); 139 updateCursorAnchorInfo(view);
141 } 140 }
142 } 141 }
143 } 142 }
144 143
145 /** 144 /**
146 * Sets coordinates system parameters and selection marker information. 145 * Sets coordinates system parameters and selection marker information.
146 * @param scale device scale factor.
147 * @param contentOffsetYPix Y offset below the browser controls.
147 * @param hasInsertionMarker {@code true} if the insertion marker exists. 148 * @param hasInsertionMarker {@code true} if the insertion marker exists.
148 * @param isInsertionMarkerVisible {@code true} if the insertion insertion m arker is visible. 149 * @param isInsertionMarkerVisible {@code true} if the insertion insertion m arker is visible.
149 * @param insertionMarkerHorizontal X coordinate of the top of the first sel ection marker. 150 * @param insertionMarkerHorizontal X coordinate of the top of the first sel ection marker.
150 * @param insertionMarkerTop Y coordinate of the top of the first selection marker. 151 * @param insertionMarkerTop Y coordinate of the top of the first selection marker.
151 * @param insertionMarkerBottom Y coordinate of the bottom of the first sele ction marker. 152 * @param insertionMarkerBottom Y coordinate of the bottom of the first sele ction marker.
152 * @param view The attached view. 153 * @param view The attached view.
153 */ 154 */
154 @SuppressFBWarnings("FE_FLOATING_POINT_EQUALITY") 155 @SuppressFBWarnings("FE_FLOATING_POINT_EQUALITY")
155 public void onUpdateFrameInfo(@Nonnull RenderCoordinates renderCoordinates, 156 public void onUpdateFrameInfo(float scale, float contentOffsetYPix, boolean hasInsertionMarker,
156 boolean hasInsertionMarker, boolean isInsertionMarkerVisible, 157 boolean isInsertionMarkerVisible, float insertionMarkerHorizontal,
157 float insertionMarkerHorizontal, float insertionMarkerTop, 158 float insertionMarkerTop, float insertionMarkerBottom, @Nonnull View view) {
158 float insertionMarkerBottom, @Nonnull View view) {
159 if (!mIsEditable) return; 159 if (!mIsEditable) return;
160 160
161 // Reuse {@param #mViewOrigin} to avoid object creation, as this method is supposed to be 161 // Reuse {@param #mViewOrigin} to avoid object creation, as this method is supposed to be
162 // called at relatively high rate. 162 // called at relatively high rate.
163 mViewDelegate.getLocationOnScreen(view, mViewOrigin); 163 mViewDelegate.getLocationOnScreen(view, mViewOrigin);
164 164
165 // Character bounds and insertion marker locations come in device indepe ndent pixels 165 // Character bounds and insertion marker locations come in device indepe ndent pixels
166 // relative from the top-left corner of the web view content area. (In o ther words, the 166 // relative from the top-left corner of the web view content area. (In o ther words, the
167 // effects of various kinds of zooming and scrolling are already taken i nto account.) 167 // effects of various kinds of zooming and scrolling are already taken i nto account.)
168 // 168 //
169 // We need to prepare parameters that convert such values to physical pi xels, in the 169 // We need to prepare parameters that convert such values to physical pi xels, in the
170 // screen coordinate. Hence the following values are derived. 170 // screen coordinate. Hence the following values are derived.
171 float scale = renderCoordinates.getDeviceScaleFactor();
172 float translationX = mViewOrigin[0]; 171 float translationX = mViewOrigin[0];
173 float translationY = mViewOrigin[1] + renderCoordinates.getContentOffset YPix(); 172 float translationY = mViewOrigin[1] + contentOffsetYPix;
174
175 if (!mHasCoordinateInfo 173 if (!mHasCoordinateInfo
176 || scale != mScale 174 || scale != mScale
177 || translationX != mTranslationX 175 || translationX != mTranslationX
178 || translationY != mTranslationY 176 || translationY != mTranslationY
179 || hasInsertionMarker != mHasInsertionMarker 177 || hasInsertionMarker != mHasInsertionMarker
180 || isInsertionMarkerVisible != mIsInsertionMarkerVisible 178 || isInsertionMarkerVisible != mIsInsertionMarkerVisible
181 || insertionMarkerHorizontal != mInsertionMarkerHorizontal 179 || insertionMarkerHorizontal != mInsertionMarkerHorizontal
182 || insertionMarkerTop != mInsertionMarkerTop 180 || insertionMarkerTop != mInsertionMarkerTop
183 || insertionMarkerBottom != mInsertionMarkerBottom) { 181 || insertionMarkerBottom != mInsertionMarkerBottom) {
184 mLastCursorAnchorInfo = null; 182 mLastCursorAnchorInfo = null;
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after
273 } 271 }
274 mLastCursorAnchorInfo = mCursorAnchorInfoBuilder.build(); 272 mLastCursorAnchorInfo = mCursorAnchorInfoBuilder.build();
275 } 273 }
276 274
277 if (mInputMethodManagerWrapper != null) { 275 if (mInputMethodManagerWrapper != null) {
278 mInputMethodManagerWrapper.updateCursorAnchorInfo(view, mLastCursorA nchorInfo); 276 mInputMethodManagerWrapper.updateCursorAnchorInfo(view, mLastCursorA nchorInfo);
279 } 277 }
280 mHasPendingImmediateRequest = false; 278 mHasPendingImmediateRequest = false;
281 } 279 }
282 } 280 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698