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

Side by Side 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: 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc. All rights reserv ed. 2 * Copyright (C) 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc. All rights reserv ed.
3 * Copyright (C) 2006 Alexey Proskuryakov (ap@webkit.org) 3 * Copyright (C) 2006 Alexey Proskuryakov (ap@webkit.org)
4 * Copyright (C) 2012 Digia Plc. and/or its subsidiary(-ies) 4 * Copyright (C) 2012 Digia Plc. and/or its subsidiary(-ies)
5 * 5 *
6 * Redistribution and use in source and binary forms, with or without 6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions 7 * modification, are permitted provided that the following conditions
8 * are met: 8 * are met:
9 * 1. Redistributions of source code must retain the above copyright 9 * 1. Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer. 10 * notice, this list of conditions and the following disclaimer.
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
50 #include "core/events/MouseEvent.h" 50 #include "core/events/MouseEvent.h"
51 #include "core/events/TextEvent.h" 51 #include "core/events/TextEvent.h"
52 #include "core/events/ThreadLocalEventNames.h" 52 #include "core/events/ThreadLocalEventNames.h"
53 #include "core/events/TouchEvent.h" 53 #include "core/events/TouchEvent.h"
54 #include "core/events/WheelEvent.h" 54 #include "core/events/WheelEvent.h"
55 #include "core/fetch/ImageResource.h" 55 #include "core/fetch/ImageResource.h"
56 #include "core/html/HTMLDialogElement.h" 56 #include "core/html/HTMLDialogElement.h"
57 #include "core/html/HTMLFrameElementBase.h" 57 #include "core/html/HTMLFrameElementBase.h"
58 #include "core/html/HTMLFrameSetElement.h" 58 #include "core/html/HTMLFrameSetElement.h"
59 #include "core/html/HTMLInputElement.h" 59 #include "core/html/HTMLInputElement.h"
60 #include "core/loader/EmptyClients.h"
Rick Byers 2014/02/14 21:27:53 why do you need this new include? Seems odd...
60 #include "core/loader/FrameLoader.h" 61 #include "core/loader/FrameLoader.h"
61 #include "core/loader/FrameLoaderClient.h" 62 #include "core/loader/FrameLoaderClient.h"
62 #include "core/page/AutoscrollController.h" 63 #include "core/page/AutoscrollController.h"
63 #include "core/page/BackForwardClient.h" 64 #include "core/page/BackForwardClient.h"
64 #include "core/page/Chrome.h" 65 #include "core/page/Chrome.h"
65 #include "core/page/ChromeClient.h" 66 #include "core/page/ChromeClient.h"
66 #include "core/page/DragController.h" 67 #include "core/page/DragController.h"
67 #include "core/page/DragState.h" 68 #include "core/page/DragState.h"
68 #include "core/page/EditorClient.h" 69 #include "core/page/EditorClient.h"
69 #include "core/page/FocusController.h" 70 #include "core/page/FocusController.h"
(...skipping 221 matching lines...) Expand 10 before | Expand all | Expand 10 after
291 , m_originatingTouchPointTargetKey(0) 292 , m_originatingTouchPointTargetKey(0)
292 , m_touchPressed(false) 293 , m_touchPressed(false)
293 , m_scrollGestureHandlingNode(0) 294 , m_scrollGestureHandlingNode(0)
294 , m_lastHitTestResultOverWidget(false) 295 , m_lastHitTestResultOverWidget(false)
295 , m_maxMouseMovedDuration(0) 296 , m_maxMouseMovedDuration(0)
296 , m_baseEventType(PlatformEvent::NoType) 297 , m_baseEventType(PlatformEvent::NoType)
297 , m_didStartDrag(false) 298 , m_didStartDrag(false)
298 , m_longTapShouldInvokeContextMenu(false) 299 , m_longTapShouldInvokeContextMenu(false)
299 , m_syntheticPageScaleFactor(0) 300 , m_syntheticPageScaleFactor(0)
300 , m_activeIntervalTimer(this, &EventHandler::activeIntervalTimerFired) 301 , m_activeIntervalTimer(this, &EventHandler::activeIntervalTimerFired)
301 , m_lastShowPressTimestamp(0) 302 , m_lastActiveTimestamp(0)
303 , m_tapDownTriggeredActive(false)
302 { 304 {
303 } 305 }
304 306
305 EventHandler::~EventHandler() 307 EventHandler::~EventHandler()
306 { 308 {
307 ASSERT(!m_fakeMouseMoveEventTimer.isActive()); 309 ASSERT(!m_fakeMouseMoveEventTimer.isActive());
308 } 310 }
309 311
310 DragState& EventHandler::dragState() 312 DragState& EventHandler::dragState()
311 { 313 {
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
347 m_scrollGestureHandlingNode = 0; 349 m_scrollGestureHandlingNode = 0;
348 m_lastHitTestResultOverWidget = false; 350 m_lastHitTestResultOverWidget = false;
349 m_previousGestureScrolledNode = 0; 351 m_previousGestureScrolledNode = 0;
350 m_scrollbarHandlingScrollGesture = 0; 352 m_scrollbarHandlingScrollGesture = 0;
351 m_maxMouseMovedDuration = 0; 353 m_maxMouseMovedDuration = 0;
352 m_baseEventType = PlatformEvent::NoType; 354 m_baseEventType = PlatformEvent::NoType;
353 m_didStartDrag = false; 355 m_didStartDrag = false;
354 m_touchPressed = false; 356 m_touchPressed = false;
355 m_mouseDownMayStartSelect = false; 357 m_mouseDownMayStartSelect = false;
356 m_mouseDownMayStartDrag = false; 358 m_mouseDownMayStartDrag = false;
357 m_lastShowPressTimestamp = 0; 359 m_lastActiveTimestamp = 0;
358 m_lastDeferredTapElement = 0; 360 m_lastDeferredTapElement = 0;
361 m_tapDownTriggeredActive = false;
359 } 362 }
360 363
361 void EventHandler::nodeWillBeRemoved(Node& nodeToBeRemoved) 364 void EventHandler::nodeWillBeRemoved(Node& nodeToBeRemoved)
362 { 365 {
363 if (!nodeToBeRemoved.containsIncludingShadowDOM(m_clickNode.get())) 366 if (!nodeToBeRemoved.containsIncludingShadowDOM(m_clickNode.get()))
364 return; 367 return;
365 if (nodeToBeRemoved.isInShadowTree()) { 368 if (nodeToBeRemoved.isInShadowTree()) {
366 m_clickNode = nodeToBeRemoved.parentOrShadowHostNode(); 369 m_clickNode = nodeToBeRemoved.parentOrShadowHostNode();
367 } else { 370 } else {
368 // We don't dispatch click events if the mousedown node is removed 371 // We don't dispatch click events if the mousedown node is removed
(...skipping 1846 matching lines...) Expand 10 before | Expand all | Expand 10 after
2215 2218
2216 if (scroll(ScrollDown, granularity, startNode, &stopNode, wheelEvent->deltaY (), roundedIntPoint(wheelEvent->absoluteLocation()))) 2219 if (scroll(ScrollDown, granularity, startNode, &stopNode, wheelEvent->deltaY (), roundedIntPoint(wheelEvent->absoluteLocation())))
2217 wheelEvent->setDefaultHandled(); 2220 wheelEvent->setDefaultHandled();
2218 2221
2219 if (!m_latchedWheelEventNode) 2222 if (!m_latchedWheelEventNode)
2220 m_previousWheelScrolledNode = stopNode; 2223 m_previousWheelScrolledNode = stopNode;
2221 } 2224 }
2222 2225
2223 bool EventHandler::handleGestureShowPress() 2226 bool EventHandler::handleGestureShowPress()
2224 { 2227 {
2225 m_lastShowPressTimestamp = WTF::currentTime(); 2228 if (!m_tapDownTriggeredActive)
2229 m_lastActiveTimestamp = WTF::currentTime();
2226 2230
2227 FrameView* view = m_frame->view(); 2231 FrameView* view = m_frame->view();
2228 if (!view) 2232 if (!view)
2229 return false; 2233 return false;
2230 if (ScrollAnimator* scrollAnimator = view->existingScrollAnimator()) 2234 if (ScrollAnimator* scrollAnimator = view->existingScrollAnimator())
2231 scrollAnimator->cancelAnimations(); 2235 scrollAnimator->cancelAnimations();
2232 const FrameView::ScrollableAreaSet* areas = view->scrollableAreas(); 2236 const FrameView::ScrollableAreaSet* areas = view->scrollableAreas();
2233 if (!areas) 2237 if (!areas)
2234 return false; 2238 return false;
2235 for (FrameView::ScrollableAreaSet::const_iterator it = areas->begin(); it != areas->end(); ++it) { 2239 for (FrameView::ScrollableAreaSet::const_iterator it = areas->begin(); it != areas->end(); ++it) {
(...skipping 11 matching lines...) Expand all
2247 RefPtr<Frame> subframe = 0; 2251 RefPtr<Frame> subframe = 0;
2248 switch (gestureEvent.type()) { 2252 switch (gestureEvent.type()) {
2249 case PlatformEvent::GestureScrollBegin: 2253 case PlatformEvent::GestureScrollBegin:
2250 case PlatformEvent::GestureScrollUpdate: 2254 case PlatformEvent::GestureScrollUpdate:
2251 case PlatformEvent::GestureScrollUpdateWithoutPropagation: 2255 case PlatformEvent::GestureScrollUpdateWithoutPropagation:
2252 case PlatformEvent::GestureScrollEnd: 2256 case PlatformEvent::GestureScrollEnd:
2253 case PlatformEvent::GestureFlingStart: 2257 case PlatformEvent::GestureFlingStart:
2254 // Handle directly in main frame 2258 // Handle directly in main frame
2255 break; 2259 break;
2256 2260
2261 case PlatformEvent::GestureTapDown:
2262 m_tapDownTriggeredActive = false;
2257 case PlatformEvent::GestureTap: 2263 case PlatformEvent::GestureTap:
2258 case PlatformEvent::GestureTapUnconfirmed: 2264 case PlatformEvent::GestureTapUnconfirmed:
2259 case PlatformEvent::GestureTapDown:
2260 case PlatformEvent::GestureShowPress: 2265 case PlatformEvent::GestureShowPress:
2261 case PlatformEvent::GestureTapDownCancel: 2266 case PlatformEvent::GestureTapDownCancel:
2262 case PlatformEvent::GestureTwoFingerTap: 2267 case PlatformEvent::GestureTwoFingerTap:
2263 case PlatformEvent::GestureLongPress: 2268 case PlatformEvent::GestureLongPress:
2264 case PlatformEvent::GestureLongTap: 2269 case PlatformEvent::GestureLongTap:
2265 case PlatformEvent::GesturePinchBegin: 2270 case PlatformEvent::GesturePinchBegin:
2266 case PlatformEvent::GesturePinchEnd: 2271 case PlatformEvent::GesturePinchEnd:
2267 case PlatformEvent::GesturePinchUpdate: 2272 case PlatformEvent::GesturePinchUpdate:
2268 adjustGesturePosition(gestureEvent, adjustedPoint); 2273 adjustGesturePosition(gestureEvent, adjustedPoint);
2269 subframe = getSubFrameForGestureEvent(adjustedPoint, gestureEvent); 2274 subframe = getSubFrameForGestureEvent(adjustedPoint, gestureEvent);
(...skipping 11 matching lines...) Expand all
2281 || gestureEvent.type() == PlatformEvent::GestureScrollUpdate 2286 || gestureEvent.type() == PlatformEvent::GestureScrollUpdate
2282 || gestureEvent.type() == PlatformEvent::GestureScrollUpdateWithoutPropa gation 2287 || gestureEvent.type() == PlatformEvent::GestureScrollUpdateWithoutPropa gation
2283 || gestureEvent.type() == PlatformEvent::GestureFlingStart) { 2288 || gestureEvent.type() == PlatformEvent::GestureFlingStart) {
2284 scrollbar = m_scrollbarHandlingScrollGesture.get(); 2289 scrollbar = m_scrollbarHandlingScrollGesture.get();
2285 eventTarget = m_scrollGestureHandlingNode.get(); 2290 eventTarget = m_scrollGestureHandlingNode.get();
2286 } 2291 }
2287 2292
2288 HitTestRequest::HitTestRequestType hitType = HitTestRequest::TouchEvent; 2293 HitTestRequest::HitTestRequestType hitType = HitTestRequest::TouchEvent;
2289 double activeInterval = 0; 2294 double activeInterval = 0;
2290 bool shouldKeepActiveForMinInterval = false; 2295 bool shouldKeepActiveForMinInterval = false;
2291 if (gestureEvent.type() == PlatformEvent::GestureShowPress 2296 if (gestureEvent.type() == PlatformEvent::GestureTapDown) {
2292 || gestureEvent.type() == PlatformEvent::GestureTapUnconfirmed) { 2297 Page* page = m_frame->page();
bokan 2014/02/18 19:59:57 Nit: I think this is involved enough that you coul
2298 Frame* mainFrame = page ? page->mainFrame() : 0;
2299 FrameView* frameView = mainFrame ? mainFrame->view() : 0;
2300 ChromeClient& chromeClient = mainFrame ? mainFrame->chromeClient() : *ne w EmptyChromeClient();
Rick Byers 2014/02/14 21:27:53 we should probably avoid creating a fake client (j
2301
2302 // Only activate on TapDown if page isn't scrollable or pinchable and
2303 // this isn't the start of a scroll.
2304 if (frameView && !frameView->isScrollable() && chromeClient.minimumPageS caleFactor() == chromeClient.maximumPageScaleFactor()) {
2305 IntPoint hitTestPoint = m_frame->view()->windowToContents(adjustedPo int);
2306 HitTestResult result = hitTestResultAtPoint(hitTestPoint, HitTestReq uest::TouchEvent | HitTestRequest::ReadOnly | HitTestRequest::AllowFrameScrollb ars);
2307 RenderObject* renderer = result.innerElement()->renderer();
2308
2309 // If no ancestor is scrollable then this couldn't possibly be the s tart of a scroll.
2310 bool shouldTapDownTriggerActive = true;
2311 for (RenderLayer* parent = renderer ? renderer->enclosingLayer() : 0 ; parent && shouldTapDownTriggerActive; parent = parent->parent()) {
bokan 2014/02/18 19:59:57 I think this will break if your renderer is contai
2312 if (parent->scrollsOverflow())
2313 shouldTapDownTriggerActive = false;
bokan 2014/02/18 19:59:57 You can 'break' out of the loop here
2314 }
2315
2316 if (shouldTapDownTriggerActive) {
2317 m_tapDownTriggeredActive = true;
2318 hitType |= HitTestRequest::Active;
2319 }
2320 }
2321 } else if (gestureEvent.type() == PlatformEvent::GestureShowPress && !m_tapD ownTriggeredActive) {
2322 hitType |= HitTestRequest::Active;
2323 } else if (gestureEvent.type() == PlatformEvent::GestureTapUnconfirmed) {
2293 hitType |= HitTestRequest::Active; 2324 hitType |= HitTestRequest::Active;
2294 } else if (gestureEvent.type() == PlatformEvent::GestureTapDownCancel) { 2325 } else if (gestureEvent.type() == PlatformEvent::GestureTapDownCancel) {
2295 hitType |= HitTestRequest::Release; 2326 hitType |= HitTestRequest::Release;
2296 // A TapDownCancel received when no element is active shouldn't really b e changing hover state. 2327 // A TapDownCancel received when no element is active shouldn't really b e changing hover state.
2297 if (!m_frame->document()->activeHoverElement()) 2328 if (!m_frame->document()->activeHoverElement())
2298 hitType |= HitTestRequest::ReadOnly; 2329 hitType |= HitTestRequest::ReadOnly;
2299 } else if (gestureEvent.type() == PlatformEvent::GestureTap) { 2330 } else if (gestureEvent.type() == PlatformEvent::GestureTap) {
2300 hitType |= HitTestRequest::Release; 2331 hitType |= HitTestRequest::Release;
2301 // If the Tap is received very shortly after ShowPress, we want to delay clearing 2332 // If the Tap is received very shortly after ShowPress, we want to delay clearing
2302 // of the active state so that it's visible to the user for at least one frame. 2333 // of the active state so that it's visible to the user for at least one frame.
2303 activeInterval = WTF::currentTime() - m_lastShowPressTimestamp; 2334 activeInterval = WTF::currentTime() - m_lastActiveTimestamp;
2304 shouldKeepActiveForMinInterval = m_lastShowPressTimestamp && activeInter val < minimumActiveInterval; 2335 shouldKeepActiveForMinInterval = m_lastActiveTimestamp && activeInterval < minimumActiveInterval;
2305 if (shouldKeepActiveForMinInterval) 2336 if (shouldKeepActiveForMinInterval)
2306 hitType |= HitTestRequest::ReadOnly; 2337 hitType |= HitTestRequest::ReadOnly;
2307 } 2338 }
2308 else 2339 else
2309 hitType |= HitTestRequest::Active | HitTestRequest::ReadOnly; 2340 hitType |= HitTestRequest::Active | HitTestRequest::ReadOnly;
2310 2341
2311 if ((!scrollbar && !eventTarget) || !(hitType & HitTestRequest::ReadOnly)) { 2342 if ((!scrollbar && !eventTarget) || !(hitType & HitTestRequest::ReadOnly)) {
2312 IntPoint hitTestPoint = m_frame->view()->windowToContents(adjustedPoint) ; 2343 IntPoint hitTestPoint = m_frame->view()->windowToContents(adjustedPoint) ;
2313 HitTestResult result = hitTestResultAtPoint(hitTestPoint, hitType | HitT estRequest::AllowFrameScrollbars); 2344 HitTestResult result = hitTestResultAtPoint(hitTestPoint, hitType | HitT estRequest::AllowFrameScrollbars);
2314 2345
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
2371 return handleGestureTap(gestureEvent, adjustedPoint); 2402 return handleGestureTap(gestureEvent, adjustedPoint);
2372 case PlatformEvent::GestureShowPress: 2403 case PlatformEvent::GestureShowPress:
2373 return handleGestureShowPress(); 2404 return handleGestureShowPress();
2374 case PlatformEvent::GestureLongPress: 2405 case PlatformEvent::GestureLongPress:
2375 return handleGestureLongPress(gestureEvent, adjustedPoint); 2406 return handleGestureLongPress(gestureEvent, adjustedPoint);
2376 case PlatformEvent::GestureLongTap: 2407 case PlatformEvent::GestureLongTap:
2377 return handleGestureLongTap(gestureEvent, adjustedPoint); 2408 return handleGestureLongTap(gestureEvent, adjustedPoint);
2378 case PlatformEvent::GestureTwoFingerTap: 2409 case PlatformEvent::GestureTwoFingerTap:
2379 return handleGestureTwoFingerTap(gestureEvent, adjustedPoint); 2410 return handleGestureTwoFingerTap(gestureEvent, adjustedPoint);
2380 case PlatformEvent::GestureTapDown: 2411 case PlatformEvent::GestureTapDown:
2412 if (m_tapDownTriggeredActive)
2413 m_lastActiveTimestamp = WTF::currentTime();
2381 case PlatformEvent::GesturePinchBegin: 2414 case PlatformEvent::GesturePinchBegin:
2382 case PlatformEvent::GesturePinchEnd: 2415 case PlatformEvent::GesturePinchEnd:
2383 case PlatformEvent::GesturePinchUpdate: 2416 case PlatformEvent::GesturePinchUpdate:
2384 case PlatformEvent::GestureTapDownCancel: 2417 case PlatformEvent::GestureTapDownCancel:
2385 case PlatformEvent::GestureTapUnconfirmed: 2418 case PlatformEvent::GestureTapUnconfirmed:
2386 case PlatformEvent::GestureFlingStart: 2419 case PlatformEvent::GestureFlingStart:
2387 break; 2420 break;
2388 default: 2421 default:
2389 ASSERT_NOT_REACHED(); 2422 ASSERT_NOT_REACHED();
2390 } 2423 }
(...skipping 1623 matching lines...) Expand 10 before | Expand all | Expand 10 after
4014 unsigned EventHandler::accessKeyModifiers() 4047 unsigned EventHandler::accessKeyModifiers()
4015 { 4048 {
4016 #if OS(MACOSX) 4049 #if OS(MACOSX)
4017 return PlatformEvent::CtrlKey | PlatformEvent::AltKey; 4050 return PlatformEvent::CtrlKey | PlatformEvent::AltKey;
4018 #else 4051 #else
4019 return PlatformEvent::AltKey; 4052 return PlatformEvent::AltKey;
4020 #endif 4053 #endif
4021 } 4054 }
4022 4055
4023 } // namespace WebCore 4056 } // namespace WebCore
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698