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

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: Get element coordinates programmatically Created 6 years, 9 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 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()

Powered by Google App Engine
This is Rietveld 408576698