Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(527)

Unified Diff: Source/core/page/EventHandler.cpp

Issue 163933002: Send early ShowPress on TapDown when page isn't scrollable/pinchable. (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Add tests Created 6 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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()

Powered by Google App Engine
This is Rietveld 408576698