Index: Source/core/page/EventHandler.cpp |
diff --git a/Source/core/page/EventHandler.cpp b/Source/core/page/EventHandler.cpp |
index cf16660a6b045b4a2b1d4b08e4effbe9b3232974..ed9b6ba954c744a1baf86db945c2dd1148b10e20 100644 |
--- a/Source/core/page/EventHandler.cpp |
+++ b/Source/core/page/EventHandler.cpp |
@@ -2220,6 +2220,22 @@ void EventHandler::defaultWheelEventHandler(Node* startNode, WheelEvent* wheelEv |
m_previousWheelScrolledNode = stopNode; |
} |
+bool EventHandler::hasScrollableAncestor(const Node* node) const |
Rick Byers
2014/02/21 03:35:52
some special cases that may require more general l
bokan
2014/02/24 14:55:35
I'll also add list box (<select> with size < 5) to
|
+{ |
+ RenderObject* renderer = node->renderer(); |
+ |
+ for (RenderLayer* parent = renderer ? renderer->enclosingLayer() : 0; parent; parent = parent->parent()) { |
Rick Byers
2014/02/21 03:35:52
Did bokan@ say that walking the layer tree was suf
bokan
2014/02/24 14:55:35
I think (though I could be wrong) it'll always cre
|
+ if (parent->scrollsOverflow()) |
+ return true; |
+ } |
+ |
+ Frame* 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 +2260,9 @@ bool EventHandler::handleGestureShowPress() |
bool EventHandler::handleGestureEvent(const PlatformGestureEvent& gestureEvent) |
{ |
IntPoint adjustedPoint = gestureEvent.position(); |
- RefPtr<Frame> subframe = 0; |
- 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<Frame> subframe = frameForGestureEvent(gestureEvent, adjustedPoint); |
+ if (subframe != m_frame) |
+ return subframe->eventHandler().handleGestureEvent(gestureEvent); |
Node* eventTarget = 0; |
Scrollbar* scrollbar = 0; |
@@ -2650,13 +2639,44 @@ bool EventHandler::sendScrollEventToView(const PlatformGestureEvent& gestureEven |
return scrolledFrame; |
} |
-Frame* EventHandler::getSubFrameForGestureEvent(const IntPoint& touchAdjustedPoint, const PlatformGestureEvent& gestureEvent) |
+Frame* 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: |
+ 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<Frame> subframe = subframeForHitTestResult(mev); |
+ if (subframe) |
+ return subframe->eventHandler().frameForGestureEvent(gestureEvent, adjustedPoint); |
+ break; |
+ } |
+ |
+ default: |
+ ASSERT_NOT_REACHED(); |
+ } |
+ |
+ return m_frame; |
} |
void EventHandler::clearGestureScrollNodes() |