Index: content/public/android/java/src/org/chromium/content/browser/ContentViewCore.java |
diff --git a/content/public/android/java/src/org/chromium/content/browser/ContentViewCore.java b/content/public/android/java/src/org/chromium/content/browser/ContentViewCore.java |
index 40661f1caf9c7d53fcc92e2032619dec8ccb6767..d6d61267c8274d0b8cdc548a35245837bdebcf62 100644 |
--- a/content/public/android/java/src/org/chromium/content/browser/ContentViewCore.java |
+++ b/content/public/android/java/src/org/chromium/content/browser/ContentViewCore.java |
@@ -1081,36 +1081,48 @@ public class ContentViewCore |
* @see View#onTouchEvent(MotionEvent) |
*/ |
public boolean onTouchEvent(MotionEvent event) { |
- MotionEvent offset = createOffsetMotionEvent(event); |
+ TraceEvent.begin("onTouchEvent"); |
+ try { |
+ cancelRequestToScrollFocusedEditableNodeIntoView(); |
+ |
+ final int eventAction = event.getActionMasked(); |
+ |
+ // Only these actions have any effect on gesture detection. Other |
+ // actions have no corresponding WebTouchEvent type and may confuse the |
+ // touch pipline, so we ignore them entirely. |
+ if (eventAction != MotionEvent.ACTION_DOWN |
+ && eventAction != MotionEvent.ACTION_UP |
+ && eventAction != MotionEvent.ACTION_CANCEL |
+ && eventAction != MotionEvent.ACTION_MOVE |
+ && eventAction != MotionEvent.ACTION_POINTER_DOWN |
+ && eventAction != MotionEvent.ACTION_POINTER_UP) { |
+ return false; |
+ } |
- cancelRequestToScrollFocusedEditableNodeIntoView(); |
+ if (mNativeContentViewCore == 0) return false; |
- final int eventAction = offset.getActionMasked(); |
+ // A zero offset is quite common, in which case the unnecessary copy should be avoided. |
+ MotionEvent offset = null; |
+ if (mCurrentTouchOffsetX != 0 || mCurrentTouchOffsetY != 0) { |
+ offset = createOffsetMotionEvent(event); |
+ event = offset; |
+ } |
- // Only these actions have any effect on gesture detection. Other |
- // actions have no corresponding WebTouchEvent type and may confuse the |
- // touch pipline, so we ignore them entirely. |
- if (eventAction != MotionEvent.ACTION_DOWN |
- && eventAction != MotionEvent.ACTION_UP |
- && eventAction != MotionEvent.ACTION_CANCEL |
- && eventAction != MotionEvent.ACTION_MOVE |
- && eventAction != MotionEvent.ACTION_POINTER_DOWN |
- && eventAction != MotionEvent.ACTION_POINTER_UP) { |
- return false; |
+ final int pointerCount = event.getPointerCount(); |
+ final boolean consumed = nativeOnTouchEvent(mNativeContentViewCore, event, |
+ event.getEventTime(), eventAction, |
+ pointerCount, event.getHistorySize(), event.getActionIndex(), |
+ event.getX(), event.getY(), |
+ pointerCount > 1 ? event.getX(1) : 0, |
+ pointerCount > 1 ? event.getY(1) : 0, |
+ event.getPointerId(0), pointerCount > 1 ? event.getPointerId(1) : -1, |
+ event.getTouchMajor(), pointerCount > 1 ? event.getTouchMajor(1) : 0); |
+ |
+ if (offset != null) offset.recycle(); |
+ return consumed; |
+ } finally { |
+ TraceEvent.end("onTouchEvent"); |
} |
- |
- if (mNativeContentViewCore == 0) return false; |
- final int pointerCount = offset.getPointerCount(); |
- boolean consumed = nativeOnTouchEvent(mNativeContentViewCore, offset, |
- offset.getEventTime(), eventAction, |
- pointerCount, offset.getHistorySize(), offset.getActionIndex(), |
- offset.getX(), offset.getY(), |
- pointerCount > 1 ? offset.getX(1) : 0, |
- pointerCount > 1 ? offset.getY(1) : 0, |
- offset.getPointerId(0), pointerCount > 1 ? offset.getPointerId(1) : -1, |
- offset.getTouchMajor(), pointerCount > 1 ? offset.getTouchMajor(1) : 0); |
- offset.recycle(); |
- return consumed; |
} |
public void setIgnoreRemainingTouchEvents() { |
@@ -1613,25 +1625,27 @@ public class ContentViewCore |
public boolean onHoverEvent(MotionEvent event) { |
TraceEvent.begin("onHoverEvent"); |
MotionEvent offset = createOffsetMotionEvent(event); |
+ try { |
+ if (mBrowserAccessibilityManager != null) { |
+ return mBrowserAccessibilityManager.onHoverEvent(offset); |
+ } |
- if (mBrowserAccessibilityManager != null) { |
- return mBrowserAccessibilityManager.onHoverEvent(offset); |
- } |
+ // Work around Android bug where the x, y coordinates of a hover exit |
+ // event are incorrect when touch exploration is on. |
+ if (mTouchExplorationEnabled && offset.getAction() == MotionEvent.ACTION_HOVER_EXIT) { |
+ return true; |
+ } |
- // Work around Android bug where the x, y coordinates of a hover exit |
- // event are incorrect when touch exploration is on. |
- if (mTouchExplorationEnabled && offset.getAction() == MotionEvent.ACTION_HOVER_EXIT) { |
+ mContainerView.removeCallbacks(mFakeMouseMoveRunnable); |
+ if (mNativeContentViewCore != 0) { |
+ nativeSendMouseMoveEvent(mNativeContentViewCore, offset.getEventTime(), |
+ offset.getX(), offset.getY()); |
+ } |
return true; |
+ } finally { |
+ offset.recycle(); |
+ TraceEvent.end("onHoverEvent"); |
} |
- |
- mContainerView.removeCallbacks(mFakeMouseMoveRunnable); |
- if (mNativeContentViewCore != 0) { |
- nativeSendMouseMoveEvent(mNativeContentViewCore, offset.getEventTime(), |
- offset.getX(), offset.getY()); |
- } |
- TraceEvent.end("onHoverEvent"); |
- offset.recycle(); |
- return true; |
} |
/** |
@@ -1653,6 +1667,7 @@ public class ContentViewCore |
@Override |
public void run() { |
onHoverEvent(eventFakeMouseMove); |
+ eventFakeMouseMove.recycle(); |
} |
}; |
mContainerView.postDelayed(mFakeMouseMoveRunnable, 250); |