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

Side by Side Diff: third_party/WebKit/Source/core/input/EventHandler.cpp

Issue 2010133003: Add ScrollManager class (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 6 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
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 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
49 #include "core/events/TextEvent.h" 49 #include "core/events/TextEvent.h"
50 #include "core/events/TouchEvent.h" 50 #include "core/events/TouchEvent.h"
51 #include "core/events/WheelEvent.h" 51 #include "core/events/WheelEvent.h"
52 #include "core/fetch/ImageResource.h" 52 #include "core/fetch/ImageResource.h"
53 #include "core/frame/Deprecation.h" 53 #include "core/frame/Deprecation.h"
54 #include "core/frame/EventHandlerRegistry.h" 54 #include "core/frame/EventHandlerRegistry.h"
55 #include "core/frame/FrameHost.h" 55 #include "core/frame/FrameHost.h"
56 #include "core/frame/FrameView.h" 56 #include "core/frame/FrameView.h"
57 #include "core/frame/LocalFrame.h" 57 #include "core/frame/LocalFrame.h"
58 #include "core/frame/Settings.h" 58 #include "core/frame/Settings.h"
59 #include "core/frame/TopControls.h"
60 #include "core/frame/UseCounter.h" 59 #include "core/frame/UseCounter.h"
61 #include "core/frame/VisualViewport.h" 60 #include "core/frame/VisualViewport.h"
62 #include "core/html/HTMLDialogElement.h" 61 #include "core/html/HTMLDialogElement.h"
63 #include "core/html/HTMLFrameElementBase.h" 62 #include "core/html/HTMLFrameElementBase.h"
64 #include "core/html/HTMLFrameSetElement.h" 63 #include "core/html/HTMLFrameSetElement.h"
65 #include "core/html/HTMLInputElement.h" 64 #include "core/html/HTMLInputElement.h"
66 #include "core/input/InputDeviceCapabilities.h" 65 #include "core/input/InputDeviceCapabilities.h"
67 #include "core/input/TouchActionUtil.h" 66 #include "core/input/TouchActionUtil.h"
68 #include "core/layout/HitTestRequest.h" 67 #include "core/layout/HitTestRequest.h"
69 #include "core/layout/HitTestResult.h" 68 #include "core/layout/HitTestResult.h"
70 #include "core/layout/LayoutPart.h" 69 #include "core/layout/LayoutPart.h"
71 #include "core/layout/LayoutTextControlSingleLine.h" 70 #include "core/layout/LayoutTextControlSingleLine.h"
72 #include "core/layout/LayoutView.h" 71 #include "core/layout/LayoutView.h"
73 #include "core/layout/api/LayoutViewItem.h" 72 #include "core/layout/api/LayoutViewItem.h"
74 #include "core/loader/DocumentLoader.h" 73 #include "core/loader/DocumentLoader.h"
75 #include "core/loader/FrameLoader.h" 74 #include "core/loader/FrameLoader.h"
76 #include "core/loader/FrameLoaderClient.h" 75 #include "core/loader/FrameLoaderClient.h"
77 #include "core/page/AutoscrollController.h" 76 #include "core/page/AutoscrollController.h"
78 #include "core/page/ChromeClient.h" 77 #include "core/page/ChromeClient.h"
79 #include "core/page/DragController.h" 78 #include "core/page/DragController.h"
80 #include "core/page/DragState.h" 79 #include "core/page/DragState.h"
81 #include "core/page/FocusController.h" 80 #include "core/page/FocusController.h"
82 #include "core/page/FrameTree.h" 81 #include "core/page/FrameTree.h"
83 #include "core/page/Page.h" 82 #include "core/page/Page.h"
84 #include "core/page/SpatialNavigation.h" 83 #include "core/page/SpatialNavigation.h"
85 #include "core/page/TouchAdjustment.h" 84 #include "core/page/TouchAdjustment.h"
86 #include "core/page/scrolling/OverscrollController.h"
87 #include "core/page/scrolling/RootScroller.h"
88 #include "core/page/scrolling/ScrollState.h" 85 #include "core/page/scrolling/ScrollState.h"
89 #include "core/paint/PaintLayer.h" 86 #include "core/paint/PaintLayer.h"
90 #include "core/style/ComputedStyle.h" 87 #include "core/style/ComputedStyle.h"
91 #include "core/style/CursorData.h" 88 #include "core/style/CursorData.h"
92 #include "core/svg/SVGDocumentExtensions.h" 89 #include "core/svg/SVGDocumentExtensions.h"
93 #include "platform/PlatformGestureEvent.h" 90 #include "platform/PlatformGestureEvent.h"
94 #include "platform/PlatformKeyboardEvent.h" 91 #include "platform/PlatformKeyboardEvent.h"
95 #include "platform/PlatformTouchEvent.h" 92 #include "platform/PlatformTouchEvent.h"
96 #include "platform/PlatformWheelEvent.h" 93 #include "platform/PlatformWheelEvent.h"
97 #include "platform/RuntimeEnabledFeatures.h" 94 #include "platform/RuntimeEnabledFeatures.h"
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
136 // we'd like to EventHandler::handleMousePressEvent to pass the event to the wid get and thus the 133 // we'd like to EventHandler::handleMousePressEvent to pass the event to the wid get and thus the
137 // event target node can't still be the shadow node. 134 // event target node can't still be the shadow node.
138 bool shouldRefetchEventTarget(const MouseEventWithHitTestResults& mev) 135 bool shouldRefetchEventTarget(const MouseEventWithHitTestResults& mev)
139 { 136 {
140 Node* targetNode = mev.innerNode(); 137 Node* targetNode = mev.innerNode();
141 if (!targetNode || !targetNode->parentNode()) 138 if (!targetNode || !targetNode->parentNode())
142 return true; 139 return true;
143 return targetNode->isShadowRoot() && isHTMLInputElement(toShadowRoot(targetN ode)->host()); 140 return targetNode->isShadowRoot() && isHTMLInputElement(toShadowRoot(targetN ode)->host());
144 } 141 }
145 142
146 // TODO(bokan): This method can go away once all scrolls happen through the
147 // scroll customization path.
148 void computeScrollChainForSingleNode(Node& node, std::deque<int>& scrollChain)
149 {
150 scrollChain.clear();
151
152 ASSERT(node.layoutObject());
153 Element* element = toElement(&node);
154
155 scrollChain.push_front(DOMNodeIds::idForNode(element));
156 }
157
158 void recomputeScrollChain(const LocalFrame& frame, const Node& startNode,
159 std::deque<int>& scrollChain)
160 {
161 scrollChain.clear();
162
163 ASSERT(startNode.layoutObject());
164 LayoutBox* curBox = startNode.layoutObject()->enclosingBox();
165
166 // Scrolling propagates along the containing block chain.
167 while (curBox && !curBox->isLayoutView()) {
168 Node* curNode = curBox->node();
169 // FIXME: this should reject more elements, as part of crbug.com/410974.
170 if (curNode && curNode->isElementNode()) {
171 Element* curElement = toElement(curNode);
172 if (curElement == frame.document()->scrollingElement())
173 break;
174 scrollChain.push_front(DOMNodeIds::idForNode(curElement));
175 }
176 curBox = curBox->containingBlock();
177 }
178 // TODO(tdresser): this should sometimes be excluded, as part of crbug.com/4 10974.
179 // We need to ensure that the scrollingElement is always part of
180 // the scroll chain. In quirks mode, when the scrollingElement is
181 // the body, some elements may use the documentElement as their
182 // containingBlock, so we ensure the scrollingElement is added
183 // here.
184 scrollChain.push_front(DOMNodeIds::idForNode(frame.document()->scrollingElem ent()));
185 }
186
187 } // namespace 143 } // namespace
188 144
189 using namespace HTMLNames; 145 using namespace HTMLNames;
190 146
191 // The link drag hysteresis is much larger than the others because there 147 // The link drag hysteresis is much larger than the others because there
192 // needs to be enough space to cancel the link press without starting a link dra g, 148 // needs to be enough space to cancel the link press without starting a link dra g,
193 // and because dragging links is rare. 149 // and because dragging links is rare.
194 static const int LinkDragHysteresis = 40; 150 static const int LinkDragHysteresis = 40;
195 static const int ImageDragHysteresis = 5; 151 static const int ImageDragHysteresis = 5;
196 static const int TextDragHysteresis = 3; 152 static const int TextDragHysteresis = 3;
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
242 : m_frame(frame) 198 : m_frame(frame)
243 , m_mousePressed(false) 199 , m_mousePressed(false)
244 , m_capturesDragging(false) 200 , m_capturesDragging(false)
245 , m_mouseDownMayStartDrag(false) 201 , m_mouseDownMayStartDrag(false)
246 , m_selectionController(SelectionController::create(*frame)) 202 , m_selectionController(SelectionController::create(*frame))
247 , m_hoverTimer(this, &EventHandler::hoverTimerFired) 203 , m_hoverTimer(this, &EventHandler::hoverTimerFired)
248 , m_cursorUpdateTimer(this, &EventHandler::cursorUpdateTimerFired) 204 , m_cursorUpdateTimer(this, &EventHandler::cursorUpdateTimerFired)
249 , m_mouseDownMayStartAutoscroll(false) 205 , m_mouseDownMayStartAutoscroll(false)
250 , m_fakeMouseMoveEventTimer(this, &EventHandler::fakeMouseMoveEventTimerFire d) 206 , m_fakeMouseMoveEventTimer(this, &EventHandler::fakeMouseMoveEventTimerFire d)
251 , m_svgPan(false) 207 , m_svgPan(false)
252 , m_resizeScrollableArea(nullptr)
253 , m_eventHandlerWillResetCapturingMouseEventsNode(0) 208 , m_eventHandlerWillResetCapturingMouseEventsNode(0)
254 , m_clickCount(0) 209 , m_clickCount(0)
255 , m_shouldOnlyFireDragOverEvent(false) 210 , m_shouldOnlyFireDragOverEvent(false)
256 , m_mousePositionIsUnknown(true) 211 , m_mousePositionIsUnknown(true)
257 , m_mouseDownTimestamp(0) 212 , m_mouseDownTimestamp(0)
258 , m_pointerEventManager(frame) 213 , m_pointerEventManager(frame)
259 , m_scrollGestureHandlingNode(nullptr) 214 , m_scrollManager(frame)
260 , m_lastGestureScrollOverWidget(false)
261 , m_longTapShouldInvokeContextMenu(false) 215 , m_longTapShouldInvokeContextMenu(false)
262 , m_activeIntervalTimer(this, &EventHandler::activeIntervalTimerFired) 216 , m_activeIntervalTimer(this, &EventHandler::activeIntervalTimerFired)
263 , m_lastShowPressTimestamp(0) 217 , m_lastShowPressTimestamp(0)
264 , m_deltaConsumedForScrollSequence(false)
265 { 218 {
266 } 219 }
267 220
268 EventHandler::~EventHandler() 221 EventHandler::~EventHandler()
269 { 222 {
270 ASSERT(!m_fakeMouseMoveEventTimer.isActive()); 223 ASSERT(!m_fakeMouseMoveEventTimer.isActive());
271 } 224 }
272 225
273 DEFINE_TRACE(EventHandler) 226 DEFINE_TRACE(EventHandler)
274 { 227 {
275 visitor->trace(m_frame); 228 visitor->trace(m_frame);
276 visitor->trace(m_mousePressNode); 229 visitor->trace(m_mousePressNode);
277 visitor->trace(m_resizeScrollableArea);
278 visitor->trace(m_capturingMouseEventsNode); 230 visitor->trace(m_capturingMouseEventsNode);
279 visitor->trace(m_nodeUnderMouse); 231 visitor->trace(m_nodeUnderMouse);
280 visitor->trace(m_lastMouseMoveEventSubframe); 232 visitor->trace(m_lastMouseMoveEventSubframe);
281 visitor->trace(m_lastScrollbarUnderMouse); 233 visitor->trace(m_lastScrollbarUnderMouse);
282 visitor->trace(m_clickNode); 234 visitor->trace(m_clickNode);
283 visitor->trace(m_dragTarget); 235 visitor->trace(m_dragTarget);
284 visitor->trace(m_frameSetBeingResized); 236 visitor->trace(m_frameSetBeingResized);
285 visitor->trace(m_scrollbarHandlingScrollGesture);
286 visitor->trace(m_scrollGestureHandlingNode);
287 visitor->trace(m_previousGestureScrolledNode);
288 visitor->trace(m_lastDeferredTapElement); 237 visitor->trace(m_lastDeferredTapElement);
289 visitor->trace(m_selectionController); 238 visitor->trace(m_selectionController);
290 visitor->trace(m_pointerEventManager); 239 visitor->trace(m_pointerEventManager);
240 visitor->trace(m_scrollManager);
291 } 241 }
292 242
293 DragState& EventHandler::dragState() 243 DragState& EventHandler::dragState()
294 { 244 {
295 DEFINE_STATIC_LOCAL(DragState, state, (new DragState)); 245 DEFINE_STATIC_LOCAL(DragState, state, (new DragState));
296 return state; 246 return state;
297 } 247 }
298 248
299 void EventHandler::clear() 249 void EventHandler::clear()
300 { 250 {
301 m_hoverTimer.stop(); 251 m_hoverTimer.stop();
302 m_cursorUpdateTimer.stop(); 252 m_cursorUpdateTimer.stop();
303 m_fakeMouseMoveEventTimer.stop(); 253 m_fakeMouseMoveEventTimer.stop();
304 m_activeIntervalTimer.stop(); 254 m_activeIntervalTimer.stop();
305 m_resizeScrollableArea = nullptr;
306 m_nodeUnderMouse = nullptr; 255 m_nodeUnderMouse = nullptr;
307 m_lastMouseMoveEventSubframe = nullptr; 256 m_lastMouseMoveEventSubframe = nullptr;
308 m_lastScrollbarUnderMouse = nullptr; 257 m_lastScrollbarUnderMouse = nullptr;
309 m_clickCount = 0; 258 m_clickCount = 0;
310 m_clickNode = nullptr; 259 m_clickNode = nullptr;
311 m_frameSetBeingResized = nullptr; 260 m_frameSetBeingResized = nullptr;
312 m_dragTarget = nullptr; 261 m_dragTarget = nullptr;
313 m_shouldOnlyFireDragOverEvent = false; 262 m_shouldOnlyFireDragOverEvent = false;
314 m_mousePositionIsUnknown = true; 263 m_mousePositionIsUnknown = true;
315 m_lastKnownMousePosition = IntPoint(); 264 m_lastKnownMousePosition = IntPoint();
316 m_lastKnownMouseGlobalPosition = IntPoint(); 265 m_lastKnownMouseGlobalPosition = IntPoint();
317 m_lastMouseDownUserGestureToken.clear(); 266 m_lastMouseDownUserGestureToken.clear();
318 m_mousePressNode = nullptr; 267 m_mousePressNode = nullptr;
319 m_mousePressed = false; 268 m_mousePressed = false;
320 m_capturesDragging = false; 269 m_capturesDragging = false;
321 m_capturingMouseEventsNode = nullptr; 270 m_capturingMouseEventsNode = nullptr;
322 clearGestureScrollState();
323 m_lastGestureScrollOverWidget = false;
324 m_scrollbarHandlingScrollGesture = nullptr;
325 m_pointerEventManager.clear(); 271 m_pointerEventManager.clear();
272 m_scrollManager.clear();
326 m_mouseDownMayStartDrag = false; 273 m_mouseDownMayStartDrag = false;
327 m_lastShowPressTimestamp = 0; 274 m_lastShowPressTimestamp = 0;
328 m_lastDeferredTapElement = nullptr; 275 m_lastDeferredTapElement = nullptr;
329 m_eventHandlerWillResetCapturingMouseEventsNode = false; 276 m_eventHandlerWillResetCapturingMouseEventsNode = false;
330 m_mouseDownMayStartAutoscroll = false; 277 m_mouseDownMayStartAutoscroll = false;
331 m_svgPan = false; 278 m_svgPan = false;
332 m_mouseDownPos = IntPoint(); 279 m_mouseDownPos = IntPoint();
333 m_mouseDownTimestamp = 0; 280 m_mouseDownTimestamp = 0;
334 m_longTapShouldInvokeContextMenu = false; 281 m_longTapShouldInvokeContextMenu = false;
335 m_dragStartPos = LayoutPoint(); 282 m_dragStartPos = LayoutPoint();
336 m_offsetFromResizeCorner = LayoutSize();
337 m_mouseDown = PlatformMouseEvent(); 283 m_mouseDown = PlatformMouseEvent();
338 } 284 }
339 285
340 WebInputEventResult EventHandler::mergeEventResult( 286 WebInputEventResult EventHandler::mergeEventResult(
341 WebInputEventResult resultA, WebInputEventResult resultB) 287 WebInputEventResult resultA, WebInputEventResult resultB)
342 { 288 {
343 // The ordering of the enumeration is specific. There are times that 289 // The ordering of the enumeration is specific. There are times that
344 // multiple events fire and we need to combine them into a single 290 // multiple events fire and we need to combine them into a single
345 // result code. The enumeration is based on the level of consumption that 291 // result code. The enumeration is based on the level of consumption that
346 // is most significant. The enumeration is ordered with smaller specified 292 // is most significant. The enumeration is ordered with smaller specified
(...skipping 129 matching lines...) Expand 10 before | Expand all | Expand 10 after
476 if (!parent) 422 if (!parent)
477 return WebInputEventResult::NotHandled; 423 return WebInputEventResult::NotHandled;
478 424
479 layoutObject = parent->layoutObject(); 425 layoutObject = parent->layoutObject();
480 if (!layoutObject || !layoutObject->isListBox()) 426 if (!layoutObject || !layoutObject->isListBox())
481 return WebInputEventResult::NotHandled; 427 return WebInputEventResult::NotHandled;
482 } 428 }
483 429
484 m_mouseDownMayStartDrag = false; 430 m_mouseDownMayStartDrag = false;
485 431
486 if (m_mouseDownMayStartAutoscroll && !panScrollInProgress()) { 432 if (m_mouseDownMayStartAutoscroll && !m_scrollManager.panScrollInProgress()) {
487 if (AutoscrollController* controller = autoscrollController()) { 433 if (AutoscrollController* controller = m_scrollManager.autoscrollControl ler()) {
488 controller->startAutoscrollForSelection(layoutObject); 434 controller->startAutoscrollForSelection(layoutObject);
489 m_mouseDownMayStartAutoscroll = false; 435 m_mouseDownMayStartAutoscroll = false;
490 } 436 }
491 } 437 }
492 438
493 selectionController().handleMouseDraggedEvent(event, m_mouseDownPos, m_dragS tartPos, m_mousePressNode.get(), m_lastKnownMousePosition); 439 selectionController().handleMouseDraggedEvent(event, m_mouseDownPos, m_dragS tartPos, m_mousePressNode.get(), m_lastKnownMousePosition);
494 return WebInputEventResult::HandledSystem; 440 return WebInputEventResult::HandledSystem;
495 } 441 }
496 442
497 void EventHandler::updateSelectionForMouseDrag() 443 void EventHandler::updateSelectionForMouseDrag()
498 { 444 {
499 selectionController().updateSelectionForMouseDrag(m_mousePressNode.get(), m_ dragStartPos, m_lastKnownMousePosition); 445 selectionController().updateSelectionForMouseDrag(m_mousePressNode.get(), m_ dragStartPos, m_lastKnownMousePosition);
500 } 446 }
501 447
502 WebInputEventResult EventHandler::handleMouseReleaseEvent(const MouseEventWithHi tTestResults& event) 448 WebInputEventResult EventHandler::handleMouseReleaseEvent(const MouseEventWithHi tTestResults& event)
503 { 449 {
504 AutoscrollController* controller = autoscrollController(); 450 AutoscrollController* controller = m_scrollManager.autoscrollController();
dtapuska 2016/05/27 14:12:23 Why can't this just be a call to m_scrollManager.s
Navid Zolghadr 2016/05/30 20:15:46 stopAutoScroll is used in other places without thi
505 if (controller && controller->autoscrollInProgress()) 451 if (controller && controller->autoscrollInProgress())
506 stopAutoscroll(); 452 m_scrollManager.stopAutoscroll();
507 453
508 // Used to prevent mouseMoveEvent from initiating a drag before 454 // Used to prevent mouseMoveEvent from initiating a drag before
509 // the mouse is pressed again. 455 // the mouse is pressed again.
510 m_mousePressed = false; 456 m_mousePressed = false;
511 m_capturesDragging = false; 457 m_capturesDragging = false;
512 m_mouseDownMayStartDrag = false; 458 m_mouseDownMayStartDrag = false;
513 m_mouseDownMayStartAutoscroll = false; 459 m_mouseDownMayStartAutoscroll = false;
514 460
515 return selectionController().handleMouseReleaseEvent(event, m_dragStartPos) ? WebInputEventResult::HandledSystem : WebInputEventResult::NotHandled; 461 return selectionController().handleMouseReleaseEvent(event, m_dragStartPos) ? WebInputEventResult::HandledSystem : WebInputEventResult::NotHandled;
516 } 462 }
517 463
518 #if OS(WIN) 464 #if OS(WIN)
519 465
520 void EventHandler::startPanScrolling(LayoutObject* layoutObject) 466 void EventHandler::startPanScrolling(LayoutObject* layoutObject)
521 { 467 {
522 if (!layoutObject->isBox()) 468 if (!layoutObject->isBox())
dtapuska 2016/05/27 14:12:23 This seems like something that should be delegated
Navid Zolghadr 2016/05/30 20:15:46 This seems a little tricky to remove autoScrollCon
bokan 2016/05/31 19:39:13 I'd prefer if we kept this patch as simple and mec
Navid Zolghadr 2016/06/01 17:36:43 Okay then. I'll leave this function as is.
523 return; 469 return;
524 AutoscrollController* controller = autoscrollController(); 470 AutoscrollController* controller = m_scrollManager.autoscrollController();
525 if (!controller) 471 if (!controller)
526 return; 472 return;
527 controller->startPanScrolling(toLayoutBox(layoutObject), lastKnownMousePosit ion()); 473 controller->startPanScrolling(toLayoutBox(layoutObject), lastKnownMousePosit ion());
528 invalidateClick(); 474 invalidateClick();
529 } 475 }
530 476
531 #endif // OS(WIN) 477 #endif // OS(WIN)
532 478
533 AutoscrollController* EventHandler::autoscrollController() const
534 {
535 if (Page* page = m_frame->page())
536 return &page->autoscrollController();
537 return nullptr;
538 }
539
540 bool EventHandler::panScrollInProgress() const
541 {
542 return autoscrollController() && autoscrollController()->panScrollInProgress ();
543 }
544
545 HitTestResult EventHandler::hitTestResultAtPoint(const LayoutPoint& point, HitTe stRequest::HitTestRequestType hitType, const LayoutSize& padding) 479 HitTestResult EventHandler::hitTestResultAtPoint(const LayoutPoint& point, HitTe stRequest::HitTestRequestType hitType, const LayoutSize& padding)
546 { 480 {
547 TRACE_EVENT0("blink", "EventHandler::hitTestResultAtPoint"); 481 TRACE_EVENT0("blink", "EventHandler::hitTestResultAtPoint");
548 482
549 ASSERT((hitType & HitTestRequest::ListBased) || padding.isEmpty()); 483 ASSERT((hitType & HitTestRequest::ListBased) || padding.isEmpty());
550 484
551 // We always send hitTestResultAtPoint to the main frame if we have one, 485 // We always send hitTestResultAtPoint to the main frame if we have one,
552 // otherwise we might hit areas that are obscured by higher frames. 486 // otherwise we might hit areas that are obscured by higher frames.
553 if (m_frame->page()) { 487 if (m_frame->page()) {
554 LocalFrame* mainFrame = m_frame->localFrameRoot(); 488 LocalFrame* mainFrame = m_frame->localFrameRoot();
(...skipping 22 matching lines...) Expand all
577 511
578 m_frame->contentLayoutItem().hitTest(result); 512 m_frame->contentLayoutItem().hitTest(result);
579 if (!request.readOnly()) 513 if (!request.readOnly())
580 m_frame->document()->updateHoverActiveState(request, result.innerElement ()); 514 m_frame->document()->updateHoverActiveState(request, result.innerElement ());
581 515
582 return result; 516 return result;
583 } 517 }
584 518
585 void EventHandler::stopAutoscroll() 519 void EventHandler::stopAutoscroll()
586 { 520 {
587 if (AutoscrollController* controller = autoscrollController()) 521 m_scrollManager.stopAutoscroll();
588 controller->stopAutoscroll();
589 }
590
591 ScrollResult EventHandler::scrollBox(LayoutBox* box,
592 ScrollGranularity granularity, const FloatSize& delta,
593 const FloatPoint& position, const FloatSize& velocity,
594 bool* wasRootScroller)
595 {
596 ASSERT(box);
597 Node* node = box->node();
598
599 // If there's no ApplyScroll callback on the element, scroll as usuall in
600 // the non-scroll-customization case.
601 if (!node || !node->isElementNode() || !toElement(node)->getApplyScroll()) {
602 *wasRootScroller = false;
603 return box->scroll(granularity, delta);
604 }
605
606 // Viewport actions should only happen when scrolling an element in the
607 // main frame.
608 ASSERT(m_frame->isMainFrame());
609
610 // If there is an ApplyScroll callback, its because we placed one on the
611 // root scroller to control top controls and overscroll. Invoke a scroll
612 // using parts of the scroll customization framework on just this element.
613 computeScrollChainForSingleNode(*node, m_currentScrollChain);
614
615 OwnPtr<ScrollStateData> scrollStateData = adoptPtr(new ScrollStateData());
616 scrollStateData->delta_x = delta.width();
617 scrollStateData->delta_y = delta.height();
618 scrollStateData->position_x = position.x();
619 scrollStateData->position_y = position.y();
620 // TODO(bokan): delta_granularity is meant to be the number of pixels per
621 // unit of delta but we can't determine that until we get to the area we'll
622 // scroll. This is a hack, we stuff the enum into the double value for
623 // now.
624 scrollStateData->delta_granularity = static_cast<double>(granularity);
625 scrollStateData->velocity_x = velocity.width();
626 scrollStateData->velocity_y = velocity.height();
627 scrollStateData->should_propagate = false;
628 scrollStateData->is_in_inertial_phase = false;
629 scrollStateData->from_user_input = true;
630 scrollStateData->delta_consumed_for_scroll_sequence = false;
631 ScrollState* scrollState =
632 ScrollState::create(std::move(scrollStateData));
633
634 customizedScroll(*node, *scrollState);
635
636 ScrollResult result(
637 scrollState->deltaX() != delta.width(),
638 scrollState->deltaY() != delta.height(),
639 scrollState->deltaX(),
640 scrollState->deltaY());
641
642 *wasRootScroller = true;
643 m_currentScrollChain.clear();
644
645 return result;
646 }
647
648 ScrollResult EventHandler::physicalScroll(ScrollGranularity granularity,
649 const FloatSize& delta, const FloatPoint& position,
650 const FloatSize& velocity, Node* startNode, Node** stopNode, bool* consumed)
651 {
652 if (consumed)
653 *consumed = false;
654 if (delta.isZero())
655 return ScrollResult();
656
657 Node* node = startNode;
658 ASSERT(node && node->layoutObject());
659
660 m_frame->document()->updateStyleAndLayoutIgnorePendingStylesheets();
661
662 ScrollResult result;
663
664 LayoutBox* curBox = node->layoutObject()->enclosingBox();
665 while (curBox) {
666 // If we're at the stopNode, we should try to scroll it but we shouldn't
667 // chain past it.
668 bool shouldStopChaining =
669 stopNode && *stopNode && curBox->node() == *stopNode;
670 bool wasRootScroller = false;
671
672 result = scrollBox(
673 curBox,
674 granularity,
675 delta,
676 position,
677 velocity,
678 &wasRootScroller);
679
680 if (result.didScroll() && stopNode)
681 *stopNode = curBox->node();
682
683 if (result.didScroll() || shouldStopChaining) {
684 setFrameWasScrolledByUser();
685 if (consumed)
686 *consumed = true;
687 return result;
688 } else if (wasRootScroller) {
689 // Don't try to chain past the root scroller, even if there's
690 // eligible ancestors.
691 break;
692 }
693
694 curBox = curBox->containingBlock();
695 }
696
697 return result;
698 }
699
700 bool EventHandler::logicalScroll(ScrollDirection direction, ScrollGranularity gr anularity, Node* startNode)
701 {
702 Node* node = startNode;
703
704 if (!node)
705 node = m_frame->document()->focusedElement();
706
707 if (!node)
708 node = m_mousePressNode.get();
709
710 if ((!node || !node->layoutObject()) && m_frame->view() && !m_frame->view()- >layoutViewItem().isNull())
711 node = m_frame->view()->layoutViewItem().node();
712
713 if (!node)
714 return false;
715
716 m_frame->document()->updateStyleAndLayoutIgnorePendingStylesheets();
717
718 LayoutBox* curBox = node->layoutObject()->enclosingBox();
719 while (curBox) {
720 ScrollDirectionPhysical physicalDirection = toPhysicalDirection(
721 direction, curBox->isHorizontalWritingMode(), curBox->style()->isFli ppedBlocksWritingMode());
722
723 ScrollResult result = curBox->scroll(granularity, toScrollDelta(physical Direction, 1));
724
725 if (result.didScroll()) {
726 setFrameWasScrolledByUser();
727 return true;
728 }
729
730 curBox = curBox->containingBlock();
731 }
732
733 return false;
734 }
735
736 void EventHandler::customizedScroll(const Node& startNode, ScrollState& scrollSt ate)
737 {
738 if (scrollState.fullyConsumed())
739 return;
740
741 if (scrollState.deltaX() || scrollState.deltaY())
742 m_frame->document()->updateStyleAndLayoutIgnorePendingStylesheets();
743
744 if (m_currentScrollChain.empty())
745 recomputeScrollChain(*m_frame, startNode, m_currentScrollChain);
746 scrollState.setScrollChain(m_currentScrollChain);
747
748 scrollState.distributeToScrollChainDescendant();
749 } 522 }
750 523
751 // TODO(bokan): This should be merged with logicalScroll assuming 524 // TODO(bokan): This should be merged with logicalScroll assuming
752 // defaultSpaceEventHandler's chaining scroll can be done crossing frames. 525 // defaultSpaceEventHandler's chaining scroll can be done crossing frames.
753 bool EventHandler::bubblingScroll(ScrollDirection direction, ScrollGranularity g ranularity, Node* startingNode) 526 bool EventHandler::bubblingScroll(ScrollDirection direction, ScrollGranularity g ranularity, Node* startingNode)
754 { 527 {
755 // The layout needs to be up to date to determine if we can scroll. We may b e 528 // The layout needs to be up to date to determine if we can scroll. We may b e
756 // here because of an onLoad event, in which case the final layout hasn't be en performed yet. 529 // here because of an onLoad event, in which case the final layout hasn't be en performed yet.
dtapuska 2016/05/27 14:12:23 It would seem to me bubbling scroll would just get
Navid Zolghadr 2016/05/30 20:15:46 Done.
757 m_frame->document()->updateStyleAndLayoutIgnorePendingStylesheets(); 530 m_frame->document()->updateStyleAndLayoutIgnorePendingStylesheets();
758 // FIXME: enable scroll customization in this case. See crbug.com/410974. 531 // FIXME: enable scroll customization in this case. See crbug.com/410974.
759 if (logicalScroll(direction, granularity, startingNode)) 532 if (m_scrollManager.logicalScroll(direction, granularity, startingNode, m_mo usePressNode))
760 return true; 533 return true;
761 534
762 Frame* parentFrame = m_frame->tree().parent(); 535 Frame* parentFrame = m_frame->tree().parent();
763 if (!parentFrame || !parentFrame->isLocalFrame()) 536 if (!parentFrame || !parentFrame->isLocalFrame())
764 return false; 537 return false;
765 // FIXME: Broken for OOPI. 538 // FIXME: Broken for OOPI.
766 return toLocalFrame(parentFrame)->eventHandler().bubblingScroll(direction, g ranularity, m_frame->deprecatedLocalOwner()); 539 return toLocalFrame(parentFrame)->eventHandler().bubblingScroll(direction, g ranularity, m_frame->deprecatedLocalOwner());
767 } 540 }
768 541
769 IntPoint EventHandler::lastKnownMousePosition() const 542 IntPoint EventHandler::lastKnownMousePosition() const
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after
851 if (LocalFrame* frame = result.innerNodeFrame()) { 624 if (LocalFrame* frame = result.innerNodeFrame()) {
852 OptionalCursor optionalCursor = frame->eventHandler().selectCursor(resul t); 625 OptionalCursor optionalCursor = frame->eventHandler().selectCursor(resul t);
853 if (optionalCursor.isCursorChange()) { 626 if (optionalCursor.isCursorChange()) {
854 view->setCursor(optionalCursor.cursor()); 627 view->setCursor(optionalCursor.cursor());
855 } 628 }
856 } 629 }
857 } 630 }
858 631
859 OptionalCursor EventHandler::selectCursor(const HitTestResult& result) 632 OptionalCursor EventHandler::selectCursor(const HitTestResult& result)
860 { 633 {
861 if (m_resizeScrollableArea && m_resizeScrollableArea->inResizeMode()) 634 if (m_scrollManager.inResizeMode())
862 return NoCursorChange; 635 return NoCursorChange;
863 636
864 Page* page = m_frame->page(); 637 Page* page = m_frame->page();
865 if (!page) 638 if (!page)
866 return NoCursorChange; 639 return NoCursorChange;
867 if (panScrollInProgress()) 640 if (m_scrollManager.panScrollInProgress())
868 return NoCursorChange; 641 return NoCursorChange;
869 642
870 Node* node = result.innerPossiblyPseudoNode(); 643 Node* node = result.innerPossiblyPseudoNode();
871 if (!node) 644 if (!node)
872 return selectAutoCursor(result, node, iBeamCursor()); 645 return selectAutoCursor(result, node, iBeamCursor());
873 646
874 LayoutObject* layoutObject = node->layoutObject(); 647 LayoutObject* layoutObject = node->layoutObject();
875 const ComputedStyle* style = layoutObject ? layoutObject->style() : nullptr; 648 const ComputedStyle* style = layoutObject ? layoutObject->style() : nullptr;
876 649
877 if (layoutObject) { 650 if (layoutObject) {
(...skipping 212 matching lines...) Expand 10 before | Expand all | Expand 10 after
1090 m_capturingMouseEventsNode = mev.innerNode(); 863 m_capturingMouseEventsNode = mev.innerNode();
1091 m_eventHandlerWillResetCapturingMouseEventsNode = true; 864 m_eventHandlerWillResetCapturingMouseEventsNode = true;
1092 } 865 }
1093 invalidateClick(); 866 invalidateClick();
1094 return result; 867 return result;
1095 } 868 }
1096 869
1097 #if OS(WIN) 870 #if OS(WIN)
1098 // We store whether pan scrolling is in progress before calling stopAutoscro ll() 871 // We store whether pan scrolling is in progress before calling stopAutoscro ll()
1099 // because it will set m_autoscrollType to NoAutoscroll on return. 872 // because it will set m_autoscrollType to NoAutoscroll on return.
1100 bool isPanScrollInProgress = panScrollInProgress(); 873 bool isPanScrollInProgress = m_scrollManager.panScrollInProgress();
1101 stopAutoscroll(); 874 m_scrollManager.stopAutoscroll();
1102 if (isPanScrollInProgress) { 875 if (isPanScrollInProgress) {
1103 // We invalidate the click when exiting pan scrolling so that we don't i nadvertently navigate 876 // We invalidate the click when exiting pan scrolling so that we don't i nadvertently navigate
1104 // away from the current page (e.g. the click was on a hyperlink). See < rdar://problem/6095023>. 877 // away from the current page (e.g. the click was on a hyperlink). See < rdar://problem/6095023>.
1105 invalidateClick(); 878 invalidateClick();
1106 return WebInputEventResult::HandledSuppressed; 879 return WebInputEventResult::HandledSuppressed;
1107 } 880 }
1108 #endif 881 #endif
1109 882
1110 m_clickCount = mouseEvent.clickCount(); 883 m_clickCount = mouseEvent.clickCount();
1111 m_clickNode = mev.innerNode()->isTextNode() ? FlatTreeTraversal::parent(*me v.innerNode()) : mev.innerNode(); 884 m_clickNode = mev.innerNode()->isTextNode() ? FlatTreeTraversal::parent(*me v.innerNode()) : mev.innerNode();
1112 885
1113 m_frame->selection().setCaretBlinkingSuspended(true); 886 m_frame->selection().setCaretBlinkingSuspended(true);
1114 887
1115 WebInputEventResult eventResult = updatePointerTargetAndDispatchEvents(Event TypeNames::mousedown, mev.innerNode(), m_clickCount, mev.event()); 888 WebInputEventResult eventResult = updatePointerTargetAndDispatchEvents(Event TypeNames::mousedown, mev.innerNode(), m_clickCount, mev.event());
1116 889
1117 if (eventResult == WebInputEventResult::NotHandled && m_frame->view()) { 890 if (eventResult == WebInputEventResult::NotHandled && m_frame->view()) {
1118 FrameView* view = m_frame->view(); 891 FrameView* view = m_frame->view();
1119 PaintLayer* layer = mev.innerNode()->layoutObject() ? mev.innerNode()->l ayoutObject()->enclosingLayer() : nullptr; 892 PaintLayer* layer = mev.innerNode()->layoutObject() ? mev.innerNode()->l ayoutObject()->enclosingLayer() : nullptr;
1120 IntPoint p = view->rootFrameToContents(mouseEvent.position()); 893 IntPoint p = view->rootFrameToContents(mouseEvent.position());
1121 if (layer && layer->getScrollableArea() && layer->getScrollableArea()->i sPointInResizeControl(p, ResizerForPointer)) { 894 if (layer && layer->getScrollableArea() && layer->getScrollableArea()->i sPointInResizeControl(p, ResizerForPointer)) {
1122 m_resizeScrollableArea = layer->getScrollableArea(); 895 m_scrollManager.setResizeScrollableArea(layer, p);
1123 m_resizeScrollableArea->setInResizeMode(true);
1124 m_offsetFromResizeCorner = LayoutSize(m_resizeScrollableArea->offset FromResizeCorner(p));
1125 return WebInputEventResult::HandledSystem; 896 return WebInputEventResult::HandledSystem;
1126 } 897 }
1127 } 898 }
1128 899
1129 // m_selectionInitiationState is initialized after dispatching mousedown 900 // m_selectionInitiationState is initialized after dispatching mousedown
1130 // event in order not to keep the selection by DOM APIs Because we can't 901 // event in order not to keep the selection by DOM APIs Because we can't
1131 // give the user the chance to handle the selection by user action like 902 // give the user the chance to handle the selection by user action like
1132 // dragging if we keep the selection in case of mousedown. FireFox also has 903 // dragging if we keep the selection in case of mousedown. FireFox also has
1133 // the same behavior and it's more compatible with other browsers. 904 // the same behavior and it's more compatible with other browsers.
1134 selectionController().initializeSelectionState(); 905 selectionController().initializeSelectionState();
(...skipping 150 matching lines...) Expand 10 before | Expand all | Expand 10 after
1285 if (forceLeave) 1056 if (forceLeave)
1286 m_frame->document()->updateHoverActiveState(request, 0); 1057 m_frame->document()->updateHoverActiveState(request, 0);
1287 else 1058 else
1288 mev = prepareMouseEvent(request, mouseEvent); 1059 mev = prepareMouseEvent(request, mouseEvent);
1289 1060
1290 if (hoveredNode) 1061 if (hoveredNode)
1291 *hoveredNode = mev.hitTestResult(); 1062 *hoveredNode = mev.hitTestResult();
1292 1063
1293 Scrollbar* scrollbar = nullptr; 1064 Scrollbar* scrollbar = nullptr;
1294 1065
1295 if (m_resizeScrollableArea && m_resizeScrollableArea->inResizeMode()) { 1066 if (m_scrollManager.inResizeMode()) {
1296 m_resizeScrollableArea->resize(mev.event(), m_offsetFromResizeCorner); 1067 m_scrollManager.resize(mev.event());
1297 } else { 1068 } else {
1298 if (!scrollbar) 1069 if (!scrollbar)
1299 scrollbar = mev.scrollbar(); 1070 scrollbar = mev.scrollbar();
1300 1071
1301 updateLastScrollbarUnderMouse(scrollbar, !m_mousePressed); 1072 updateLastScrollbarUnderMouse(scrollbar, !m_mousePressed);
1302 if (onlyUpdateScrollbars) 1073 if (onlyUpdateScrollbars)
1303 return WebInputEventResult::HandledSuppressed; 1074 return WebInputEventResult::HandledSuppressed;
1304 } 1075 }
1305 1076
1306 WebInputEventResult eventResult = WebInputEventResult::NotHandled; 1077 WebInputEventResult eventResult = WebInputEventResult::NotHandled;
(...skipping 147 matching lines...) Expand 10 before | Expand all | Expand 10 after
1454 // This is to suppress sending click events for non-primary buttons. 1225 // This is to suppress sending click events for non-primary buttons.
1455 // But still doing default action like opening a new tab for middle 1226 // But still doing default action like opening a new tab for middle
1456 // click (crbug.com/255). 1227 // click (crbug.com/255).
1457 if (mev.event().button() != MouseButton::LeftButton) 1228 if (mev.event().button() != MouseButton::LeftButton)
1458 event->stopPropagation(); 1229 event->stopPropagation();
1459 1230
1460 clickEventResult = toWebInputEventResult(clickTargetNode->dispatchEv ent(event)); 1231 clickEventResult = toWebInputEventResult(clickTargetNode->dispatchEv ent(event));
1461 } 1232 }
1462 } 1233 }
1463 1234
1464 if (m_resizeScrollableArea) { 1235 m_scrollManager.clearResizeScrollableArea(false);
1465 m_resizeScrollableArea->setInResizeMode(false);
1466 m_resizeScrollableArea = nullptr;
1467 }
1468 1236
1469 if (eventResult == WebInputEventResult::NotHandled) 1237 if (eventResult == WebInputEventResult::NotHandled)
1470 eventResult = handleMouseReleaseEvent(mev); 1238 eventResult = handleMouseReleaseEvent(mev);
1471 1239
1472 invalidateClick(); 1240 invalidateClick();
1473 1241
1474 return mergeEventResult(clickEventResult, eventResult); 1242 return mergeEventResult(clickEventResult, eventResult);
1475 } 1243 }
1476 1244
1477 WebInputEventResult EventHandler::dispatchDragEvent(const AtomicString& eventTyp e, Node* dragTarget, const PlatformMouseEvent& event, DataTransfer* dataTransfer ) 1245 WebInputEventResult EventHandler::dispatchDragEvent(const AtomicString& eventTyp e, Node* dragTarget, const PlatformMouseEvent& event, DataTransfer* dataTransfer )
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after
1552 return eventResult; 1320 return eventResult;
1553 1321
1554 HitTestRequest request(HitTestRequest::ReadOnly); 1322 HitTestRequest request(HitTestRequest::ReadOnly);
1555 MouseEventWithHitTestResults mev = prepareMouseEvent(request, event); 1323 MouseEventWithHitTestResults mev = prepareMouseEvent(request, event);
1556 1324
1557 // Drag events should never go to text nodes (following IE, and proper mouse over/out dispatch) 1325 // Drag events should never go to text nodes (following IE, and proper mouse over/out dispatch)
1558 Node* newTarget = mev.innerNode(); 1326 Node* newTarget = mev.innerNode();
1559 if (newTarget && newTarget->isTextNode()) 1327 if (newTarget && newTarget->isTextNode())
1560 newTarget = FlatTreeTraversal::parent(*newTarget); 1328 newTarget = FlatTreeTraversal::parent(*newTarget);
1561 1329
1562 if (AutoscrollController* controller = autoscrollController()) 1330 if (AutoscrollController* controller = m_scrollManager.autoscrollController( ))
1563 controller->updateDragAndDrop(newTarget, event.position(), event.timesta mp()); 1331 controller->updateDragAndDrop(newTarget, event.position(), event.timesta mp());
1564 1332
1565 if (m_dragTarget != newTarget) { 1333 if (m_dragTarget != newTarget) {
1566 // FIXME: this ordering was explicitly chosen to match WinIE. However, 1334 // FIXME: this ordering was explicitly chosen to match WinIE. However,
1567 // it is sometimes incorrect when dragging within subframes, as seen wit h 1335 // it is sometimes incorrect when dragging within subframes, as seen wit h
1568 // LayoutTests/fast/events/drag-in-frames.html. 1336 // LayoutTests/fast/events/drag-in-frames.html.
1569 // 1337 //
1570 // Moreover, this ordering conforms to section 7.9.4 of the HTML 5 spec. <http://dev.w3.org/html5/spec/Overview.html#drag-and-drop-processing-model>. 1338 // Moreover, this ordering conforms to section 7.9.4 of the HTML 5 spec. <http://dev.w3.org/html5/spec/Overview.html#drag-and-drop-processing-model>.
1571 LocalFrame* targetFrame; 1339 LocalFrame* targetFrame;
1572 if (targetIsFrame(newTarget, targetFrame)) { 1340 if (targetIsFrame(newTarget, targetFrame)) {
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after
1640 result = targetFrame->eventHandler().performDragAndDrop(event, dataT ransfer); 1408 result = targetFrame->eventHandler().performDragAndDrop(event, dataT ransfer);
1641 } else if (m_dragTarget.get()) { 1409 } else if (m_dragTarget.get()) {
1642 result = dispatchDragEvent(EventTypeNames::drop, m_dragTarget.get(), eve nt, dataTransfer); 1410 result = dispatchDragEvent(EventTypeNames::drop, m_dragTarget.get(), eve nt, dataTransfer);
1643 } 1411 }
1644 clearDragState(); 1412 clearDragState();
1645 return result; 1413 return result;
1646 } 1414 }
1647 1415
1648 void EventHandler::clearDragState() 1416 void EventHandler::clearDragState()
1649 { 1417 {
1650 stopAutoscroll(); 1418 m_scrollManager.stopAutoscroll();
1651 m_dragTarget = nullptr; 1419 m_dragTarget = nullptr;
1652 m_capturingMouseEventsNode = nullptr; 1420 m_capturingMouseEventsNode = nullptr;
1653 m_shouldOnlyFireDragOverEvent = false; 1421 m_shouldOnlyFireDragOverEvent = false;
1654 } 1422 }
1655 1423
1656 void EventHandler::setCapturingMouseEventsNode(Node* n) 1424 void EventHandler::setCapturingMouseEventsNode(Node* n)
1657 { 1425 {
1658 m_capturingMouseEventsNode = n; 1426 m_capturingMouseEventsNode = n;
1659 m_eventHandlerWillResetCapturingMouseEventsNode = false; 1427 m_eventHandlerWillResetCapturingMouseEventsNode = false;
1660 } 1428 }
(...skipping 226 matching lines...) Expand 10 before | Expand all | Expand 10 after
1887 1655
1888 // If we're over the frame scrollbar, scroll the document. 1656 // If we're over the frame scrollbar, scroll the document.
1889 if (!node && result.scrollbar()) 1657 if (!node && result.scrollbar())
1890 node = doc->documentElement(); 1658 node = doc->documentElement();
1891 1659
1892 bool sendDOMEvent = true; 1660 bool sendDOMEvent = true;
1893 LocalFrame* subframe = subframeForTargetNode(node); 1661 LocalFrame* subframe = subframeForTargetNode(node);
1894 if (subframe) { 1662 if (subframe) {
1895 WebInputEventResult result = subframe->eventHandler().handleWheelEvent(e vent); 1663 WebInputEventResult result = subframe->eventHandler().handleWheelEvent(e vent);
1896 if (result != WebInputEventResult::NotHandled) { 1664 if (result != WebInputEventResult::NotHandled) {
1897 setFrameWasScrolledByUser(); 1665 m_scrollManager.setFrameWasScrolledByUser();
1898 return result; 1666 return result;
1899 } 1667 }
1900 // TODO(dtapuska): Remove this once wheel gesture scroll has 1668 // TODO(dtapuska): Remove this once wheel gesture scroll has
1901 // been enabled everywhere; as we can just return early. 1669 // been enabled everywhere; as we can just return early.
1902 // http://crbug.com/568183 1670 // http://crbug.com/568183
1903 // Don't propagate the DOM event into the parent iframe 1671 // Don't propagate the DOM event into the parent iframe
1904 // but do dispatch the scroll event. 1672 // but do dispatch the scroll event.
1905 sendDOMEvent = false; 1673 sendDOMEvent = false;
1906 } 1674 }
1907 1675
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
1955 if (granularity == ScrollByPage) { 1723 if (granularity == ScrollByPage) {
1956 if (delta.width()) 1724 if (delta.width())
1957 delta.setWidth(delta.width() > 0 ? 1 : -1); 1725 delta.setWidth(delta.width() > 0 ? 1 : -1);
1958 if (delta.height()) 1726 if (delta.height())
1959 delta.setHeight(delta.height() > 0 ? 1 : -1); 1727 delta.setHeight(delta.height() > 0 ? 1 : -1);
1960 } 1728 }
1961 1729
1962 // FIXME: enable scroll customization in this case. See crbug.com/410974. 1730 // FIXME: enable scroll customization in this case. See crbug.com/410974.
1963 bool consumed = false; 1731 bool consumed = false;
1964 1732
1965 physicalScroll( 1733 m_scrollManager.physicalScroll(
1966 granularity, 1734 granularity,
1967 delta, 1735 delta,
1968 FloatPoint(), 1736 FloatPoint(),
1969 FloatSize(), 1737 FloatSize(),
1970 startNode, 1738 startNode,
1971 &node, 1739 &node,
1972 &consumed); 1740 &consumed);
1973 1741
1974 if (consumed) 1742 if (consumed)
1975 wheelEvent->setDefaultHandled(); 1743 wheelEvent->setDefaultHandled();
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
2033 1801
2034 // No hit test result, handle in root instance. Perhaps we should just retur n false instead? 1802 // No hit test result, handle in root instance. Perhaps we should just retur n false instead?
2035 return handleGestureEventInFrame(targetedEvent); 1803 return handleGestureEventInFrame(targetedEvent);
2036 } 1804 }
2037 1805
2038 WebInputEventResult EventHandler::handleGestureEventInFrame(const GestureEventWi thHitTestResults& targetedEvent) 1806 WebInputEventResult EventHandler::handleGestureEventInFrame(const GestureEventWi thHitTestResults& targetedEvent)
2039 { 1807 {
2040 ASSERT(!targetedEvent.event().isScrollEvent()); 1808 ASSERT(!targetedEvent.event().isScrollEvent());
2041 1809
2042 Node* eventTarget = targetedEvent.hitTestResult().innerNode(); 1810 Node* eventTarget = targetedEvent.hitTestResult().innerNode();
2043 Scrollbar* scrollbar = targetedEvent.hitTestResult().scrollbar();
2044 const PlatformGestureEvent& gestureEvent = targetedEvent.event(); 1811 const PlatformGestureEvent& gestureEvent = targetedEvent.event();
2045 1812
2046 if (scrollbar) { 1813 if (m_scrollManager.canHandleGestureEvent(targetedEvent))
2047 bool shouldUpdateCapture = false; 1814 return WebInputEventResult::HandledSuppressed;
2048 if (scrollbar->gestureEvent(gestureEvent, &shouldUpdateCapture)) {
2049 if (shouldUpdateCapture)
2050 m_scrollbarHandlingScrollGesture = scrollbar;
2051 return WebInputEventResult::HandledSuppressed;
2052 }
2053 }
2054 1815
2055 if (eventTarget) { 1816 if (eventTarget) {
2056 GestureEvent* gestureDomEvent = GestureEvent::create(eventTarget->docume nt().domWindow(), gestureEvent); 1817 GestureEvent* gestureDomEvent = GestureEvent::create(eventTarget->docume nt().domWindow(), gestureEvent);
2057 if (gestureDomEvent) { 1818 if (gestureDomEvent) {
2058 DispatchEventResult gestureDomEventResult = eventTarget->dispatchEve nt(gestureDomEvent); 1819 DispatchEventResult gestureDomEventResult = eventTarget->dispatchEve nt(gestureDomEvent);
2059 if (gestureDomEventResult != DispatchEventResult::NotCanceled) { 1820 if (gestureDomEventResult != DispatchEventResult::NotCanceled) {
2060 ASSERT(gestureDomEventResult != DispatchEventResult::CanceledByE ventHandler); 1821 ASSERT(gestureDomEventResult != DispatchEventResult::CanceledByE ventHandler);
2061 return toWebInputEventResult(gestureDomEventResult); 1822 return toWebInputEventResult(gestureDomEventResult);
2062 } 1823 }
2063 } 1824 }
(...skipping 21 matching lines...) Expand all
2085 ASSERT_NOT_REACHED(); 1846 ASSERT_NOT_REACHED();
2086 } 1847 }
2087 1848
2088 return WebInputEventResult::NotHandled; 1849 return WebInputEventResult::NotHandled;
2089 } 1850 }
2090 1851
2091 WebInputEventResult EventHandler::handleGestureScrollEvent(const PlatformGesture Event& gestureEvent) 1852 WebInputEventResult EventHandler::handleGestureScrollEvent(const PlatformGesture Event& gestureEvent)
2092 { 1853 {
2093 TRACE_EVENT0("input", "EventHandler::handleGestureScrollEvent"); 1854 TRACE_EVENT0("input", "EventHandler::handleGestureScrollEvent");
2094 1855
2095 Node* eventTarget = nullptr; 1856 return m_scrollManager.handleGestureScrollEvent(gestureEvent);
2096 Scrollbar* scrollbar = nullptr;
2097 if (gestureEvent.type() != PlatformEvent::GestureScrollBegin) {
2098 scrollbar = m_scrollbarHandlingScrollGesture.get();
2099 eventTarget = m_scrollGestureHandlingNode.get();
2100 }
2101
2102 if (!eventTarget) {
2103 Document* document = m_frame->document();
2104 if (document->layoutViewItem().isNull())
2105 return WebInputEventResult::NotHandled;
2106
2107 FrameView* view = m_frame->view();
2108 LayoutPoint viewPoint = view->rootFrameToContents(gestureEvent.position( ));
2109 HitTestRequest request(HitTestRequest::ReadOnly);
2110 HitTestResult result(request, viewPoint);
2111 document->layoutViewItem().hitTest(result);
2112
2113 eventTarget = result.innerNode();
2114
2115 m_lastGestureScrollOverWidget = result.isOverWidget();
2116 m_scrollGestureHandlingNode = eventTarget;
2117 m_previousGestureScrolledNode = nullptr;
2118
2119 if (!scrollbar)
2120 scrollbar = result.scrollbar();
2121 }
2122
2123 if (scrollbar) {
2124 bool shouldUpdateCapture = false;
2125 if (scrollbar->gestureEvent(gestureEvent, &shouldUpdateCapture)) {
2126 if (shouldUpdateCapture)
2127 m_scrollbarHandlingScrollGesture = scrollbar;
2128 return WebInputEventResult::HandledSuppressed;
2129 }
2130 m_scrollbarHandlingScrollGesture = nullptr;
2131 }
2132
2133 if (eventTarget) {
2134 if (handleScrollGestureOnResizer(eventTarget, gestureEvent))
2135 return WebInputEventResult::HandledSuppressed;
2136
2137 GestureEvent* gestureDomEvent = GestureEvent::create(eventTarget->docume nt().domWindow(), gestureEvent);
2138 if (gestureDomEvent) {
2139 DispatchEventResult gestureDomEventResult = eventTarget->dispatchEve nt(gestureDomEvent);
2140 if (gestureDomEventResult != DispatchEventResult::NotCanceled) {
2141 ASSERT(gestureDomEventResult != DispatchEventResult::CanceledByE ventHandler);
2142 return toWebInputEventResult(gestureDomEventResult);
2143 }
2144 }
2145 }
2146
2147 switch (gestureEvent.type()) {
2148 case PlatformEvent::GestureScrollBegin:
2149 return handleGestureScrollBegin(gestureEvent);
2150 case PlatformEvent::GestureScrollUpdate:
2151 return handleGestureScrollUpdate(gestureEvent);
2152 case PlatformEvent::GestureScrollEnd:
2153 return handleGestureScrollEnd(gestureEvent);
2154 case PlatformEvent::GestureFlingStart:
2155 case PlatformEvent::GesturePinchBegin:
2156 case PlatformEvent::GesturePinchEnd:
2157 case PlatformEvent::GesturePinchUpdate:
2158 return WebInputEventResult::NotHandled;
2159 default:
2160 ASSERT_NOT_REACHED();
2161 return WebInputEventResult::NotHandled;
2162 }
2163 } 1857 }
2164 1858
2165 WebInputEventResult EventHandler::handleGestureTap(const GestureEventWithHitTest Results& targetedEvent) 1859 WebInputEventResult EventHandler::handleGestureTap(const GestureEventWithHitTest Results& targetedEvent)
2166 { 1860 {
2167 FrameView* frameView(m_frame->view()); 1861 FrameView* frameView(m_frame->view());
2168 const PlatformGestureEvent& gestureEvent = targetedEvent.event(); 1862 const PlatformGestureEvent& gestureEvent = targetedEvent.event();
2169 HitTestRequest::HitTestRequestType hitType = getHitTypeForGestureType(gestur eEvent.type()); 1863 HitTestRequest::HitTestRequestType hitType = getHitTypeForGestureType(gestur eEvent.type());
2170 uint64_t preDispatchDomTreeVersion = m_frame->document()->domTreeVersion(); 1864 uint64_t preDispatchDomTreeVersion = m_frame->document()->domTreeVersion();
2171 uint64_t preDispatchStyleVersion = m_frame->document()->styleVersion(); 1865 uint64_t preDispatchStyleVersion = m_frame->document()->styleVersion();
2172 1866
(...skipping 142 matching lines...) Expand 10 before | Expand all | Expand 10 after
2315 { 2009 {
2316 #if !OS(ANDROID) 2010 #if !OS(ANDROID)
2317 if (m_longTapShouldInvokeContextMenu) { 2011 if (m_longTapShouldInvokeContextMenu) {
2318 m_longTapShouldInvokeContextMenu = false; 2012 m_longTapShouldInvokeContextMenu = false;
2319 return sendContextMenuEventForGesture(targetedEvent); 2013 return sendContextMenuEventForGesture(targetedEvent);
2320 } 2014 }
2321 #endif 2015 #endif
2322 return WebInputEventResult::NotHandled; 2016 return WebInputEventResult::NotHandled;
2323 } 2017 }
2324 2018
2325 bool EventHandler::handleScrollGestureOnResizer(Node* eventTarget, const Platfor mGestureEvent& gestureEvent)
2326 {
2327 if (gestureEvent.type() == PlatformEvent::GestureScrollBegin) {
2328 PaintLayer* layer = eventTarget->layoutObject() ? eventTarget->layoutObj ect()->enclosingLayer() : nullptr;
2329 IntPoint p = m_frame->view()->rootFrameToContents(gestureEvent.position( ));
2330 if (layer && layer->getScrollableArea() && layer->getScrollableArea()->i sPointInResizeControl(p, ResizerForTouch)) {
2331 m_resizeScrollableArea = layer->getScrollableArea();
2332 m_resizeScrollableArea->setInResizeMode(true);
2333 m_offsetFromResizeCorner = LayoutSize(m_resizeScrollableArea->offset FromResizeCorner(p));
2334 return true;
2335 }
2336 } else if (gestureEvent.type() == PlatformEvent::GestureScrollUpdate) {
2337 if (m_resizeScrollableArea && m_resizeScrollableArea->inResizeMode()) {
2338 m_resizeScrollableArea->resize(gestureEvent, m_offsetFromResizeCorne r);
2339 return true;
2340 }
2341 } else if (gestureEvent.type() == PlatformEvent::GestureScrollEnd) {
2342 if (m_resizeScrollableArea && m_resizeScrollableArea->inResizeMode()) {
2343 m_resizeScrollableArea->setInResizeMode(false);
2344 m_resizeScrollableArea = nullptr;
2345 return false;
2346 }
2347 }
2348
2349 return false;
2350 }
2351
2352 WebInputEventResult EventHandler::passScrollGestureEventToWidget(const PlatformG estureEvent& gestureEvent, LayoutObject* layoutObject)
2353 {
2354 ASSERT(gestureEvent.isScrollEvent());
2355
2356 if (!m_lastGestureScrollOverWidget || !layoutObject || !layoutObject->isLayo utPart())
2357 return WebInputEventResult::NotHandled;
2358
2359 Widget* widget = toLayoutPart(layoutObject)->widget();
2360
2361 if (!widget || !widget->isFrameView())
2362 return WebInputEventResult::NotHandled;
2363
2364 return toFrameView(widget)->frame().eventHandler().handleGestureScrollEvent( gestureEvent);
2365 }
2366
2367 WebInputEventResult EventHandler::handleGestureScrollEnd(const PlatformGestureEv ent& gestureEvent) 2019 WebInputEventResult EventHandler::handleGestureScrollEnd(const PlatformGestureEv ent& gestureEvent)
2368 { 2020 {
2369 Node* node = m_scrollGestureHandlingNode; 2021 return m_scrollManager.handleGestureScrollEnd(gestureEvent);
2370
2371 if (node) {
2372 passScrollGestureEventToWidget(gestureEvent, node->layoutObject());
2373 if (RuntimeEnabledFeatures::scrollCustomizationEnabled()) {
2374 OwnPtr<ScrollStateData> scrollStateData = adoptPtr(new ScrollStateDa ta());
2375 scrollStateData->is_ending = true;
2376 scrollStateData->is_in_inertial_phase = gestureEvent.inertialPhase() == ScrollInertialPhaseMomentum;
2377 scrollStateData->from_user_input = true;
2378 scrollStateData->is_direct_manipulation = true;
2379 scrollStateData->delta_consumed_for_scroll_sequence = m_deltaConsume dForScrollSequence;
2380 ScrollState* scrollState = ScrollState::create(std::move(scrollState Data));
2381 customizedScroll(*node, *scrollState);
2382 }
2383 }
2384
2385 clearGestureScrollState();
2386 return WebInputEventResult::NotHandled;
2387 } 2022 }
2388 2023
2389 WebInputEventResult EventHandler::handleGestureScrollBegin(const PlatformGesture Event& gestureEvent) 2024 WebInputEventResult EventHandler::handleGestureScrollBegin(const PlatformGesture Event& gestureEvent)
2390 { 2025 {
2391 Document* document = m_frame->document(); 2026 return m_scrollManager.handleGestureScrollBegin(gestureEvent);
2392 if (document->layoutViewItem().isNull())
2393 return WebInputEventResult::NotHandled;
2394
2395 FrameView* view = m_frame->view();
2396 if (!view)
2397 return WebInputEventResult::NotHandled;
2398
2399 // If there's no layoutObject on the node, send the event to the nearest anc estor with a layoutObject.
2400 // Needed for <option> and <optgroup> elements so we can touch scroll <selec t>s
2401 while (m_scrollGestureHandlingNode && !m_scrollGestureHandlingNode->layoutOb ject())
2402 m_scrollGestureHandlingNode = m_scrollGestureHandlingNode->parentOrShado wHostNode();
2403
2404 if (!m_scrollGestureHandlingNode) {
2405 if (RuntimeEnabledFeatures::scrollCustomizationEnabled())
2406 m_scrollGestureHandlingNode = m_frame->document()->documentElement() ;
2407 else
2408 return WebInputEventResult::NotHandled;
2409 }
2410 ASSERT(m_scrollGestureHandlingNode);
2411
2412 passScrollGestureEventToWidget(gestureEvent, m_scrollGestureHandlingNode->la youtObject());
2413 if (RuntimeEnabledFeatures::scrollCustomizationEnabled()) {
2414 m_currentScrollChain.clear();
2415 OwnPtr<ScrollStateData> scrollStateData = adoptPtr(new ScrollStateData() );
2416 scrollStateData->position_x = gestureEvent.position().x();
2417 scrollStateData->position_y = gestureEvent.position().y();
2418 scrollStateData->is_beginning = true;
2419 scrollStateData->from_user_input = true;
2420 scrollStateData->delta_consumed_for_scroll_sequence = m_deltaConsumedFor ScrollSequence;
2421 ScrollState* scrollState = ScrollState::create(std::move(scrollStateData ));
2422 customizedScroll(*m_scrollGestureHandlingNode.get(), *scrollState);
2423 } else {
2424 if (m_frame->isMainFrame())
2425 m_frame->host()->topControls().scrollBegin();
2426 }
2427 return WebInputEventResult::HandledSystem;
2428 }
2429
2430 bool EventHandler::isRootScroller(const Node& node) const
2431 {
2432 // The root scroller is the one Element on the page designated to perform
2433 // "viewport actions" like top controls movement and overscroll glow.
2434 if (!frameHost() || !frameHost()->rootScroller())
2435 return false;
2436
2437 return frameHost()->rootScroller()->get() == &node;
2438 } 2027 }
2439 2028
2440 WebInputEventResult EventHandler::handleGestureScrollUpdate(const PlatformGestur eEvent& gestureEvent) 2029 WebInputEventResult EventHandler::handleGestureScrollUpdate(const PlatformGestur eEvent& gestureEvent)
2441 { 2030 {
2442 ASSERT(gestureEvent.type() == PlatformEvent::GestureScrollUpdate); 2031 return m_scrollManager.handleGestureScrollUpdate(gestureEvent);
2443
2444 // Negate the deltas since the gesture event stores finger movement and
2445 // scrolling occurs in the direction opposite the finger's movement
2446 // direction. e.g. Finger moving up has negative event delta but causes the
2447 // page to scroll down causing positive scroll delta.
2448 FloatSize delta(-gestureEvent.deltaX(), -gestureEvent.deltaY());
2449 FloatSize velocity(-gestureEvent.velocityX(), -gestureEvent.velocityY());
2450 if (delta.isZero())
2451 return WebInputEventResult::NotHandled;
2452
2453 ScrollGranularity granularity = gestureEvent.deltaUnits();
2454 Node* node = m_scrollGestureHandlingNode.get();
2455
2456 // Scroll customization is only available for touch.
2457 bool handleScrollCustomization = RuntimeEnabledFeatures::scrollCustomization Enabled() && gestureEvent.source() == PlatformGestureSourceTouchscreen;
2458 if (node) {
2459 LayoutObject* layoutObject = node->layoutObject();
2460 if (!layoutObject)
2461 return WebInputEventResult::NotHandled;
2462
2463 // Try to send the event to the correct view.
2464 WebInputEventResult result = passScrollGestureEventToWidget(gestureEvent , layoutObject);
2465 if (result != WebInputEventResult::NotHandled) {
2466 if (gestureEvent.preventPropagation()
2467 && !RuntimeEnabledFeatures::scrollCustomizationEnabled()) {
2468 // This is an optimization which doesn't apply with
2469 // scroll customization enabled.
2470 m_previousGestureScrolledNode = m_scrollGestureHandlingNode;
2471 }
2472 // FIXME: we should allow simultaneous scrolling of nested
2473 // iframes along perpendicular axes. See crbug.com/466991.
2474 m_deltaConsumedForScrollSequence = true;
2475 return result;
2476 }
2477
2478 if (handleScrollCustomization) {
2479 OwnPtr<ScrollStateData> scrollStateData = adoptPtr(new ScrollStateDa ta());
2480 scrollStateData->delta_x = delta.width();
2481 scrollStateData->delta_y = delta.height();
2482 scrollStateData->delta_granularity = ScrollByPrecisePixel;
2483 scrollStateData->velocity_x = velocity.width();
2484 scrollStateData->velocity_y = velocity.height();
2485 scrollStateData->should_propagate = !gestureEvent.preventPropagation ();
2486 scrollStateData->is_in_inertial_phase = gestureEvent.inertialPhase() == ScrollInertialPhaseMomentum;
2487 scrollStateData->from_user_input = true;
2488 scrollStateData->delta_consumed_for_scroll_sequence = m_deltaConsume dForScrollSequence;
2489 ScrollState* scrollState = ScrollState::create(std::move(scrollState Data));
2490 if (m_previousGestureScrolledNode) {
2491 // The ScrollState needs to know what the current
2492 // native scrolling element is, so that for an
2493 // inertial scroll that shouldn't propagate, only the
2494 // currently scrolling element responds.
2495 ASSERT(m_previousGestureScrolledNode->isElementNode());
2496 scrollState->setCurrentNativeScrollingElement(toElement(m_previo usGestureScrolledNode.get()));
2497 }
2498 customizedScroll(*node, *scrollState);
2499 m_previousGestureScrolledNode = scrollState->currentNativeScrollingE lement();
2500 m_deltaConsumedForScrollSequence = scrollState->deltaConsumedForScro llSequence();
2501 if (scrollState->deltaX() != delta.width()
2502 || scrollState->deltaY() != delta.height()) {
2503 setFrameWasScrolledByUser();
2504 return WebInputEventResult::HandledSystem;
2505 }
2506 } else {
2507 Node* stopNode = nullptr;
2508 if (gestureEvent.preventPropagation())
2509 stopNode = m_previousGestureScrolledNode.get();
2510
2511 bool consumed = false;
2512 ScrollResult result = physicalScroll(
2513 granularity,
2514 delta,
2515 FloatPoint(gestureEvent.position()),
2516 velocity,
2517 node,
2518 &stopNode,
2519 &consumed);
2520
2521 if (gestureEvent.preventPropagation())
2522 m_previousGestureScrolledNode = stopNode;
2523
2524 if ((!stopNode || !isRootScroller(*stopNode)) && frameHost()) {
2525 frameHost()->overscrollController().resetAccumulated(
2526 result.didScrollX, result.didScrollY);
2527 }
2528
2529 if (consumed)
2530 return WebInputEventResult::HandledSystem;
2531 }
2532 }
2533
2534 return WebInputEventResult::NotHandled;
2535 }
2536
2537 void EventHandler::clearGestureScrollState()
2538 {
2539 m_scrollGestureHandlingNode = nullptr;
2540 m_previousGestureScrolledNode = nullptr;
2541 m_deltaConsumedForScrollSequence = false;
2542 m_currentScrollChain.clear();
2543
2544 if (FrameHost* host = frameHost()) {
2545 bool resetX = true;
2546 bool resetY = true;
2547 host->overscrollController().resetAccumulated(resetX, resetY);
2548 }
2549 } 2032 }
2550 2033
2551 bool EventHandler::isScrollbarHandlingGestures() const 2034 bool EventHandler::isScrollbarHandlingGestures() const
2552 { 2035 {
2553 return m_scrollbarHandlingScrollGesture.get(); 2036 return m_scrollManager.isScrollbarHandlingGestures();
2554 } 2037 }
2555 2038
2556 bool EventHandler::shouldApplyTouchAdjustment(const PlatformGestureEvent& event) const 2039 bool EventHandler::shouldApplyTouchAdjustment(const PlatformGestureEvent& event) const
2557 { 2040 {
2558 if (m_frame->settings() && !m_frame->settings()->touchAdjustmentEnabled()) 2041 if (m_frame->settings() && !m_frame->settings()->touchAdjustmentEnabled())
2559 return false; 2042 return false;
2560 return !event.area().isEmpty(); 2043 return !event.area().isEmpty();
2561 } 2044 }
2562 2045
2563 bool EventHandler::bestClickableNodeForHitTestResult(const HitTestResult& result , IntPoint& targetPoint, Node*& targetNode) 2046 bool EventHandler::bestClickableNodeForHitTestResult(const HitTestResult& result , IntPoint& targetPoint, Node*& targetNode)
(...skipping 518 matching lines...) Expand 10 before | Expand all | Expand 10 after
3082 return m_frame->page()->isCursorVisible(); 2565 return m_frame->page()->isCursorVisible();
3083 } 2566 }
3084 2567
3085 void EventHandler::setResizingFrameSet(HTMLFrameSetElement* frameSet) 2568 void EventHandler::setResizingFrameSet(HTMLFrameSetElement* frameSet)
3086 { 2569 {
3087 m_frameSetBeingResized = frameSet; 2570 m_frameSetBeingResized = frameSet;
3088 } 2571 }
3089 2572
3090 void EventHandler::resizeScrollableAreaDestroyed() 2573 void EventHandler::resizeScrollableAreaDestroyed()
3091 { 2574 {
3092 ASSERT(m_resizeScrollableArea); 2575 m_scrollManager.clearResizeScrollableArea(true);
3093 m_resizeScrollableArea = nullptr;
3094 } 2576 }
3095 2577
3096 void EventHandler::hoverTimerFired(Timer<EventHandler>*) 2578 void EventHandler::hoverTimerFired(Timer<EventHandler>*)
3097 { 2579 {
3098 TRACE_EVENT0("input", "EventHandler::hoverTimerFired"); 2580 TRACE_EVENT0("input", "EventHandler::hoverTimerFired");
3099 m_hoverTimer.stop(); 2581 m_hoverTimer.stop();
3100 2582
3101 ASSERT(m_frame); 2583 ASSERT(m_frame);
3102 ASSERT(m_frame->document()); 2584 ASSERT(m_frame->document());
3103 2585
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
3153 } 2635 }
3154 2636
3155 WebInputEventResult EventHandler::keyEvent(const PlatformKeyboardEvent& initialK eyEvent) 2637 WebInputEventResult EventHandler::keyEvent(const PlatformKeyboardEvent& initialK eyEvent)
3156 { 2638 {
3157 m_frame->chromeClient().clearToolTip(); 2639 m_frame->chromeClient().clearToolTip();
3158 2640
3159 if (initialKeyEvent.windowsVirtualKeyCode() == VK_CAPITAL) 2641 if (initialKeyEvent.windowsVirtualKeyCode() == VK_CAPITAL)
3160 capsLockStateMayHaveChanged(); 2642 capsLockStateMayHaveChanged();
3161 2643
3162 #if OS(WIN) 2644 #if OS(WIN)
3163 if (panScrollInProgress()) { 2645 if (m_scrollManager.panScrollInProgress()) {
3164 // If a key is pressed while the panScroll is in progress then we want t o stop 2646 // If a key is pressed while the panScroll is in progress then we want t o stop
3165 if (initialKeyEvent.type() == PlatformEvent::KeyDown || initialKeyEvent. type() == PlatformEvent::RawKeyDown) 2647 if (initialKeyEvent.type() == PlatformEvent::KeyDown || initialKeyEvent. type() == PlatformEvent::RawKeyDown)
3166 stopAutoscroll(); 2648 m_scrollManager.stopAutoscroll();
3167 2649
3168 // If we were in panscroll mode, we swallow the key event 2650 // If we were in panscroll mode, we swallow the key event
3169 return WebInputEventResult::HandledSuppressed; 2651 return WebInputEventResult::HandledSuppressed;
3170 } 2652 }
3171 #endif 2653 #endif
3172 2654
3173 // Check for cases where we are too early for events -- possible unmatched k ey up 2655 // Check for cases where we are too early for events -- possible unmatched k ey up
3174 // from pressing return in the location bar. 2656 // from pressing return in the location bar.
3175 Node* node = eventTargetNodeForDocument(m_frame->document()); 2657 Node* node = eventTargetNodeForDocument(m_frame->document());
3176 if (!node) 2658 if (!node)
(...skipping 303 matching lines...) Expand 10 before | Expand all | Expand 10 after
3480 event->setDefaultHandled(); 2962 event->setDefaultHandled();
3481 } 2963 }
3482 2964
3483 void EventHandler::defaultSpaceEventHandler(KeyboardEvent* event) 2965 void EventHandler::defaultSpaceEventHandler(KeyboardEvent* event)
3484 { 2966 {
3485 ASSERT(event->type() == EventTypeNames::keypress); 2967 ASSERT(event->type() == EventTypeNames::keypress);
3486 2968
3487 if (event->ctrlKey() || event->metaKey() || event->altKey()) 2969 if (event->ctrlKey() || event->metaKey() || event->altKey())
3488 return; 2970 return;
3489 2971
3490 ScrollDirection direction = event->shiftKey() ? ScrollBlockDirectionBackward : ScrollBlockDirectionForward; 2972 ScrollDirection direction = event->shiftKey() ? ScrollBlockDirectionBackward : ScrollBlockDirectionForward;
dtapuska 2016/05/27 14:12:23 I wonder if defaultSpaceEventHandler and defaultWh
Navid Zolghadr 2016/05/30 20:15:46 I wanted to move DefaultSpaceEventHandler to anoth
bokan 2016/05/31 19:39:13 This plan sgtm.
3491 2973
3492 // FIXME: enable scroll customization in this case. See crbug.com/410974. 2974 // FIXME: enable scroll customization in this case. See crbug.com/410974.
3493 if (logicalScroll(direction, ScrollByPage)) { 2975 if (m_scrollManager.logicalScroll(direction, ScrollByPage, nullptr, m_mouseP ressNode)) {
3494 event->setDefaultHandled(); 2976 event->setDefaultHandled();
3495 return; 2977 return;
3496 } 2978 }
3497 } 2979 }
3498 2980
3499 void EventHandler::defaultBackspaceEventHandler(KeyboardEvent* event) 2981 void EventHandler::defaultBackspaceEventHandler(KeyboardEvent* event)
3500 { 2982 {
3501 ASSERT(event->type() == EventTypeNames::keydown); 2983 ASSERT(event->type() == EventTypeNames::keydown);
3502 2984
3503 if (!RuntimeEnabledFeatures::backspaceDefaultHandlerEnabled()) 2985 if (!RuntimeEnabledFeatures::backspaceDefaultHandlerEnabled())
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after
3579 void EventHandler::capsLockStateMayHaveChanged() 3061 void EventHandler::capsLockStateMayHaveChanged()
3580 { 3062 {
3581 if (Element* element = m_frame->document()->focusedElement()) { 3063 if (Element* element = m_frame->document()->focusedElement()) {
3582 if (LayoutObject* r = element->layoutObject()) { 3064 if (LayoutObject* r = element->layoutObject()) {
3583 if (r->isTextField()) 3065 if (r->isTextField())
3584 toLayoutTextControlSingleLine(r)->capsLockStateMayHaveChanged(); 3066 toLayoutTextControlSingleLine(r)->capsLockStateMayHaveChanged();
3585 } 3067 }
3586 } 3068 }
3587 } 3069 }
3588 3070
3589 void EventHandler::setFrameWasScrolledByUser()
3590 {
3591 if (DocumentLoader* documentLoader = m_frame->loader().documentLoader())
3592 documentLoader->initialScrollState().wasScrolledByUser = true;
3593 }
3594
3595 bool EventHandler::passMousePressEventToScrollbar(MouseEventWithHitTestResults& mev) 3071 bool EventHandler::passMousePressEventToScrollbar(MouseEventWithHitTestResults& mev)
3596 { 3072 {
3597 Scrollbar* scrollbar = mev.scrollbar(); 3073 Scrollbar* scrollbar = mev.scrollbar();
3598 updateLastScrollbarUnderMouse(scrollbar, true); 3074 updateLastScrollbarUnderMouse(scrollbar, true);
3599 3075
3600 if (!scrollbar || !scrollbar->enabled()) 3076 if (!scrollbar || !scrollbar->enabled())
3601 return false; 3077 return false;
3602 setFrameWasScrolledByUser(); 3078 m_scrollManager.setFrameWasScrolledByUser();
3603 scrollbar->mouseDown(mev.event()); 3079 scrollbar->mouseDown(mev.event());
3604 return true; 3080 return true;
3605 } 3081 }
3606 3082
3607 // If scrollbar (under mouse) is different from last, send a mouse exited. Set 3083 // If scrollbar (under mouse) is different from last, send a mouse exited. Set
3608 // last to scrollbar if setLast is true; else set last to 0. 3084 // last to scrollbar if setLast is true; else set last to 0.
3609 void EventHandler::updateLastScrollbarUnderMouse(Scrollbar* scrollbar, bool setL ast) 3085 void EventHandler::updateLastScrollbarUnderMouse(Scrollbar* scrollbar, bool setL ast)
3610 { 3086 {
3611 if (m_lastScrollbarUnderMouse != scrollbar) { 3087 if (m_lastScrollbarUnderMouse != scrollbar) {
3612 // Send mouse exited to the old scrollbar. 3088 // Send mouse exited to the old scrollbar.
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after
3708 3184
3709 FrameHost* EventHandler::frameHost() const 3185 FrameHost* EventHandler::frameHost() const
3710 { 3186 {
3711 if (!m_frame->page()) 3187 if (!m_frame->page())
3712 return nullptr; 3188 return nullptr;
3713 3189
3714 return &m_frame->page()->frameHost(); 3190 return &m_frame->page()->frameHost();
3715 } 3191 }
3716 3192
3717 } // namespace blink 3193 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698