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

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: Refactor into hasEarlyShowPress() 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
« no previous file with comments | « Source/core/page/EventHandler.h ('k') | Source/web/WebViewImpl.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: Source/core/page/EventHandler.cpp
diff --git a/Source/core/page/EventHandler.cpp b/Source/core/page/EventHandler.cpp
index e0301a0034d9d5e7edd6564342e4facd19597c63..50c94d0a972a7a2f8609f54e7e3a7cf78a22119b 100644
--- a/Source/core/page/EventHandler.cpp
+++ b/Source/core/page/EventHandler.cpp
@@ -2225,6 +2225,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();
@@ -2249,36 +2273,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;
@@ -2655,13 +2652,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:
+ 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()
« no previous file with comments | « Source/core/page/EventHandler.h ('k') | Source/web/WebViewImpl.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698