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.PackageManager; | 14 import android.content.pm.PackageManager; |
14 import android.content.res.Configuration; | 15 import android.content.res.Configuration; |
15 import android.database.ContentObserver; | 16 import android.database.ContentObserver; |
16 import android.graphics.Bitmap; | 17 import android.graphics.Bitmap; |
17 import android.graphics.Canvas; | 18 import android.graphics.Canvas; |
18 import android.graphics.Color; | 19 import android.graphics.Color; |
19 import android.graphics.Rect; | 20 import android.graphics.Rect; |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
54 import org.chromium.base.JNINamespace; | 55 import org.chromium.base.JNINamespace; |
55 import org.chromium.base.ObserverList; | 56 import org.chromium.base.ObserverList; |
56 import org.chromium.base.ObserverList.RewindableIterator; | 57 import org.chromium.base.ObserverList.RewindableIterator; |
57 import org.chromium.base.TraceEvent; | 58 import org.chromium.base.TraceEvent; |
58 import org.chromium.content.R; | 59 import org.chromium.content.R; |
59 import org.chromium.content.browser.ScreenOrientationListener.ScreenOrientationO bserver; | 60 import org.chromium.content.browser.ScreenOrientationListener.ScreenOrientationO bserver; |
60 import org.chromium.content.browser.accessibility.AccessibilityInjector; | 61 import org.chromium.content.browser.accessibility.AccessibilityInjector; |
61 import org.chromium.content.browser.accessibility.BrowserAccessibilityManager; | 62 import org.chromium.content.browser.accessibility.BrowserAccessibilityManager; |
62 import org.chromium.content.browser.input.AdapterInputConnection; | 63 import org.chromium.content.browser.input.AdapterInputConnection; |
63 import org.chromium.content.browser.input.GamepadList; | 64 import org.chromium.content.browser.input.GamepadList; |
64 import org.chromium.content.browser.input.HandleView; | |
65 import org.chromium.content.browser.input.ImeAdapter; | 65 import org.chromium.content.browser.input.ImeAdapter; |
66 import org.chromium.content.browser.input.ImeAdapter.AdapterInputConnectionFacto ry; | 66 import org.chromium.content.browser.input.ImeAdapter.AdapterInputConnectionFacto ry; |
67 import org.chromium.content.browser.input.InputMethodManagerWrapper; | 67 import org.chromium.content.browser.input.InputMethodManagerWrapper; |
68 import org.chromium.content.browser.input.InsertionHandleController; | 68 import org.chromium.content.browser.input.PastePopupMenu; |
69 import org.chromium.content.browser.input.PastePopupMenu.PastePopupMenuDelegate; | |
70 import org.chromium.content.browser.input.PopupTouchHandleDrawable; | |
71 import org.chromium.content.browser.input.PopupTouchHandleDrawable.PopupTouchHan dleDrawableDelegate; | |
69 import org.chromium.content.browser.input.SelectPopup; | 72 import org.chromium.content.browser.input.SelectPopup; |
70 import org.chromium.content.browser.input.SelectPopupDialog; | 73 import org.chromium.content.browser.input.SelectPopupDialog; |
71 import org.chromium.content.browser.input.SelectPopupDropdown; | 74 import org.chromium.content.browser.input.SelectPopupDropdown; |
72 import org.chromium.content.browser.input.SelectPopupItem; | 75 import org.chromium.content.browser.input.SelectPopupItem; |
73 import org.chromium.content.browser.input.SelectionHandleController; | 76 import org.chromium.content.browser.input.SelectionEventType; |
74 import org.chromium.content.common.ContentSwitches; | 77 import org.chromium.content.common.ContentSwitches; |
75 import org.chromium.content_public.browser.GestureStateListener; | 78 import org.chromium.content_public.browser.GestureStateListener; |
76 import org.chromium.content_public.browser.WebContents; | 79 import org.chromium.content_public.browser.WebContents; |
77 import org.chromium.ui.base.DeviceFormFactor; | 80 import org.chromium.ui.base.DeviceFormFactor; |
78 import org.chromium.ui.base.ViewAndroid; | 81 import org.chromium.ui.base.ViewAndroid; |
79 import org.chromium.ui.base.ViewAndroidDelegate; | 82 import org.chromium.ui.base.ViewAndroidDelegate; |
80 import org.chromium.ui.base.WindowAndroid; | 83 import org.chromium.ui.base.WindowAndroid; |
81 import org.chromium.ui.gfx.DeviceDisplayInfo; | 84 import org.chromium.ui.gfx.DeviceDisplayInfo; |
82 | 85 |
83 import java.lang.annotation.Annotation; | 86 import java.lang.annotation.Annotation; |
(...skipping 16 matching lines...) Expand all Loading... | |
100 private static final String TAG = "ContentViewCore"; | 103 private static final String TAG = "ContentViewCore"; |
101 | 104 |
102 // Used to avoid enabling zooming in / out if resulting zooming will | 105 // Used to avoid enabling zooming in / out if resulting zooming will |
103 // produce little visible difference. | 106 // produce little visible difference. |
104 private static final float ZOOM_CONTROLS_EPSILON = 0.007f; | 107 private static final float ZOOM_CONTROLS_EPSILON = 0.007f; |
105 | 108 |
106 // Used to represent gestures for long press and long tap. | 109 // Used to represent gestures for long press and long tap. |
107 private static final int IS_LONG_PRESS = 1; | 110 private static final int IS_LONG_PRESS = 1; |
108 private static final int IS_LONG_TAP = 2; | 111 private static final int IS_LONG_TAP = 2; |
109 | 112 |
110 // Length of the delay (in ms) before fading in handles after the last page movement. | |
111 private static final int TEXT_HANDLE_FADE_IN_DELAY = 300; | |
112 | |
113 // If the embedder adds a JavaScript interface object that contains an indir ect reference to | 113 // If the embedder adds a JavaScript interface object that contains an indir ect reference to |
114 // the ContentViewCore, then storing a strong ref to the interface object on the native | 114 // the ContentViewCore, then storing a strong ref to the interface object on the native |
115 // side would prevent garbage collection of the ContentViewCore (as that str ong ref would | 115 // side would prevent garbage collection of the ContentViewCore (as that str ong ref would |
116 // create a new GC root). | 116 // create a new GC root). |
117 // For that reason, we store only a weak reference to the interface object o n the | 117 // For that reason, we store only a weak reference to the interface object o n the |
118 // native side. However we still need a strong reference on the Java side to | 118 // native side. However we still need a strong reference on the Java side to |
119 // prevent garbage collection if the embedder doesn't maintain their own ref to the | 119 // prevent garbage collection if the embedder doesn't maintain their own ref to the |
120 // interface object - the Java side ref won't create a new GC root. | 120 // interface object - the Java side ref won't create a new GC root. |
121 // This map stores those refernces. We put into the map on addJavaScriptInte rface() | 121 // This map stores those refernces. We put into the map on addJavaScriptInte rface() |
122 // and remove from it in removeJavaScriptInterface(). | 122 // and remove from it in removeJavaScriptInterface(). |
(...skipping 129 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
252 private SelectPopup mSelectPopup; | 252 private SelectPopup mSelectPopup; |
253 | 253 |
254 private Runnable mFakeMouseMoveRunnable = null; | 254 private Runnable mFakeMouseMoveRunnable = null; |
255 | 255 |
256 // Only valid when focused on a text / password field. | 256 // Only valid when focused on a text / password field. |
257 private ImeAdapter mImeAdapter; | 257 private ImeAdapter mImeAdapter; |
258 private ImeAdapter.AdapterInputConnectionFactory mAdapterInputConnectionFact ory; | 258 private ImeAdapter.AdapterInputConnectionFactory mAdapterInputConnectionFact ory; |
259 private AdapterInputConnection mInputConnection; | 259 private AdapterInputConnection mInputConnection; |
260 private InputMethodManagerWrapper mInputMethodManagerWrapper; | 260 private InputMethodManagerWrapper mInputMethodManagerWrapper; |
261 | 261 |
262 private SelectionHandleController mSelectionHandleController; | 262 // Lazily created paste popup menu, triggered either via long press in an |
263 private InsertionHandleController mInsertionHandleController; | 263 // editable region or from tapping the insertion handle. |
264 private PastePopupMenu mPastePopupMenu; | |
265 private boolean mAllowAutomaticPastePopupShowing; | |
264 | 266 |
265 private Runnable mDeferredHandleFadeInRunnable; | 267 private PopupTouchHandleDrawableDelegate mTouchHandleDelegate; |
266 | 268 |
267 private PositionObserver mPositionObserver; | 269 private PositionObserver mPositionObserver; |
268 private PositionObserver.Listener mPositionListener; | |
269 | 270 |
270 // Size of the viewport in physical pixels as set from onSizeChanged. | 271 // Size of the viewport in physical pixels as set from onSizeChanged. |
271 private int mViewportWidthPix; | 272 private int mViewportWidthPix; |
272 private int mViewportHeightPix; | 273 private int mViewportHeightPix; |
273 private int mPhysicalBackingWidthPix; | 274 private int mPhysicalBackingWidthPix; |
274 private int mPhysicalBackingHeightPix; | 275 private int mPhysicalBackingHeightPix; |
275 private int mOverdrawBottomHeightPix; | 276 private int mOverdrawBottomHeightPix; |
276 private int mViewportSizeOffsetWidthPix; | 277 private int mViewportSizeOffsetWidthPix; |
277 private int mViewportSizeOffsetHeightPix; | 278 private int mViewportSizeOffsetHeightPix; |
278 | 279 |
279 // Cached copy of all positions and scales as reported by the renderer. | 280 // Cached copy of all positions and scales as reported by the renderer. |
280 private final RenderCoordinates mRenderCoordinates; | 281 private final RenderCoordinates mRenderCoordinates; |
281 | 282 |
282 private final RenderCoordinates.NormalizedPoint mStartHandlePoint; | |
283 private final RenderCoordinates.NormalizedPoint mEndHandlePoint; | |
284 private final RenderCoordinates.NormalizedPoint mInsertionHandlePoint; | |
285 | |
286 // Tracks whether a selection is currently active. When applied to selected text, indicates | 283 // Tracks whether a selection is currently active. When applied to selected text, indicates |
287 // whether the last selected text is still highlighted. | 284 // whether the last selected text is still highlighted. |
288 private boolean mHasSelection; | 285 private boolean mHasSelection; |
286 private boolean mHasInsertion; | |
289 private String mLastSelectedText; | 287 private String mLastSelectedText; |
290 private boolean mSelectionEditable; | 288 private boolean mSelectionEditable; |
291 private ActionMode mActionMode; | 289 private ActionMode mActionMode; |
292 private boolean mUnselectAllOnActionModeDismiss; | 290 private boolean mUnselectAllOnActionModeDismiss; |
293 | 291 |
294 // Delegate that will handle GET downloads, and be notified of completion of POST downloads. | 292 // Delegate that will handle GET downloads, and be notified of completion of POST downloads. |
295 private ContentViewDownloadDelegate mDownloadDelegate; | 293 private ContentViewDownloadDelegate mDownloadDelegate; |
296 | 294 |
297 // The AccessibilityInjector that handles loading Accessibility scripts into the web page. | 295 // The AccessibilityInjector that handles loading Accessibility scripts into the web page. |
298 private AccessibilityInjector mAccessibilityInjector; | 296 private AccessibilityInjector mAccessibilityInjector; |
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
372 mInputMethodManagerWrapper = new InputMethodManagerWrapper(mContext); | 370 mInputMethodManagerWrapper = new InputMethodManagerWrapper(mContext); |
373 | 371 |
374 mRenderCoordinates = new RenderCoordinates(); | 372 mRenderCoordinates = new RenderCoordinates(); |
375 float deviceScaleFactor = getContext().getResources().getDisplayMetrics( ).density; | 373 float deviceScaleFactor = getContext().getResources().getDisplayMetrics( ).density; |
376 String forceScaleFactor = CommandLine.getInstance().getSwitchValue( | 374 String forceScaleFactor = CommandLine.getInstance().getSwitchValue( |
377 ContentSwitches.FORCE_DEVICE_SCALE_FACTOR); | 375 ContentSwitches.FORCE_DEVICE_SCALE_FACTOR); |
378 if (forceScaleFactor != null) { | 376 if (forceScaleFactor != null) { |
379 deviceScaleFactor = Float.valueOf(forceScaleFactor); | 377 deviceScaleFactor = Float.valueOf(forceScaleFactor); |
380 } | 378 } |
381 mRenderCoordinates.setDeviceScaleFactor(deviceScaleFactor); | 379 mRenderCoordinates.setDeviceScaleFactor(deviceScaleFactor); |
382 mStartHandlePoint = mRenderCoordinates.createNormalizedPoint(); | |
383 mEndHandlePoint = mRenderCoordinates.createNormalizedPoint(); | |
384 mInsertionHandlePoint = mRenderCoordinates.createNormalizedPoint(); | |
385 mAccessibilityManager = (AccessibilityManager) | 380 mAccessibilityManager = (AccessibilityManager) |
386 getContext().getSystemService(Context.ACCESSIBILITY_SERVICE); | 381 getContext().getSystemService(Context.ACCESSIBILITY_SERVICE); |
387 mGestureStateListeners = new ObserverList<GestureStateListener>(); | 382 mGestureStateListeners = new ObserverList<GestureStateListener>(); |
388 mGestureStateListenersIterator = mGestureStateListeners.rewindableIterat or(); | 383 mGestureStateListenersIterator = mGestureStateListeners.rewindableIterat or(); |
389 | 384 |
390 mEditable = Editable.Factory.getInstance().newEditable(""); | 385 mEditable = Editable.Factory.getInstance().newEditable(""); |
391 Selection.setSelection(mEditable, 0); | 386 Selection.setSelection(mEditable, 0); |
392 } | 387 } |
393 | 388 |
394 /** | 389 /** |
(...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
532 return mInputConnection; | 527 return mInputConnection; |
533 } | 528 } |
534 | 529 |
535 private ImeAdapter createImeAdapter(Context context) { | 530 private ImeAdapter createImeAdapter(Context context) { |
536 return new ImeAdapter(mInputMethodManagerWrapper, | 531 return new ImeAdapter(mInputMethodManagerWrapper, |
537 new ImeAdapter.ImeAdapterDelegate() { | 532 new ImeAdapter.ImeAdapterDelegate() { |
538 @Override | 533 @Override |
539 public void onImeEvent(boolean isFinish) { | 534 public void onImeEvent(boolean isFinish) { |
540 getContentViewClient().onImeEvent(); | 535 getContentViewClient().onImeEvent(); |
541 if (!isFinish) { | 536 if (!isFinish) { |
542 hideHandles(); | 537 hideTextHandles(); |
543 } | 538 } |
544 } | 539 } |
545 | 540 |
546 @Override | 541 @Override |
547 public void onDismissInput() { | 542 public void onDismissInput() { |
548 getContentViewClient().onImeStateChangeRequested(false); | 543 getContentViewClient().onImeStateChangeRequested(false); |
549 } | 544 } |
550 | 545 |
551 @Override | 546 @Override |
552 public View getAttachedView() { | 547 public View getAttachedView() { |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
595 // is a vital component of the ContentViewCore, so embedders must exercise c aution in what | 590 // is a vital component of the ContentViewCore, so embedders must exercise c aution in what |
596 // they do with the ContentViewCore before calling initialize(). | 591 // they do with the ContentViewCore before calling initialize(). |
597 // We supply the nativeWebContents pointer here rather than in the construct or to allow us | 592 // We supply the nativeWebContents pointer here rather than in the construct or to allow us |
598 // to set the private browsing mode at a later point for the WebView impleme ntation. | 593 // to set the private browsing mode at a later point for the WebView impleme ntation. |
599 // Note that the caller remains the owner of the nativeWebContents and is re sponsible for | 594 // Note that the caller remains the owner of the nativeWebContents and is re sponsible for |
600 // deleting it after destroying the ContentViewCore. | 595 // deleting it after destroying the ContentViewCore. |
601 public void initialize(ViewGroup containerView, InternalAccessDelegate inter nalDispatcher, | 596 public void initialize(ViewGroup containerView, InternalAccessDelegate inter nalDispatcher, |
602 long nativeWebContents, WindowAndroid windowAndroid) { | 597 long nativeWebContents, WindowAndroid windowAndroid) { |
603 setContainerView(containerView); | 598 setContainerView(containerView); |
604 | 599 |
605 mPositionListener = new PositionObserver.Listener() { | |
606 @Override | |
607 public void onPositionChanged(int x, int y) { | |
608 if (isSelectionHandleShowing() || isInsertionHandleShowing()) { | |
609 temporarilyHideTextHandles(); | |
610 } | |
611 } | |
612 }; | |
613 | |
614 long windowNativePointer = windowAndroid != null ? windowAndroid.getNati vePointer() : 0; | 600 long windowNativePointer = windowAndroid != null ? windowAndroid.getNati vePointer() : 0; |
615 | 601 |
616 long viewAndroidNativePointer = 0; | 602 long viewAndroidNativePointer = 0; |
617 if (windowNativePointer != 0) { | 603 if (windowNativePointer != 0) { |
618 mViewAndroid = new ViewAndroid(windowAndroid, getViewAndroidDelegate ()); | 604 mViewAndroid = new ViewAndroid(windowAndroid, getViewAndroidDelegate ()); |
619 viewAndroidNativePointer = mViewAndroid.getNativePointer(); | 605 viewAndroidNativePointer = mViewAndroid.getNativePointer(); |
620 } | 606 } |
621 | 607 |
622 mZoomControlsDelegate = new ZoomControlsDelegate() { | 608 mZoomControlsDelegate = new ZoomControlsDelegate() { |
623 @Override | 609 @Override |
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
675 * <li>Disconnecting the old container view from this ContentViewCore</l i> | 661 * <li>Disconnecting the old container view from this ContentViewCore</l i> |
676 * <li>Updating the InternalAccessDelegate</li> | 662 * <li>Updating the InternalAccessDelegate</li> |
677 * <li>Reconciling the state of this ContentViewCore with the new contai ner view</li> | 663 * <li>Reconciling the state of this ContentViewCore with the new contai ner view</li> |
678 * <li>Tearing down and recreating the native GL rendering where appropr iate</li> | 664 * <li>Tearing down and recreating the native GL rendering where appropr iate</li> |
679 * <li>etc.</li> | 665 * <li>etc.</li> |
680 * </ul> | 666 * </ul> |
681 */ | 667 */ |
682 public void setContainerView(ViewGroup containerView) { | 668 public void setContainerView(ViewGroup containerView) { |
683 TraceEvent.begin(); | 669 TraceEvent.begin(); |
684 if (mContainerView != null) { | 670 if (mContainerView != null) { |
685 mPositionObserver.removeListener(mPositionListener); | 671 mPastePopupMenu = null; |
686 mSelectionHandleController = null; | |
687 mInsertionHandleController = null; | |
688 mInputConnection = null; | 672 mInputConnection = null; |
689 } | 673 } |
690 | 674 |
691 mContainerView = containerView; | 675 mContainerView = containerView; |
692 mPositionObserver = new ViewPositionObserver(mContainerView); | 676 mPositionObserver = new ViewPositionObserver(mContainerView); |
693 String contentDescription = "Web View"; | 677 String contentDescription = "Web View"; |
694 if (R.string.accessibility_content_view == 0) { | 678 if (R.string.accessibility_content_view == 0) { |
695 Log.w(TAG, "Setting contentDescription to 'Web View' as no value was specified."); | 679 Log.w(TAG, "Setting contentDescription to 'Web View' as no value was specified."); |
696 } else { | 680 } else { |
697 contentDescription = mContext.getResources().getString( | 681 contentDescription = mContext.getResources().getString( |
(...skipping 420 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1118 | 1102 |
1119 /** | 1103 /** |
1120 * @see View#onTouchEvent(MotionEvent) | 1104 * @see View#onTouchEvent(MotionEvent) |
1121 */ | 1105 */ |
1122 public boolean onTouchEvent(MotionEvent event) { | 1106 public boolean onTouchEvent(MotionEvent event) { |
1123 TraceEvent.begin("onTouchEvent"); | 1107 TraceEvent.begin("onTouchEvent"); |
1124 try { | 1108 try { |
1125 cancelRequestToScrollFocusedEditableNodeIntoView(); | 1109 cancelRequestToScrollFocusedEditableNodeIntoView(); |
1126 | 1110 |
1127 final int eventAction = event.getActionMasked(); | 1111 final int eventAction = event.getActionMasked(); |
1128 | 1112 if (!isValidTouchEventActionForNative(eventAction)) return false; |
1129 // Only these actions have any effect on gesture detection. Other | |
1130 // actions have no corresponding WebTouchEvent type and may confuse the | |
1131 // touch pipline, so we ignore them entirely. | |
1132 if (eventAction != MotionEvent.ACTION_DOWN | |
1133 && eventAction != MotionEvent.ACTION_UP | |
1134 && eventAction != MotionEvent.ACTION_CANCEL | |
1135 && eventAction != MotionEvent.ACTION_MOVE | |
1136 && eventAction != MotionEvent.ACTION_POINTER_DOWN | |
1137 && eventAction != MotionEvent.ACTION_POINTER_UP) { | |
1138 return false; | |
1139 } | |
1140 | 1113 |
1141 if (mNativeContentViewCore == 0) return false; | 1114 if (mNativeContentViewCore == 0) return false; |
1142 | 1115 |
1143 // A zero offset is quite common, in which case the unnecessary copy should be avoided. | 1116 // A zero offset is quite common, in which case the unnecessary copy should be avoided. |
1144 MotionEvent offset = null; | 1117 MotionEvent offset = null; |
1145 if (mCurrentTouchOffsetX != 0 || mCurrentTouchOffsetY != 0) { | 1118 if (mCurrentTouchOffsetX != 0 || mCurrentTouchOffsetY != 0) { |
1146 offset = createOffsetMotionEvent(event); | 1119 offset = createOffsetMotionEvent(event); |
1147 event = offset; | 1120 event = offset; |
1148 } | 1121 } |
1149 | 1122 |
(...skipping 11 matching lines...) Expand all Loading... | |
1161 pointerCount > 1 ? event.getToolType(1) : MotionEvent.TOOL_T YPE_UNKNOWN, | 1134 pointerCount > 1 ? event.getToolType(1) : MotionEvent.TOOL_T YPE_UNKNOWN, |
1162 event.getButtonState()); | 1135 event.getButtonState()); |
1163 | 1136 |
1164 if (offset != null) offset.recycle(); | 1137 if (offset != null) offset.recycle(); |
1165 return consumed; | 1138 return consumed; |
1166 } finally { | 1139 } finally { |
1167 TraceEvent.end("onTouchEvent"); | 1140 TraceEvent.end("onTouchEvent"); |
1168 } | 1141 } |
1169 } | 1142 } |
1170 | 1143 |
1144 private static boolean isValidTouchEventActionForNative(int eventAction) { | |
1145 // Only these actions have any effect on gesture detection. Other | |
1146 // actions have no corresponding WebTouchEvent type and may confuse the | |
1147 // touch pipline, so we ignore them entirely. | |
1148 return eventAction == MotionEvent.ACTION_DOWN | |
1149 || eventAction == MotionEvent.ACTION_UP | |
1150 || eventAction == MotionEvent.ACTION_CANCEL | |
1151 || eventAction == MotionEvent.ACTION_MOVE | |
1152 || eventAction == MotionEvent.ACTION_POINTER_DOWN | |
1153 || eventAction == MotionEvent.ACTION_POINTER_UP; | |
1154 } | |
1155 | |
1171 public void setIgnoreRemainingTouchEvents() { | 1156 public void setIgnoreRemainingTouchEvents() { |
1172 resetGestureDetection(); | 1157 resetGestureDetection(); |
1173 } | 1158 } |
1174 | 1159 |
1175 public boolean isScrollInProgress() { | 1160 public boolean isScrollInProgress() { |
1176 return mTouchScrollInProgress || mPotentiallyActiveFlingCount > 0; | 1161 return mTouchScrollInProgress || mPotentiallyActiveFlingCount > 0; |
1177 } | 1162 } |
1178 | 1163 |
1179 @SuppressWarnings("unused") | 1164 @SuppressWarnings("unused") |
1180 @CalledByNative | 1165 @CalledByNative |
1181 private void onFlingStartEventConsumed(int vx, int vy) { | 1166 private void onFlingStartEventConsumed(int vx, int vy) { |
1182 mTouchScrollInProgress = false; | 1167 mTouchScrollInProgress = false; |
1183 mPotentiallyActiveFlingCount++; | 1168 mPotentiallyActiveFlingCount++; |
1184 temporarilyHideTextHandles(); | |
1185 for (mGestureStateListenersIterator.rewind(); | 1169 for (mGestureStateListenersIterator.rewind(); |
1186 mGestureStateListenersIterator.hasNext();) { | 1170 mGestureStateListenersIterator.hasNext();) { |
1187 mGestureStateListenersIterator.next().onFlingStartGesture( | 1171 mGestureStateListenersIterator.next().onFlingStartGesture( |
1188 vx, vy, computeVerticalScrollOffset(), computeVerticalScroll Extent()); | 1172 vx, vy, computeVerticalScrollOffset(), computeVerticalScroll Extent()); |
1189 } | 1173 } |
1190 } | 1174 } |
1191 | 1175 |
1192 @SuppressWarnings("unused") | 1176 @SuppressWarnings("unused") |
1193 @CalledByNative | 1177 @CalledByNative |
1194 private void onFlingStartEventHadNoConsumer(int vx, int vy) { | 1178 private void onFlingStartEventHadNoConsumer(int vx, int vy) { |
1195 mTouchScrollInProgress = false; | 1179 mTouchScrollInProgress = false; |
1196 for (mGestureStateListenersIterator.rewind(); | 1180 for (mGestureStateListenersIterator.rewind(); |
1197 mGestureStateListenersIterator.hasNext();) { | 1181 mGestureStateListenersIterator.hasNext();) { |
1198 mGestureStateListenersIterator.next().onUnhandledFlingStartEvent(vx, vy); | 1182 mGestureStateListenersIterator.next().onUnhandledFlingStartEvent(vx, vy); |
1199 } | 1183 } |
1200 } | 1184 } |
1201 | 1185 |
1202 @SuppressWarnings("unused") | 1186 @SuppressWarnings("unused") |
1203 @CalledByNative | 1187 @CalledByNative |
1204 private void onFlingCancelEventAck() { | 1188 private void onFlingCancelEventAck() { |
1205 updateGestureStateListener(GestureEventType.FLING_CANCEL); | 1189 updateGestureStateListener(GestureEventType.FLING_CANCEL); |
1206 } | 1190 } |
1207 | 1191 |
1208 @SuppressWarnings("unused") | 1192 @SuppressWarnings("unused") |
1209 @CalledByNative | 1193 @CalledByNative |
1210 private void onScrollBeginEventAck() { | 1194 private void onScrollBeginEventAck() { |
1195 hidePastePopup(); | |
1211 mTouchScrollInProgress = true; | 1196 mTouchScrollInProgress = true; |
1212 temporarilyHideTextHandles(); | |
1213 mZoomControlsDelegate.invokeZoomPicker(); | 1197 mZoomControlsDelegate.invokeZoomPicker(); |
1214 updateGestureStateListener(GestureEventType.SCROLL_START); | 1198 updateGestureStateListener(GestureEventType.SCROLL_START); |
1215 } | 1199 } |
1216 | 1200 |
1217 @SuppressWarnings("unused") | 1201 @SuppressWarnings("unused") |
1218 @CalledByNative | 1202 @CalledByNative |
1219 private void onScrollUpdateGestureConsumed() { | 1203 private void onScrollUpdateGestureConsumed() { |
1220 mZoomControlsDelegate.invokeZoomPicker(); | 1204 mZoomControlsDelegate.invokeZoomPicker(); |
1221 for (mGestureStateListenersIterator.rewind(); | 1205 for (mGestureStateListenersIterator.rewind(); |
1222 mGestureStateListenersIterator.hasNext();) { | 1206 mGestureStateListenersIterator.hasNext();) { |
1223 mGestureStateListenersIterator.next().onScrollUpdateGestureConsumed( ); | 1207 mGestureStateListenersIterator.next().onScrollUpdateGestureConsumed( ); |
1224 } | 1208 } |
1225 } | 1209 } |
1226 | 1210 |
1227 @SuppressWarnings("unused") | 1211 @SuppressWarnings("unused") |
1228 @CalledByNative | 1212 @CalledByNative |
1229 private void onScrollEndEventAck() { | 1213 private void onScrollEndEventAck() { |
1230 if (!mTouchScrollInProgress) return; | 1214 if (!mTouchScrollInProgress) return; |
1231 mTouchScrollInProgress = false; | 1215 mTouchScrollInProgress = false; |
1232 updateGestureStateListener(GestureEventType.SCROLL_END); | 1216 updateGestureStateListener(GestureEventType.SCROLL_END); |
1233 } | 1217 } |
1234 | 1218 |
1235 @SuppressWarnings("unused") | 1219 @SuppressWarnings("unused") |
1236 @CalledByNative | 1220 @CalledByNative |
1237 private void onPinchBeginEventAck() { | 1221 private void onPinchBeginEventAck() { |
1238 temporarilyHideTextHandles(); | |
1239 updateGestureStateListener(GestureEventType.PINCH_BEGIN); | 1222 updateGestureStateListener(GestureEventType.PINCH_BEGIN); |
1240 } | 1223 } |
1241 | 1224 |
1242 @SuppressWarnings("unused") | 1225 @SuppressWarnings("unused") |
1243 @CalledByNative | 1226 @CalledByNative |
1244 private void onPinchEndEventAck() { | 1227 private void onPinchEndEventAck() { |
1245 updateGestureStateListener(GestureEventType.PINCH_END); | 1228 updateGestureStateListener(GestureEventType.PINCH_END); |
1246 } | 1229 } |
1247 | 1230 |
1248 @SuppressWarnings("unused") | 1231 @SuppressWarnings("unused") |
1249 @CalledByNative | 1232 @CalledByNative |
1250 private void onSingleTapEventAck(boolean consumed, int x, int y) { | 1233 private void onSingleTapEventAck(boolean consumed, int x, int y) { |
1251 for (mGestureStateListenersIterator.rewind(); | 1234 for (mGestureStateListenersIterator.rewind(); |
1252 mGestureStateListenersIterator.hasNext();) { | 1235 mGestureStateListenersIterator.hasNext();) { |
1253 mGestureStateListenersIterator.next().onSingleTap(consumed, x, y); | 1236 mGestureStateListenersIterator.next().onSingleTap(consumed, x, y); |
1254 } | 1237 } |
1255 } | 1238 } |
1256 | 1239 |
1257 @SuppressWarnings("unused") | |
1258 @CalledByNative | |
1259 private void onDoubleTapEventAck() { | |
1260 temporarilyHideTextHandles(); | |
1261 } | |
1262 | |
1263 /** | 1240 /** |
1264 * Called just prior to a tap or press gesture being forwarded to the render er. | 1241 * Called just prior to a tap or press gesture being forwarded to the render er. |
1265 */ | 1242 */ |
1266 @SuppressWarnings("unused") | 1243 @SuppressWarnings("unused") |
1267 @CalledByNative | 1244 @CalledByNative |
1268 private boolean filterTapOrPressEvent(int type, int x, int y) { | 1245 private boolean filterTapOrPressEvent(int type, int x, int y) { |
1269 if (type == GestureEventType.LONG_PRESS && offerLongPressToEmbedder()) { | 1246 if (type == GestureEventType.LONG_PRESS && offerLongPressToEmbedder()) { |
1270 return true; | 1247 return true; |
1271 } | 1248 } |
1272 updateForTapOrPress(type, x, y); | 1249 updateForTapOrPress(type, x, y); |
(...skipping 145 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1418 * Return the ContentSettings object used to retrieve the settings for this | 1395 * Return the ContentSettings object used to retrieve the settings for this |
1419 * ContentViewCore. For modifications, ChromeNativePreferences is to be used . | 1396 * ContentViewCore. For modifications, ChromeNativePreferences is to be used . |
1420 * @return A ContentSettings object that can be used to retrieve this | 1397 * @return A ContentSettings object that can be used to retrieve this |
1421 * ContentViewCore's settings. | 1398 * ContentViewCore's settings. |
1422 */ | 1399 */ |
1423 public ContentSettings getContentSettings() { | 1400 public ContentSettings getContentSettings() { |
1424 return mContentSettings; | 1401 return mContentSettings; |
1425 } | 1402 } |
1426 | 1403 |
1427 private void hidePopups() { | 1404 private void hidePopups() { |
1405 mUnselectAllOnActionModeDismiss = true; | |
1406 hideSelectActionBar(); | |
1407 hidePastePopup(); | |
1428 hideSelectPopup(); | 1408 hideSelectPopup(); |
1429 hideHandles(); | 1409 hideTextHandles(); |
1430 hideSelectActionBar(); | |
1431 } | 1410 } |
1432 | 1411 |
1433 public void hideSelectActionBar() { | 1412 public void hideSelectActionBar() { |
1434 if (mActionMode != null) { | 1413 if (mActionMode != null) { |
1435 mActionMode.finish(); | 1414 mActionMode.finish(); |
1436 mActionMode = null; | 1415 mActionMode = null; |
1437 } | 1416 } |
1438 } | 1417 } |
1439 | 1418 |
1440 public boolean isSelectActionBarShowing() { | 1419 public boolean isSelectActionBarShowing() { |
(...skipping 434 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1875 if (mContainerView.isFocusable() && mContainerView.isFocusableInTouchMod e() | 1854 if (mContainerView.isFocusable() && mContainerView.isFocusableInTouchMod e() |
1876 && !mContainerView.isFocused()) { | 1855 && !mContainerView.isFocused()) { |
1877 mContainerView.requestFocus(); | 1856 mContainerView.requestFocus(); |
1878 } | 1857 } |
1879 | 1858 |
1880 if (!mPopupZoomer.isShowing()) mPopupZoomer.setLastTouch(xPix, yPix); | 1859 if (!mPopupZoomer.isShowing()) mPopupZoomer.setLastTouch(xPix, yPix); |
1881 | 1860 |
1882 mLastTapX = (int) xPix; | 1861 mLastTapX = (int) xPix; |
1883 mLastTapY = (int) yPix; | 1862 mLastTapY = (int) yPix; |
1884 | 1863 |
1885 if (type == GestureEventType.LONG_PRESS | 1864 if (type == GestureEventType.LONG_PRESS) mAllowAutomaticPastePopupShowin g = true; |
1886 || type == GestureEventType.LONG_TAP) { | |
1887 getInsertionHandleController().allowAutomaticShowing(); | |
1888 getSelectionHandleController().allowAutomaticShowing(); | |
1889 } else { | |
1890 if (mSelectionEditable) getInsertionHandleController().allowAutomati cShowing(); | |
1891 } | |
1892 } | 1865 } |
1893 | 1866 |
1894 /** | 1867 /** |
1895 * @return The x coordinate for the last point that a tap or press gesture w as initiated from. | 1868 * @return The x coordinate for the last point that a tap or press gesture w as initiated from. |
1896 */ | 1869 */ |
1897 public int getLastTapX() { | 1870 public int getLastTapX() { |
1898 return mLastTapX; | 1871 return mLastTapX; |
1899 } | 1872 } |
1900 | 1873 |
1901 /** | 1874 /** |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1944 */ | 1917 */ |
1945 public void setDownloadDelegate(ContentViewDownloadDelegate delegate) { | 1918 public void setDownloadDelegate(ContentViewDownloadDelegate delegate) { |
1946 mDownloadDelegate = delegate; | 1919 mDownloadDelegate = delegate; |
1947 } | 1920 } |
1948 | 1921 |
1949 // Called by DownloadController. | 1922 // Called by DownloadController. |
1950 ContentViewDownloadDelegate getDownloadDelegate() { | 1923 ContentViewDownloadDelegate getDownloadDelegate() { |
1951 return mDownloadDelegate; | 1924 return mDownloadDelegate; |
1952 } | 1925 } |
1953 | 1926 |
1954 private SelectionHandleController getSelectionHandleController() { | |
1955 if (mSelectionHandleController == null) { | |
1956 mSelectionHandleController = new SelectionHandleController( | |
1957 getContainerView(), mPositionObserver) { | |
1958 @Override | |
1959 public void selectBetweenCoordinates(int x1, int y1, int x2, int y2) { | |
1960 if (mNativeContentViewCore != 0 && !(x1 == x2 && y1 == y2)) { | |
1961 nativeSelectBetweenCoordinates(mNativeContentViewCore, | |
1962 x1, y1 - mRenderCoordinates.getContentOffsetYPix (), | |
1963 x2, y2 - mRenderCoordinates.getContentOffsetYPix ()); | |
1964 } | |
1965 } | |
1966 | |
1967 @Override | |
1968 public void showHandles(int startDir, int endDir) { | |
1969 final boolean wasShowing = isShowing(); | |
1970 super.showHandles(startDir, endDir); | |
1971 if (!wasShowing || mActionMode == null) showSelectActionBar( ); | |
1972 } | |
1973 | |
1974 }; | |
1975 | |
1976 mSelectionHandleController.hideAndDisallowAutomaticShowing(); | |
1977 } | |
1978 | |
1979 return mSelectionHandleController; | |
1980 } | |
1981 | |
1982 private InsertionHandleController getInsertionHandleController() { | |
1983 if (mInsertionHandleController == null) { | |
1984 mInsertionHandleController = new InsertionHandleController( | |
1985 getContainerView(), mPositionObserver) { | |
1986 private static final int AVERAGE_LINE_HEIGHT = 14; | |
1987 | |
1988 @Override | |
1989 public void setCursorPosition(int x, int y) { | |
1990 if (mNativeContentViewCore != 0) { | |
1991 nativeMoveCaret(mNativeContentViewCore, | |
1992 x, y - mRenderCoordinates.getContentOffsetYPix() ); | |
1993 } | |
1994 } | |
1995 | |
1996 @Override | |
1997 public void paste() { | |
1998 mImeAdapter.paste(); | |
1999 hideHandles(); | |
2000 } | |
2001 | |
2002 @Override | |
2003 public int getLineHeight() { | |
2004 return (int) Math.ceil( | |
2005 mRenderCoordinates.fromLocalCssToPix(AVERAGE_LINE_HE IGHT)); | |
2006 } | |
2007 }; | |
2008 | |
2009 mInsertionHandleController.hideAndDisallowAutomaticShowing(); | |
2010 } | |
2011 | |
2012 return mInsertionHandleController; | |
2013 } | |
2014 | |
2015 @VisibleForTesting | |
2016 public InsertionHandleController getInsertionHandleControllerForTest() { | |
2017 return mInsertionHandleController; | |
2018 } | |
2019 | |
2020 @VisibleForTesting | |
2021 public SelectionHandleController getSelectionHandleControllerForTest() { | |
2022 return mSelectionHandleController; | |
2023 } | |
2024 | |
2025 private void updateHandleScreenPositions() { | |
2026 if (isSelectionHandleShowing()) { | |
2027 mSelectionHandleController.setStartHandlePosition( | |
2028 mStartHandlePoint.getXPix(), mStartHandlePoint.getYPix()); | |
2029 mSelectionHandleController.setEndHandlePosition( | |
2030 mEndHandlePoint.getXPix(), mEndHandlePoint.getYPix()); | |
2031 } | |
2032 | |
2033 if (isInsertionHandleShowing()) { | |
2034 mInsertionHandleController.setHandlePosition( | |
2035 mInsertionHandlePoint.getXPix(), mInsertionHandlePoint.getYP ix()); | |
2036 } | |
2037 } | |
2038 | |
2039 private void hideHandles() { | |
2040 if (mSelectionHandleController != null) { | |
2041 mSelectionHandleController.hideAndDisallowAutomaticShowing(); | |
2042 } | |
2043 if (mInsertionHandleController != null) { | |
2044 mInsertionHandleController.hideAndDisallowAutomaticShowing(); | |
2045 } | |
2046 mPositionObserver.removeListener(mPositionListener); | |
2047 } | |
2048 | |
2049 private void showSelectActionBar() { | 1927 private void showSelectActionBar() { |
2050 if (mActionMode != null) { | 1928 if (mActionMode != null) { |
2051 mActionMode.invalidate(); | 1929 mActionMode.invalidate(); |
2052 return; | 1930 return; |
2053 } | 1931 } |
2054 | 1932 |
2055 // Start a new action mode with a SelectActionModeCallback. | 1933 // Start a new action mode with a SelectActionModeCallback. |
2056 SelectActionModeCallback.ActionHandler actionHandler = | 1934 SelectActionModeCallback.ActionHandler actionHandler = |
2057 new SelectActionModeCallback.ActionHandler() { | 1935 new SelectActionModeCallback.ActionHandler() { |
2058 @Override | 1936 @Override |
(...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2168 } | 2046 } |
2169 mUnselectAllOnActionModeDismiss = true; | 2047 mUnselectAllOnActionModeDismiss = true; |
2170 if (mActionMode == null) { | 2048 if (mActionMode == null) { |
2171 // There is no ActionMode, so remove the selection. | 2049 // There is no ActionMode, so remove the selection. |
2172 mImeAdapter.unselect(); | 2050 mImeAdapter.unselect(); |
2173 } else { | 2051 } else { |
2174 getContentViewClient().onContextualActionBarShown(); | 2052 getContentViewClient().onContextualActionBarShown(); |
2175 } | 2053 } |
2176 } | 2054 } |
2177 | 2055 |
2056 private void hidePastePopup() { | |
2057 mAllowAutomaticPastePopupShowing = false; | |
2058 if (mPastePopupMenu == null) return; | |
2059 mPastePopupMenu.hide(); | |
2060 } | |
2061 | |
2062 @CalledByNative | |
2063 private void onSelectionEvent(int eventType, float posXDip, float posYDip) { | |
2064 boolean shouldShowPastePopup = false; | |
2065 switch (eventType) { | |
2066 case SelectionEventType.SELECTION_SHOWN: | |
2067 mHasSelection = true; | |
2068 // TODO(cjhopman): Remove this when there is a better signal tha t long press caused | |
2069 // a selection. See http://crbug.com/150151. | |
2070 mContainerView.performHapticFeedback(HapticFeedbackConstants.LON G_PRESS); | |
2071 showSelectActionBar(); | |
2072 break; | |
2073 | |
2074 case SelectionEventType.SELECTION_CLEARED: | |
2075 mHasSelection = false; | |
2076 mUnselectAllOnActionModeDismiss = false; | |
2077 hideSelectActionBar(); | |
2078 break; | |
2079 | |
2080 case SelectionEventType.INSERTION_SHOWN: | |
2081 mHasInsertion = true; | |
2082 shouldShowPastePopup = mAllowAutomaticPastePopupShowing; | |
2083 break; | |
2084 | |
2085 case SelectionEventType.INSERTION_MOVED: | |
2086 // TODO(jdduke): Handle case where movement triggered by focus. | |
2087 hidePastePopup(); | |
2088 break; | |
2089 | |
2090 case SelectionEventType.INSERTION_TAPPED: | |
2091 if (getPastePopup().isShowing()) | |
2092 mPastePopupMenu.hide(); | |
2093 else | |
2094 shouldShowPastePopup = true; | |
2095 break; | |
2096 | |
2097 case SelectionEventType.INSERTION_CLEARED: | |
2098 mHasInsertion = false; | |
2099 hidePastePopup(); | |
2100 break; | |
2101 | |
2102 default: | |
2103 assert false : "Invalid selection event type."; | |
2104 } | |
2105 if (shouldShowPastePopup) { | |
2106 final float contentOffsetYPix = mRenderCoordinates.getContentOffsetY Pix(); | |
2107 getPastePopup().showAt( | |
2108 (int) mRenderCoordinates.fromDipToPix(posXDip), | |
2109 (int) (mRenderCoordinates.fromDipToPix(posYDip) + contentOffsetY Pix)); | |
2110 } | |
2111 } | |
2112 | |
2178 public boolean getUseDesktopUserAgent() { | 2113 public boolean getUseDesktopUserAgent() { |
2179 if (mNativeContentViewCore != 0) { | 2114 if (mNativeContentViewCore != 0) { |
2180 return nativeGetUseDesktopUserAgent(mNativeContentViewCore); | 2115 return nativeGetUseDesktopUserAgent(mNativeContentViewCore); |
2181 } | 2116 } |
2182 return false; | 2117 return false; |
2183 } | 2118 } |
2184 | 2119 |
2185 /** | 2120 /** |
2186 * Set whether or not we're using a desktop user agent for the currently loa ded page. | 2121 * Set whether or not we're using a desktop user agent for the currently loa ded page. |
2187 * @param override If true, use a desktop user agent. Use a mobile one othe rwise. | 2122 * @param override If true, use a desktop user agent. Use a mobile one othe rwise. |
2188 * @param reloadOnChange Reload the page if the UA has changed. | 2123 * @param reloadOnChange Reload the page if the UA has changed. |
2189 */ | 2124 */ |
2190 public void setUseDesktopUserAgent(boolean override, boolean reloadOnChange) { | 2125 public void setUseDesktopUserAgent(boolean override, boolean reloadOnChange) { |
2191 if (mNativeContentViewCore != 0) { | 2126 if (mNativeContentViewCore != 0) { |
2192 nativeSetUseDesktopUserAgent(mNativeContentViewCore, override, reloa dOnChange); | 2127 nativeSetUseDesktopUserAgent(mNativeContentViewCore, override, reloa dOnChange); |
2193 } | 2128 } |
2194 } | 2129 } |
2195 | 2130 |
2196 public void clearSslPreferences() { | 2131 public void clearSslPreferences() { |
2197 if (mNativeContentViewCore != 0) nativeClearSslPreferences(mNativeConten tViewCore); | 2132 if (mNativeContentViewCore != 0) nativeClearSslPreferences(mNativeConten tViewCore); |
2198 } | 2133 } |
2199 | 2134 |
2200 private boolean isSelectionHandleShowing() { | 2135 private void hideTextHandles() { |
2201 return mSelectionHandleController != null && mSelectionHandleController. isShowing(); | 2136 mHasSelection = false; |
2202 } | 2137 mHasInsertion = false; |
2203 | 2138 if (mNativeContentViewCore != 0) nativeHideTextHandles(mNativeContentVie wCore); |
2204 private boolean isInsertionHandleShowing() { | |
2205 return mInsertionHandleController != null && mInsertionHandleController. isShowing(); | |
2206 } | |
2207 | |
2208 // Makes the insertion/selection handles invisible. They will fade back in s hortly after the | |
2209 // last call to scheduleTextHandleFadeIn (or temporarilyHideTextHandles). | |
2210 private void temporarilyHideTextHandles() { | |
2211 if (isSelectionHandleShowing() && !mSelectionHandleController.isDragging ()) { | |
2212 mSelectionHandleController.setHandleVisibility(HandleView.INVISIBLE) ; | |
2213 } | |
2214 if (isInsertionHandleShowing() && !mInsertionHandleController.isDragging ()) { | |
2215 mInsertionHandleController.setHandleVisibility(HandleView.INVISIBLE) ; | |
2216 } | |
2217 scheduleTextHandleFadeIn(); | |
2218 } | |
2219 | |
2220 private boolean allowTextHandleFadeIn() { | |
2221 if (mTouchScrollInProgress) return false; | |
2222 | |
2223 if (mPopupZoomer.isShowing()) return false; | |
2224 | |
2225 return true; | |
2226 } | |
2227 | |
2228 // Cancels any pending fade in and schedules a new one. | |
2229 private void scheduleTextHandleFadeIn() { | |
2230 if (!isInsertionHandleShowing() && !isSelectionHandleShowing()) return; | |
2231 | |
2232 if (mDeferredHandleFadeInRunnable == null) { | |
2233 mDeferredHandleFadeInRunnable = new Runnable() { | |
2234 @Override | |
2235 public void run() { | |
2236 if (!allowTextHandleFadeIn()) { | |
2237 // Delay fade in until it is allowed. | |
2238 scheduleTextHandleFadeIn(); | |
2239 } else { | |
2240 if (isSelectionHandleShowing()) { | |
2241 mSelectionHandleController.beginHandleFadeIn(); | |
2242 } | |
2243 if (isInsertionHandleShowing()) { | |
2244 mInsertionHandleController.beginHandleFadeIn(); | |
2245 } | |
2246 } | |
2247 } | |
2248 }; | |
2249 } | |
2250 | |
2251 mContainerView.removeCallbacks(mDeferredHandleFadeInRunnable); | |
2252 mContainerView.postDelayed(mDeferredHandleFadeInRunnable, TEXT_HANDLE_FA DE_IN_DELAY); | |
2253 } | 2139 } |
2254 | 2140 |
2255 /** | 2141 /** |
2256 * Shows the IME if the focused widget could accept text input. | 2142 * Shows the IME if the focused widget could accept text input. |
2257 */ | 2143 */ |
2258 public void showImeIfNeeded() { | 2144 public void showImeIfNeeded() { |
2259 if (mNativeContentViewCore != 0) nativeShowImeIfNeeded(mNativeContentVie wCore); | 2145 if (mNativeContentViewCore != 0) nativeShowImeIfNeeded(mNativeContentVie wCore); |
2260 } | 2146 } |
2261 | 2147 |
2262 /** | 2148 /** |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2306 pageScaleFactor != mRenderCoordinates.getPageScaleFactor(); | 2192 pageScaleFactor != mRenderCoordinates.getPageScaleFactor(); |
2307 final boolean scrollChanged = | 2193 final boolean scrollChanged = |
2308 pageScaleChanged | 2194 pageScaleChanged |
2309 || scrollOffsetX != mRenderCoordinates.getScrollX() | 2195 || scrollOffsetX != mRenderCoordinates.getScrollX() |
2310 || scrollOffsetY != mRenderCoordinates.getScrollY(); | 2196 || scrollOffsetY != mRenderCoordinates.getScrollY(); |
2311 final boolean contentOffsetChanged = | 2197 final boolean contentOffsetChanged = |
2312 contentOffsetYPix != mRenderCoordinates.getContentOffsetYPix(); | 2198 contentOffsetYPix != mRenderCoordinates.getContentOffsetYPix(); |
2313 | 2199 |
2314 final boolean needHidePopupZoomer = contentSizeChanged || scrollChanged; | 2200 final boolean needHidePopupZoomer = contentSizeChanged || scrollChanged; |
2315 final boolean needUpdateZoomControls = scaleLimitsChanged || scrollChang ed; | 2201 final boolean needUpdateZoomControls = scaleLimitsChanged || scrollChang ed; |
2316 final boolean needTemporarilyHideHandles = scrollChanged; | |
2317 | 2202 |
2318 if (needHidePopupZoomer) mPopupZoomer.hide(true); | 2203 if (needHidePopupZoomer) mPopupZoomer.hide(true); |
2319 | 2204 |
2320 if (scrollChanged) { | 2205 if (scrollChanged) { |
2321 mContainerViewInternals.onScrollChanged( | 2206 mContainerViewInternals.onScrollChanged( |
2322 (int) mRenderCoordinates.fromLocalCssToPix(scrollOffsetX), | 2207 (int) mRenderCoordinates.fromLocalCssToPix(scrollOffsetX), |
2323 (int) mRenderCoordinates.fromLocalCssToPix(scrollOffsetY), | 2208 (int) mRenderCoordinates.fromLocalCssToPix(scrollOffsetY), |
2324 (int) mRenderCoordinates.getScrollXPix(), | 2209 (int) mRenderCoordinates.getScrollXPix(), |
2325 (int) mRenderCoordinates.getScrollYPix()); | 2210 (int) mRenderCoordinates.getScrollYPix()); |
2326 } | 2211 } |
2327 | 2212 |
2328 mRenderCoordinates.updateFrameInfo( | 2213 mRenderCoordinates.updateFrameInfo( |
2329 scrollOffsetX, scrollOffsetY, | 2214 scrollOffsetX, scrollOffsetY, |
2330 contentWidth, contentHeight, | 2215 contentWidth, contentHeight, |
2331 viewportWidth, viewportHeight, | 2216 viewportWidth, viewportHeight, |
2332 pageScaleFactor, minPageScaleFactor, maxPageScaleFactor, | 2217 pageScaleFactor, minPageScaleFactor, maxPageScaleFactor, |
2333 contentOffsetYPix); | 2218 contentOffsetYPix); |
2334 | 2219 |
2335 if (scrollChanged || contentOffsetChanged) { | 2220 if (scrollChanged || contentOffsetChanged) { |
2336 for (mGestureStateListenersIterator.rewind(); | 2221 for (mGestureStateListenersIterator.rewind(); |
2337 mGestureStateListenersIterator.hasNext();) { | 2222 mGestureStateListenersIterator.hasNext();) { |
2338 mGestureStateListenersIterator.next().onScrollOffsetOrExtentChan ged( | 2223 mGestureStateListenersIterator.next().onScrollOffsetOrExtentChan ged( |
2339 computeVerticalScrollOffset(), | 2224 computeVerticalScrollOffset(), |
2340 computeVerticalScrollExtent()); | 2225 computeVerticalScrollExtent()); |
2341 } | 2226 } |
2342 } | 2227 } |
2343 | 2228 |
2344 if (needTemporarilyHideHandles) temporarilyHideTextHandles(); | |
2345 if (needUpdateZoomControls) mZoomControlsDelegate.updateZoomControls(); | 2229 if (needUpdateZoomControls) mZoomControlsDelegate.updateZoomControls(); |
2346 if (contentOffsetChanged) updateHandleScreenPositions(); | |
2347 | 2230 |
2348 // Update offsets for fullscreen. | 2231 // Update offsets for fullscreen. |
2349 final float controlsOffsetPix = controlsOffsetYCss * deviceScale; | 2232 final float controlsOffsetPix = controlsOffsetYCss * deviceScale; |
2350 final float overdrawBottomHeightPix = overdrawBottomHeightCss * deviceSc ale; | 2233 final float overdrawBottomHeightPix = overdrawBottomHeightCss * deviceSc ale; |
2351 getContentViewClient().onOffsetsForFullscreenChanged( | 2234 getContentViewClient().onOffsetsForFullscreenChanged( |
2352 controlsOffsetPix, contentOffsetYPix, overdrawBottomHeightPix); | 2235 controlsOffsetPix, contentOffsetYPix, overdrawBottomHeightPix); |
2353 | 2236 |
2354 if (mBrowserAccessibilityManager != null) { | 2237 if (mBrowserAccessibilityManager != null) { |
2355 mBrowserAccessibilityManager.notifyFrameInfoInitialized(); | 2238 mBrowserAccessibilityManager.notifyFrameInfoInitialized(); |
2356 } | 2239 } |
2357 } | 2240 } |
2358 | 2241 |
2359 @CalledByNative | 2242 @CalledByNative |
2360 private void updateImeAdapter(long nativeImeAdapterAndroid, int textInputTyp e, | 2243 private void updateImeAdapter(long nativeImeAdapterAndroid, int textInputTyp e, |
2361 String text, int selectionStart, int selectionEnd, | 2244 String text, int selectionStart, int selectionEnd, |
2362 int compositionStart, int compositionEnd, boolean showImeIfNeeded, | 2245 int compositionStart, int compositionEnd, boolean showImeIfNeeded, |
2363 boolean isNonImeChange) { | 2246 boolean isNonImeChange) { |
2364 TraceEvent.begin(); | 2247 TraceEvent.begin(); |
2365 mSelectionEditable = (textInputType != ImeAdapter.getTextInputTypeNone() ); | 2248 mSelectionEditable = (textInputType != ImeAdapter.getTextInputTypeNone() ); |
2249 if (!mSelectionEditable) hidePastePopup(); | |
2366 | 2250 |
2367 mImeAdapter.updateKeyboardVisibility( | 2251 mImeAdapter.updateKeyboardVisibility( |
2368 nativeImeAdapterAndroid, textInputType, showImeIfNeeded); | 2252 nativeImeAdapterAndroid, textInputType, showImeIfNeeded); |
2369 | 2253 |
2370 if (mInputConnection != null) { | 2254 if (mInputConnection != null) { |
2371 mInputConnection.updateState(text, selectionStart, selectionEnd, com positionStart, | 2255 mInputConnection.updateState(text, selectionStart, selectionEnd, com positionStart, |
2372 compositionEnd, isNonImeChange); | 2256 compositionEnd, isNonImeChange); |
2373 } | 2257 } |
2374 | 2258 |
2375 if (mActionMode != null) mActionMode.invalidate(); | 2259 if (mActionMode != null) mActionMode.invalidate(); |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2425 */ | 2309 */ |
2426 public SelectPopup getSelectPopupForTest() { | 2310 public SelectPopup getSelectPopupForTest() { |
2427 return mSelectPopup; | 2311 return mSelectPopup; |
2428 } | 2312 } |
2429 | 2313 |
2430 @SuppressWarnings("unused") | 2314 @SuppressWarnings("unused") |
2431 @CalledByNative | 2315 @CalledByNative |
2432 private void showDisambiguationPopup(Rect targetRect, Bitmap zoomedBitmap) { | 2316 private void showDisambiguationPopup(Rect targetRect, Bitmap zoomedBitmap) { |
2433 mPopupZoomer.setBitmap(zoomedBitmap); | 2317 mPopupZoomer.setBitmap(zoomedBitmap); |
2434 mPopupZoomer.show(targetRect); | 2318 mPopupZoomer.show(targetRect); |
2435 temporarilyHideTextHandles(); | |
2436 } | 2319 } |
2437 | 2320 |
2438 @SuppressWarnings("unused") | 2321 @SuppressWarnings("unused") |
2439 @CalledByNative | 2322 @CalledByNative |
2440 private TouchEventSynthesizer createTouchEventSynthesizer() { | 2323 private TouchEventSynthesizer createTouchEventSynthesizer() { |
2441 return new TouchEventSynthesizer(this); | 2324 return new TouchEventSynthesizer(this); |
2442 } | 2325 } |
2443 | 2326 |
2444 @SuppressWarnings("unused") | 2327 @SuppressWarnings("unused") |
2445 @CalledByNative | 2328 @CalledByNative |
2329 private PopupTouchHandleDrawable createPopupTouchHandleDrawable() { | |
2330 if (mTouchHandleDelegate == null) { | |
2331 mTouchHandleDelegate = new PopupTouchHandleDrawableDelegate() { | |
2332 public boolean onTouchHandleEvent(MotionEvent event) { | |
2333 if (mNativeContentViewCore == 0) return false; | |
2334 if (!isValidTouchEventActionForNative(event.getActionMasked( ))) return false; | |
2335 return nativeOnTouchHandleEvent(mNativeContentViewCore, even t); | |
2336 } | |
2337 }; | |
2338 } | |
2339 return new PopupTouchHandleDrawable( | |
2340 mTouchHandleDelegate, getContainerView(), mPositionObserver); | |
2341 } | |
2342 | |
2343 @SuppressWarnings("unused") | |
2344 @CalledByNative | |
2446 private void onSelectionChanged(String text) { | 2345 private void onSelectionChanged(String text) { |
2447 mLastSelectedText = text; | 2346 mLastSelectedText = text; |
2448 getContentViewClient().onSelectionChanged(text); | 2347 getContentViewClient().onSelectionChanged(text); |
2449 } | 2348 } |
2450 | 2349 |
2451 @SuppressWarnings("unused") | 2350 @SuppressWarnings("unused") |
2452 @CalledByNative | |
2453 private void showSelectionHandlesAutomatically() { | |
2454 getSelectionHandleController().allowAutomaticShowing(); | |
2455 } | |
2456 | |
2457 @SuppressWarnings("unused") | |
2458 @CalledByNative | |
2459 private void onSelectionBoundsChanged( | |
2460 float anchorXDip, float anchorYDip, float focusXDip, float focusYDip , | |
2461 int anchorDir, int focusDir, | |
2462 boolean isAnchorVisible, boolean isFocusVisible) { | |
2463 // TODO(jdduke): Use |is{Anchor,Focus}Visible|, as well as the action | |
2464 // bar height, to set handle visibility, see crbug.com/164819. | |
2465 if (focusXDip != anchorXDip || focusYDip != anchorYDip || | |
2466 (mSelectionHandleController != null && mSelectionHandleControlle r.isDragging())) { | |
2467 if (mInsertionHandleController != null) { | |
2468 mInsertionHandleController.hide(); | |
2469 } | |
2470 mStartHandlePoint.setLocalDip(anchorXDip, anchorYDip); | |
2471 mEndHandlePoint.setLocalDip(focusXDip, focusYDip); | |
2472 | |
2473 boolean wereSelectionHandlesShowing = getSelectionHandleController() .isShowing(); | |
2474 | |
2475 getSelectionHandleController().onSelectionChanged(anchorDir, focusDi r); | |
2476 updateHandleScreenPositions(); | |
2477 mHasSelection = true; | |
2478 | |
2479 if (!wereSelectionHandlesShowing && getSelectionHandleController().i sShowing()) { | |
2480 // TODO(cjhopman): Remove this when there is a better signal tha t long press caused | |
2481 // a selection. See http://crbug.com/150151. | |
2482 mContainerView.performHapticFeedback(HapticFeedbackConstants.LON G_PRESS); | |
2483 } | |
2484 | |
2485 } else { | |
2486 mUnselectAllOnActionModeDismiss = false; | |
2487 hideSelectActionBar(); | |
2488 if (anchorXDip != 0 && anchorYDip != 0 && mSelectionEditable) { | |
2489 // Selection is a caret, and a text field is focused. | |
2490 if (mSelectionHandleController != null) { | |
2491 mSelectionHandleController.hide(); | |
2492 } | |
2493 mInsertionHandlePoint.setLocalDip(anchorXDip, anchorYDip); | |
2494 | |
2495 getInsertionHandleController().onCursorPositionChanged(); | |
2496 updateHandleScreenPositions(); | |
2497 if (mInputMethodManagerWrapper.isWatchingCursor(mContainerView)) { | |
2498 final int xPix = (int) mInsertionHandlePoint.getXPix(); | |
2499 final int yPix = (int) mInsertionHandlePoint.getYPix(); | |
2500 mInputMethodManagerWrapper.updateCursor( | |
2501 mContainerView, xPix, yPix, xPix, yPix); | |
2502 } | |
2503 } else { | |
2504 // Deselection | |
2505 hideHandles(); | |
2506 } | |
2507 mHasSelection = false; | |
2508 } | |
2509 if (isSelectionHandleShowing() || isInsertionHandleShowing()) { | |
2510 mPositionObserver.addListener(mPositionListener); | |
2511 } | |
2512 } | |
2513 | |
2514 @SuppressWarnings("unused") | |
2515 @CalledByNative | 2351 @CalledByNative |
2516 private static void onEvaluateJavaScriptResult( | 2352 private static void onEvaluateJavaScriptResult( |
2517 String jsonResult, JavaScriptCallback callback) { | 2353 String jsonResult, JavaScriptCallback callback) { |
2518 callback.handleJavaScriptResult(jsonResult); | 2354 callback.handleJavaScriptResult(jsonResult); |
2519 } | 2355 } |
2520 | 2356 |
2521 @SuppressWarnings("unused") | 2357 @SuppressWarnings("unused") |
2522 @CalledByNative | 2358 @CalledByNative |
2523 private void showPastePopup(int xDip, int yDip) { | 2359 private void showPastePopup(int xDip, int yDip) { |
cjhopman
2014/07/09 22:29:12
Is this called by native? Should it show the paste
jdduke (slow)
2014/07/10 02:08:39
Yeah, I was debating what to do here. I'd like to
| |
2524 mInsertionHandlePoint.setLocalDip(xDip, yDip); | 2360 /* |
2525 getInsertionHandleController().showHandle(); | 2361 if (mPastePopupMenu == null) { |
2526 updateHandleScreenPositions(); | 2362 mPastePopupMenu = new PastePopupMenu(getContainerView(), |
2527 getInsertionHandleController().showHandleWithPastePopup(); | 2363 new PastePopupMenuDelegate() { |
2364 public void paste() { | |
2365 mImeAdapter.paste(); | |
2366 } | |
2367 }); | |
2368 } | |
2369 final float contentOffsetYPix = mRenderCoordinates.getContentOffsetYPix( ); | |
2370 mPastePopupMenu.showAt((int) mRenderCoordinates.fromDipToPix(xDip), | |
2371 (int) (mRenderCoordinates.fromDipToPix(yDip) + co ntentOffsetYPix)); | |
2372 */ | |
2373 } | |
2374 | |
2375 private PastePopupMenu getPastePopup() { | |
2376 if (mPastePopupMenu == null) { | |
2377 mPastePopupMenu = new PastePopupMenu(getContainerView(), | |
2378 new PastePopupMenuDelegate() { | |
2379 public void paste() { | |
2380 mImeAdapter.paste(); | |
2381 } | |
2382 public boolean canPaste() { | |
2383 if (!mSelectionEditable) return false; | |
2384 return ((ClipboardManager) mContext.getSystemService( | |
2385 Context.CLIPBOARD_SERVICE)).hasPrimaryClip(); | |
2386 } | |
2387 }); | |
2388 } | |
2389 return mPastePopupMenu; | |
2528 } | 2390 } |
2529 | 2391 |
2530 @SuppressWarnings("unused") | 2392 @SuppressWarnings("unused") |
2531 @CalledByNative | 2393 @CalledByNative |
2532 private void onRenderProcessChange() { | 2394 private void onRenderProcessChange() { |
2533 attachImeAdapter(); | 2395 attachImeAdapter(); |
2534 } | 2396 } |
2535 | 2397 |
2536 /** | 2398 /** |
2537 * Attaches the native ImeAdapter object to the java ImeAdapter to allow com munication via JNI. | 2399 * Attaches the native ImeAdapter object to the java ImeAdapter to allow com munication via JNI. |
(...skipping 660 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
3198 // All touch events (including flings, scrolls etc) accept coordinates in ph ysical pixels. | 3060 // All touch events (including flings, scrolls etc) accept coordinates in ph ysical pixels. |
3199 private native boolean nativeOnTouchEvent( | 3061 private native boolean nativeOnTouchEvent( |
3200 long nativeContentViewCoreImpl, MotionEvent event, | 3062 long nativeContentViewCoreImpl, MotionEvent event, |
3201 long timeMs, int action, int pointerCount, int historySize, int acti onIndex, | 3063 long timeMs, int action, int pointerCount, int historySize, int acti onIndex, |
3202 float x0, float y0, float x1, float y1, | 3064 float x0, float y0, float x1, float y1, |
3203 int pointerId0, int pointerId1, | 3065 int pointerId0, int pointerId1, |
3204 float touchMajor0, float touchMajor1, | 3066 float touchMajor0, float touchMajor1, |
3205 float rawX, float rawY, | 3067 float rawX, float rawY, |
3206 int androidToolType0, int androidToolType1, int androidButtonState); | 3068 int androidToolType0, int androidToolType1, int androidButtonState); |
3207 | 3069 |
3070 private native boolean nativeOnTouchHandleEvent( | |
3071 long nativeContentViewCoreImpl, MotionEvent event); | |
3072 | |
3208 private native int nativeSendMouseMoveEvent( | 3073 private native int nativeSendMouseMoveEvent( |
3209 long nativeContentViewCoreImpl, long timeMs, float x, float y); | 3074 long nativeContentViewCoreImpl, long timeMs, float x, float y); |
3210 | 3075 |
3211 private native int nativeSendMouseWheelEvent( | 3076 private native int nativeSendMouseWheelEvent( |
3212 long nativeContentViewCoreImpl, long timeMs, float x, float y, float verticalAxis); | 3077 long nativeContentViewCoreImpl, long timeMs, float x, float y, float verticalAxis); |
3213 | 3078 |
3214 private native void nativeScrollBegin( | 3079 private native void nativeScrollBegin( |
3215 long nativeContentViewCoreImpl, long timeMs, float x, float y, float hintX, | 3080 long nativeContentViewCoreImpl, long timeMs, float x, float y, float hintX, |
3216 float hintY); | 3081 float hintY); |
3217 | 3082 |
(...skipping 23 matching lines...) Expand all Loading... | |
3241 private native void nativePinchEnd(long nativeContentViewCoreImpl, long time Ms); | 3106 private native void nativePinchEnd(long nativeContentViewCoreImpl, long time Ms); |
3242 | 3107 |
3243 private native void nativePinchBy(long nativeContentViewCoreImpl, long timeM s, | 3108 private native void nativePinchBy(long nativeContentViewCoreImpl, long timeM s, |
3244 float anchorX, float anchorY, float deltaScale); | 3109 float anchorX, float anchorY, float deltaScale); |
3245 | 3110 |
3246 private native void nativeSelectBetweenCoordinates( | 3111 private native void nativeSelectBetweenCoordinates( |
3247 long nativeContentViewCoreImpl, float x1, float y1, float x2, float y2); | 3112 long nativeContentViewCoreImpl, float x1, float y1, float x2, float y2); |
3248 | 3113 |
3249 private native void nativeMoveCaret(long nativeContentViewCoreImpl, float x, float y); | 3114 private native void nativeMoveCaret(long nativeContentViewCoreImpl, float x, float y); |
3250 | 3115 |
3116 private native void nativeHideTextHandles(long nativeContentViewCoreImpl); | |
3117 | |
3251 private native void nativeResetGestureDetection(long nativeContentViewCoreIm pl); | 3118 private native void nativeResetGestureDetection(long nativeContentViewCoreIm pl); |
3252 private native void nativeSetDoubleTapSupportEnabled( | 3119 private native void nativeSetDoubleTapSupportEnabled( |
3253 long nativeContentViewCoreImpl, boolean enabled); | 3120 long nativeContentViewCoreImpl, boolean enabled); |
3254 private native void nativeSetMultiTouchZoomSupportEnabled( | 3121 private native void nativeSetMultiTouchZoomSupportEnabled( |
3255 long nativeContentViewCoreImpl, boolean enabled); | 3122 long nativeContentViewCoreImpl, boolean enabled); |
3256 | 3123 |
3257 private native void nativeLoadIfNecessary(long nativeContentViewCoreImpl); | 3124 private native void nativeLoadIfNecessary(long nativeContentViewCoreImpl); |
3258 private native void nativeRequestRestoreLoad(long nativeContentViewCoreImpl) ; | 3125 private native void nativeRequestRestoreLoad(long nativeContentViewCoreImpl) ; |
3259 | 3126 |
3260 private native void nativeReload(long nativeContentViewCoreImpl, boolean che ckForRepost); | 3127 private native void nativeReload(long nativeContentViewCoreImpl, boolean che ckForRepost); |
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
3324 | 3191 |
3325 private native void nativeExtractSmartClipData(long nativeContentViewCoreImp l, | 3192 private native void nativeExtractSmartClipData(long nativeContentViewCoreImp l, |
3326 int x, int y, int w, int h); | 3193 int x, int y, int w, int h); |
3327 private native void nativeSetBackgroundOpaque(long nativeContentViewCoreImpl , boolean opaque); | 3194 private native void nativeSetBackgroundOpaque(long nativeContentViewCoreImpl , boolean opaque); |
3328 | 3195 |
3329 private native void nativeResumeResponseDeferredAtStart( | 3196 private native void nativeResumeResponseDeferredAtStart( |
3330 long nativeContentViewCoreImpl); | 3197 long nativeContentViewCoreImpl); |
3331 private native void nativeSetHasPendingNavigationTransitionForTesting( | 3198 private native void nativeSetHasPendingNavigationTransitionForTesting( |
3332 long nativeContentViewCoreImpl); | 3199 long nativeContentViewCoreImpl); |
3333 } | 3200 } |
OLD | NEW |