OLD | NEW |
1 // Copyright 2012 The Chromium Authors. All rights reserved. | 1 // Copyright 2012 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; | 5 package org.chromium.content.browser; |
6 | 6 |
7 import android.annotation.SuppressLint; | 7 import android.annotation.SuppressLint; |
8 import android.app.Activity; | 8 import android.app.Activity; |
9 import android.app.SearchManager; | 9 import android.app.SearchManager; |
| 10 import android.content.ClipboardManager; |
10 import android.content.ContentResolver; | 11 import android.content.ContentResolver; |
11 import android.content.Context; | 12 import android.content.Context; |
12 import android.content.Intent; | 13 import android.content.Intent; |
13 import android.content.pm.FeatureInfo; | 14 import android.content.pm.FeatureInfo; |
14 import android.content.pm.PackageManager; | 15 import android.content.pm.PackageManager; |
15 import android.content.res.Configuration; | 16 import android.content.res.Configuration; |
16 import android.database.ContentObserver; | 17 import android.database.ContentObserver; |
17 import android.graphics.Bitmap; | 18 import android.graphics.Bitmap; |
18 import android.graphics.Canvas; | 19 import android.graphics.Canvas; |
19 import android.graphics.Rect; | 20 import android.graphics.Rect; |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
55 import org.chromium.base.JNINamespace; | 56 import org.chromium.base.JNINamespace; |
56 import org.chromium.base.ObserverList; | 57 import org.chromium.base.ObserverList; |
57 import org.chromium.base.ObserverList.RewindableIterator; | 58 import org.chromium.base.ObserverList.RewindableIterator; |
58 import org.chromium.base.TraceEvent; | 59 import org.chromium.base.TraceEvent; |
59 import org.chromium.content.R; | 60 import org.chromium.content.R; |
60 import org.chromium.content.browser.ScreenOrientationListener.ScreenOrientationO
bserver; | 61 import org.chromium.content.browser.ScreenOrientationListener.ScreenOrientationO
bserver; |
61 import org.chromium.content.browser.accessibility.AccessibilityInjector; | 62 import org.chromium.content.browser.accessibility.AccessibilityInjector; |
62 import org.chromium.content.browser.accessibility.BrowserAccessibilityManager; | 63 import org.chromium.content.browser.accessibility.BrowserAccessibilityManager; |
63 import org.chromium.content.browser.input.AdapterInputConnection; | 64 import org.chromium.content.browser.input.AdapterInputConnection; |
64 import org.chromium.content.browser.input.GamepadList; | 65 import org.chromium.content.browser.input.GamepadList; |
65 import org.chromium.content.browser.input.HandleView; | |
66 import org.chromium.content.browser.input.ImeAdapter; | 66 import org.chromium.content.browser.input.ImeAdapter; |
67 import org.chromium.content.browser.input.ImeAdapter.AdapterInputConnectionFacto
ry; | 67 import org.chromium.content.browser.input.ImeAdapter.AdapterInputConnectionFacto
ry; |
68 import org.chromium.content.browser.input.InputMethodManagerWrapper; | 68 import org.chromium.content.browser.input.InputMethodManagerWrapper; |
69 import org.chromium.content.browser.input.InsertionHandleController; | 69 import org.chromium.content.browser.input.PastePopupMenu; |
| 70 import org.chromium.content.browser.input.PastePopupMenu.PastePopupMenuDelegate; |
| 71 import org.chromium.content.browser.input.PopupTouchHandleDrawable; |
| 72 import org.chromium.content.browser.input.PopupTouchHandleDrawable.PopupTouchHan
dleDrawableDelegate; |
70 import org.chromium.content.browser.input.SelectPopup; | 73 import org.chromium.content.browser.input.SelectPopup; |
71 import org.chromium.content.browser.input.SelectPopupDialog; | 74 import org.chromium.content.browser.input.SelectPopupDialog; |
72 import org.chromium.content.browser.input.SelectPopupDropdown; | 75 import org.chromium.content.browser.input.SelectPopupDropdown; |
73 import org.chromium.content.browser.input.SelectPopupItem; | 76 import org.chromium.content.browser.input.SelectPopupItem; |
74 import org.chromium.content.browser.input.SelectionHandleController; | 77 import org.chromium.content.browser.input.SelectionEventType; |
75 import org.chromium.content.common.ContentSwitches; | 78 import org.chromium.content.common.ContentSwitches; |
76 import org.chromium.content_public.browser.GestureStateListener; | 79 import org.chromium.content_public.browser.GestureStateListener; |
77 import org.chromium.content_public.browser.WebContents; | 80 import org.chromium.content_public.browser.WebContents; |
78 import org.chromium.ui.base.DeviceFormFactor; | 81 import org.chromium.ui.base.DeviceFormFactor; |
79 import org.chromium.ui.base.ViewAndroid; | 82 import org.chromium.ui.base.ViewAndroid; |
80 import org.chromium.ui.base.ViewAndroidDelegate; | 83 import org.chromium.ui.base.ViewAndroidDelegate; |
81 import org.chromium.ui.base.WindowAndroid; | 84 import org.chromium.ui.base.WindowAndroid; |
82 import org.chromium.ui.gfx.DeviceDisplayInfo; | 85 import org.chromium.ui.gfx.DeviceDisplayInfo; |
83 | 86 |
84 import java.lang.annotation.Annotation; | 87 import java.lang.annotation.Annotation; |
(...skipping 16 matching lines...) Expand all Loading... |
101 private static final String TAG = "ContentViewCore"; | 104 private static final String TAG = "ContentViewCore"; |
102 | 105 |
103 // Used to avoid enabling zooming in / out if resulting zooming will | 106 // Used to avoid enabling zooming in / out if resulting zooming will |
104 // produce little visible difference. | 107 // produce little visible difference. |
105 private static final float ZOOM_CONTROLS_EPSILON = 0.007f; | 108 private static final float ZOOM_CONTROLS_EPSILON = 0.007f; |
106 | 109 |
107 // Used to represent gestures for long press and long tap. | 110 // Used to represent gestures for long press and long tap. |
108 private static final int IS_LONG_PRESS = 1; | 111 private static final int IS_LONG_PRESS = 1; |
109 private static final int IS_LONG_TAP = 2; | 112 private static final int IS_LONG_TAP = 2; |
110 | 113 |
111 // Length of the delay (in ms) before fading in handles after the last page
movement. | |
112 private static final int TEXT_HANDLE_FADE_IN_DELAY = 300; | |
113 | |
114 // These values are obtained from Samsung. | 114 // These values are obtained from Samsung. |
115 private static final int SPEN_ACTION_DOWN = 211; | 115 private static final int SPEN_ACTION_DOWN = 211; |
116 private static final int SPEN_ACTION_UP = 212; | 116 private static final int SPEN_ACTION_UP = 212; |
117 private static final int SPEN_ACTION_MOVE = 213; | 117 private static final int SPEN_ACTION_MOVE = 213; |
118 private static final int SPEN_ACTION_CANCEL = 214; | 118 private static final int SPEN_ACTION_CANCEL = 214; |
119 private static Boolean sIsSPenSupported; | 119 private static Boolean sIsSPenSupported; |
120 | 120 |
121 // If the embedder adds a JavaScript interface object that contains an indir
ect reference to | 121 // If the embedder adds a JavaScript interface object that contains an indir
ect reference to |
122 // the ContentViewCore, then storing a strong ref to the interface object on
the native | 122 // the ContentViewCore, then storing a strong ref to the interface object on
the native |
123 // side would prevent garbage collection of the ContentViewCore (as that str
ong ref would | 123 // side would prevent garbage collection of the ContentViewCore (as that str
ong ref would |
(...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
263 private SelectPopup mSelectPopup; | 263 private SelectPopup mSelectPopup; |
264 | 264 |
265 private Runnable mFakeMouseMoveRunnable = null; | 265 private Runnable mFakeMouseMoveRunnable = null; |
266 | 266 |
267 // Only valid when focused on a text / password field. | 267 // Only valid when focused on a text / password field. |
268 private ImeAdapter mImeAdapter; | 268 private ImeAdapter mImeAdapter; |
269 private ImeAdapter.AdapterInputConnectionFactory mAdapterInputConnectionFact
ory; | 269 private ImeAdapter.AdapterInputConnectionFactory mAdapterInputConnectionFact
ory; |
270 private AdapterInputConnection mInputConnection; | 270 private AdapterInputConnection mInputConnection; |
271 private InputMethodManagerWrapper mInputMethodManagerWrapper; | 271 private InputMethodManagerWrapper mInputMethodManagerWrapper; |
272 | 272 |
273 private SelectionHandleController mSelectionHandleController; | 273 // Lazily created paste popup menu, triggered either via long press in an |
274 private InsertionHandleController mInsertionHandleController; | 274 // editable region or from tapping the insertion handle. |
| 275 private PastePopupMenu mPastePopupMenu; |
275 | 276 |
276 private Runnable mDeferredHandleFadeInRunnable; | 277 private PopupTouchHandleDrawableDelegate mTouchHandleDelegate; |
277 | 278 |
278 private PositionObserver mPositionObserver; | 279 private PositionObserver mPositionObserver; |
279 private PositionObserver.Listener mPositionListener; | |
280 | 280 |
281 // Size of the viewport in physical pixels as set from onSizeChanged. | 281 // Size of the viewport in physical pixels as set from onSizeChanged. |
282 private int mViewportWidthPix; | 282 private int mViewportWidthPix; |
283 private int mViewportHeightPix; | 283 private int mViewportHeightPix; |
284 private int mPhysicalBackingWidthPix; | 284 private int mPhysicalBackingWidthPix; |
285 private int mPhysicalBackingHeightPix; | 285 private int mPhysicalBackingHeightPix; |
286 private int mOverdrawBottomHeightPix; | 286 private int mOverdrawBottomHeightPix; |
287 private int mViewportSizeOffsetWidthPix; | 287 private int mViewportSizeOffsetWidthPix; |
288 private int mViewportSizeOffsetHeightPix; | 288 private int mViewportSizeOffsetHeightPix; |
289 | 289 |
290 // Cached copy of all positions and scales as reported by the renderer. | 290 // Cached copy of all positions and scales as reported by the renderer. |
291 private final RenderCoordinates mRenderCoordinates; | 291 private final RenderCoordinates mRenderCoordinates; |
292 | 292 |
293 private final RenderCoordinates.NormalizedPoint mStartHandlePoint; | |
294 private final RenderCoordinates.NormalizedPoint mEndHandlePoint; | |
295 private final RenderCoordinates.NormalizedPoint mInsertionHandlePoint; | |
296 | |
297 // Tracks whether a selection is currently active. When applied to selected
text, indicates | 293 // Tracks whether a selection is currently active. When applied to selected
text, indicates |
298 // whether the last selected text is still highlighted. | 294 // whether the last selected text is still highlighted. |
299 private boolean mHasSelection; | 295 private boolean mHasSelection; |
| 296 private boolean mHasInsertion; |
300 private String mLastSelectedText; | 297 private String mLastSelectedText; |
301 private boolean mFocusedNodeEditable; | 298 private boolean mFocusedNodeEditable; |
302 private ActionMode mActionMode; | 299 private ActionMode mActionMode; |
303 private boolean mUnselectAllOnActionModeDismiss; | 300 private boolean mUnselectAllOnActionModeDismiss; |
304 | 301 |
305 // Delegate that will handle GET downloads, and be notified of completion of
POST downloads. | 302 // Delegate that will handle GET downloads, and be notified of completion of
POST downloads. |
306 private ContentViewDownloadDelegate mDownloadDelegate; | 303 private ContentViewDownloadDelegate mDownloadDelegate; |
307 | 304 |
308 // The AccessibilityInjector that handles loading Accessibility scripts into
the web page. | 305 // The AccessibilityInjector that handles loading Accessibility scripts into
the web page. |
309 private AccessibilityInjector mAccessibilityInjector; | 306 private AccessibilityInjector mAccessibilityInjector; |
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
383 mInputMethodManagerWrapper = new InputMethodManagerWrapper(mContext); | 380 mInputMethodManagerWrapper = new InputMethodManagerWrapper(mContext); |
384 | 381 |
385 mRenderCoordinates = new RenderCoordinates(); | 382 mRenderCoordinates = new RenderCoordinates(); |
386 float deviceScaleFactor = getContext().getResources().getDisplayMetrics(
).density; | 383 float deviceScaleFactor = getContext().getResources().getDisplayMetrics(
).density; |
387 String forceScaleFactor = CommandLine.getInstance().getSwitchValue( | 384 String forceScaleFactor = CommandLine.getInstance().getSwitchValue( |
388 ContentSwitches.FORCE_DEVICE_SCALE_FACTOR); | 385 ContentSwitches.FORCE_DEVICE_SCALE_FACTOR); |
389 if (forceScaleFactor != null) { | 386 if (forceScaleFactor != null) { |
390 deviceScaleFactor = Float.valueOf(forceScaleFactor); | 387 deviceScaleFactor = Float.valueOf(forceScaleFactor); |
391 } | 388 } |
392 mRenderCoordinates.setDeviceScaleFactor(deviceScaleFactor); | 389 mRenderCoordinates.setDeviceScaleFactor(deviceScaleFactor); |
393 mStartHandlePoint = mRenderCoordinates.createNormalizedPoint(); | |
394 mEndHandlePoint = mRenderCoordinates.createNormalizedPoint(); | |
395 mInsertionHandlePoint = mRenderCoordinates.createNormalizedPoint(); | |
396 mAccessibilityManager = (AccessibilityManager) | 390 mAccessibilityManager = (AccessibilityManager) |
397 getContext().getSystemService(Context.ACCESSIBILITY_SERVICE); | 391 getContext().getSystemService(Context.ACCESSIBILITY_SERVICE); |
398 mGestureStateListeners = new ObserverList<GestureStateListener>(); | 392 mGestureStateListeners = new ObserverList<GestureStateListener>(); |
399 mGestureStateListenersIterator = mGestureStateListeners.rewindableIterat
or(); | 393 mGestureStateListenersIterator = mGestureStateListeners.rewindableIterat
or(); |
400 | 394 |
401 mEditable = Editable.Factory.getInstance().newEditable(""); | 395 mEditable = Editable.Factory.getInstance().newEditable(""); |
402 Selection.setSelection(mEditable, 0); | 396 Selection.setSelection(mEditable, 0); |
403 } | 397 } |
404 | 398 |
405 /** | 399 /** |
(...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
543 return mInputConnection; | 537 return mInputConnection; |
544 } | 538 } |
545 | 539 |
546 private ImeAdapter createImeAdapter(Context context) { | 540 private ImeAdapter createImeAdapter(Context context) { |
547 return new ImeAdapter(mInputMethodManagerWrapper, | 541 return new ImeAdapter(mInputMethodManagerWrapper, |
548 new ImeAdapter.ImeAdapterDelegate() { | 542 new ImeAdapter.ImeAdapterDelegate() { |
549 @Override | 543 @Override |
550 public void onImeEvent(boolean isFinish) { | 544 public void onImeEvent(boolean isFinish) { |
551 getContentViewClient().onImeEvent(); | 545 getContentViewClient().onImeEvent(); |
552 if (!isFinish) { | 546 if (!isFinish) { |
553 hideHandles(); | 547 hideTextHandles(); |
554 } | 548 } |
555 } | 549 } |
556 | 550 |
557 @Override | 551 @Override |
558 public void onDismissInput() { | 552 public void onDismissInput() { |
559 getContentViewClient().onImeStateChangeRequested(false); | 553 getContentViewClient().onImeStateChangeRequested(false); |
560 } | 554 } |
561 | 555 |
562 @Override | 556 @Override |
563 public View getAttachedView() { | 557 public View getAttachedView() { |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
606 // is a vital component of the ContentViewCore, so embedders must exercise c
aution in what | 600 // is a vital component of the ContentViewCore, so embedders must exercise c
aution in what |
607 // they do with the ContentViewCore before calling initialize(). | 601 // they do with the ContentViewCore before calling initialize(). |
608 // We supply the nativeWebContents pointer here rather than in the construct
or to allow us | 602 // We supply the nativeWebContents pointer here rather than in the construct
or to allow us |
609 // to set the private browsing mode at a later point for the WebView impleme
ntation. | 603 // to set the private browsing mode at a later point for the WebView impleme
ntation. |
610 // Note that the caller remains the owner of the nativeWebContents and is re
sponsible for | 604 // Note that the caller remains the owner of the nativeWebContents and is re
sponsible for |
611 // deleting it after destroying the ContentViewCore. | 605 // deleting it after destroying the ContentViewCore. |
612 public void initialize(ViewGroup containerView, InternalAccessDelegate inter
nalDispatcher, | 606 public void initialize(ViewGroup containerView, InternalAccessDelegate inter
nalDispatcher, |
613 long nativeWebContents, WindowAndroid windowAndroid) { | 607 long nativeWebContents, WindowAndroid windowAndroid) { |
614 setContainerView(containerView); | 608 setContainerView(containerView); |
615 | 609 |
616 mPositionListener = new PositionObserver.Listener() { | |
617 @Override | |
618 public void onPositionChanged(int x, int y) { | |
619 if (isSelectionHandleShowing() || isInsertionHandleShowing()) { | |
620 temporarilyHideTextHandles(); | |
621 } | |
622 } | |
623 }; | |
624 | |
625 long windowNativePointer = windowAndroid.getNativePointer(); | 610 long windowNativePointer = windowAndroid.getNativePointer(); |
626 assert windowNativePointer != 0; | 611 assert windowNativePointer != 0; |
627 mViewAndroid = new ViewAndroid(windowAndroid, getViewAndroidDelegate()); | 612 mViewAndroid = new ViewAndroid(windowAndroid, getViewAndroidDelegate()); |
628 long viewAndroidNativePointer = mViewAndroid.getNativePointer(); | 613 long viewAndroidNativePointer = mViewAndroid.getNativePointer(); |
629 assert viewAndroidNativePointer != 0; | 614 assert viewAndroidNativePointer != 0; |
630 | 615 |
631 mZoomControlsDelegate = new ZoomControlsDelegate() { | 616 mZoomControlsDelegate = new ZoomControlsDelegate() { |
632 @Override | 617 @Override |
633 public void invokeZoomPicker() {} | 618 public void invokeZoomPicker() {} |
634 @Override | 619 @Override |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
684 * <li>Disconnecting the old container view from this ContentViewCore</l
i> | 669 * <li>Disconnecting the old container view from this ContentViewCore</l
i> |
685 * <li>Updating the InternalAccessDelegate</li> | 670 * <li>Updating the InternalAccessDelegate</li> |
686 * <li>Reconciling the state of this ContentViewCore with the new contai
ner view</li> | 671 * <li>Reconciling the state of this ContentViewCore with the new contai
ner view</li> |
687 * <li>Tearing down and recreating the native GL rendering where appropr
iate</li> | 672 * <li>Tearing down and recreating the native GL rendering where appropr
iate</li> |
688 * <li>etc.</li> | 673 * <li>etc.</li> |
689 * </ul> | 674 * </ul> |
690 */ | 675 */ |
691 public void setContainerView(ViewGroup containerView) { | 676 public void setContainerView(ViewGroup containerView) { |
692 TraceEvent.begin(); | 677 TraceEvent.begin(); |
693 if (mContainerView != null) { | 678 if (mContainerView != null) { |
694 mPositionObserver.removeListener(mPositionListener); | 679 mPastePopupMenu = null; |
695 mSelectionHandleController = null; | |
696 mInsertionHandleController = null; | |
697 mInputConnection = null; | 680 mInputConnection = null; |
| 681 hidePopups(); |
698 } | 682 } |
699 | 683 |
700 mContainerView = containerView; | 684 mContainerView = containerView; |
701 mPositionObserver = new ViewPositionObserver(mContainerView); | 685 mPositionObserver = new ViewPositionObserver(mContainerView); |
702 String contentDescription = "Web View"; | 686 String contentDescription = "Web View"; |
703 if (R.string.accessibility_content_view == 0) { | 687 if (R.string.accessibility_content_view == 0) { |
704 Log.w(TAG, "Setting contentDescription to 'Web View' as no value was
specified."); | 688 Log.w(TAG, "Setting contentDescription to 'Web View' as no value was
specified."); |
705 } else { | 689 } else { |
706 contentDescription = mContext.getResources().getString( | 690 contentDescription = mContext.getResources().getString( |
707 R.string.accessibility_content_view); | 691 R.string.accessibility_content_view); |
(...skipping 451 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1159 return MotionEvent.ACTION_CANCEL; | 1143 return MotionEvent.ACTION_CANCEL; |
1160 default: | 1144 default: |
1161 return eventActionMasked; | 1145 return eventActionMasked; |
1162 } | 1146 } |
1163 } | 1147 } |
1164 | 1148 |
1165 /** | 1149 /** |
1166 * @see View#onTouchEvent(MotionEvent) | 1150 * @see View#onTouchEvent(MotionEvent) |
1167 */ | 1151 */ |
1168 public boolean onTouchEvent(MotionEvent event) { | 1152 public boolean onTouchEvent(MotionEvent event) { |
| 1153 final boolean isTouchHandleEvent = false; |
| 1154 return onTouchEventImpl(event, isTouchHandleEvent); |
| 1155 } |
| 1156 |
| 1157 private boolean onTouchEventImpl(MotionEvent event, boolean isTouchHandleEve
nt) { |
1169 TraceEvent.begin("onTouchEvent"); | 1158 TraceEvent.begin("onTouchEvent"); |
1170 try { | 1159 try { |
1171 int eventAction = event.getActionMasked(); | 1160 int eventAction = event.getActionMasked(); |
1172 | 1161 |
1173 if (eventAction == MotionEvent.ACTION_DOWN) { | 1162 if (eventAction == MotionEvent.ACTION_DOWN) { |
1174 cancelRequestToScrollFocusedEditableNodeIntoView(); | 1163 cancelRequestToScrollFocusedEditableNodeIntoView(); |
1175 } | 1164 } |
1176 | 1165 |
1177 if (isSPenSupported(mContext)) | 1166 if (isSPenSupported(mContext)) |
1178 eventAction = convertSPenEventAction(eventAction); | 1167 eventAction = convertSPenEventAction(eventAction); |
1179 | 1168 if (!isValidTouchEventActionForNative(eventAction)) return false; |
1180 // Only these actions have any effect on gesture detection. Other | |
1181 // actions have no corresponding WebTouchEvent type and may confuse
the | |
1182 // touch pipline, so we ignore them entirely. | |
1183 if (eventAction != MotionEvent.ACTION_DOWN | |
1184 && eventAction != MotionEvent.ACTION_UP | |
1185 && eventAction != MotionEvent.ACTION_CANCEL | |
1186 && eventAction != MotionEvent.ACTION_MOVE | |
1187 && eventAction != MotionEvent.ACTION_POINTER_DOWN | |
1188 && eventAction != MotionEvent.ACTION_POINTER_UP) { | |
1189 return false; | |
1190 } | |
1191 | 1169 |
1192 if (mNativeContentViewCore == 0) return false; | 1170 if (mNativeContentViewCore == 0) return false; |
1193 | 1171 |
1194 // A zero offset is quite common, in which case the unnecessary copy
should be avoided. | 1172 // A zero offset is quite common, in which case the unnecessary copy
should be avoided. |
1195 MotionEvent offset = null; | 1173 MotionEvent offset = null; |
1196 if (mCurrentTouchOffsetX != 0 || mCurrentTouchOffsetY != 0) { | 1174 if (mCurrentTouchOffsetX != 0 || mCurrentTouchOffsetY != 0) { |
1197 offset = createOffsetMotionEvent(event); | 1175 offset = createOffsetMotionEvent(event); |
1198 event = offset; | 1176 event = offset; |
1199 } | 1177 } |
1200 | 1178 |
1201 final int pointerCount = event.getPointerCount(); | 1179 final int pointerCount = event.getPointerCount(); |
1202 final boolean consumed = nativeOnTouchEvent(mNativeContentViewCore,
event, | 1180 final boolean consumed = nativeOnTouchEvent(mNativeContentViewCore,
event, |
1203 event.getEventTime(), eventAction, | 1181 event.getEventTime(), eventAction, |
1204 pointerCount, event.getHistorySize(), event.getActionIndex()
, | 1182 pointerCount, event.getHistorySize(), event.getActionIndex()
, |
1205 event.getX(), event.getY(), | 1183 event.getX(), event.getY(), |
1206 pointerCount > 1 ? event.getX(1) : 0, | 1184 pointerCount > 1 ? event.getX(1) : 0, |
1207 pointerCount > 1 ? event.getY(1) : 0, | 1185 pointerCount > 1 ? event.getY(1) : 0, |
1208 event.getPointerId(0), pointerCount > 1 ? event.getPointerId
(1) : -1, | 1186 event.getPointerId(0), pointerCount > 1 ? event.getPointerId
(1) : -1, |
1209 event.getTouchMajor(), pointerCount > 1 ? event.getTouchMajo
r(1) : 0, | 1187 event.getTouchMajor(), pointerCount > 1 ? event.getTouchMajo
r(1) : 0, |
1210 event.getRawX(), event.getRawY(), | 1188 event.getRawX(), event.getRawY(), |
1211 event.getToolType(0), | 1189 event.getToolType(0), |
1212 pointerCount > 1 ? event.getToolType(1) : MotionEvent.TOOL_T
YPE_UNKNOWN, | 1190 pointerCount > 1 ? event.getToolType(1) : MotionEvent.TOOL_T
YPE_UNKNOWN, |
1213 event.getButtonState()); | 1191 event.getButtonState(), |
| 1192 isTouchHandleEvent); |
1214 | 1193 |
1215 if (offset != null) offset.recycle(); | 1194 if (offset != null) offset.recycle(); |
1216 return consumed; | 1195 return consumed; |
1217 } finally { | 1196 } finally { |
1218 TraceEvent.end("onTouchEvent"); | 1197 TraceEvent.end("onTouchEvent"); |
1219 } | 1198 } |
1220 } | 1199 } |
1221 | 1200 |
| 1201 private static boolean isValidTouchEventActionForNative(int eventAction) { |
| 1202 // Only these actions have any effect on gesture detection. Other |
| 1203 // actions have no corresponding WebTouchEvent type and may confuse the |
| 1204 // touch pipline, so we ignore them entirely. |
| 1205 return eventAction == MotionEvent.ACTION_DOWN |
| 1206 || eventAction == MotionEvent.ACTION_UP |
| 1207 || eventAction == MotionEvent.ACTION_CANCEL |
| 1208 || eventAction == MotionEvent.ACTION_MOVE |
| 1209 || eventAction == MotionEvent.ACTION_POINTER_DOWN |
| 1210 || eventAction == MotionEvent.ACTION_POINTER_UP; |
| 1211 } |
| 1212 |
1222 public void setIgnoreRemainingTouchEvents() { | 1213 public void setIgnoreRemainingTouchEvents() { |
1223 resetGestureDetection(); | 1214 resetGestureDetection(); |
1224 } | 1215 } |
1225 | 1216 |
1226 public boolean isScrollInProgress() { | 1217 public boolean isScrollInProgress() { |
1227 return mTouchScrollInProgress || mPotentiallyActiveFlingCount > 0; | 1218 return mTouchScrollInProgress || mPotentiallyActiveFlingCount > 0; |
1228 } | 1219 } |
1229 | 1220 |
1230 @SuppressWarnings("unused") | 1221 @SuppressWarnings("unused") |
1231 @CalledByNative | 1222 @CalledByNative |
1232 private void onFlingStartEventConsumed(int vx, int vy) { | 1223 private void onFlingStartEventConsumed(int vx, int vy) { |
1233 mTouchScrollInProgress = false; | 1224 mTouchScrollInProgress = false; |
1234 mPotentiallyActiveFlingCount++; | 1225 mPotentiallyActiveFlingCount++; |
1235 temporarilyHideTextHandles(); | |
1236 for (mGestureStateListenersIterator.rewind(); | 1226 for (mGestureStateListenersIterator.rewind(); |
1237 mGestureStateListenersIterator.hasNext();) { | 1227 mGestureStateListenersIterator.hasNext();) { |
1238 mGestureStateListenersIterator.next().onFlingStartGesture( | 1228 mGestureStateListenersIterator.next().onFlingStartGesture( |
1239 vx, vy, computeVerticalScrollOffset(), computeVerticalScroll
Extent()); | 1229 vx, vy, computeVerticalScrollOffset(), computeVerticalScroll
Extent()); |
1240 } | 1230 } |
1241 } | 1231 } |
1242 | 1232 |
1243 @SuppressWarnings("unused") | 1233 @SuppressWarnings("unused") |
1244 @CalledByNative | 1234 @CalledByNative |
1245 private void onFlingStartEventHadNoConsumer(int vx, int vy) { | 1235 private void onFlingStartEventHadNoConsumer(int vx, int vy) { |
1246 mTouchScrollInProgress = false; | 1236 mTouchScrollInProgress = false; |
1247 for (mGestureStateListenersIterator.rewind(); | 1237 for (mGestureStateListenersIterator.rewind(); |
1248 mGestureStateListenersIterator.hasNext();) { | 1238 mGestureStateListenersIterator.hasNext();) { |
1249 mGestureStateListenersIterator.next().onUnhandledFlingStartEvent(vx,
vy); | 1239 mGestureStateListenersIterator.next().onUnhandledFlingStartEvent(vx,
vy); |
1250 } | 1240 } |
1251 } | 1241 } |
1252 | 1242 |
1253 @SuppressWarnings("unused") | 1243 @SuppressWarnings("unused") |
1254 @CalledByNative | 1244 @CalledByNative |
1255 private void onFlingCancelEventAck() { | 1245 private void onFlingCancelEventAck() { |
1256 updateGestureStateListener(GestureEventType.FLING_CANCEL); | 1246 updateGestureStateListener(GestureEventType.FLING_CANCEL); |
1257 } | 1247 } |
1258 | 1248 |
1259 @SuppressWarnings("unused") | 1249 @SuppressWarnings("unused") |
1260 @CalledByNative | 1250 @CalledByNative |
1261 private void onScrollBeginEventAck() { | 1251 private void onScrollBeginEventAck() { |
1262 mTouchScrollInProgress = true; | 1252 mTouchScrollInProgress = true; |
1263 temporarilyHideTextHandles(); | 1253 hidePastePopup(); |
1264 mZoomControlsDelegate.invokeZoomPicker(); | 1254 mZoomControlsDelegate.invokeZoomPicker(); |
1265 updateGestureStateListener(GestureEventType.SCROLL_START); | 1255 updateGestureStateListener(GestureEventType.SCROLL_START); |
1266 } | 1256 } |
1267 | 1257 |
1268 @SuppressWarnings("unused") | 1258 @SuppressWarnings("unused") |
1269 @CalledByNative | 1259 @CalledByNative |
1270 private void onScrollUpdateGestureConsumed() { | 1260 private void onScrollUpdateGestureConsumed() { |
1271 mZoomControlsDelegate.invokeZoomPicker(); | 1261 mZoomControlsDelegate.invokeZoomPicker(); |
1272 for (mGestureStateListenersIterator.rewind(); | 1262 for (mGestureStateListenersIterator.rewind(); |
1273 mGestureStateListenersIterator.hasNext();) { | 1263 mGestureStateListenersIterator.hasNext();) { |
1274 mGestureStateListenersIterator.next().onScrollUpdateGestureConsumed(
); | 1264 mGestureStateListenersIterator.next().onScrollUpdateGestureConsumed(
); |
1275 } | 1265 } |
1276 } | 1266 } |
1277 | 1267 |
1278 @SuppressWarnings("unused") | 1268 @SuppressWarnings("unused") |
1279 @CalledByNative | 1269 @CalledByNative |
1280 private void onScrollEndEventAck() { | 1270 private void onScrollEndEventAck() { |
1281 if (!mTouchScrollInProgress) return; | 1271 if (!mTouchScrollInProgress) return; |
1282 mTouchScrollInProgress = false; | 1272 mTouchScrollInProgress = false; |
1283 updateGestureStateListener(GestureEventType.SCROLL_END); | 1273 updateGestureStateListener(GestureEventType.SCROLL_END); |
1284 } | 1274 } |
1285 | 1275 |
1286 @SuppressWarnings("unused") | 1276 @SuppressWarnings("unused") |
1287 @CalledByNative | 1277 @CalledByNative |
1288 private void onPinchBeginEventAck() { | 1278 private void onPinchBeginEventAck() { |
1289 temporarilyHideTextHandles(); | |
1290 updateGestureStateListener(GestureEventType.PINCH_BEGIN); | 1279 updateGestureStateListener(GestureEventType.PINCH_BEGIN); |
1291 } | 1280 } |
1292 | 1281 |
1293 @SuppressWarnings("unused") | 1282 @SuppressWarnings("unused") |
1294 @CalledByNative | 1283 @CalledByNative |
1295 private void onPinchEndEventAck() { | 1284 private void onPinchEndEventAck() { |
1296 updateGestureStateListener(GestureEventType.PINCH_END); | 1285 updateGestureStateListener(GestureEventType.PINCH_END); |
1297 } | 1286 } |
1298 | 1287 |
1299 @SuppressWarnings("unused") | 1288 @SuppressWarnings("unused") |
1300 @CalledByNative | 1289 @CalledByNative |
1301 private void onSingleTapEventAck(boolean consumed, int x, int y) { | 1290 private void onSingleTapEventAck(boolean consumed, int x, int y) { |
1302 for (mGestureStateListenersIterator.rewind(); | 1291 for (mGestureStateListenersIterator.rewind(); |
1303 mGestureStateListenersIterator.hasNext();) { | 1292 mGestureStateListenersIterator.hasNext();) { |
1304 mGestureStateListenersIterator.next().onSingleTap(consumed, x, y); | 1293 mGestureStateListenersIterator.next().onSingleTap(consumed, x, y); |
1305 } | 1294 } |
1306 } | 1295 } |
1307 | 1296 |
1308 @SuppressWarnings("unused") | |
1309 @CalledByNative | |
1310 private void onDoubleTapEventAck() { | |
1311 temporarilyHideTextHandles(); | |
1312 } | |
1313 | |
1314 /** | 1297 /** |
1315 * Called just prior to a tap or press gesture being forwarded to the render
er. | 1298 * Called just prior to a tap or press gesture being forwarded to the render
er. |
1316 */ | 1299 */ |
1317 @SuppressWarnings("unused") | 1300 @SuppressWarnings("unused") |
1318 @CalledByNative | 1301 @CalledByNative |
1319 private boolean filterTapOrPressEvent(int type, int x, int y) { | 1302 private boolean filterTapOrPressEvent(int type, int x, int y) { |
1320 if (type == GestureEventType.LONG_PRESS && offerLongPressToEmbedder()) { | 1303 if (type == GestureEventType.LONG_PRESS && offerLongPressToEmbedder()) { |
1321 return true; | 1304 return true; |
1322 } | 1305 } |
1323 updateForTapOrPress(type, x, y); | 1306 updateForTapOrPress(type, x, y); |
(...skipping 163 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1487 * Return the ContentSettings object used to retrieve the settings for this | 1470 * Return the ContentSettings object used to retrieve the settings for this |
1488 * ContentViewCore. For modifications, ChromeNativePreferences is to be used
. | 1471 * ContentViewCore. For modifications, ChromeNativePreferences is to be used
. |
1489 * @return A ContentSettings object that can be used to retrieve this | 1472 * @return A ContentSettings object that can be used to retrieve this |
1490 * ContentViewCore's settings. | 1473 * ContentViewCore's settings. |
1491 */ | 1474 */ |
1492 public ContentSettings getContentSettings() { | 1475 public ContentSettings getContentSettings() { |
1493 return mContentSettings; | 1476 return mContentSettings; |
1494 } | 1477 } |
1495 | 1478 |
1496 private void hidePopups() { | 1479 private void hidePopups() { |
| 1480 mUnselectAllOnActionModeDismiss = true; |
| 1481 hideSelectActionBar(); |
| 1482 hidePastePopup(); |
1497 hideSelectPopup(); | 1483 hideSelectPopup(); |
1498 hideHandles(); | 1484 hideTextHandles(); |
1499 hideSelectActionBar(); | |
1500 } | 1485 } |
1501 | 1486 |
1502 public void hideSelectActionBar() { | 1487 public void hideSelectActionBar() { |
1503 if (mActionMode != null) { | 1488 if (mActionMode != null) { |
1504 mActionMode.finish(); | 1489 mActionMode.finish(); |
1505 mActionMode = null; | 1490 mActionMode = null; |
1506 } | 1491 } |
1507 } | 1492 } |
1508 | 1493 |
1509 public boolean isSelectActionBarShowing() { | 1494 public boolean isSelectActionBarShowing() { |
(...skipping 430 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1940 | 1925 |
1941 if (mContainerView.isFocusable() && mContainerView.isFocusableInTouchMod
e() | 1926 if (mContainerView.isFocusable() && mContainerView.isFocusableInTouchMod
e() |
1942 && !mContainerView.isFocused()) { | 1927 && !mContainerView.isFocused()) { |
1943 mContainerView.requestFocus(); | 1928 mContainerView.requestFocus(); |
1944 } | 1929 } |
1945 | 1930 |
1946 if (!mPopupZoomer.isShowing()) mPopupZoomer.setLastTouch(xPix, yPix); | 1931 if (!mPopupZoomer.isShowing()) mPopupZoomer.setLastTouch(xPix, yPix); |
1947 | 1932 |
1948 mLastTapX = (int) xPix; | 1933 mLastTapX = (int) xPix; |
1949 mLastTapY = (int) yPix; | 1934 mLastTapY = (int) yPix; |
1950 | |
1951 if (type == GestureEventType.LONG_PRESS | |
1952 || type == GestureEventType.LONG_TAP) { | |
1953 getInsertionHandleController().allowAutomaticShowing(); | |
1954 getSelectionHandleController().allowAutomaticShowing(); | |
1955 } else { | |
1956 if (mFocusedNodeEditable) getInsertionHandleController().allowAutoma
ticShowing(); | |
1957 } | |
1958 } | 1935 } |
1959 | 1936 |
1960 /** | 1937 /** |
1961 * @return The x coordinate for the last point that a tap or press gesture w
as initiated from. | 1938 * @return The x coordinate for the last point that a tap or press gesture w
as initiated from. |
1962 */ | 1939 */ |
1963 public int getLastTapX() { | 1940 public int getLastTapX() { |
1964 return mLastTapX; | 1941 return mLastTapX; |
1965 } | 1942 } |
1966 | 1943 |
1967 /** | 1944 /** |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2010 */ | 1987 */ |
2011 public void setDownloadDelegate(ContentViewDownloadDelegate delegate) { | 1988 public void setDownloadDelegate(ContentViewDownloadDelegate delegate) { |
2012 mDownloadDelegate = delegate; | 1989 mDownloadDelegate = delegate; |
2013 } | 1990 } |
2014 | 1991 |
2015 // Called by DownloadController. | 1992 // Called by DownloadController. |
2016 ContentViewDownloadDelegate getDownloadDelegate() { | 1993 ContentViewDownloadDelegate getDownloadDelegate() { |
2017 return mDownloadDelegate; | 1994 return mDownloadDelegate; |
2018 } | 1995 } |
2019 | 1996 |
2020 private SelectionHandleController getSelectionHandleController() { | |
2021 if (mSelectionHandleController == null) { | |
2022 mSelectionHandleController = new SelectionHandleController( | |
2023 getContainerView(), mPositionObserver) { | |
2024 @Override | |
2025 public void selectBetweenCoordinates(int x1, int y1, int x2, int
y2) { | |
2026 if (mNativeContentViewCore != 0 && !(x1 == x2 && y1 == y2))
{ | |
2027 nativeSelectBetweenCoordinates(mNativeContentViewCore, | |
2028 x1, y1 - mRenderCoordinates.getContentOffsetYPix
(), | |
2029 x2, y2 - mRenderCoordinates.getContentOffsetYPix
()); | |
2030 } | |
2031 } | |
2032 | |
2033 @Override | |
2034 public void showHandles(int startDir, int endDir) { | |
2035 final boolean wasShowing = isShowing(); | |
2036 super.showHandles(startDir, endDir); | |
2037 if (!wasShowing || mActionMode == null) showSelectActionBar(
); | |
2038 } | |
2039 | |
2040 }; | |
2041 | |
2042 mSelectionHandleController.hideAndDisallowAutomaticShowing(); | |
2043 } | |
2044 | |
2045 return mSelectionHandleController; | |
2046 } | |
2047 | |
2048 private InsertionHandleController getInsertionHandleController() { | |
2049 if (mInsertionHandleController == null) { | |
2050 mInsertionHandleController = new InsertionHandleController( | |
2051 getContainerView(), mPositionObserver) { | |
2052 private static final int AVERAGE_LINE_HEIGHT = 14; | |
2053 | |
2054 @Override | |
2055 public void setCursorPosition(int x, int y) { | |
2056 if (mNativeContentViewCore != 0) { | |
2057 nativeMoveCaret(mNativeContentViewCore, | |
2058 x, y - mRenderCoordinates.getContentOffsetYPix()
); | |
2059 } | |
2060 } | |
2061 | |
2062 @Override | |
2063 public void paste() { | |
2064 mImeAdapter.paste(); | |
2065 hideHandles(); | |
2066 } | |
2067 | |
2068 @Override | |
2069 public int getLineHeight() { | |
2070 return (int) Math.ceil( | |
2071 mRenderCoordinates.fromLocalCssToPix(AVERAGE_LINE_HE
IGHT)); | |
2072 } | |
2073 | |
2074 @Override | |
2075 public void showHandle() { | |
2076 super.showHandle(); | |
2077 } | |
2078 }; | |
2079 | |
2080 mInsertionHandleController.hideAndDisallowAutomaticShowing(); | |
2081 } | |
2082 | |
2083 return mInsertionHandleController; | |
2084 } | |
2085 | |
2086 @VisibleForTesting | |
2087 public InsertionHandleController getInsertionHandleControllerForTest() { | |
2088 return mInsertionHandleController; | |
2089 } | |
2090 | |
2091 @VisibleForTesting | |
2092 public SelectionHandleController getSelectionHandleControllerForTest() { | |
2093 return mSelectionHandleController; | |
2094 } | |
2095 | |
2096 private void updateHandleScreenPositions() { | |
2097 if (isSelectionHandleShowing()) { | |
2098 mSelectionHandleController.setStartHandlePosition( | |
2099 mStartHandlePoint.getXPix(), mStartHandlePoint.getYPix()); | |
2100 mSelectionHandleController.setEndHandlePosition( | |
2101 mEndHandlePoint.getXPix(), mEndHandlePoint.getYPix()); | |
2102 } | |
2103 | |
2104 if (isInsertionHandleShowing()) { | |
2105 mInsertionHandleController.setHandlePosition( | |
2106 mInsertionHandlePoint.getXPix(), mInsertionHandlePoint.getYP
ix()); | |
2107 } | |
2108 } | |
2109 | |
2110 private void hideHandles() { | |
2111 if (mSelectionHandleController != null) { | |
2112 mSelectionHandleController.hideAndDisallowAutomaticShowing(); | |
2113 } | |
2114 if (mInsertionHandleController != null) { | |
2115 mInsertionHandleController.hideAndDisallowAutomaticShowing(); | |
2116 } | |
2117 mPositionObserver.removeListener(mPositionListener); | |
2118 } | |
2119 | |
2120 private void showSelectActionBar() { | 1997 private void showSelectActionBar() { |
2121 if (mActionMode != null) { | 1998 if (mActionMode != null) { |
2122 mActionMode.invalidate(); | 1999 mActionMode.invalidate(); |
2123 return; | 2000 return; |
2124 } | 2001 } |
2125 | 2002 |
2126 // Start a new action mode with a SelectActionModeCallback. | 2003 // Start a new action mode with a SelectActionModeCallback. |
2127 SelectActionModeCallback.ActionHandler actionHandler = | 2004 SelectActionModeCallback.ActionHandler actionHandler = |
2128 new SelectActionModeCallback.ActionHandler() { | 2005 new SelectActionModeCallback.ActionHandler() { |
2129 @Override | 2006 @Override |
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2196 | 2073 |
2197 @Override | 2074 @Override |
2198 public boolean isSelectionEditable() { | 2075 public boolean isSelectionEditable() { |
2199 return mFocusedNodeEditable; | 2076 return mFocusedNodeEditable; |
2200 } | 2077 } |
2201 | 2078 |
2202 @Override | 2079 @Override |
2203 public void onDestroyActionMode() { | 2080 public void onDestroyActionMode() { |
2204 mActionMode = null; | 2081 mActionMode = null; |
2205 if (mUnselectAllOnActionModeDismiss) { | 2082 if (mUnselectAllOnActionModeDismiss) { |
2206 hideHandles(); | 2083 hideTextHandles(); |
2207 if (isSelectionEditable()) { | 2084 if (isSelectionEditable()) { |
2208 int selectionEnd = Selection.getSelectionEnd(mEditable); | 2085 int selectionEnd = Selection.getSelectionEnd(mEditable); |
2209 mInputConnection.setSelection(selectionEnd, selectionEnd
); | 2086 mInputConnection.setSelection(selectionEnd, selectionEnd
); |
2210 } else { | 2087 } else { |
2211 mImeAdapter.unselect(); | 2088 mImeAdapter.unselect(); |
2212 } | 2089 } |
2213 } | 2090 } |
2214 getContentViewClient().onContextualActionBarHidden(); | 2091 getContentViewClient().onContextualActionBarHidden(); |
2215 } | 2092 } |
2216 | 2093 |
(...skipping 23 matching lines...) Expand all Loading... |
2240 } | 2117 } |
2241 mUnselectAllOnActionModeDismiss = true; | 2118 mUnselectAllOnActionModeDismiss = true; |
2242 if (mActionMode == null) { | 2119 if (mActionMode == null) { |
2243 // There is no ActionMode, so remove the selection. | 2120 // There is no ActionMode, so remove the selection. |
2244 mImeAdapter.unselect(); | 2121 mImeAdapter.unselect(); |
2245 } else { | 2122 } else { |
2246 getContentViewClient().onContextualActionBarShown(); | 2123 getContentViewClient().onContextualActionBarShown(); |
2247 } | 2124 } |
2248 } | 2125 } |
2249 | 2126 |
| 2127 private void hidePastePopup() { |
| 2128 if (mPastePopupMenu == null) return; |
| 2129 mPastePopupMenu.hide(); |
| 2130 } |
| 2131 |
| 2132 @CalledByNative |
| 2133 private void onSelectionEvent(int eventType, float posXDip, float posYDip) { |
| 2134 switch (eventType) { |
| 2135 case SelectionEventType.SELECTION_SHOWN: |
| 2136 mHasSelection = true; |
| 2137 // TODO(cjhopman): Remove this when there is a better signal tha
t long press caused |
| 2138 // a selection. See http://crbug.com/150151. |
| 2139 mContainerView.performHapticFeedback(HapticFeedbackConstants.LON
G_PRESS); |
| 2140 showSelectActionBar(); |
| 2141 break; |
| 2142 |
| 2143 case SelectionEventType.SELECTION_CLEARED: |
| 2144 mHasSelection = false; |
| 2145 mUnselectAllOnActionModeDismiss = false; |
| 2146 hideSelectActionBar(); |
| 2147 break; |
| 2148 |
| 2149 case SelectionEventType.INSERTION_SHOWN: |
| 2150 mHasInsertion = true; |
| 2151 break; |
| 2152 |
| 2153 case SelectionEventType.INSERTION_MOVED: |
| 2154 // TODO(jdduke): Handle case where movement triggered by focus. |
| 2155 hidePastePopup(); |
| 2156 break; |
| 2157 |
| 2158 case SelectionEventType.INSERTION_TAPPED: |
| 2159 if (getPastePopup().isShowing()) |
| 2160 mPastePopupMenu.hide(); |
| 2161 else |
| 2162 showPastePopup((int) posXDip, (int) posYDip); |
| 2163 break; |
| 2164 |
| 2165 case SelectionEventType.INSERTION_CLEARED: |
| 2166 mHasInsertion = false; |
| 2167 hidePastePopup(); |
| 2168 break; |
| 2169 |
| 2170 default: |
| 2171 assert false : "Invalid selection event type."; |
| 2172 } |
| 2173 } |
| 2174 |
2250 public boolean getUseDesktopUserAgent() { | 2175 public boolean getUseDesktopUserAgent() { |
2251 if (mNativeContentViewCore != 0) { | 2176 if (mNativeContentViewCore != 0) { |
2252 return nativeGetUseDesktopUserAgent(mNativeContentViewCore); | 2177 return nativeGetUseDesktopUserAgent(mNativeContentViewCore); |
2253 } | 2178 } |
2254 return false; | 2179 return false; |
2255 } | 2180 } |
2256 | 2181 |
2257 /** | 2182 /** |
2258 * Set whether or not we're using a desktop user agent for the currently loa
ded page. | 2183 * Set whether or not we're using a desktop user agent for the currently loa
ded page. |
2259 * @param override If true, use a desktop user agent. Use a mobile one othe
rwise. | 2184 * @param override If true, use a desktop user agent. Use a mobile one othe
rwise. |
2260 * @param reloadOnChange Reload the page if the UA has changed. | 2185 * @param reloadOnChange Reload the page if the UA has changed. |
2261 */ | 2186 */ |
2262 public void setUseDesktopUserAgent(boolean override, boolean reloadOnChange)
{ | 2187 public void setUseDesktopUserAgent(boolean override, boolean reloadOnChange)
{ |
2263 if (mNativeContentViewCore != 0) { | 2188 if (mNativeContentViewCore != 0) { |
2264 nativeSetUseDesktopUserAgent(mNativeContentViewCore, override, reloa
dOnChange); | 2189 nativeSetUseDesktopUserAgent(mNativeContentViewCore, override, reloa
dOnChange); |
2265 } | 2190 } |
2266 } | 2191 } |
2267 | 2192 |
2268 public void clearSslPreferences() { | 2193 public void clearSslPreferences() { |
2269 if (mNativeContentViewCore != 0) nativeClearSslPreferences(mNativeConten
tViewCore); | 2194 if (mNativeContentViewCore != 0) nativeClearSslPreferences(mNativeConten
tViewCore); |
2270 } | 2195 } |
2271 | 2196 |
2272 private boolean isSelectionHandleShowing() { | 2197 private void hideTextHandles() { |
2273 return mSelectionHandleController != null && mSelectionHandleController.
isShowing(); | 2198 mHasSelection = false; |
2274 } | 2199 mHasInsertion = false; |
2275 | 2200 if (mNativeContentViewCore != 0) nativeHideTextHandles(mNativeContentVie
wCore); |
2276 private boolean isInsertionHandleShowing() { | |
2277 return mInsertionHandleController != null && mInsertionHandleController.
isShowing(); | |
2278 } | |
2279 | |
2280 // Makes the insertion/selection handles invisible. They will fade back in s
hortly after the | |
2281 // last call to scheduleTextHandleFadeIn (or temporarilyHideTextHandles). | |
2282 private void temporarilyHideTextHandles() { | |
2283 if (isSelectionHandleShowing() && !mSelectionHandleController.isDragging
()) { | |
2284 mSelectionHandleController.setHandleVisibility(HandleView.INVISIBLE)
; | |
2285 } | |
2286 if (isInsertionHandleShowing() && !mInsertionHandleController.isDragging
()) { | |
2287 mInsertionHandleController.setHandleVisibility(HandleView.INVISIBLE)
; | |
2288 } | |
2289 scheduleTextHandleFadeIn(); | |
2290 } | |
2291 | |
2292 private boolean allowTextHandleFadeIn() { | |
2293 if (mTouchScrollInProgress) return false; | |
2294 | |
2295 if (mPopupZoomer.isShowing()) return false; | |
2296 | |
2297 return true; | |
2298 } | |
2299 | |
2300 // Cancels any pending fade in and schedules a new one. | |
2301 private void scheduleTextHandleFadeIn() { | |
2302 if (!isInsertionHandleShowing() && !isSelectionHandleShowing()) return; | |
2303 | |
2304 if (mDeferredHandleFadeInRunnable == null) { | |
2305 mDeferredHandleFadeInRunnable = new Runnable() { | |
2306 @Override | |
2307 public void run() { | |
2308 if (!allowTextHandleFadeIn()) { | |
2309 // Delay fade in until it is allowed. | |
2310 scheduleTextHandleFadeIn(); | |
2311 } else { | |
2312 if (isSelectionHandleShowing()) { | |
2313 mSelectionHandleController.beginHandleFadeIn(); | |
2314 } | |
2315 if (isInsertionHandleShowing()) { | |
2316 mInsertionHandleController.beginHandleFadeIn(); | |
2317 } | |
2318 } | |
2319 } | |
2320 }; | |
2321 } | |
2322 | |
2323 mContainerView.removeCallbacks(mDeferredHandleFadeInRunnable); | |
2324 mContainerView.postDelayed(mDeferredHandleFadeInRunnable, TEXT_HANDLE_FA
DE_IN_DELAY); | |
2325 } | 2201 } |
2326 | 2202 |
2327 /** | 2203 /** |
2328 * Shows the IME if the focused widget could accept text input. | 2204 * Shows the IME if the focused widget could accept text input. |
2329 */ | 2205 */ |
2330 public void showImeIfNeeded() { | 2206 public void showImeIfNeeded() { |
2331 assert mWebContents != null; | 2207 assert mWebContents != null; |
2332 mWebContents.showImeIfNeeded(); | 2208 mWebContents.showImeIfNeeded(); |
2333 } | 2209 } |
2334 | 2210 |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2379 pageScaleFactor != mRenderCoordinates.getPageScaleFactor(); | 2255 pageScaleFactor != mRenderCoordinates.getPageScaleFactor(); |
2380 final boolean scrollChanged = | 2256 final boolean scrollChanged = |
2381 pageScaleChanged | 2257 pageScaleChanged |
2382 || scrollOffsetX != mRenderCoordinates.getScrollX() | 2258 || scrollOffsetX != mRenderCoordinates.getScrollX() |
2383 || scrollOffsetY != mRenderCoordinates.getScrollY(); | 2259 || scrollOffsetY != mRenderCoordinates.getScrollY(); |
2384 final boolean contentOffsetChanged = | 2260 final boolean contentOffsetChanged = |
2385 contentOffsetYPix != mRenderCoordinates.getContentOffsetYPix(); | 2261 contentOffsetYPix != mRenderCoordinates.getContentOffsetYPix(); |
2386 | 2262 |
2387 final boolean needHidePopupZoomer = contentSizeChanged || scrollChanged; | 2263 final boolean needHidePopupZoomer = contentSizeChanged || scrollChanged; |
2388 final boolean needUpdateZoomControls = scaleLimitsChanged || scrollChang
ed; | 2264 final boolean needUpdateZoomControls = scaleLimitsChanged || scrollChang
ed; |
2389 final boolean needTemporarilyHideHandles = scrollChanged; | |
2390 | 2265 |
2391 if (needHidePopupZoomer) mPopupZoomer.hide(true); | 2266 if (needHidePopupZoomer) mPopupZoomer.hide(true); |
2392 | 2267 |
2393 if (scrollChanged) { | 2268 if (scrollChanged) { |
2394 mContainerViewInternals.onScrollChanged( | 2269 mContainerViewInternals.onScrollChanged( |
2395 (int) mRenderCoordinates.fromLocalCssToPix(scrollOffsetX), | 2270 (int) mRenderCoordinates.fromLocalCssToPix(scrollOffsetX), |
2396 (int) mRenderCoordinates.fromLocalCssToPix(scrollOffsetY), | 2271 (int) mRenderCoordinates.fromLocalCssToPix(scrollOffsetY), |
2397 (int) mRenderCoordinates.getScrollXPix(), | 2272 (int) mRenderCoordinates.getScrollXPix(), |
2398 (int) mRenderCoordinates.getScrollYPix()); | 2273 (int) mRenderCoordinates.getScrollYPix()); |
2399 } | 2274 } |
2400 | 2275 |
2401 mRenderCoordinates.updateFrameInfo( | 2276 mRenderCoordinates.updateFrameInfo( |
2402 scrollOffsetX, scrollOffsetY, | 2277 scrollOffsetX, scrollOffsetY, |
2403 contentWidth, contentHeight, | 2278 contentWidth, contentHeight, |
2404 viewportWidth, viewportHeight, | 2279 viewportWidth, viewportHeight, |
2405 pageScaleFactor, minPageScaleFactor, maxPageScaleFactor, | 2280 pageScaleFactor, minPageScaleFactor, maxPageScaleFactor, |
2406 contentOffsetYPix); | 2281 contentOffsetYPix); |
2407 | 2282 |
2408 if (scrollChanged || contentOffsetChanged) { | 2283 if (scrollChanged || contentOffsetChanged) { |
2409 for (mGestureStateListenersIterator.rewind(); | 2284 for (mGestureStateListenersIterator.rewind(); |
2410 mGestureStateListenersIterator.hasNext();) { | 2285 mGestureStateListenersIterator.hasNext();) { |
2411 mGestureStateListenersIterator.next().onScrollOffsetOrExtentChan
ged( | 2286 mGestureStateListenersIterator.next().onScrollOffsetOrExtentChan
ged( |
2412 computeVerticalScrollOffset(), | 2287 computeVerticalScrollOffset(), |
2413 computeVerticalScrollExtent()); | 2288 computeVerticalScrollExtent()); |
2414 } | 2289 } |
2415 } | 2290 } |
2416 | 2291 |
2417 if (needTemporarilyHideHandles) temporarilyHideTextHandles(); | |
2418 if (needUpdateZoomControls) mZoomControlsDelegate.updateZoomControls(); | 2292 if (needUpdateZoomControls) mZoomControlsDelegate.updateZoomControls(); |
2419 if (contentOffsetChanged) updateHandleScreenPositions(); | |
2420 | 2293 |
2421 // Update offsets for fullscreen. | 2294 // Update offsets for fullscreen. |
2422 final float controlsOffsetPix = controlsOffsetYCss * deviceScale; | 2295 final float controlsOffsetPix = controlsOffsetYCss * deviceScale; |
2423 final float overdrawBottomHeightPix = overdrawBottomHeightCss * deviceSc
ale; | 2296 final float overdrawBottomHeightPix = overdrawBottomHeightCss * deviceSc
ale; |
2424 getContentViewClient().onOffsetsForFullscreenChanged( | 2297 getContentViewClient().onOffsetsForFullscreenChanged( |
2425 controlsOffsetPix, contentOffsetYPix, overdrawBottomHeightPix); | 2298 controlsOffsetPix, contentOffsetYPix, overdrawBottomHeightPix); |
2426 | 2299 |
2427 if (mBrowserAccessibilityManager != null) { | 2300 if (mBrowserAccessibilityManager != null) { |
2428 mBrowserAccessibilityManager.notifyFrameInfoInitialized(); | 2301 mBrowserAccessibilityManager.notifyFrameInfoInitialized(); |
2429 } | 2302 } |
2430 } | 2303 } |
2431 | 2304 |
2432 @CalledByNative | 2305 @CalledByNative |
2433 private void updateImeAdapter(long nativeImeAdapterAndroid, int textInputTyp
e, | 2306 private void updateImeAdapter(long nativeImeAdapterAndroid, int textInputTyp
e, |
2434 String text, int selectionStart, int selectionEnd, | 2307 String text, int selectionStart, int selectionEnd, |
2435 int compositionStart, int compositionEnd, boolean showImeIfNeeded, | 2308 int compositionStart, int compositionEnd, boolean showImeIfNeeded, |
2436 boolean isNonImeChange) { | 2309 boolean isNonImeChange) { |
2437 TraceEvent.begin(); | 2310 TraceEvent.begin(); |
2438 mFocusedNodeEditable = (textInputType != ImeAdapter.getTextInputTypeNone
()); | 2311 mFocusedNodeEditable = (textInputType != ImeAdapter.getTextInputTypeNone
()); |
| 2312 if (!mFocusedNodeEditable) hidePastePopup(); |
2439 | 2313 |
2440 mImeAdapter.updateKeyboardVisibility( | 2314 mImeAdapter.updateKeyboardVisibility( |
2441 nativeImeAdapterAndroid, textInputType, showImeIfNeeded); | 2315 nativeImeAdapterAndroid, textInputType, showImeIfNeeded); |
2442 | 2316 |
2443 if (mInputConnection != null) { | 2317 if (mInputConnection != null) { |
2444 mInputConnection.updateState(text, selectionStart, selectionEnd, com
positionStart, | 2318 mInputConnection.updateState(text, selectionStart, selectionEnd, com
positionStart, |
2445 compositionEnd, isNonImeChange); | 2319 compositionEnd, isNonImeChange); |
2446 } | 2320 } |
2447 | 2321 |
2448 if (mActionMode != null) mActionMode.invalidate(); | 2322 if (mActionMode != null) mActionMode.invalidate(); |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2498 */ | 2372 */ |
2499 public SelectPopup getSelectPopupForTest() { | 2373 public SelectPopup getSelectPopupForTest() { |
2500 return mSelectPopup; | 2374 return mSelectPopup; |
2501 } | 2375 } |
2502 | 2376 |
2503 @SuppressWarnings("unused") | 2377 @SuppressWarnings("unused") |
2504 @CalledByNative | 2378 @CalledByNative |
2505 private void showDisambiguationPopup(Rect targetRect, Bitmap zoomedBitmap) { | 2379 private void showDisambiguationPopup(Rect targetRect, Bitmap zoomedBitmap) { |
2506 mPopupZoomer.setBitmap(zoomedBitmap); | 2380 mPopupZoomer.setBitmap(zoomedBitmap); |
2507 mPopupZoomer.show(targetRect); | 2381 mPopupZoomer.show(targetRect); |
2508 temporarilyHideTextHandles(); | |
2509 } | 2382 } |
2510 | 2383 |
2511 @SuppressWarnings("unused") | 2384 @SuppressWarnings("unused") |
2512 @CalledByNative | 2385 @CalledByNative |
2513 private TouchEventSynthesizer createTouchEventSynthesizer() { | 2386 private TouchEventSynthesizer createTouchEventSynthesizer() { |
2514 return new TouchEventSynthesizer(this); | 2387 return new TouchEventSynthesizer(this); |
2515 } | 2388 } |
2516 | 2389 |
2517 @SuppressWarnings("unused") | 2390 @SuppressWarnings("unused") |
2518 @CalledByNative | 2391 @CalledByNative |
| 2392 private PopupTouchHandleDrawable createPopupTouchHandleDrawable() { |
| 2393 if (mTouchHandleDelegate == null) { |
| 2394 mTouchHandleDelegate = new PopupTouchHandleDrawableDelegate() { |
| 2395 public View getParent() { |
| 2396 return getContainerView(); |
| 2397 } |
| 2398 |
| 2399 public PositionObserver getParentPositionObserver() { |
| 2400 return mPositionObserver; |
| 2401 } |
| 2402 |
| 2403 public boolean onTouchHandleEvent(MotionEvent event) { |
| 2404 final boolean isTouchHandleEvent = true; |
| 2405 return onTouchEventImpl(event, isTouchHandleEvent); |
| 2406 } |
| 2407 }; |
| 2408 } |
| 2409 return new PopupTouchHandleDrawable(mTouchHandleDelegate); |
| 2410 } |
| 2411 |
| 2412 @SuppressWarnings("unused") |
| 2413 @CalledByNative |
2519 private void onSelectionChanged(String text) { | 2414 private void onSelectionChanged(String text) { |
2520 mLastSelectedText = text; | 2415 mLastSelectedText = text; |
2521 getContentViewClient().onSelectionChanged(text); | 2416 getContentViewClient().onSelectionChanged(text); |
2522 } | 2417 } |
2523 | 2418 |
2524 @SuppressWarnings("unused") | 2419 @SuppressWarnings("unused") |
2525 @CalledByNative | |
2526 private void showSelectionHandlesAutomatically() { | |
2527 getSelectionHandleController().allowAutomaticShowing(); | |
2528 } | |
2529 | |
2530 @SuppressWarnings("unused") | |
2531 @CalledByNative | |
2532 private void onSelectionBoundsChanged(Rect anchorRectDip, int anchorDir, Rec
t focusRectDip, | |
2533 int focusDir, boolean isAnchorFirst) { | |
2534 // All coordinates are in DIP. | |
2535 int x1 = anchorRectDip.left; | |
2536 int y1 = anchorRectDip.bottom; | |
2537 int x2 = focusRectDip.left; | |
2538 int y2 = focusRectDip.bottom; | |
2539 | |
2540 if (x1 != x2 || y1 != y2 || | |
2541 (mSelectionHandleController != null && mSelectionHandleControlle
r.isDragging())) { | |
2542 if (mInsertionHandleController != null) { | |
2543 mInsertionHandleController.hide(); | |
2544 } | |
2545 if (isAnchorFirst) { | |
2546 mStartHandlePoint.setLocalDip(x1, y1); | |
2547 mEndHandlePoint.setLocalDip(x2, y2); | |
2548 } else { | |
2549 mStartHandlePoint.setLocalDip(x2, y2); | |
2550 mEndHandlePoint.setLocalDip(x1, y1); | |
2551 } | |
2552 | |
2553 boolean wereSelectionHandlesShowing = getSelectionHandleController()
.isShowing(); | |
2554 | |
2555 getSelectionHandleController().onSelectionChanged(anchorDir, focusDi
r); | |
2556 updateHandleScreenPositions(); | |
2557 mHasSelection = true; | |
2558 | |
2559 if (!wereSelectionHandlesShowing && getSelectionHandleController().i
sShowing()) { | |
2560 // TODO(cjhopman): Remove this when there is a better signal tha
t long press caused | |
2561 // a selection. See http://crbug.com/150151. | |
2562 mContainerView.performHapticFeedback(HapticFeedbackConstants.LON
G_PRESS); | |
2563 } | |
2564 | |
2565 } else { | |
2566 mUnselectAllOnActionModeDismiss = false; | |
2567 hideSelectActionBar(); | |
2568 if (x1 != 0 && y1 != 0 && mFocusedNodeEditable) { | |
2569 // Selection is a caret, and a text field is focused. | |
2570 if (mSelectionHandleController != null) { | |
2571 mSelectionHandleController.hide(); | |
2572 } | |
2573 mInsertionHandlePoint.setLocalDip(x1, y1); | |
2574 | |
2575 getInsertionHandleController().onCursorPositionChanged(); | |
2576 updateHandleScreenPositions(); | |
2577 if (mInputMethodManagerWrapper.isWatchingCursor(mContainerView))
{ | |
2578 final int xPix = (int) mInsertionHandlePoint.getXPix(); | |
2579 final int yPix = (int) mInsertionHandlePoint.getYPix(); | |
2580 mInputMethodManagerWrapper.updateCursor( | |
2581 mContainerView, xPix, yPix, xPix, yPix); | |
2582 } | |
2583 } else { | |
2584 // Deselection | |
2585 if (mSelectionHandleController != null) { | |
2586 mSelectionHandleController.hideAndDisallowAutomaticShowing()
; | |
2587 } | |
2588 if (mInsertionHandleController != null) { | |
2589 mInsertionHandleController.hideAndDisallowAutomaticShowing()
; | |
2590 } | |
2591 } | |
2592 mHasSelection = false; | |
2593 } | |
2594 if (isSelectionHandleShowing() || isInsertionHandleShowing()) { | |
2595 mPositionObserver.addListener(mPositionListener); | |
2596 } | |
2597 } | |
2598 | |
2599 @SuppressWarnings("unused") | |
2600 @CalledByNative | 2420 @CalledByNative |
2601 private static void onEvaluateJavaScriptResult( | 2421 private static void onEvaluateJavaScriptResult( |
2602 String jsonResult, JavaScriptCallback callback) { | 2422 String jsonResult, JavaScriptCallback callback) { |
2603 callback.handleJavaScriptResult(jsonResult); | 2423 callback.handleJavaScriptResult(jsonResult); |
2604 } | 2424 } |
2605 | 2425 |
2606 @SuppressWarnings("unused") | 2426 @SuppressWarnings("unused") |
2607 @CalledByNative | 2427 @CalledByNative |
2608 private void showPastePopup(int xDip, int yDip) { | 2428 private void showPastePopup(int xDip, int yDip) { |
2609 mInsertionHandlePoint.setLocalDip(xDip, yDip); | 2429 final float contentOffsetYPix = mRenderCoordinates.getContentOffsetYPix(
); |
2610 getInsertionHandleController().showHandle(); | 2430 getPastePopup().showAt( |
2611 updateHandleScreenPositions(); | 2431 (int) mRenderCoordinates.fromDipToPix(xDip), |
2612 getInsertionHandleController().showHandleWithPastePopup(); | 2432 (int) (mRenderCoordinates.fromDipToPix(yDip) + contentOffsetYPix)); |
| 2433 } |
| 2434 |
| 2435 private PastePopupMenu getPastePopup() { |
| 2436 if (mPastePopupMenu == null) { |
| 2437 mPastePopupMenu = new PastePopupMenu(getContainerView(), |
| 2438 new PastePopupMenuDelegate() { |
| 2439 public void paste() { |
| 2440 mImeAdapter.paste(); |
| 2441 hideTextHandles(); |
| 2442 } |
| 2443 public boolean canPaste() { |
| 2444 if (!mFocusedNodeEditable) return false; |
| 2445 return ((ClipboardManager) mContext.getSystemService( |
| 2446 Context.CLIPBOARD_SERVICE)).hasPrimaryClip(); |
| 2447 } |
| 2448 }); |
| 2449 } |
| 2450 return mPastePopupMenu; |
2613 } | 2451 } |
2614 | 2452 |
2615 @SuppressWarnings("unused") | 2453 @SuppressWarnings("unused") |
2616 @CalledByNative | 2454 @CalledByNative |
2617 private void onRenderProcessChange() { | 2455 private void onRenderProcessChange() { |
2618 attachImeAdapter(); | 2456 attachImeAdapter(); |
2619 } | 2457 } |
2620 | 2458 |
2621 /** | 2459 /** |
2622 * Attaches the native ImeAdapter object to the java ImeAdapter to allow com
munication via JNI. | 2460 * Attaches the native ImeAdapter object to the java ImeAdapter to allow com
munication via JNI. |
(...skipping 664 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3287 long nativeContentViewCoreImpl, int orientation); | 3125 long nativeContentViewCoreImpl, int orientation); |
3288 | 3126 |
3289 // All touch events (including flings, scrolls etc) accept coordinates in ph
ysical pixels. | 3127 // All touch events (including flings, scrolls etc) accept coordinates in ph
ysical pixels. |
3290 private native boolean nativeOnTouchEvent( | 3128 private native boolean nativeOnTouchEvent( |
3291 long nativeContentViewCoreImpl, MotionEvent event, | 3129 long nativeContentViewCoreImpl, MotionEvent event, |
3292 long timeMs, int action, int pointerCount, int historySize, int acti
onIndex, | 3130 long timeMs, int action, int pointerCount, int historySize, int acti
onIndex, |
3293 float x0, float y0, float x1, float y1, | 3131 float x0, float y0, float x1, float y1, |
3294 int pointerId0, int pointerId1, | 3132 int pointerId0, int pointerId1, |
3295 float touchMajor0, float touchMajor1, | 3133 float touchMajor0, float touchMajor1, |
3296 float rawX, float rawY, | 3134 float rawX, float rawY, |
3297 int androidToolType0, int androidToolType1, int androidButtonState); | 3135 int androidToolType0, int androidToolType1, int androidButtonState, |
| 3136 boolean isTouchHandleEvent); |
3298 | 3137 |
3299 private native int nativeSendMouseMoveEvent( | 3138 private native int nativeSendMouseMoveEvent( |
3300 long nativeContentViewCoreImpl, long timeMs, float x, float y); | 3139 long nativeContentViewCoreImpl, long timeMs, float x, float y); |
3301 | 3140 |
3302 private native int nativeSendMouseWheelEvent( | 3141 private native int nativeSendMouseWheelEvent( |
3303 long nativeContentViewCoreImpl, long timeMs, float x, float y, float
verticalAxis); | 3142 long nativeContentViewCoreImpl, long timeMs, float x, float y, float
verticalAxis); |
3304 | 3143 |
3305 private native void nativeScrollBegin( | 3144 private native void nativeScrollBegin( |
3306 long nativeContentViewCoreImpl, long timeMs, float x, float y, float
hintX, | 3145 long nativeContentViewCoreImpl, long timeMs, float x, float y, float
hintX, |
3307 float hintY); | 3146 float hintY); |
(...skipping 24 matching lines...) Expand all Loading... |
3332 private native void nativePinchEnd(long nativeContentViewCoreImpl, long time
Ms); | 3171 private native void nativePinchEnd(long nativeContentViewCoreImpl, long time
Ms); |
3333 | 3172 |
3334 private native void nativePinchBy(long nativeContentViewCoreImpl, long timeM
s, | 3173 private native void nativePinchBy(long nativeContentViewCoreImpl, long timeM
s, |
3335 float anchorX, float anchorY, float deltaScale); | 3174 float anchorX, float anchorY, float deltaScale); |
3336 | 3175 |
3337 private native void nativeSelectBetweenCoordinates( | 3176 private native void nativeSelectBetweenCoordinates( |
3338 long nativeContentViewCoreImpl, float x1, float y1, float x2, float
y2); | 3177 long nativeContentViewCoreImpl, float x1, float y1, float x2, float
y2); |
3339 | 3178 |
3340 private native void nativeMoveCaret(long nativeContentViewCoreImpl, float x,
float y); | 3179 private native void nativeMoveCaret(long nativeContentViewCoreImpl, float x,
float y); |
3341 | 3180 |
| 3181 private native void nativeHideTextHandles(long nativeContentViewCoreImpl); |
| 3182 |
3342 private native void nativeResetGestureDetection(long nativeContentViewCoreIm
pl); | 3183 private native void nativeResetGestureDetection(long nativeContentViewCoreIm
pl); |
3343 private native void nativeSetDoubleTapSupportEnabled( | 3184 private native void nativeSetDoubleTapSupportEnabled( |
3344 long nativeContentViewCoreImpl, boolean enabled); | 3185 long nativeContentViewCoreImpl, boolean enabled); |
3345 private native void nativeSetMultiTouchZoomSupportEnabled( | 3186 private native void nativeSetMultiTouchZoomSupportEnabled( |
3346 long nativeContentViewCoreImpl, boolean enabled); | 3187 long nativeContentViewCoreImpl, boolean enabled); |
3347 | 3188 |
3348 private native void nativeSelectPopupMenuItems(long nativeContentViewCoreImp
l, int[] indices); | 3189 private native void nativeSelectPopupMenuItems(long nativeContentViewCoreImp
l, int[] indices); |
3349 | 3190 |
3350 private native void nativeClearHistory(long nativeContentViewCoreImpl); | 3191 private native void nativeClearHistory(long nativeContentViewCoreImpl); |
3351 | 3192 |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3387 | 3228 |
3388 private native void nativeExtractSmartClipData(long nativeContentViewCoreImp
l, | 3229 private native void nativeExtractSmartClipData(long nativeContentViewCoreImp
l, |
3389 int x, int y, int w, int h); | 3230 int x, int y, int w, int h); |
3390 private native void nativeSetBackgroundOpaque(long nativeContentViewCoreImpl
, boolean opaque); | 3231 private native void nativeSetBackgroundOpaque(long nativeContentViewCoreImpl
, boolean opaque); |
3391 | 3232 |
3392 private native void nativeResumeResponseDeferredAtStart( | 3233 private native void nativeResumeResponseDeferredAtStart( |
3393 long nativeContentViewCoreImpl); | 3234 long nativeContentViewCoreImpl); |
3394 private native void nativeSetHasPendingNavigationTransitionForTesting( | 3235 private native void nativeSetHasPendingNavigationTransitionForTesting( |
3395 long nativeContentViewCoreImpl); | 3236 long nativeContentViewCoreImpl); |
3396 } | 3237 } |
OLD | NEW |