Chromium Code Reviews| 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() |