Index: Source/core/page/EventHandler.cpp |
diff --git a/Source/core/page/EventHandler.cpp b/Source/core/page/EventHandler.cpp |
index f93cae58186ce354fde3dc2cc6db9ca66ad4b994..ff133384f9ce6bab0ecfdf859373ecb9e7730f68 100644 |
--- a/Source/core/page/EventHandler.cpp |
+++ b/Source/core/page/EventHandler.cpp |
@@ -2453,58 +2453,68 @@ bool EventHandler::handleGestureTap(const PlatformGestureEvent& gestureEvent) |
bool EventHandler::handleGestureLongPress(const PlatformGestureEvent& gestureEvent) |
{ |
- if (m_frame->settings() && m_frame->settings()->touchDragDropEnabled() && m_frame->view()) { |
- IntPoint adjustedPoint = gestureEvent.position(); |
+ IntPoint adjustedPoint = gestureEvent.position(); |
#if ENABLE(TOUCH_ADJUSTMENT) |
- adjustGesturePosition(gestureEvent, adjustedPoint); |
+ adjustGesturePosition(gestureEvent, adjustedPoint); |
#endif |
+ RefPtr<Frame> subframe = getSubFrameForGestureEvent(adjustedPoint, gestureEvent); |
+ if (subframe && subframe->eventHandler()->handleGestureLongPress(gestureEvent)) |
+ return true; |
+ |
+ m_didLongPressInvokeContextMenu = true; |
+ if (m_frame->settings() && m_frame->settings()->touchDragDropEnabled() && m_frame->view()) { |
PlatformMouseEvent mouseDragEvent(adjustedPoint, gestureEvent.globalPosition(), LeftButton, PlatformEvent::MouseMoved, 1, |
gestureEvent.shiftKey(), gestureEvent.ctrlKey(), gestureEvent.altKey(), gestureEvent.metaKey(), WTF::currentTime()); |
HitTestRequest request(HitTestRequest::ReadOnly | HitTestRequest::DisallowShadowContent); |
MouseEventWithHitTestResults mev = prepareMouseEvent(request, mouseDragEvent); |
m_didStartDrag = false; |
- RefPtr<Frame> subframe = subframeForHitTestResult(mev); |
- if (subframe && subframe->eventHandler()->handleGestureLongPress(gestureEvent)) |
- return true; |
m_mouseDownMayStartDrag = true; |
dragState().m_dragSrc = 0; |
m_mouseDownPos = m_frame->view()->windowToContents(mouseDragEvent.position()); |
handleDrag(mev, DontCheckDragHysteresis); |
- if (m_didStartDrag) |
+ if (m_didStartDrag) { |
+ m_didLongPressInvokeContextMenu = false; |
return true; |
+ } |
+ } |
+#if OS(ANDROID) |
+ bool shouldLongPressSelectWord = true; |
+#else |
+ bool shouldLongPressSelectWord = m_frame->settings() && m_frame->settings()->touchEditingEnabled(); |
+#endif |
+ if (shouldLongPressSelectWord) { |
+ IntPoint hitTestPoint = m_frame->view()->windowToContents(gestureEvent.position()); |
+ HitTestResult result = hitTestResultAtPoint(hitTestPoint, HitTestRequest::ReadOnly | HitTestRequest::Active); |
+ Node* innerNode = result.targetNode(); |
+ if (!result.isLiveLink() && innerNode && (innerNode->isContentEditable() || innerNode->isTextNode())) { |
+ selectClosestWordFromHitTestResult(result, DontAppendTrailingWhitespace); |
+ if (m_frame->selection()->isRange()) |
+ return true; |
+ } |
} |
- return handleGestureForTextSelectionOrContextMenu(gestureEvent); |
+ return sendContextMenuEventForGesture(gestureEvent); |
} |
bool EventHandler::handleGestureLongTap(const PlatformGestureEvent& gestureEvent) |
{ |
+ IntPoint adjustedPoint = gestureEvent.position(); |
+#if ENABLE(TOUCH_ADJUSTMENT) |
+ adjustGesturePosition(gestureEvent, adjustedPoint); |
+#endif |
+ RefPtr<Frame> subframe = getSubFrameForGestureEvent(adjustedPoint, gestureEvent); |
+ if (subframe && subframe->eventHandler()->handleGestureLongTap(gestureEvent)) |
+ return true; |
#if !OS(ANDROID) |
if (!m_didLongPressInvokeContextMenu) |
return sendContextMenuEventForGesture(gestureEvent); |
+ m_didLongPressInvokeContextMenu = true; |
#endif |
return false; |
} |
-bool EventHandler::handleGestureForTextSelectionOrContextMenu(const PlatformGestureEvent& gestureEvent) |
-{ |
-#if OS(ANDROID) |
- IntPoint hitTestPoint = m_frame->view()->windowToContents(gestureEvent.position()); |
- HitTestResult result = hitTestResultAtPoint(hitTestPoint, HitTestRequest::ReadOnly | HitTestRequest::Active); |
- Node* innerNode = result.targetNode(); |
- if (!result.isLiveLink() && innerNode && (innerNode->isContentEditable() || innerNode->isTextNode())) { |
- selectClosestWordFromHitTestResult(result, DontAppendTrailingWhitespace); |
- if (m_frame->selection()->isRange()) |
- return true; |
- } |
-#endif |
- m_didLongPressInvokeContextMenu = (gestureEvent.type() == PlatformEvent::GestureLongPress); |
- |
- return sendContextMenuEventForGesture(gestureEvent); |
-} |
- |
bool EventHandler::handleGestureTwoFingerTap(const PlatformGestureEvent& gestureEvent) |
{ |
- return handleGestureForTextSelectionOrContextMenu(gestureEvent); |
+ return sendContextMenuEventForGesture(gestureEvent); |
} |
bool EventHandler::passGestureEventToWidget(const PlatformGestureEvent& gestureEvent, Widget* widget) |
@@ -2623,6 +2633,15 @@ bool EventHandler::sendScrollEventToView(const PlatformGestureEvent& gestureEven |
return scrolledFrame; |
} |
+Frame* EventHandler::getSubFrameForGestureEvent(const IntPoint& touchAdjustedPoint, const PlatformGestureEvent& gestureEvent) |
+{ |
+ PlatformMouseEvent mouseDown(touchAdjustedPoint, gestureEvent.globalPosition(), LeftButton, PlatformEvent::MousePressed, 1, |
+ gestureEvent.shiftKey(), gestureEvent.ctrlKey(), gestureEvent.altKey(), gestureEvent.metaKey(), gestureEvent.timestamp()); |
+ HitTestRequest request(HitTestRequest::ReadOnly); |
+ MouseEventWithHitTestResults mev = prepareMouseEvent(request, mouseDown); |
+ return EventHandler::subframeForHitTestResult(mev); |
+} |
+ |
void EventHandler::clearGestureScrollNodes() |
{ |
m_scrollGestureHandlingNode = 0; |