Index: Source/core/page/EventHandler.cpp |
diff --git a/Source/core/page/EventHandler.cpp b/Source/core/page/EventHandler.cpp |
index 8bff7ef00ce8fca1468a1e57c20cb5ede056c20e..e9fa0e9baadd834c7dc6e5682e93c61fe31b3b20 100644 |
--- a/Source/core/page/EventHandler.cpp |
+++ b/Source/core/page/EventHandler.cpp |
@@ -2220,6 +2220,30 @@ void EventHandler::defaultWheelEventHandler(Node* startNode, WheelEvent* wheelEv |
m_previousWheelScrolledNode = stopNode; |
} |
+bool EventHandler::hasScrollableAncestor(const Node* node) const |
+{ |
+ RenderObject* renderer = node->renderer(); |
+ while (node && !renderer) { |
+ node = node->parentElement(); |
+ renderer = node ? node->renderer() : 0; |
+ } |
+ |
+ if (renderer && renderer->isBox()) { |
+ RenderBox* box = toRenderBox(renderer); |
+ if (box->canBeScrolledAndHasScrollableArea()) |
+ return true; |
+ } |
+ |
+ if (renderer && renderer->enclosingScrollableBox()) |
+ return true; |
+ |
+ LocalFrame* parent = m_frame->tree().parent(); |
+ if (!parent) |
+ return false; |
+ |
+ return parent->eventHandler().hasScrollableAncestor(m_frame->ownerElement()); |
+} |
+ |
bool EventHandler::handleGestureShowPress() |
{ |
m_lastShowPressTimestamp = WTF::currentTime(); |
@@ -2244,36 +2268,9 @@ bool EventHandler::handleGestureShowPress() |
bool EventHandler::handleGestureEvent(const PlatformGestureEvent& gestureEvent) |
{ |
IntPoint adjustedPoint = gestureEvent.position(); |
- RefPtr<LocalFrame> subframe = nullptr; |
- switch (gestureEvent.type()) { |
- case PlatformEvent::GestureScrollBegin: |
- case PlatformEvent::GestureScrollUpdate: |
- case PlatformEvent::GestureScrollUpdateWithoutPropagation: |
- case PlatformEvent::GestureScrollEnd: |
- case PlatformEvent::GestureFlingStart: |
- // Handle directly in main frame |
- break; |
- |
- case PlatformEvent::GestureTap: |
- case PlatformEvent::GestureTapUnconfirmed: |
- case PlatformEvent::GestureTapDown: |
- case PlatformEvent::GestureShowPress: |
- case PlatformEvent::GestureTapDownCancel: |
- case PlatformEvent::GestureTwoFingerTap: |
- case PlatformEvent::GestureLongPress: |
- case PlatformEvent::GestureLongTap: |
- case PlatformEvent::GesturePinchBegin: |
- case PlatformEvent::GesturePinchEnd: |
- case PlatformEvent::GesturePinchUpdate: |
- adjustGesturePosition(gestureEvent, adjustedPoint); |
- subframe = getSubFrameForGestureEvent(adjustedPoint, gestureEvent); |
- if (subframe) |
- return subframe->eventHandler().handleGestureEvent(gestureEvent); |
- break; |
- |
- default: |
- ASSERT_NOT_REACHED(); |
- } |
+ RefPtr<LocalFrame> subframe = frameForGestureEvent(gestureEvent, adjustedPoint); |
+ if (subframe != m_frame) |
+ return subframe->eventHandler().handleGestureEvent(gestureEvent); |
Node* eventTarget = 0; |
Scrollbar* scrollbar = 0; |
@@ -2650,13 +2647,44 @@ bool EventHandler::sendScrollEventToView(const PlatformGestureEvent& gestureEven |
return scrolledFrame; |
} |
-LocalFrame* EventHandler::getSubFrameForGestureEvent(const IntPoint& touchAdjustedPoint, const PlatformGestureEvent& gestureEvent) |
+LocalFrame* EventHandler::frameForGestureEvent(const PlatformGestureEvent& gestureEvent, IntPoint& adjustedPoint) |
{ |
- 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 subframeForHitTestResult(mev); |
+ switch (gestureEvent.type()) { |
+ case PlatformEvent::GestureScrollBegin: |
+ case PlatformEvent::GestureScrollUpdate: |
+ case PlatformEvent::GestureScrollUpdateWithoutPropagation: |
+ case PlatformEvent::GestureScrollEnd: |
+ case PlatformEvent::GestureFlingStart: |
+ // Handle in current frame |
+ break; |
+ |
+ case PlatformEvent::GestureTap: |
+ case PlatformEvent::GestureTapUnconfirmed: |
+ case PlatformEvent::GestureTapDown: |
+ case PlatformEvent::GestureShowPress: |
+ case PlatformEvent::GestureTapDownCancel: |
+ case PlatformEvent::GestureTwoFingerTap: |
+ case PlatformEvent::GestureLongPress: |
+ case PlatformEvent::GestureLongTap: |
+ case PlatformEvent::GesturePinchBegin: |
Rick Byers
2014/03/13 01:40:06
I know you're just moving code around here, but th
Zeeshan Qureshi
2014/03/24 21:37:43
I'm not quite sure why, I was hoping to dig into i
Rick Byers
2014/03/25 19:46:47
Ok, deferring this to a future CL is fine. Thanks
|
+ case PlatformEvent::GesturePinchEnd: |
+ case PlatformEvent::GesturePinchUpdate: { |
+ adjustGesturePosition(gestureEvent, adjustedPoint); |
+ PlatformMouseEvent mouseDown(adjustedPoint, 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); |
+ RefPtr<LocalFrame> subframe = subframeForHitTestResult(mev); |
+ if (subframe) |
+ return subframe->eventHandler().frameForGestureEvent(gestureEvent, adjustedPoint); |
+ break; |
+ } |
+ |
+ default: |
+ ASSERT_NOT_REACHED(); |
+ } |
+ |
+ return m_frame; |
} |
void EventHandler::clearGestureScrollNodes() |