summaryrefslogtreecommitdiff
path: root/core/java/android
diff options
context:
space:
mode:
authorJohn Reck <jreck@google.com>2012-05-14 17:59:13 -0700
committerJohn Reck <jreck@google.com>2012-05-14 18:40:48 -0700
commit41f73bdf4d915305152ba2053b7523bf5f90ffa8 (patch)
tree852441d3c849040de0dac5ec0e39205d4d9244aa /core/java/android
parent2411c3361eb2c15b09a8bfadf5c7c4a3de092ea0 (diff)
Always do a HIT_TEST
Bug: 6490959 The issue here is that if the page calls preventDefault on a touchstart handler WebViewClassic will not do a HIT_TEST as it doesn't get the ACTION_DOWN. This means that the mouse is in the wrong position when the click ultimately fires. This changes it so that WebViewInputDispatcher will always do a HIT_TEST at the start of a touch stream, which ensures that the mouse is positioned correctly. Change-Id: I1aaca7692e2c7aeedeb21fa3592cd4cb3223ea25
Diffstat (limited to 'core/java/android')
-rw-r--r--core/java/android/webkit/WebViewClassic.java26
-rw-r--r--core/java/android/webkit/WebViewCore.java23
-rw-r--r--core/java/android/webkit/WebViewInputDispatcher.java17
3 files changed, 27 insertions, 39 deletions
diff --git a/core/java/android/webkit/WebViewClassic.java b/core/java/android/webkit/WebViewClassic.java
index eb6b7e3fdbc3..6a44c18e333a 100644
--- a/core/java/android/webkit/WebViewClassic.java
+++ b/core/java/android/webkit/WebViewClassic.java
@@ -1719,6 +1719,10 @@ public final class WebViewClassic implements WebViewProvider, WebViewProvider.Sc
mZoomManager.updateDefaultZoomDensity(density);
}
+ /* package */ int getScaledNavSlop() {
+ return viewToContentDimension(mNavSlop);
+ }
+
/* package */ boolean onSavePassword(String schemePlusHost, String username,
String password, final Message resumeMsg) {
boolean rVal = false;
@@ -4339,10 +4343,6 @@ public final class WebViewClassic implements WebViewProvider, WebViewProvider.Sc
}
private void removeTouchHighlight() {
- if (mWebViewCore != null) {
- mWebViewCore.removeMessages(EventHub.HIT_TEST);
- }
- mPrivateHandler.removeMessages(HIT_TEST_RESULT);
setTouchHighlightRects(null);
}
@@ -5834,7 +5834,6 @@ public final class WebViewClassic implements WebViewProvider, WebViewProvider.Sc
switch (action) {
case MotionEvent.ACTION_DOWN: {
mConfirmMove = false;
- mInitialHitTestResult = null;
if (!mEditTextScroller.isFinished()) {
mEditTextScroller.abortAnimation();
}
@@ -5856,23 +5855,6 @@ public final class WebViewClassic implements WebViewProvider, WebViewProvider.Sc
}
} else { // the normal case
mTouchMode = TOUCH_INIT_MODE;
- // TODO: Have WebViewInputDispatch handle this
- TouchHighlightData data = new TouchHighlightData();
- data.mX = contentX;
- data.mY = contentY;
- data.mNativeLayerRect = new Rect();
- if (mNativeClass != 0) {
- data.mNativeLayer = nativeScrollableLayer(mNativeClass,
- contentX, contentY, data.mNativeLayerRect, null);
- } else {
- data.mNativeLayer = 0;
- }
- data.mSlop = viewToContentDimension(mNavSlop);
- removeTouchHighlight();
- if (!mBlockWebkitViewMessages && mWebViewCore != null) {
- mWebViewCore.sendMessageAtFrontOfQueue(
- EventHub.HIT_TEST, data);
- }
if (mLogEvent && eventTime - mLastTouchUpTime < 1000) {
EventLog.writeEvent(EventLogTags.BROWSER_DOUBLE_TAP_DURATION,
(eventTime - mLastTouchUpTime), eventTime);
diff --git a/core/java/android/webkit/WebViewCore.java b/core/java/android/webkit/WebViewCore.java
index 4adfd6ad23f1..00dcb921ef08 100644
--- a/core/java/android/webkit/WebViewCore.java
+++ b/core/java/android/webkit/WebViewCore.java
@@ -1143,8 +1143,6 @@ public final class WebViewCore {
static final int ADD_PACKAGE_NAME = 185;
static final int REMOVE_PACKAGE_NAME = 186;
- static final int HIT_TEST = 187;
-
// accessibility support
static final int MODIFY_SELECTION = 190;
@@ -1648,18 +1646,6 @@ public final class WebViewCore {
(Set<String>) msg.obj);
break;
- case HIT_TEST:
- TouchHighlightData d = (TouchHighlightData) msg.obj;
- if (d.mNativeLayer != 0) {
- nativeScrollLayer(mNativeClass,
- d.mNativeLayer, d.mNativeLayerRect);
- }
- WebKitHitTest hit = performHitTest(d.mX, d.mY, d.mSlop, true);
- mWebViewClassic.mPrivateHandler.obtainMessage(
- WebViewClassic.HIT_TEST_RESULT, hit)
- .sendToTarget();
- break;
-
case SET_USE_MOCK_DEVICE_ORIENTATION:
setUseMockDeviceOrientation();
break;
@@ -1788,6 +1774,15 @@ public final class WebViewCore {
return false;
}
switch (eventType) {
+ case WebViewInputDispatcher.EVENT_TYPE_HIT_TEST:
+ int x = Math.round(event.getX());
+ int y = Math.round(event.getY());
+ WebKitHitTest hit = performHitTest(x, y,
+ mWebViewClassic.getScaledNavSlop(), true);
+ mWebViewClassic.mPrivateHandler.obtainMessage(
+ WebViewClassic.HIT_TEST_RESULT, hit).sendToTarget();
+ return false;
+
case WebViewInputDispatcher.EVENT_TYPE_CLICK:
return nativeMouseClick(mNativeClass);
diff --git a/core/java/android/webkit/WebViewInputDispatcher.java b/core/java/android/webkit/WebViewInputDispatcher.java
index 9328d8c04010..9eeb31167df0 100644
--- a/core/java/android/webkit/WebViewInputDispatcher.java
+++ b/core/java/android/webkit/WebViewInputDispatcher.java
@@ -204,6 +204,11 @@ final class WebViewInputDispatcher {
public static final int EVENT_TYPE_DOUBLE_TAP = 5;
/**
+ * Event type: Indicates that a hit test should be performed
+ */
+ public static final int EVENT_TYPE_HIT_TEST = 6;
+
+ /**
* Flag: This event is private to this queue. Do not forward it.
*/
public static final int FLAG_PRIVATE = 1 << 0;
@@ -499,13 +504,17 @@ final class WebViewInputDispatcher {
}
private void enqueueDoubleTapLocked(MotionEvent event) {
- unscheduleClickLocked();
- hideTapCandidateLocked();
MotionEvent eventToEnqueue = MotionEvent.obtainNoHistory(event);
DispatchEvent d = obtainDispatchEventLocked(eventToEnqueue, EVENT_TYPE_DOUBLE_TAP, 0,
mPostLastWebKitXOffset, mPostLastWebKitYOffset, mPostLastWebKitScale);
enqueueEventLocked(d);
- mIsDoubleTapCandidate = false;
+ }
+
+ private void enqueueHitTestLocked(MotionEvent event) {
+ MotionEvent eventToEnqueue = MotionEvent.obtainNoHistory(event);
+ DispatchEvent d = obtainDispatchEventLocked(eventToEnqueue, EVENT_TYPE_HIT_TEST, 0,
+ mPostLastWebKitXOffset, mPostLastWebKitYOffset, mPostLastWebKitScale);
+ enqueueEventLocked(d);
}
private void checkForSlopLocked(MotionEvent event) {
@@ -545,6 +554,7 @@ final class WebViewInputDispatcher {
mInitialDownX = event.getX();
mInitialDownY = event.getY();
scheduleShowTapHighlightLocked();
+ enqueueHitTestLocked(event);
} else if (action == MotionEvent.ACTION_UP) {
unscheduleLongPressLocked();
if (isClickCandidateLocked(event)) {
@@ -824,6 +834,7 @@ final class WebViewInputDispatcher {
case EVENT_TYPE_CLICK:
case EVENT_TYPE_HOVER:
case EVENT_TYPE_SCROLL:
+ case EVENT_TYPE_HIT_TEST:
return false;
case EVENT_TYPE_TOUCH:
return !mPostSendTouchEventsToWebKit