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

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

Issue 2350433002: Extract more of the mouse logic from EventHandler (Closed)
Patch Set: Remove redundant condition Created 4 years, 2 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 12 matching lines...) Expand all
23 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 23 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 24 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
25 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 25 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 */ 26 */
27 27
28 #include "core/input/EventHandler.h" 28 #include "core/input/EventHandler.h"
29 29
30 #include "bindings/core/v8/ExceptionStatePlaceholder.h" 30 #include "bindings/core/v8/ExceptionStatePlaceholder.h"
31 #include "core/HTMLNames.h" 31 #include "core/HTMLNames.h"
32 #include "core/InputTypeNames.h" 32 #include "core/InputTypeNames.h"
33 #include "core/clipboard/DataObject.h"
34 #include "core/clipboard/DataTransfer.h" 33 #include "core/clipboard/DataTransfer.h"
35 #include "core/dom/DOMNodeIds.h" 34 #include "core/dom/DOMNodeIds.h"
36 #include "core/dom/Document.h" 35 #include "core/dom/Document.h"
37 #include "core/dom/TouchList.h" 36 #include "core/dom/TouchList.h"
38 #include "core/dom/shadow/FlatTreeTraversal.h" 37 #include "core/dom/shadow/FlatTreeTraversal.h"
39 #include "core/dom/shadow/ShadowRoot.h" 38 #include "core/dom/shadow/ShadowRoot.h"
40 #include "core/editing/EditingUtilities.h" 39 #include "core/editing/EditingUtilities.h"
41 #include "core/editing/Editor.h" 40 #include "core/editing/Editor.h"
42 #include "core/editing/FrameSelection.h" 41 #include "core/editing/FrameSelection.h"
43 #include "core/editing/SelectionController.h" 42 #include "core/editing/SelectionController.h"
44 #include "core/events/DragEvent.h"
45 #include "core/events/EventPath.h" 43 #include "core/events/EventPath.h"
46 #include "core/events/GestureEvent.h" 44 #include "core/events/GestureEvent.h"
47 #include "core/events/KeyboardEvent.h" 45 #include "core/events/KeyboardEvent.h"
48 #include "core/events/MouseEvent.h" 46 #include "core/events/MouseEvent.h"
49 #include "core/events/PointerEvent.h" 47 #include "core/events/PointerEvent.h"
50 #include "core/events/TextEvent.h" 48 #include "core/events/TextEvent.h"
51 #include "core/events/TouchEvent.h" 49 #include "core/events/TouchEvent.h"
52 #include "core/events/WheelEvent.h" 50 #include "core/events/WheelEvent.h"
53 #include "core/fetch/ImageResource.h" 51 #include "core/fetch/ImageResource.h"
54 #include "core/frame/Deprecation.h" 52 #include "core/frame/Deprecation.h"
(...skipping 15 matching lines...) Expand all
70 #include "core/layout/HitTestResult.h" 68 #include "core/layout/HitTestResult.h"
71 #include "core/layout/LayoutPart.h" 69 #include "core/layout/LayoutPart.h"
72 #include "core/layout/LayoutTextControlSingleLine.h" 70 #include "core/layout/LayoutTextControlSingleLine.h"
73 #include "core/layout/LayoutView.h" 71 #include "core/layout/LayoutView.h"
74 #include "core/layout/api/LayoutViewItem.h" 72 #include "core/layout/api/LayoutViewItem.h"
75 #include "core/loader/DocumentLoader.h" 73 #include "core/loader/DocumentLoader.h"
76 #include "core/loader/FrameLoader.h" 74 #include "core/loader/FrameLoader.h"
77 #include "core/loader/FrameLoaderClient.h" 75 #include "core/loader/FrameLoaderClient.h"
78 #include "core/page/AutoscrollController.h" 76 #include "core/page/AutoscrollController.h"
79 #include "core/page/ChromeClient.h" 77 #include "core/page/ChromeClient.h"
80 #include "core/page/DragController.h"
81 #include "core/page/DragState.h" 78 #include "core/page/DragState.h"
82 #include "core/page/FocusController.h" 79 #include "core/page/FocusController.h"
83 #include "core/page/FrameTree.h" 80 #include "core/page/FrameTree.h"
84 #include "core/page/Page.h" 81 #include "core/page/Page.h"
85 #include "core/page/TouchAdjustment.h" 82 #include "core/page/TouchAdjustment.h"
86 #include "core/page/scrolling/ScrollState.h" 83 #include "core/page/scrolling/ScrollState.h"
87 #include "core/paint/PaintLayer.h"
88 #include "core/style/ComputedStyle.h" 84 #include "core/style/ComputedStyle.h"
89 #include "core/style/CursorData.h" 85 #include "core/style/CursorData.h"
90 #include "core/svg/SVGDocumentExtensions.h" 86 #include "core/svg/SVGDocumentExtensions.h"
91 #include "platform/PlatformGestureEvent.h" 87 #include "platform/PlatformGestureEvent.h"
92 #include "platform/PlatformTouchEvent.h" 88 #include "platform/PlatformTouchEvent.h"
93 #include "platform/PlatformWheelEvent.h" 89 #include "platform/PlatformWheelEvent.h"
94 #include "platform/RuntimeEnabledFeatures.h" 90 #include "platform/RuntimeEnabledFeatures.h"
95 #include "platform/TraceEvent.h" 91 #include "platform/TraceEvent.h"
96 #include "platform/WindowsKeyboardCodes.h" 92 #include "platform/WindowsKeyboardCodes.h"
97 #include "platform/geometry/FloatPoint.h" 93 #include "platform/geometry/FloatPoint.h"
(...skipping 21 matching lines...) Expand all
119 Node* targetNode = mev.innerNode(); 115 Node* targetNode = mev.innerNode();
120 if (!targetNode || !targetNode->parentNode()) 116 if (!targetNode || !targetNode->parentNode())
121 return true; 117 return true;
122 return targetNode->isShadowRoot() && isHTMLInputElement(toShadowRoot(targetN ode)->host()); 118 return targetNode->isShadowRoot() && isHTMLInputElement(toShadowRoot(targetN ode)->host());
123 } 119 }
124 120
125 } // namespace 121 } // namespace
126 122
127 using namespace HTMLNames; 123 using namespace HTMLNames;
128 124
129 // The link drag hysteresis is much larger than the others because there
130 // needs to be enough space to cancel the link press without starting a link dra g,
131 // and because dragging links is rare.
132 static const int LinkDragHysteresis = 40;
133 static const int ImageDragHysteresis = 5;
134 static const int TextDragHysteresis = 3;
135 static const int GeneralDragHysteresis = 3;
136
137 // The amount of time to wait before sending a fake mouse event triggered
138 // during a scroll.
139 static const double fakeMouseMoveInterval = 0.1;
140
141 // The amount of time to wait for a cursor update on style and layout changes 125 // The amount of time to wait for a cursor update on style and layout changes
142 // Set to 50Hz, no need to be faster than common screen refresh rate 126 // Set to 50Hz, no need to be faster than common screen refresh rate
143 static const double cursorUpdateInterval = 0.02; 127 static const double cursorUpdateInterval = 0.02;
144 128
145 static const int maximumCursorSize = 128; 129 static const int maximumCursorSize = 128;
146 130
147 // It's pretty unlikely that a scale of less than one would ever be used. But al l we really 131 // It's pretty unlikely that a scale of less than one would ever be used. But al l we really
148 // need to ensure here is that the scale isn't so small that integer overflow ca n occur when 132 // need to ensure here is that the scale isn't so small that integer overflow ca n occur when
149 // dividing cursor sizes (limited above) by the scale. 133 // dividing cursor sizes (limited above) by the scale.
150 static const double minimumCursorScale = 0.001; 134 static const double minimumCursorScale = 0.001;
151 135
152 // The minimum amount of time an element stays active after a ShowPress 136 // The minimum amount of time an element stays active after a ShowPress
153 // This is roughly 9 frames, which should be long enough to be noticeable. 137 // This is roughly 9 frames, which should be long enough to be noticeable.
154 static const double minimumActiveInterval = 0.15; 138 static const double minimumActiveInterval = 0.15;
155 139
156 #if OS(MACOSX)
157 static const double TextDragDelay = 0.15;
158 #else
159 static const double TextDragDelay = 0.0;
160 #endif
161
162 enum NoCursorChangeType { NoCursorChange }; 140 enum NoCursorChangeType { NoCursorChange };
163 141
164 enum class DragInitiator { Mouse, Touch };
165
166 class OptionalCursor { 142 class OptionalCursor {
167 public: 143 public:
168 OptionalCursor(NoCursorChangeType) : m_isCursorChange(false) { } 144 OptionalCursor(NoCursorChangeType) : m_isCursorChange(false) { }
169 OptionalCursor(const Cursor& cursor) : m_isCursorChange(true), m_cursor(curs or) { } 145 OptionalCursor(const Cursor& cursor) : m_isCursorChange(true), m_cursor(curs or) { }
170 146
171 bool isCursorChange() const { return m_isCursorChange; } 147 bool isCursorChange() const { return m_isCursorChange; }
172 const Cursor& cursor() const { ASSERT(m_isCursorChange); return m_cursor; } 148 const Cursor& cursor() const { ASSERT(m_isCursorChange); return m_cursor; }
173 149
174 private: 150 private:
175 bool m_isCursorChange; 151 bool m_isCursorChange;
176 Cursor m_cursor; 152 Cursor m_cursor;
177 }; 153 };
178 154
179 EventHandler::EventHandler(LocalFrame* frame) 155 EventHandler::EventHandler(LocalFrame* frame)
180 : m_frame(frame) 156 : m_frame(frame)
181 , m_mousePressed(false)
182 , m_capturesDragging(false)
183 , m_mouseDownMayStartDrag(false)
184 , m_selectionController(SelectionController::create(*frame)) 157 , m_selectionController(SelectionController::create(*frame))
185 , m_hoverTimer(this, &EventHandler::hoverTimerFired) 158 , m_hoverTimer(this, &EventHandler::hoverTimerFired)
186 , m_cursorUpdateTimer(this, &EventHandler::cursorUpdateTimerFired) 159 , m_cursorUpdateTimer(this, &EventHandler::cursorUpdateTimerFired)
187 , m_mouseDownMayStartAutoscroll(false)
188 , m_fakeMouseMoveEventTimer(this, &EventHandler::fakeMouseMoveEventTimerFire d)
189 , m_svgPan(false)
190 , m_eventHandlerWillResetCapturingMouseEventsNode(0) 160 , m_eventHandlerWillResetCapturingMouseEventsNode(0)
191 , m_clickCount(0)
192 , m_shouldOnlyFireDragOverEvent(false) 161 , m_shouldOnlyFireDragOverEvent(false)
193 , m_mousePositionIsUnknown(true)
194 , m_mouseDownTimestamp(0)
195 , m_scrollManager(new ScrollManager(frame)) 162 , m_scrollManager(new ScrollManager(frame))
196 , m_mouseEventManager(new MouseEventManager(frame)) 163 , m_mouseEventManager(new MouseEventManager(frame, m_scrollManager))
197 , m_keyboardEventManager(new KeyboardEventManager(frame, m_scrollManager)) 164 , m_keyboardEventManager(new KeyboardEventManager(frame, m_scrollManager))
198 , m_pointerEventManager(new PointerEventManager(frame, m_mouseEventManager)) 165 , m_pointerEventManager(new PointerEventManager(frame, m_mouseEventManager))
199 , m_gestureManager(new GestureManager(frame, m_scrollManager, m_pointerEvent Manager, m_selectionController)) 166 , m_gestureManager(new GestureManager(frame, m_scrollManager, m_mouseEventMa nager, m_pointerEventManager, m_selectionController))
200 , m_activeIntervalTimer(this, &EventHandler::activeIntervalTimerFired) 167 , m_activeIntervalTimer(this, &EventHandler::activeIntervalTimerFired)
201 { 168 {
202 } 169 }
203 170
204 EventHandler::~EventHandler()
205 {
206 ASSERT(!m_fakeMouseMoveEventTimer.isActive());
207 }
208
209 DEFINE_TRACE(EventHandler) 171 DEFINE_TRACE(EventHandler)
210 { 172 {
211 visitor->trace(m_frame); 173 visitor->trace(m_frame);
212 visitor->trace(m_mousePressNode);
213 visitor->trace(m_selectionController); 174 visitor->trace(m_selectionController);
214 visitor->trace(m_capturingMouseEventsNode); 175 visitor->trace(m_capturingMouseEventsNode);
215 visitor->trace(m_nodeUnderMouse);
216 visitor->trace(m_lastMouseMoveEventSubframe); 176 visitor->trace(m_lastMouseMoveEventSubframe);
217 visitor->trace(m_lastScrollbarUnderMouse); 177 visitor->trace(m_lastScrollbarUnderMouse);
218 visitor->trace(m_clickNode);
219 visitor->trace(m_dragTarget); 178 visitor->trace(m_dragTarget);
220 visitor->trace(m_frameSetBeingResized); 179 visitor->trace(m_frameSetBeingResized);
221 visitor->trace(m_scrollManager); 180 visitor->trace(m_scrollManager);
222 visitor->trace(m_mouseEventManager); 181 visitor->trace(m_mouseEventManager);
223 visitor->trace(m_keyboardEventManager); 182 visitor->trace(m_keyboardEventManager);
224 visitor->trace(m_pointerEventManager); 183 visitor->trace(m_pointerEventManager);
225 visitor->trace(m_gestureManager); 184 visitor->trace(m_gestureManager);
226 visitor->trace(m_lastDeferredTapElement); 185 visitor->trace(m_lastDeferredTapElement);
227 } 186 }
228 187
229 DragState& EventHandler::dragState()
230 {
231 DEFINE_STATIC_LOCAL(DragState, state, (new DragState));
232 return state;
233 }
234
235 void EventHandler::clear() 188 void EventHandler::clear()
236 { 189 {
237 m_hoverTimer.stop(); 190 m_hoverTimer.stop();
238 m_cursorUpdateTimer.stop(); 191 m_cursorUpdateTimer.stop();
239 m_fakeMouseMoveEventTimer.stop();
240 m_activeIntervalTimer.stop(); 192 m_activeIntervalTimer.stop();
241 m_nodeUnderMouse = nullptr;
242 m_lastMouseMoveEventSubframe = nullptr; 193 m_lastMouseMoveEventSubframe = nullptr;
243 m_lastScrollbarUnderMouse = nullptr; 194 m_lastScrollbarUnderMouse = nullptr;
244 m_clickCount = 0;
245 m_clickNode = nullptr;
246 m_frameSetBeingResized = nullptr; 195 m_frameSetBeingResized = nullptr;
247 m_dragTarget = nullptr; 196 m_dragTarget = nullptr;
248 m_shouldOnlyFireDragOverEvent = false; 197 m_shouldOnlyFireDragOverEvent = false;
249 m_mousePositionIsUnknown = true;
250 m_lastKnownMousePosition = IntPoint();
251 m_lastKnownMouseGlobalPosition = IntPoint();
252 m_lastMouseDownUserGestureToken.clear(); 198 m_lastMouseDownUserGestureToken.clear();
253 m_mousePressNode = nullptr;
254 m_mousePressed = false;
255 m_capturesDragging = false;
256 m_capturingMouseEventsNode = nullptr; 199 m_capturingMouseEventsNode = nullptr;
257 m_pointerEventManager->clear(); 200 m_pointerEventManager->clear();
258 m_scrollManager->clear(); 201 m_scrollManager->clear();
259 m_gestureManager->clear(); 202 m_gestureManager->clear();
260 m_mouseEventManager->clear(); 203 m_mouseEventManager->clear();
261 m_mouseDownMayStartDrag = false;
262 m_lastDeferredTapElement = nullptr; 204 m_lastDeferredTapElement = nullptr;
263 m_eventHandlerWillResetCapturingMouseEventsNode = false; 205 m_eventHandlerWillResetCapturingMouseEventsNode = false;
264 m_mouseDownMayStartAutoscroll = false;
265 m_svgPan = false;
266 m_mouseDownPos = IntPoint();
267 m_mouseDownTimestamp = 0;
268 m_dragStartPos = LayoutPoint();
269 m_mouseDown = PlatformMouseEvent();
270 } 206 }
271 207
272 void EventHandler::nodeWillBeRemoved(Node& nodeToBeRemoved) 208 void EventHandler::nodeWillBeRemoved(Node& nodeToBeRemoved)
273 { 209 {
274 if (nodeToBeRemoved.isShadowIncludingInclusiveAncestorOf(m_clickNode.get())) { 210 m_mouseEventManager->nodeWillBeRemoved(nodeToBeRemoved);
275 // We don't dispatch click events if the mousedown node is removed
276 // before a mouseup event. It is compatible with IE and Firefox.
277 m_clickNode = nullptr;
278 }
279 }
280
281 WebInputEventResult EventHandler::handleMousePressEvent(const MouseEventWithHitT estResults& event)
282 {
283 TRACE_EVENT0("blink", "EventHandler::handleMousePressEvent");
284
285 // Reset drag state.
286 dragState().m_dragSrc = nullptr;
287
288 cancelFakeMouseMoveEvent();
289
290 m_frame->document()->updateStyleAndLayoutIgnorePendingStylesheets();
291
292 if (FrameView* frameView = m_frame->view()) {
293 if (frameView->isPointInScrollbarCorner(event.event().position()))
294 return WebInputEventResult::NotHandled;
295 }
296
297 bool singleClick = event.event().clickCount() <= 1;
298
299 m_mouseDownMayStartDrag = singleClick && !isLinkSelection(event) && !isExten dingSelection(event);
300
301 selectionController().handleMousePressEvent(event);
302
303 m_mouseDown = event.event();
304
305 if (m_frame->document()->isSVGDocument() && m_frame->document()->accessSVGEx tensions().zoomAndPanEnabled()) {
306 if (event.event().shiftKey() && singleClick) {
307 m_svgPan = true;
308 m_frame->document()->accessSVGExtensions().startPan(m_frame->view()- >rootFrameToContents(event.event().position()));
309 return WebInputEventResult::HandledSystem;
310 }
311 }
312
313 // We don't do this at the start of mouse down handling,
314 // because we don't want to do it until we know we didn't hit a widget.
315 if (singleClick)
316 focusDocumentView();
317
318 Node* innerNode = event.innerNode();
319
320 m_mousePressNode = innerNode;
321 m_frame->document()->setSequentialFocusNavigationStartingPoint(innerNode);
322 m_dragStartPos = event.event().position();
323
324 bool swallowEvent = false;
325 m_mousePressed = true;
326
327 if (event.event().clickCount() == 2)
328 swallowEvent = selectionController().handleMousePressEventDoubleClick(ev ent);
329 else if (event.event().clickCount() >= 3)
330 swallowEvent = selectionController().handleMousePressEventTripleClick(ev ent);
331 else
332 swallowEvent = selectionController().handleMousePressEventSingleClick(ev ent);
333
334 m_mouseDownMayStartAutoscroll = selectionController().mouseDownMayStartSelec t()
335 || (m_mousePressNode && m_mousePressNode->layoutBox() && m_mousePressNod e->layoutBox()->canBeProgramaticallyScrolled());
336
337 return swallowEvent ? WebInputEventResult::HandledSystem : WebInputEventResu lt::NotHandled;
338 }
339
340 WebInputEventResult EventHandler::handleMouseDraggedEvent(const MouseEventWithHi tTestResults& event)
341 {
342 TRACE_EVENT0("blink", "EventHandler::handleMouseDraggedEvent");
343
344 // While resetting m_mousePressed here may seem out of place, it turns out
345 // to be needed to handle some bugs^Wfeatures in Blink mouse event handling:
346 // 1. Certain elements, such as <embed>, capture mouse events. They do not
347 // bubble back up. One way for a <embed> to start capturing mouse events
348 // is on a mouse press. The problem is the <embed> node only starts
349 // capturing mouse events *after* m_mousePressed for the containing frame
350 // has already been set to true. As a result, the frame's EventHandler
351 // never sees the mouse release event, which is supposed to reset
352 // m_mousePressed... so m_mousePressed ends up remaining true until the
353 // event handler finally gets another mouse released event. Oops.
354 // 2. Dragging doesn't start until after a mouse press event, but a drag
355 // that ends as a result of a mouse release does not send a mouse release
356 // event. As a result, m_mousePressed also ends up remaining true until
357 // the next mouse release event seen by the EventHandler.
358 if (event.event().pointerProperties().button != WebPointerProperties::Button ::Left)
359 m_mousePressed = false;
360
361 if (!m_mousePressed)
362 return WebInputEventResult::NotHandled;
363
364 if (handleDrag(event, DragInitiator::Mouse))
365 return WebInputEventResult::HandledSystem;
366
367 Node* targetNode = event.innerNode();
368 if (!targetNode)
369 return WebInputEventResult::NotHandled;
370
371 LayoutObject* layoutObject = targetNode->layoutObject();
372 if (!layoutObject) {
373 Node* parent = FlatTreeTraversal::parent(*targetNode);
374 if (!parent)
375 return WebInputEventResult::NotHandled;
376
377 layoutObject = parent->layoutObject();
378 if (!layoutObject || !layoutObject->isListBox())
379 return WebInputEventResult::NotHandled;
380 }
381
382 m_mouseDownMayStartDrag = false;
383
384 if (m_mouseDownMayStartAutoscroll && !m_scrollManager->middleClickAutoscroll InProgress()) {
385 if (AutoscrollController* controller = m_scrollManager->autoscrollContro ller()) {
386 controller->startAutoscrollForSelection(layoutObject);
387 m_mouseDownMayStartAutoscroll = false;
388 }
389 }
390
391 selectionController().handleMouseDraggedEvent(event, m_mouseDownPos, m_dragS tartPos, m_mousePressNode.get(), m_lastKnownMousePosition);
392 return WebInputEventResult::HandledSystem;
393 } 211 }
394 212
395 void EventHandler::updateSelectionForMouseDrag() 213 void EventHandler::updateSelectionForMouseDrag()
396 { 214 {
397 selectionController().updateSelectionForMouseDrag(m_mousePressNode.get(), m_ dragStartPos, m_lastKnownMousePosition); 215 m_mouseEventManager->updateSelectionForMouseDrag();
398 }
399
400 // TODO(nzolghadr): Refactor the mouse related functions to MouseEventManager.
401 WebInputEventResult EventHandler::handleMouseReleaseEvent(const MouseEventWithHi tTestResults& event)
402 {
403 AutoscrollController* controller = m_scrollManager->autoscrollController();
404 if (controller && controller->autoscrollInProgress())
405 m_scrollManager->stopAutoscroll();
406
407 return selectionController().handleMouseReleaseEvent(event, m_dragStartPos) ? WebInputEventResult::HandledSystem : WebInputEventResult::NotHandled;
408 } 216 }
409 217
410 void EventHandler::startMiddleClickAutoscroll(LayoutObject* layoutObject) 218 void EventHandler::startMiddleClickAutoscroll(LayoutObject* layoutObject)
411 { 219 {
412 DCHECK(RuntimeEnabledFeatures::middleClickAutoscrollEnabled()); 220 DCHECK(RuntimeEnabledFeatures::middleClickAutoscrollEnabled());
413 if (!layoutObject->isBox()) 221 if (!layoutObject->isBox())
414 return; 222 return;
415 AutoscrollController* controller = m_scrollManager->autoscrollController(); 223 AutoscrollController* controller = m_scrollManager->autoscrollController();
416 if (!controller) 224 if (!controller)
417 return; 225 return;
418 controller->startMiddleClickAutoscroll(toLayoutBox(layoutObject), lastKnownM ousePosition()); 226 controller->startMiddleClickAutoscroll(toLayoutBox(layoutObject), m_mouseEve ntManager->lastKnownMousePosition());
419 invalidateClick(); 227 m_mouseEventManager->invalidateClick();
420 } 228 }
421 229
422 HitTestResult EventHandler::hitTestResultAtPoint(const LayoutPoint& point, HitTe stRequest::HitTestRequestType hitType, const LayoutSize& padding) 230 HitTestResult EventHandler::hitTestResultAtPoint(const LayoutPoint& point, HitTe stRequest::HitTestRequestType hitType, const LayoutSize& padding)
423 { 231 {
424 TRACE_EVENT0("blink", "EventHandler::hitTestResultAtPoint"); 232 TRACE_EVENT0("blink", "EventHandler::hitTestResultAtPoint");
425 233
426 ASSERT((hitType & HitTestRequest::ListBased) || padding.isEmpty()); 234 ASSERT((hitType & HitTestRequest::ListBased) || padding.isEmpty());
427 235
428 // We always send hitTestResultAtPoint to the main frame if we have one, 236 // We always send hitTestResultAtPoint to the main frame if we have one,
429 // otherwise we might hit areas that are obscured by higher frames. 237 // otherwise we might hit areas that are obscured by higher frames.
(...skipping 11 matching lines...) Expand all
441 249
442 // hitTestResultAtPoint is specifically used to hitTest into all frames, thu s it always allows child frame content. 250 // hitTestResultAtPoint is specifically used to hitTest into all frames, thu s it always allows child frame content.
443 HitTestRequest request(hitType | HitTestRequest::AllowChildFrameContent); 251 HitTestRequest request(hitType | HitTestRequest::AllowChildFrameContent);
444 HitTestResult result(request, point, padding.height().toUnsigned(), padding. width().toUnsigned(), padding.height().toUnsigned(), padding.width().toUnsigned( )); 252 HitTestResult result(request, point, padding.height().toUnsigned(), padding. width().toUnsigned(), padding.height().toUnsigned(), padding.width().toUnsigned( ));
445 253
446 // LayoutView::hitTest causes a layout, and we don't want to hit that until the first 254 // LayoutView::hitTest causes a layout, and we don't want to hit that until the first
447 // layout because until then, there is nothing shown on the screen - the use r can't 255 // layout because until then, there is nothing shown on the screen - the use r can't
448 // have intentionally clicked on something belonging to this page. Furthermo re, 256 // have intentionally clicked on something belonging to this page. Furthermo re,
449 // mousemove events before the first layout should not lead to a premature l ayout() 257 // mousemove events before the first layout should not lead to a premature l ayout()
450 // happening, which could show a flash of white. 258 // happening, which could show a flash of white.
451 // See also the similar code in Document::prepareMouseEvent. 259 // See also the similar code in Document::performMouseEventHitTest.
452 if (m_frame->contentLayoutItem().isNull() || !m_frame->view() || !m_frame->v iew()->didFirstLayout()) 260 if (m_frame->contentLayoutItem().isNull() || !m_frame->view() || !m_frame->v iew()->didFirstLayout())
453 return result; 261 return result;
454 262
455 m_frame->contentLayoutItem().hitTest(result); 263 m_frame->contentLayoutItem().hitTest(result);
456 if (!request.readOnly()) 264 if (!request.readOnly())
457 m_frame->document()->updateHoverActiveState(request, result.innerElement ()); 265 m_frame->document()->updateHoverActiveState(request, result.innerElement ());
458 266
459 return result; 267 return result;
460 } 268 }
461 269
462 void EventHandler::stopAutoscroll() 270 void EventHandler::stopAutoscroll()
463 { 271 {
464 m_scrollManager->stopAutoscroll(); 272 m_scrollManager->stopAutoscroll();
465 } 273 }
466 274
467 // TODO(bokan): This should be merged with logicalScroll assuming 275 // TODO(bokan): This should be merged with logicalScroll assuming
468 // defaultSpaceEventHandler's chaining scroll can be done crossing frames. 276 // defaultSpaceEventHandler's chaining scroll can be done crossing frames.
469 bool EventHandler::bubblingScroll(ScrollDirection direction, ScrollGranularity g ranularity, Node* startingNode) 277 bool EventHandler::bubblingScroll(ScrollDirection direction, ScrollGranularity g ranularity, Node* startingNode)
470 { 278 {
471 return m_scrollManager->bubblingScroll(direction, granularity, startingNode, m_mousePressNode); 279 return m_scrollManager->bubblingScroll(direction, granularity, startingNode, m_mouseEventManager->mousePressNode());
472 } 280 }
473 281
474 IntPoint EventHandler::lastKnownMousePosition() const 282 IntPoint EventHandler::lastKnownMousePosition() const
475 { 283 {
476 return m_lastKnownMousePosition; 284 return m_mouseEventManager->lastKnownMousePosition();
477 } 285 }
478 286
479 IntPoint EventHandler::dragDataTransferLocationForTesting() 287 IntPoint EventHandler::dragDataTransferLocationForTesting()
480 { 288 {
481 if (dragState().m_dragDataTransfer) 289 if (m_mouseEventManager->dragState().m_dragDataTransfer)
482 return dragState().m_dragDataTransfer->dragLocation(); 290 return m_mouseEventManager->dragState().m_dragDataTransfer->dragLocation ();
483 291
484 return IntPoint(); 292 return IntPoint();
485 } 293 }
486 294
487 static LocalFrame* subframeForTargetNode(Node* node) 295 static LocalFrame* subframeForTargetNode(Node* node)
488 { 296 {
489 if (!node) 297 if (!node)
490 return nullptr; 298 return nullptr;
491 299
492 LayoutObject* layoutObject = node->layoutObject(); 300 LayoutObject* layoutObject = node->layoutObject();
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
529 } 337 }
530 338
531 void EventHandler::updateCursor() 339 void EventHandler::updateCursor()
532 { 340 {
533 TRACE_EVENT0("input", "EventHandler::updateCursor"); 341 TRACE_EVENT0("input", "EventHandler::updateCursor");
534 342
535 // We must do a cross-frame hit test because the frame that triggered the cu rsor 343 // We must do a cross-frame hit test because the frame that triggered the cu rsor
536 // update could be occluded by a different frame. 344 // update could be occluded by a different frame.
537 ASSERT(m_frame == m_frame->localFrameRoot()); 345 ASSERT(m_frame == m_frame->localFrameRoot());
538 346
539 if (m_mousePositionIsUnknown) 347 if (m_mouseEventManager->isMousePositionUnknown())
540 return; 348 return;
541 349
542 FrameView* view = m_frame->view(); 350 FrameView* view = m_frame->view();
543 if (!view || !view->shouldSetCursor()) 351 if (!view || !view->shouldSetCursor())
544 return; 352 return;
545 353
546 LayoutViewItem layoutViewItem = view->layoutViewItem(); 354 LayoutViewItem layoutViewItem = view->layoutViewItem();
547 if (layoutViewItem.isNull()) 355 if (layoutViewItem.isNull())
548 return; 356 return;
549 357
550 m_frame->document()->updateStyleAndLayout(); 358 m_frame->document()->updateStyleAndLayout();
551 359
552 HitTestRequest request(HitTestRequest::ReadOnly | HitTestRequest::AllowChild FrameContent); 360 HitTestRequest request(HitTestRequest::ReadOnly | HitTestRequest::AllowChild FrameContent);
553 HitTestResult result(request, view->rootFrameToContents(m_lastKnownMousePosi tion)); 361 HitTestResult result(request, view->rootFrameToContents(m_mouseEventManager- >lastKnownMousePosition()));
554 layoutViewItem.hitTest(result); 362 layoutViewItem.hitTest(result);
555 363
556 if (LocalFrame* frame = result.innerNodeFrame()) { 364 if (LocalFrame* frame = result.innerNodeFrame()) {
557 OptionalCursor optionalCursor = frame->eventHandler().selectCursor(resul t); 365 OptionalCursor optionalCursor = frame->eventHandler().selectCursor(resul t);
558 if (optionalCursor.isCursorChange()) { 366 if (optionalCursor.isCursorChange()) {
559 view->setCursor(optionalCursor.cursor()); 367 view->setCursor(optionalCursor.cursor());
560 } 368 }
561 } 369 }
562 } 370 }
563 371
(...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after
712 520
713 bool inResizer = false; 521 bool inResizer = false;
714 LayoutObject* layoutObject = node ? node->layoutObject() : nullptr; 522 LayoutObject* layoutObject = node ? node->layoutObject() : nullptr;
715 if (layoutObject && m_frame->view()) { 523 if (layoutObject && m_frame->view()) {
716 PaintLayer* layer = layoutObject->enclosingLayer(); 524 PaintLayer* layer = layoutObject->enclosingLayer();
717 inResizer = layer->getScrollableArea() && layer->getScrollableArea()->is PointInResizeControl(result.roundedPointInMainFrame(), ResizerForPointer); 525 inResizer = layer->getScrollableArea() && layer->getScrollableArea()->is PointInResizeControl(result.roundedPointInMainFrame(), ResizerForPointer);
718 } 526 }
719 527
720 // During selection, use an I-beam no matter what we're over. 528 // During selection, use an I-beam no matter what we're over.
721 // If a drag may be starting or we're capturing mouse events for a particula r node, don't treat this as a selection. 529 // If a drag may be starting or we're capturing mouse events for a particula r node, don't treat this as a selection.
722 if (m_mousePressed && selectionController().mouseDownMayStartSelect() 530 if (m_mouseEventManager->mousePressed() && selectionController().mouseDownMa yStartSelect()
723 && !m_mouseDownMayStartDrag 531 && !m_mouseEventManager->mouseDownMayStartDrag()
724 && !m_frame->selection().isNone() 532 && !m_frame->selection().isNone()
725 && !m_capturingMouseEventsNode) { 533 && !m_capturingMouseEventsNode) {
726 return iBeam; 534 return iBeam;
727 } 535 }
728 536
729 if ((editable || (layoutObject && layoutObject->isText() && node->canStartSe lection())) && !inResizer && !result.scrollbar()) 537 if ((editable || (layoutObject && layoutObject->isText() && node->canStartSe lection())) && !inResizer && !result.scrollbar())
730 return iBeam; 538 return iBeam;
731 return pointerCursor(); 539 return pointerCursor();
732 } 540 }
733 541
734 static LayoutPoint contentPointFromRootFrame(LocalFrame* frame, const IntPoint& pointInRootFrame)
735 {
736 FrameView* view = frame->view();
737 // FIXME: Is it really OK to use the wrong coordinates here when view is 0?
738 // Historically the code would just crash; this is clearly no worse than tha t.
739 return view ? view->rootFrameToContents(pointInRootFrame) : pointInRootFrame ;
740 }
741
742 WebInputEventResult EventHandler::handleMousePressEvent(const PlatformMouseEvent & mouseEvent) 542 WebInputEventResult EventHandler::handleMousePressEvent(const PlatformMouseEvent & mouseEvent)
743 { 543 {
744 TRACE_EVENT0("blink", "EventHandler::handleMousePressEvent"); 544 TRACE_EVENT0("blink", "EventHandler::handleMousePressEvent");
745 545
746 // For 4th/5th button in the mouse since Chrome does not yet send 546 // For 4th/5th button in the mouse since Chrome does not yet send
747 // button value to Blink but in some cases it does send the event. 547 // button value to Blink but in some cases it does send the event.
748 // This check is needed to suppress such an event (crbug.com/574959) 548 // This check is needed to suppress such an event (crbug.com/574959)
749 if (mouseEvent.pointerProperties().button == WebPointerProperties::Button::N oButton) 549 if (mouseEvent.pointerProperties().button == WebPointerProperties::Button::N oButton)
750 return WebInputEventResult::HandledSuppressed; 550 return WebInputEventResult::HandledSuppressed;
751 551
752 UserGestureIndicator gestureIndicator(DefinitelyProcessingUserGesture); 552 UserGestureIndicator gestureIndicator(DefinitelyProcessingUserGesture);
753 m_frame->localFrameRoot()->eventHandler().m_lastMouseDownUserGestureToken = UserGestureIndicator::currentToken(); 553 m_frame->localFrameRoot()->eventHandler().m_lastMouseDownUserGestureToken = UserGestureIndicator::currentToken();
754 554
755 cancelFakeMouseMoveEvent();
756 if (m_eventHandlerWillResetCapturingMouseEventsNode) 555 if (m_eventHandlerWillResetCapturingMouseEventsNode)
757 m_capturingMouseEventsNode = nullptr; 556 m_capturingMouseEventsNode = nullptr;
758 m_mousePressed = true; 557 m_mouseEventManager->handleMousePressEventUpdateStates(mouseEvent);
759 m_capturesDragging = true;
760 setLastKnownMousePosition(mouseEvent);
761 m_mouseDownTimestamp = mouseEvent.timestamp();
762 m_mouseDownMayStartDrag = false;
763 selectionController().setMouseDownMayStartSelect(false); 558 selectionController().setMouseDownMayStartSelect(false);
764 m_mouseDownMayStartAutoscroll = false; 559
765 if (FrameView* view = m_frame->view()) { 560 if (!m_frame->view())
766 m_mouseDownPos = view->rootFrameToContents(mouseEvent.position());
767 } else {
768 invalidateClick();
769 return WebInputEventResult::NotHandled; 561 return WebInputEventResult::NotHandled;
770 }
771 562
772 HitTestRequest request(HitTestRequest::Active); 563 HitTestRequest request(HitTestRequest::Active);
773 // Save the document point we generate in case the window coordinate is inva lidated by what happens 564 // Save the document point we generate in case the window coordinate is inva lidated by what happens
774 // when we dispatch the event. 565 // when we dispatch the event.
775 LayoutPoint documentPoint = contentPointFromRootFrame(m_frame, mouseEvent.po sition()); 566 LayoutPoint documentPoint = EventHandlingUtil::contentPointFromRootFrame(m_f rame, mouseEvent.position());
bokan 2016/09/30 16:57:55 We don't need this helper method, all it does is n
Navid Zolghadr 2016/10/03 16:03:00 Done.
776 MouseEventWithHitTestResults mev = m_frame->document()->prepareMouseEvent(re quest, documentPoint, mouseEvent); 567 MouseEventWithHitTestResults mev = m_frame->document()->performMouseEventHit Test(request, documentPoint, mouseEvent);
777 568
778 if (!mev.innerNode()) { 569 if (!mev.innerNode()) {
779 invalidateClick(); 570 m_mouseEventManager->invalidateClick();
780 return WebInputEventResult::NotHandled; 571 return WebInputEventResult::NotHandled;
781 } 572 }
782 573
783 m_mousePressNode = mev.innerNode(); 574 m_mouseEventManager->setMousePressNode(mev.innerNode());
784 m_frame->document()->setSequentialFocusNavigationStartingPoint(mev.innerNode ()); 575 m_frame->document()->setSequentialFocusNavigationStartingPoint(mev.innerNode ());
785 576
786 LocalFrame* subframe = subframeForHitTestResult(mev); 577 LocalFrame* subframe = subframeForHitTestResult(mev);
787 if (subframe) { 578 if (subframe) {
788 WebInputEventResult result = passMousePressEventToSubframe(mev, subframe ); 579 WebInputEventResult result = passMousePressEventToSubframe(mev, subframe );
789 // Start capturing future events for this frame. We only do this if we didn't clear 580 // Start capturing future events for this frame. We only do this if we didn't clear
790 // the m_mousePressed flag, which may happen if an AppKit widget entered a modal event loop. 581 // the m_mousePressed flag, which may happen if an AppKit widget entered a modal event loop.
791 // The capturing should be done only when the result indicates it 582 // The capturing should be done only when the result indicates it
792 // has been handled. See crbug.com/269917 583 // has been handled. See crbug.com/269917
793 m_capturesDragging = subframe->eventHandler().capturesDragging(); 584 m_mouseEventManager->setCapturesDragging(subframe->eventHandler().m_mous eEventManager->capturesDragging());
794 if (m_mousePressed && m_capturesDragging) { 585 if (m_mouseEventManager->mousePressed() && m_mouseEventManager->captures Dragging()) {
795 m_capturingMouseEventsNode = mev.innerNode(); 586 m_capturingMouseEventsNode = mev.innerNode();
796 m_eventHandlerWillResetCapturingMouseEventsNode = true; 587 m_eventHandlerWillResetCapturingMouseEventsNode = true;
797 } 588 }
798 invalidateClick(); 589 m_mouseEventManager->invalidateClick();
799 return result; 590 return result;
800 } 591 }
801 592
802 if (RuntimeEnabledFeatures::middleClickAutoscrollEnabled()) { 593 if (RuntimeEnabledFeatures::middleClickAutoscrollEnabled()) {
803 // We store whether middle click autoscroll is in progress before callin g stopAutoscroll() 594 // We store whether middle click autoscroll is in progress before callin g stopAutoscroll()
804 // because it will set m_autoscrollType to NoAutoscroll on return. 595 // because it will set m_autoscrollType to NoAutoscroll on return.
805 bool isMiddleClickAutoscrollInProgress = m_scrollManager->middleClickAut oscrollInProgress(); 596 bool isMiddleClickAutoscrollInProgress = m_scrollManager->middleClickAut oscrollInProgress();
806 m_scrollManager->stopAutoscroll(); 597 m_scrollManager->stopAutoscroll();
807 if (isMiddleClickAutoscrollInProgress) { 598 if (isMiddleClickAutoscrollInProgress) {
808 // We invalidate the click when exiting middle click auto scroll so that we don't inadvertently navigate 599 // We invalidate the click when exiting middle click auto scroll so that we don't inadvertently navigate
809 // away from the current page (e.g. the click was on a hyperlink). S ee <rdar://problem/6095023>. 600 // away from the current page (e.g. the click was on a hyperlink). S ee <rdar://problem/6095023>.
810 invalidateClick(); 601 m_mouseEventManager->invalidateClick();
811 return WebInputEventResult::HandledSuppressed; 602 return WebInputEventResult::HandledSuppressed;
812 } 603 }
813 } 604 }
814 605
815 m_clickCount = mouseEvent.clickCount(); 606 m_mouseEventManager->setClickCount(mouseEvent.clickCount());
816 m_clickNode = mev.innerNode()->isTextNode() ? FlatTreeTraversal::parent(*me v.innerNode()) : mev.innerNode(); 607 m_mouseEventManager->setClickNode(mev.innerNode()->isTextNode() ? FlatTreeT raversal::parent(*mev.innerNode()) : mev.innerNode());
817 608
818 if (!mouseEvent.fromTouch()) 609 if (!mouseEvent.fromTouch())
819 m_frame->selection().setCaretBlinkingSuspended(true); 610 m_frame->selection().setCaretBlinkingSuspended(true);
820 611
821 WebInputEventResult eventResult = updatePointerTargetAndDispatchEvents(Event TypeNames::mousedown, mev.innerNode(), m_clickCount, mev.event()); 612 WebInputEventResult eventResult = updatePointerTargetAndDispatchEvents(Event TypeNames::mousedown, mev.innerNode(), mev.event());
822 613
823 if (eventResult == WebInputEventResult::NotHandled && m_frame->view()) { 614 if (eventResult == WebInputEventResult::NotHandled && m_frame->view()) {
824 FrameView* view = m_frame->view(); 615 FrameView* view = m_frame->view();
825 PaintLayer* layer = mev.innerNode()->layoutObject() ? mev.innerNode()->l ayoutObject()->enclosingLayer() : nullptr; 616 PaintLayer* layer = mev.innerNode()->layoutObject() ? mev.innerNode()->l ayoutObject()->enclosingLayer() : nullptr;
826 IntPoint p = view->rootFrameToContents(mouseEvent.position()); 617 IntPoint p = view->rootFrameToContents(mouseEvent.position());
827 if (layer && layer->getScrollableArea() && layer->getScrollableArea()->i sPointInResizeControl(p, ResizerForPointer)) { 618 if (layer && layer->getScrollableArea() && layer->getScrollableArea()->i sPointInResizeControl(p, ResizerForPointer)) {
828 m_scrollManager->setResizeScrollableArea(layer, p); 619 m_scrollManager->setResizeScrollableArea(layer, p);
829 return WebInputEventResult::HandledSystem; 620 return WebInputEventResult::HandledSystem;
830 } 621 }
831 } 622 }
832 623
833 // m_selectionInitiationState is initialized after dispatching mousedown 624 // m_selectionInitiationState is initialized after dispatching mousedown
834 // event in order not to keep the selection by DOM APIs because we can't 625 // event in order not to keep the selection by DOM APIs because we can't
835 // give the user the chance to handle the selection by user action like 626 // give the user the chance to handle the selection by user action like
836 // dragging if we keep the selection in case of mousedown. FireFox also has 627 // dragging if we keep the selection in case of mousedown. FireFox also has
837 // the same behavior and it's more compatible with other browsers. 628 // the same behavior and it's more compatible with other browsers.
838 selectionController().initializeSelectionState(); 629 selectionController().initializeSelectionState();
839 HitTestResult hitTestResult = EventHandlingUtil::hitTestResultInFrame(m_fram e, documentPoint, HitTestRequest::ReadOnly); 630 HitTestResult hitTestResult = EventHandlingUtil::hitTestResultInFrame(m_fram e, documentPoint, HitTestRequest::ReadOnly);
840 InputDeviceCapabilities* sourceCapabilities = mouseEvent.getSyntheticEventTy pe() == PlatformMouseEvent::FromTouch ? InputDeviceCapabilities::firesTouchEvent sSourceCapabilities() : 631 InputDeviceCapabilities* sourceCapabilities = mouseEvent.getSyntheticEventTy pe() == PlatformMouseEvent::FromTouch ? InputDeviceCapabilities::firesTouchEvent sSourceCapabilities() :
841 InputDeviceCapabilities::doesntFireTouchEventsSourceCapabilities(); 632 InputDeviceCapabilities::doesntFireTouchEventsSourceCapabilities();
842 if (eventResult == WebInputEventResult::NotHandled) 633 if (eventResult == WebInputEventResult::NotHandled)
843 eventResult = handleMouseFocus(hitTestResult, sourceCapabilities); 634 eventResult = m_mouseEventManager->handleMouseFocus(hitTestResult, sourc eCapabilities);
844 m_capturesDragging = eventResult == WebInputEventResult::NotHandled || mev.s crollbar(); 635 m_mouseEventManager->setCapturesDragging(eventResult == WebInputEventResult: :NotHandled || mev.scrollbar());
845 636
846 // If the hit testing originally determined the event was in a scrollbar, re fetch the MouseEventWithHitTestResults 637 // If the hit testing originally determined the event was in a scrollbar, re fetch the MouseEventWithHitTestResults
847 // in case the scrollbar widget was destroyed when the mouse event was handl ed. 638 // in case the scrollbar widget was destroyed when the mouse event was handl ed.
848 if (mev.scrollbar()) { 639 if (mev.scrollbar()) {
849 const bool wasLastScrollBar = mev.scrollbar() == m_lastScrollbarUnderMou se.get(); 640 const bool wasLastScrollBar = mev.scrollbar() == m_lastScrollbarUnderMou se.get();
850 HitTestRequest request(HitTestRequest::ReadOnly | HitTestRequest::Active ); 641 HitTestRequest request(HitTestRequest::ReadOnly | HitTestRequest::Active );
851 mev = m_frame->document()->prepareMouseEvent(request, documentPoint, mou seEvent); 642 mev = m_frame->document()->performMouseEventHitTest(request, documentPoi nt, mouseEvent);
852 if (wasLastScrollBar && mev.scrollbar() != m_lastScrollbarUnderMouse.get ()) 643 if (wasLastScrollBar && mev.scrollbar() != m_lastScrollbarUnderMouse.get ())
853 m_lastScrollbarUnderMouse = nullptr; 644 m_lastScrollbarUnderMouse = nullptr;
854 } 645 }
855 646
856 if (eventResult != WebInputEventResult::NotHandled) { 647 if (eventResult != WebInputEventResult::NotHandled) {
857 // scrollbars should get events anyway, even disabled controls might be scrollable 648 // scrollbars should get events anyway, even disabled controls might be scrollable
858 passMousePressEventToScrollbar(mev); 649 passMousePressEventToScrollbar(mev);
859 } else { 650 } else {
860 if (shouldRefetchEventTarget(mev)) { 651 if (shouldRefetchEventTarget(mev)) {
861 HitTestRequest request(HitTestRequest::ReadOnly | HitTestRequest::Ac tive); 652 HitTestRequest request(HitTestRequest::ReadOnly | HitTestRequest::Ac tive);
862 mev = m_frame->document()->prepareMouseEvent(request, documentPoint, mouseEvent); 653 mev = m_frame->document()->performMouseEventHitTest(request, documen tPoint, mouseEvent);
863 } 654 }
864 655
865 if (passMousePressEventToScrollbar(mev)) 656 if (passMousePressEventToScrollbar(mev))
866 eventResult = WebInputEventResult::HandledSystem; 657 eventResult = WebInputEventResult::HandledSystem;
867 else 658 else
868 eventResult = handleMousePressEvent(mev); 659 eventResult = m_mouseEventManager->handleMousePressEvent(mev);
869 } 660 }
870 661
871 if (mev.hitTestResult().innerNode() && mouseEvent.pointerProperties().button == WebPointerProperties::Button::Left) { 662 if (mev.hitTestResult().innerNode() && mouseEvent.pointerProperties().button == WebPointerProperties::Button::Left) {
872 ASSERT(mouseEvent.type() == PlatformEvent::MousePressed); 663 ASSERT(mouseEvent.type() == PlatformEvent::MousePressed);
873 HitTestResult result = mev.hitTestResult(); 664 HitTestResult result = mev.hitTestResult();
874 result.setToShadowHostIfInUserAgentShadowRoot(); 665 result.setToShadowHostIfInUserAgentShadowRoot();
875 m_frame->chromeClient().onMouseDown(result.innerNode()); 666 m_frame->chromeClient().onMouseDown(result.innerNode());
876 } 667 }
877 668
878 return eventResult; 669 return eventResult;
879 } 670 }
880 671
881 static PaintLayer* layerForNode(Node* node)
882 {
883 if (!node)
884 return nullptr;
885
886 LayoutObject* layoutObject = node->layoutObject();
887 if (!layoutObject)
888 return nullptr;
889
890 PaintLayer* layer = layoutObject->enclosingLayer();
891 if (!layer)
892 return nullptr;
893
894 return layer;
895 }
896
897 ScrollableArea* EventHandler::associatedScrollableArea(const PaintLayer* layer) const
898 {
899 if (PaintLayerScrollableArea* scrollableArea = layer->getScrollableArea()) {
900 if (scrollableArea->scrollsOverflow())
901 return scrollableArea;
902 }
903
904 return nullptr;
905 }
906
907 WebInputEventResult EventHandler::handleMouseMoveEvent(const PlatformMouseEvent& event) 672 WebInputEventResult EventHandler::handleMouseMoveEvent(const PlatformMouseEvent& event)
908 { 673 {
909 TRACE_EVENT0("blink", "EventHandler::handleMouseMoveEvent"); 674 TRACE_EVENT0("blink", "EventHandler::handleMouseMoveEvent");
910 675
911 HitTestResult hoveredNode = HitTestResult(); 676 HitTestResult hoveredNode = HitTestResult();
912 WebInputEventResult result = handleMouseMoveOrLeaveEvent(event, &hoveredNode ); 677 WebInputEventResult result = handleMouseMoveOrLeaveEvent(event, &hoveredNode );
913 678
914 Page* page = m_frame->page(); 679 Page* page = m_frame->page();
915 if (!page) 680 if (!page)
916 return result; 681 return result;
917 682
918 if (PaintLayer* layer = layerForNode(hoveredNode.innerNode())) { 683 if (PaintLayer* layer = EventHandlingUtil::layerForNode(hoveredNode.innerNod e())) {
919 if (ScrollableArea* layerScrollableArea = associatedScrollableArea(layer )) 684 if (ScrollableArea* layerScrollableArea = EventHandlingUtil::associatedS crollableArea(layer))
920 layerScrollableArea->mouseMovedInContentArea(); 685 layerScrollableArea->mouseMovedInContentArea();
921 } 686 }
922 687
923 if (FrameView* frameView = m_frame->view()) 688 if (FrameView* frameView = m_frame->view())
924 frameView->mouseMovedInContentArea(); 689 frameView->mouseMovedInContentArea();
925 690
926 hoveredNode.setToShadowHostIfInUserAgentShadowRoot(); 691 hoveredNode.setToShadowHostIfInUserAgentShadowRoot();
927 page->chromeClient().mouseDidMoveOverElement(hoveredNode); 692 page->chromeClient().mouseDidMoveOverElement(hoveredNode);
928 693
929 return result; 694 return result;
930 } 695 }
931 696
932 void EventHandler::handleMouseLeaveEvent(const PlatformMouseEvent& event) 697 void EventHandler::handleMouseLeaveEvent(const PlatformMouseEvent& event)
933 { 698 {
934 TRACE_EVENT0("blink", "EventHandler::handleMouseLeaveEvent"); 699 TRACE_EVENT0("blink", "EventHandler::handleMouseLeaveEvent");
935 700
936 handleMouseMoveOrLeaveEvent(event, 0, false, true); 701 handleMouseMoveOrLeaveEvent(event, 0, false, true);
937 } 702 }
938 703
939 WebInputEventResult EventHandler::handleMouseMoveOrLeaveEvent(const PlatformMous eEvent& mouseEvent, HitTestResult* hoveredNode, bool onlyUpdateScrollbars, bool forceLeave) 704 WebInputEventResult EventHandler::handleMouseMoveOrLeaveEvent(const PlatformMous eEvent& mouseEvent, HitTestResult* hoveredNode, bool onlyUpdateScrollbars, bool forceLeave)
940 { 705 {
941 ASSERT(m_frame); 706 ASSERT(m_frame);
942 ASSERT(m_frame->view()); 707 ASSERT(m_frame->view());
943 708
944 setLastKnownMousePosition(mouseEvent); 709 m_mouseEventManager->setLastKnownMousePosition(mouseEvent);
945 710
946 if (m_hoverTimer.isActive()) 711 if (m_hoverTimer.isActive())
947 m_hoverTimer.stop(); 712 m_hoverTimer.stop();
948 713
949 m_cursorUpdateTimer.stop(); 714 m_cursorUpdateTimer.stop();
950 715
951 cancelFakeMouseMoveEvent(); 716 m_mouseEventManager->cancelFakeMouseMoveEvent();
952 717
953 if (m_svgPan) { 718 m_mouseEventManager->handleSvgPanIfNeeded(false);
954 m_frame->document()->accessSVGExtensions().updatePan(m_frame->view()->ro otFrameToContents(m_lastKnownMousePosition));
955 return WebInputEventResult::HandledSuppressed;
956 }
957 719
958 if (m_frameSetBeingResized) 720 if (m_frameSetBeingResized)
959 return updatePointerTargetAndDispatchEvents(EventTypeNames::mousemove, m _frameSetBeingResized.get(), 0, mouseEvent); 721 return updatePointerTargetAndDispatchEvents(EventTypeNames::mousemove, m _frameSetBeingResized.get(), mouseEvent);
960 722
961 // Send events right to a scrollbar if the mouse is pressed. 723 // Send events right to a scrollbar if the mouse is pressed.
962 if (m_lastScrollbarUnderMouse && m_mousePressed) { 724 if (m_lastScrollbarUnderMouse && m_mouseEventManager->mousePressed()) {
963 m_lastScrollbarUnderMouse->mouseMoved(mouseEvent); 725 m_lastScrollbarUnderMouse->mouseMoved(mouseEvent);
964 return WebInputEventResult::HandledSystem; 726 return WebInputEventResult::HandledSystem;
965 } 727 }
966 728
967 // Mouse events simulated from touch should not hit-test again. 729 // Mouse events simulated from touch should not hit-test again.
968 ASSERT(!mouseEvent.fromTouch()); 730 ASSERT(!mouseEvent.fromTouch());
969 731
970 HitTestRequest::HitTestRequestType hitType = HitTestRequest::Move; 732 HitTestRequest::HitTestRequestType hitType = HitTestRequest::Move;
971 if (m_mousePressed) { 733 if (m_mouseEventManager->mousePressed()) {
972 hitType |= HitTestRequest::Active; 734 hitType |= HitTestRequest::Active;
973 } else if (onlyUpdateScrollbars) { 735 } else if (onlyUpdateScrollbars) {
974 // Mouse events should be treated as "read-only" if we're updating only scrollbars. This 736 // Mouse events should be treated as "read-only" if we're updating only scrollbars. This
975 // means that :hover and :active freeze in the state they were in, rathe r than updating 737 // means that :hover and :active freeze in the state they were in, rathe r than updating
976 // for nodes the mouse moves while the window is not key (which will be the case if 738 // for nodes the mouse moves while the window is not key (which will be the case if
977 // onlyUpdateScrollbars is true). 739 // onlyUpdateScrollbars is true).
978 hitType |= HitTestRequest::ReadOnly; 740 hitType |= HitTestRequest::ReadOnly;
979 } 741 }
980 742
981 // Treat any mouse move events as readonly if the user is currently touching the screen. 743 // Treat any mouse move events as readonly if the user is currently touching the screen.
982 if (m_pointerEventManager->isAnyTouchActive()) 744 if (m_pointerEventManager->isAnyTouchActive())
983 hitType |= HitTestRequest::Active | HitTestRequest::ReadOnly; 745 hitType |= HitTestRequest::Active | HitTestRequest::ReadOnly;
984 HitTestRequest request(hitType); 746 HitTestRequest request(hitType);
985 MouseEventWithHitTestResults mev = MouseEventWithHitTestResults(mouseEvent, HitTestResult(request, LayoutPoint())); 747 MouseEventWithHitTestResults mev = MouseEventWithHitTestResults(mouseEvent, HitTestResult(request, LayoutPoint()));
986 748
987 // We don't want to do a hit-test in forceLeave scenarios because there migh t actually be some other frame above this one at the specified co-ordinate. 749 // We don't want to do a hit-test in forceLeave scenarios because there migh t actually be some other frame above this one at the specified co-ordinate.
988 // So we must force the hit-test to fail, while still clearing hover/active state. 750 // So we must force the hit-test to fail, while still clearing hover/active state.
989 if (forceLeave) 751 if (forceLeave)
990 m_frame->document()->updateHoverActiveState(request, 0); 752 m_frame->document()->updateHoverActiveState(request, 0);
991 else 753 else
992 mev = prepareMouseEvent(request, mouseEvent); 754 mev = EventHandlingUtil::performMouseEventHitTest(m_frame, request, mous eEvent);
993 755
994 if (hoveredNode) 756 if (hoveredNode)
995 *hoveredNode = mev.hitTestResult(); 757 *hoveredNode = mev.hitTestResult();
996 758
997 Scrollbar* scrollbar = nullptr; 759 Scrollbar* scrollbar = nullptr;
998 760
999 if (m_scrollManager->inResizeMode()) { 761 if (m_scrollManager->inResizeMode()) {
1000 m_scrollManager->resize(mev.event()); 762 m_scrollManager->resize(mev.event());
1001 } else { 763 } else {
1002 if (!scrollbar) 764 if (!scrollbar)
1003 scrollbar = mev.scrollbar(); 765 scrollbar = mev.scrollbar();
1004 766
1005 updateLastScrollbarUnderMouse(scrollbar, !m_mousePressed); 767 updateLastScrollbarUnderMouse(scrollbar, !m_mouseEventManager->mousePres sed());
1006 if (onlyUpdateScrollbars) 768 if (onlyUpdateScrollbars)
1007 return WebInputEventResult::HandledSuppressed; 769 return WebInputEventResult::HandledSuppressed;
1008 } 770 }
1009 771
1010 WebInputEventResult eventResult = WebInputEventResult::NotHandled; 772 WebInputEventResult eventResult = WebInputEventResult::NotHandled;
1011 LocalFrame* newSubframe = m_capturingMouseEventsNode.get() ? subframeForTarg etNode(m_capturingMouseEventsNode.get()) : subframeForHitTestResult(mev); 773 LocalFrame* newSubframe = m_capturingMouseEventsNode.get() ? subframeForTarg etNode(m_capturingMouseEventsNode.get()) : subframeForHitTestResult(mev);
1012 774
1013 // We want mouseouts to happen first, from the inside out. First send a mov e event to the last subframe so that it will fire mouseouts. 775 // We want mouseouts to happen first, from the inside out. First send a mov e event to the last subframe so that it will fire mouseouts.
1014 if (m_lastMouseMoveEventSubframe && m_lastMouseMoveEventSubframe->tree().isD escendantOf(m_frame) && m_lastMouseMoveEventSubframe != newSubframe) 776 if (m_lastMouseMoveEventSubframe && m_lastMouseMoveEventSubframe->tree().isD escendantOf(m_frame) && m_lastMouseMoveEventSubframe != newSubframe)
1015 m_lastMouseMoveEventSubframe->eventHandler().handleMouseLeaveEvent(mev.e vent()); 777 m_lastMouseMoveEventSubframe->eventHandler().handleMouseLeaveEvent(mev.e vent());
1016 778
1017 if (newSubframe) { 779 if (newSubframe) {
1018 // Update over/out state before passing the event to the subframe. 780 // Update over/out state before passing the event to the subframe.
1019 updateMouseEventTargetNodeAndSendEvents(mev.innerNode(), mev.event(), tr ue); 781 m_pointerEventManager->sendMouseAndPointerBoundaryEvents(updateMouseEven tTargetNode(mev.innerNode()), mev.event());
1020 782
1021 // Event dispatch in updateMouseEventTargetNodeAndSendEvents may have ca used the subframe of the target 783 // Event dispatch in sendMouseAndPointerBoundaryEvents may have caused t he subframe of the target
1022 // node to be detached from its FrameView, in which case the event shoul d not be passed. 784 // node to be detached from its FrameView, in which case the event shoul d not be passed.
1023 if (newSubframe->view()) 785 if (newSubframe->view())
1024 eventResult = passMouseMoveEventToSubframe(mev, newSubframe, hovered Node); 786 eventResult = passMouseMoveEventToSubframe(mev, newSubframe, hovered Node);
1025 } else { 787 } else {
1026 if (scrollbar && !m_mousePressed) 788 if (scrollbar && !m_mouseEventManager->mousePressed())
1027 scrollbar->mouseMoved(mev.event()); // Handle hover effects on platf orms that support visual feedback on scrollbar hovering. 789 scrollbar->mouseMoved(mev.event()); // Handle hover effects on platf orms that support visual feedback on scrollbar hovering.
1028 if (FrameView* view = m_frame->view()) { 790 if (FrameView* view = m_frame->view()) {
1029 OptionalCursor optionalCursor = selectCursor(mev.hitTestResult()); 791 OptionalCursor optionalCursor = selectCursor(mev.hitTestResult());
1030 if (optionalCursor.isCursorChange()) { 792 if (optionalCursor.isCursorChange()) {
1031 view->setCursor(optionalCursor.cursor()); 793 view->setCursor(optionalCursor.cursor());
1032 } 794 }
1033 } 795 }
1034 } 796 }
1035 797
1036 m_lastMouseMoveEventSubframe = newSubframe; 798 m_lastMouseMoveEventSubframe = newSubframe;
1037 799
1038 if (eventResult != WebInputEventResult::NotHandled) 800 if (eventResult != WebInputEventResult::NotHandled)
1039 return eventResult; 801 return eventResult;
1040 802
1041 eventResult = updatePointerTargetAndDispatchEvents(EventTypeNames::mousemove , mev.innerNode(), 0, mev.event()); 803 eventResult = updatePointerTargetAndDispatchEvents(EventTypeNames::mousemove , mev.innerNode(), mev.event());
1042 if (eventResult != WebInputEventResult::NotHandled) 804 if (eventResult != WebInputEventResult::NotHandled)
1043 return eventResult; 805 return eventResult;
1044 806
1045 return handleMouseDraggedEvent(mev); 807 return m_mouseEventManager->handleMouseDraggedEvent(mev);
1046 }
1047
1048 void EventHandler::invalidateClick()
1049 {
1050 m_clickCount = 0;
1051 m_clickNode = nullptr;
1052 }
1053
1054 ContainerNode* EventHandler::parentForClickEvent(const Node& node)
1055 {
1056 // IE doesn't dispatch click events for mousedown/mouseup events across form
1057 // controls.
1058 if (node.isHTMLElement() && toHTMLElement(node).isInteractiveContent())
1059 return nullptr;
1060
1061 return FlatTreeTraversal::parent(node);
1062 } 808 }
1063 809
1064 WebInputEventResult EventHandler::handleMouseReleaseEvent(const PlatformMouseEve nt& mouseEvent) 810 WebInputEventResult EventHandler::handleMouseReleaseEvent(const PlatformMouseEve nt& mouseEvent)
1065 { 811 {
1066 TRACE_EVENT0("blink", "EventHandler::handleMouseReleaseEvent"); 812 TRACE_EVENT0("blink", "EventHandler::handleMouseReleaseEvent");
1067 813
1068 // For 4th/5th button in the mouse since Chrome does not yet send 814 // For 4th/5th button in the mouse since Chrome does not yet send
1069 // button value to Blink but in some cases it does send the event. 815 // button value to Blink but in some cases it does send the event.
1070 // This check is needed to suppress such an event (crbug.com/574959) 816 // This check is needed to suppress such an event (crbug.com/574959)
1071 if (mouseEvent.pointerProperties().button == WebPointerProperties::Button::N oButton) 817 if (mouseEvent.pointerProperties().button == WebPointerProperties::Button::N oButton)
1072 return WebInputEventResult::HandledSuppressed; 818 return WebInputEventResult::HandledSuppressed;
1073 819
1074 if (!mouseEvent.fromTouch()) 820 if (!mouseEvent.fromTouch())
1075 m_frame->selection().setCaretBlinkingSuspended(false); 821 m_frame->selection().setCaretBlinkingSuspended(false);
1076 822
1077 std::unique_ptr<UserGestureIndicator> gestureIndicator; 823 std::unique_ptr<UserGestureIndicator> gestureIndicator;
1078 824
1079 if (m_frame->localFrameRoot()->eventHandler().m_lastMouseDownUserGestureToke n) 825 if (m_frame->localFrameRoot()->eventHandler().m_lastMouseDownUserGestureToke n)
1080 gestureIndicator = wrapUnique(new UserGestureIndicator(m_frame->localFra meRoot()->eventHandler().m_lastMouseDownUserGestureToken.release())); 826 gestureIndicator = wrapUnique(new UserGestureIndicator(m_frame->localFra meRoot()->eventHandler().m_lastMouseDownUserGestureToken.release()));
1081 else 827 else
1082 gestureIndicator = wrapUnique(new UserGestureIndicator(DefinitelyProcess ingUserGesture)); 828 gestureIndicator = wrapUnique(new UserGestureIndicator(DefinitelyProcess ingUserGesture));
1083 829
1084 if (RuntimeEnabledFeatures::middleClickAutoscrollEnabled()) { 830 if (RuntimeEnabledFeatures::middleClickAutoscrollEnabled()) {
1085 if (Page* page = m_frame->page()) 831 if (Page* page = m_frame->page())
1086 page->autoscrollController().handleMouseReleaseForMiddleClickAutoscr oll(m_frame, mouseEvent); 832 page->autoscrollController().handleMouseReleaseForMiddleClickAutoscr oll(m_frame, mouseEvent);
1087 } 833 }
1088 834
1089 m_mousePressed = false; 835 m_mouseEventManager->setMousePressed(false);
1090 setLastKnownMousePosition(mouseEvent); 836 m_mouseEventManager->setLastKnownMousePosition(mouseEvent);
1091 837 m_mouseEventManager->handleSvgPanIfNeeded(true);
1092 if (m_svgPan) {
1093 m_svgPan = false;
1094 m_frame->document()->accessSVGExtensions().updatePan(m_frame->view()->ro otFrameToContents(m_lastKnownMousePosition));
1095 return WebInputEventResult::HandledSuppressed;
1096 }
1097 838
1098 if (m_frameSetBeingResized) 839 if (m_frameSetBeingResized)
1099 return dispatchMouseEvent(EventTypeNames::mouseup, m_frameSetBeingResize d.get(), m_clickCount, mouseEvent); 840 return m_mouseEventManager->setMousePositionAndDispatchMouseEvent(update MouseEventTargetNode(m_frameSetBeingResized.get()), EventTypeNames::mouseup, mou seEvent);
1100 841
1101 if (m_lastScrollbarUnderMouse) { 842 if (m_lastScrollbarUnderMouse) {
1102 invalidateClick(); 843 m_mouseEventManager->invalidateClick();
1103 m_lastScrollbarUnderMouse->mouseUp(mouseEvent); 844 m_lastScrollbarUnderMouse->mouseUp(mouseEvent);
1104 return updatePointerTargetAndDispatchEvents(EventTypeNames::mouseup, m_n odeUnderMouse.get(), m_clickCount, mouseEvent); 845 return updatePointerTargetAndDispatchEvents(EventTypeNames::mouseup, m_m ouseEventManager->getNodeUnderMouse(), mouseEvent);
1105 } 846 }
1106 847
1107 // Mouse events simulated from touch should not hit-test again. 848 // Mouse events simulated from touch should not hit-test again.
1108 ASSERT(!mouseEvent.fromTouch()); 849 ASSERT(!mouseEvent.fromTouch());
1109 850
1110 HitTestRequest::HitTestRequestType hitType = HitTestRequest::Release; 851 HitTestRequest::HitTestRequestType hitType = HitTestRequest::Release;
1111 HitTestRequest request(hitType); 852 HitTestRequest request(hitType);
1112 MouseEventWithHitTestResults mev = prepareMouseEvent(request, mouseEvent); 853 MouseEventWithHitTestResults mev = EventHandlingUtil::performMouseEventHitTe st(m_frame, request, mouseEvent);
1113 LocalFrame* subframe = m_capturingMouseEventsNode.get() ? subframeForTargetN ode(m_capturingMouseEventsNode.get()) : subframeForHitTestResult(mev); 854 LocalFrame* subframe = m_capturingMouseEventsNode.get() ? subframeForTargetN ode(m_capturingMouseEventsNode.get()) : subframeForHitTestResult(mev);
1114 if (m_eventHandlerWillResetCapturingMouseEventsNode) 855 if (m_eventHandlerWillResetCapturingMouseEventsNode)
1115 m_capturingMouseEventsNode = nullptr; 856 m_capturingMouseEventsNode = nullptr;
1116 if (subframe) 857 if (subframe)
1117 return passMouseReleaseEventToSubframe(mev, subframe); 858 return passMouseReleaseEventToSubframe(mev, subframe);
1118 859
1119 WebInputEventResult eventResult = updatePointerTargetAndDispatchEvents(Event TypeNames::mouseup, mev.innerNode(), m_clickCount, mev.event()); 860 WebInputEventResult eventResult = updatePointerTargetAndDispatchEvents(Event TypeNames::mouseup, mev.innerNode(), mev.event());
1120 861
1121 // We only prevent click event when the click may cause contextmenu to popup . 862 WebInputEventResult clickEventResult = m_mouseEventManager->dispatchMouseCli ckIfNeeded(mev);
1122 // However, we always send auxclick.
1123 bool contextMenuEvent = !RuntimeEnabledFeatures::auxclickEnabled()
1124 && mouseEvent.pointerProperties().button == WebPointerProperties::Button ::Right;
1125 #if OS(MACOSX)
1126 // FIXME: The Mac port achieves the same behavior by checking whether the co ntext menu is currently open in WebPage::mouseEvent(). Consider merging the impl ementations.
1127 if (mouseEvent.pointerProperties().button == WebPointerProperties::Button::L eft
1128 && mouseEvent.getModifiers() & PlatformEvent::CtrlKey)
1129 contextMenuEvent = true;
1130 #endif
1131
1132 WebInputEventResult clickEventResult = WebInputEventResult::NotHandled;
1133 const bool shouldDispatchClickEvent = m_clickCount > 0
1134 && !contextMenuEvent
1135 && mev.innerNode() && m_clickNode
1136 && mev.innerNode()->canParticipateInFlatTree() && m_clickNode->canPartic ipateInFlatTree()
1137 && !(selectionController().hasExtendedSelection() && isLinkSelection(mev ));
1138 if (shouldDispatchClickEvent) {
1139 Node* clickTargetNode = nullptr;
1140 // Updates distribution because a 'mouseup' event listener can make the
1141 // tree dirty at dispatchMouseEvent() invocation above.
1142 // Unless distribution is updated, commonAncestor would hit ASSERT.
1143 if (m_clickNode == mev.innerNode()) {
1144 clickTargetNode = m_clickNode;
1145 clickTargetNode->updateDistribution();
1146 } else if (m_clickNode->document() == mev.innerNode()->document()) {
1147 m_clickNode->updateDistribution();
1148 mev.innerNode()->updateDistribution();
1149 clickTargetNode = mev.innerNode()->commonAncestor(
1150 *m_clickNode, parentForClickEvent);
1151 }
1152 if (clickTargetNode) {
1153 // Dispatch mouseup directly w/o calling updateMouseEventTargetNodeA ndSendEvents
1154 // because the mouseup dispatch above has already updated it
1155 // correctly. Moreover, clickTargetNode is different from
1156 // mev.innerNode at drag-release.
1157 clickEventResult = EventHandlingUtil::toWebInputEventResult(
1158 clickTargetNode->dispatchMouseEvent(mev.event(),
1159 !RuntimeEnabledFeatures::auxclickEnabled()
1160 || (mev.event().pointerProperties().button == WebPointerProp erties::Button::Left)
1161 ? EventTypeNames::click
1162 : EventTypeNames::auxclick,
1163 m_clickCount));
1164 }
1165 }
1166
1167 m_scrollManager->clearResizeScrollableArea(false); 863 m_scrollManager->clearResizeScrollableArea(false);
1168 864
1169 if (eventResult == WebInputEventResult::NotHandled) 865 if (eventResult == WebInputEventResult::NotHandled)
1170 eventResult = handleMouseReleaseEvent(mev); 866 eventResult = m_mouseEventManager->handleMouseReleaseEvent(mev);
1171 clearDragHeuristicState(); 867 m_mouseEventManager->clearDragHeuristicState();
1172 868
1173 invalidateClick(); 869 m_mouseEventManager->invalidateClick();
1174 870
1175 return EventHandlingUtil::mergeEventResult(clickEventResult, eventResult); 871 return EventHandlingUtil::mergeEventResult(clickEventResult, eventResult);
1176 } 872 }
1177 873
1178 WebInputEventResult EventHandler::dispatchDragEvent(const AtomicString& eventTyp e, Node* dragTarget, const PlatformMouseEvent& event, DataTransfer* dataTransfer )
1179 {
1180 FrameView* view = m_frame->view();
1181
1182 // FIXME: We might want to dispatch a dragleave even if the view is gone.
1183 if (!view)
1184 return WebInputEventResult::NotHandled;
1185
1186 DragEvent* me = DragEvent::create(eventType,
1187 true, true, m_frame->document()->domWindow(),
1188 0, event.globalPosition().x(), event.globalPosition().y(), event.positio n().x(), event.position().y(),
1189 event.movementDelta().x(), event.movementDelta().y(),
1190 event.getModifiers(),
1191 0, MouseEvent::platformModifiersToButtons(event.getModifiers()), nullptr , event.timestamp(), dataTransfer, event.getSyntheticEventType());
1192
1193 return EventHandlingUtil::toWebInputEventResult(dragTarget->dispatchEvent(me ));
1194 }
1195
1196 static bool targetIsFrame(Node* target, LocalFrame*& frame) 874 static bool targetIsFrame(Node* target, LocalFrame*& frame)
1197 { 875 {
1198 if (!isHTMLFrameElementBase(target)) 876 if (!isHTMLFrameElementBase(target))
1199 return false; 877 return false;
1200 878
1201 // Cross-process drag and drop is not yet supported. 879 // Cross-process drag and drop is not yet supported.
1202 if (toHTMLFrameElementBase(target)->contentFrame() && !toHTMLFrameElementBas e(target)->contentFrame()->isLocalFrame()) 880 if (toHTMLFrameElementBase(target)->contentFrame() && !toHTMLFrameElementBas e(target)->contentFrame()->isLocalFrame())
1203 return false; 881 return false;
1204 882
1205 frame = toLocalFrame(toHTMLFrameElementBase(target)->contentFrame()); 883 frame = toLocalFrame(toHTMLFrameElementBase(target)->contentFrame());
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
1246 } 924 }
1247 925
1248 WebInputEventResult EventHandler::updateDragAndDrop(const PlatformMouseEvent& ev ent, DataTransfer* dataTransfer) 926 WebInputEventResult EventHandler::updateDragAndDrop(const PlatformMouseEvent& ev ent, DataTransfer* dataTransfer)
1249 { 927 {
1250 WebInputEventResult eventResult = WebInputEventResult::NotHandled; 928 WebInputEventResult eventResult = WebInputEventResult::NotHandled;
1251 929
1252 if (!m_frame->view()) 930 if (!m_frame->view())
1253 return eventResult; 931 return eventResult;
1254 932
1255 HitTestRequest request(HitTestRequest::ReadOnly); 933 HitTestRequest request(HitTestRequest::ReadOnly);
1256 MouseEventWithHitTestResults mev = prepareMouseEvent(request, event); 934 MouseEventWithHitTestResults mev = EventHandlingUtil::performMouseEventHitTe st(m_frame, request, event);
1257 935
1258 // Drag events should never go to text nodes (following IE, and proper mouse over/out dispatch) 936 // Drag events should never go to text nodes (following IE, and proper mouse over/out dispatch)
1259 Node* newTarget = mev.innerNode(); 937 Node* newTarget = mev.innerNode();
1260 if (newTarget && newTarget->isTextNode()) 938 if (newTarget && newTarget->isTextNode())
1261 newTarget = FlatTreeTraversal::parent(*newTarget); 939 newTarget = FlatTreeTraversal::parent(*newTarget);
1262 940
1263 if (AutoscrollController* controller = m_scrollManager->autoscrollController ()) 941 if (AutoscrollController* controller = m_scrollManager->autoscrollController ())
1264 controller->updateDragAndDrop(newTarget, event.position(), event.timesta mp()); 942 controller->updateDragAndDrop(newTarget, event.position(), event.timesta mp());
1265 943
1266 if (m_dragTarget != newTarget) { 944 if (m_dragTarget != newTarget) {
1267 // FIXME: this ordering was explicitly chosen to match WinIE. However, 945 // FIXME: this ordering was explicitly chosen to match WinIE. However,
1268 // it is sometimes incorrect when dragging within subframes, as seen wit h 946 // it is sometimes incorrect when dragging within subframes, as seen wit h
1269 // LayoutTests/fast/events/drag-in-frames.html. 947 // LayoutTests/fast/events/drag-in-frames.html.
1270 // 948 //
1271 // 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>. 949 // 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>.
1272 LocalFrame* targetFrame; 950 LocalFrame* targetFrame;
1273 if (targetIsFrame(newTarget, targetFrame)) { 951 if (targetIsFrame(newTarget, targetFrame)) {
1274 if (targetFrame) 952 if (targetFrame)
1275 eventResult = targetFrame->eventHandler().updateDragAndDrop(even t, dataTransfer); 953 eventResult = targetFrame->eventHandler().updateDragAndDrop(even t, dataTransfer);
1276 } else if (newTarget) { 954 } else if (newTarget) {
1277 // As per section 7.9.4 of the HTML 5 spec., we must always fire a d rag event before firing a dragenter, dragleave, or dragover event. 955 // As per section 7.9.4 of the HTML 5 spec., we must always fire a d rag event before firing a dragenter, dragleave, or dragover event.
1278 if (dragState().m_dragSrc) { 956 if (m_mouseEventManager->dragState().m_dragSrc) {
1279 // for now we don't care if event handler cancels default behavi or, since there is none 957 // for now we don't care if event handler cancels default behavi or, since there is none
1280 dispatchDragSrcEvent(EventTypeNames::drag, event); 958 m_mouseEventManager->dispatchDragSrcEvent(EventTypeNames::drag, event);
1281 } 959 }
1282 eventResult = dispatchDragEvent(EventTypeNames::dragenter, newTarget , event, dataTransfer); 960 eventResult = m_mouseEventManager->dispatchDragEvent(EventTypeNames: :dragenter, newTarget, event, dataTransfer);
1283 if (eventResult == WebInputEventResult::NotHandled && findDropZone(n ewTarget, dataTransfer)) 961 if (eventResult == WebInputEventResult::NotHandled && findDropZone(n ewTarget, dataTransfer))
1284 eventResult = WebInputEventResult::HandledSystem; 962 eventResult = WebInputEventResult::HandledSystem;
1285 } 963 }
1286 964
1287 if (targetIsFrame(m_dragTarget.get(), targetFrame)) { 965 if (targetIsFrame(m_dragTarget.get(), targetFrame)) {
1288 if (targetFrame) 966 if (targetFrame)
1289 eventResult = targetFrame->eventHandler().updateDragAndDrop(even t, dataTransfer); 967 eventResult = targetFrame->eventHandler().updateDragAndDrop(even t, dataTransfer);
1290 } else if (m_dragTarget) { 968 } else if (m_dragTarget) {
1291 dispatchDragEvent(EventTypeNames::dragleave, m_dragTarget.get(), eve nt, dataTransfer); 969 m_mouseEventManager->dispatchDragEvent(EventTypeNames::dragleave, m_ dragTarget.get(), event, dataTransfer);
1292 } 970 }
1293 971
1294 if (newTarget) { 972 if (newTarget) {
1295 // We do not explicitly call dispatchDragEvent here because it could ultimately result in the appearance that 973 // We do not explicitly call m_mouseEventManager->dispatchDragEvent here because it could ultimately result in the appearance that
1296 // two dragover events fired. So, we mark that we should only fire a dragover event on the next call to this function. 974 // two dragover events fired. So, we mark that we should only fire a dragover event on the next call to this function.
1297 m_shouldOnlyFireDragOverEvent = true; 975 m_shouldOnlyFireDragOverEvent = true;
1298 } 976 }
1299 } else { 977 } else {
1300 LocalFrame* targetFrame; 978 LocalFrame* targetFrame;
1301 if (targetIsFrame(newTarget, targetFrame)) { 979 if (targetIsFrame(newTarget, targetFrame)) {
1302 if (targetFrame) 980 if (targetFrame)
1303 eventResult = targetFrame->eventHandler().updateDragAndDrop(even t, dataTransfer); 981 eventResult = targetFrame->eventHandler().updateDragAndDrop(even t, dataTransfer);
1304 } else if (newTarget) { 982 } else if (newTarget) {
1305 // Note, when dealing with sub-frames, we may need to fire only a dr agover event as a drag event may have been fired earlier. 983 // Note, when dealing with sub-frames, we may need to fire only a dr agover event as a drag event may have been fired earlier.
1306 if (!m_shouldOnlyFireDragOverEvent && dragState().m_dragSrc) { 984 if (!m_shouldOnlyFireDragOverEvent && m_mouseEventManager->dragState ().m_dragSrc) {
1307 // for now we don't care if event handler cancels default behavi or, since there is none 985 // for now we don't care if event handler cancels default behavi or, since there is none
1308 dispatchDragSrcEvent(EventTypeNames::drag, event); 986 m_mouseEventManager->dispatchDragSrcEvent(EventTypeNames::drag, event);
1309 } 987 }
1310 eventResult = dispatchDragEvent(EventTypeNames::dragover, newTarget, event, dataTransfer); 988 eventResult = m_mouseEventManager->dispatchDragEvent(EventTypeNames: :dragover, newTarget, event, dataTransfer);
1311 if (eventResult == WebInputEventResult::NotHandled && findDropZone(n ewTarget, dataTransfer)) 989 if (eventResult == WebInputEventResult::NotHandled && findDropZone(n ewTarget, dataTransfer))
1312 eventResult = WebInputEventResult::HandledSystem; 990 eventResult = WebInputEventResult::HandledSystem;
1313 m_shouldOnlyFireDragOverEvent = false; 991 m_shouldOnlyFireDragOverEvent = false;
1314 } 992 }
1315 } 993 }
1316 m_dragTarget = newTarget; 994 m_dragTarget = newTarget;
1317 995
1318 return eventResult; 996 return eventResult;
1319 } 997 }
1320 998
1321 void EventHandler::cancelDragAndDrop(const PlatformMouseEvent& event, DataTransf er* dataTransfer) 999 void EventHandler::cancelDragAndDrop(const PlatformMouseEvent& event, DataTransf er* dataTransfer)
1322 { 1000 {
1323 LocalFrame* targetFrame; 1001 LocalFrame* targetFrame;
1324 if (targetIsFrame(m_dragTarget.get(), targetFrame)) { 1002 if (targetIsFrame(m_dragTarget.get(), targetFrame)) {
1325 if (targetFrame) 1003 if (targetFrame)
1326 targetFrame->eventHandler().cancelDragAndDrop(event, dataTransfer); 1004 targetFrame->eventHandler().cancelDragAndDrop(event, dataTransfer);
1327 } else if (m_dragTarget.get()) { 1005 } else if (m_dragTarget.get()) {
1328 if (dragState().m_dragSrc) 1006 if (m_mouseEventManager->dragState().m_dragSrc)
1329 dispatchDragSrcEvent(EventTypeNames::drag, event); 1007 m_mouseEventManager->dispatchDragSrcEvent(EventTypeNames::drag, even t);
1330 dispatchDragEvent(EventTypeNames::dragleave, m_dragTarget.get(), event, dataTransfer); 1008 m_mouseEventManager->dispatchDragEvent(EventTypeNames::dragleave, m_drag Target.get(), event, dataTransfer);
1331 } 1009 }
1332 clearDragState(); 1010 clearDragState();
1333 } 1011 }
1334 1012
1335 WebInputEventResult EventHandler::performDragAndDrop(const PlatformMouseEvent& e vent, DataTransfer* dataTransfer) 1013 WebInputEventResult EventHandler::performDragAndDrop(const PlatformMouseEvent& e vent, DataTransfer* dataTransfer)
1336 { 1014 {
1337 LocalFrame* targetFrame; 1015 LocalFrame* targetFrame;
1338 WebInputEventResult result = WebInputEventResult::NotHandled; 1016 WebInputEventResult result = WebInputEventResult::NotHandled;
1339 if (targetIsFrame(m_dragTarget.get(), targetFrame)) { 1017 if (targetIsFrame(m_dragTarget.get(), targetFrame)) {
1340 if (targetFrame) 1018 if (targetFrame)
1341 result = targetFrame->eventHandler().performDragAndDrop(event, dataT ransfer); 1019 result = targetFrame->eventHandler().performDragAndDrop(event, dataT ransfer);
1342 } else if (m_dragTarget.get()) { 1020 } else if (m_dragTarget.get()) {
1343 result = dispatchDragEvent(EventTypeNames::drop, m_dragTarget.get(), eve nt, dataTransfer); 1021 result = m_mouseEventManager->dispatchDragEvent(EventTypeNames::drop, m_ dragTarget.get(), event, dataTransfer);
1344 } 1022 }
1345 clearDragState(); 1023 clearDragState();
1346 return result; 1024 return result;
1347 } 1025 }
1348 1026
1349 void EventHandler::clearDragHeuristicState()
1350 {
1351 // Used to prevent mouseMoveEvent from initiating a drag before
1352 // the mouse is pressed again.
1353 m_mousePressed = false;
1354 m_capturesDragging = false;
1355 m_mouseDownMayStartDrag = false;
1356 m_mouseDownMayStartAutoscroll = false;
1357 }
1358
1359 void EventHandler::clearDragState() 1027 void EventHandler::clearDragState()
1360 { 1028 {
1361 m_scrollManager->stopAutoscroll(); 1029 m_scrollManager->stopAutoscroll();
1362 m_dragTarget = nullptr; 1030 m_dragTarget = nullptr;
1363 m_capturingMouseEventsNode = nullptr; 1031 m_capturingMouseEventsNode = nullptr;
1364 m_shouldOnlyFireDragOverEvent = false; 1032 m_shouldOnlyFireDragOverEvent = false;
1365 } 1033 }
1366 1034
1367 void EventHandler::setCapturingMouseEventsNode(Node* n) 1035 void EventHandler::setCapturingMouseEventsNode(Node* n)
1368 { 1036 {
1369 m_capturingMouseEventsNode = n; 1037 m_capturingMouseEventsNode = n;
1370 m_eventHandlerWillResetCapturingMouseEventsNode = false; 1038 m_eventHandlerWillResetCapturingMouseEventsNode = false;
1371 } 1039 }
1372 1040
1373 MouseEventWithHitTestResults EventHandler::prepareMouseEvent(const HitTestReques t& request, const PlatformMouseEvent& mev) 1041 Node* EventHandler::updateMouseEventTargetNode(Node* targetNode)
1374 {
1375 ASSERT(m_frame);
1376 ASSERT(m_frame->document());
1377
1378 return m_frame->document()->prepareMouseEvent(request, contentPointFromRootF rame(m_frame, mev.position()), mev);
1379 }
1380
1381 Node* EventHandler::updateMouseEventTargetNode(Node* targetNode,
1382 const PlatformMouseEvent& mouseEvent)
1383 { 1042 {
1384 Node* newNodeUnderMouse = targetNode; 1043 Node* newNodeUnderMouse = targetNode;
1385 1044
1386 // If we're capturing, we always go right to that node. 1045 // If we're capturing, we always go right to that node.
1387 EventTarget* mousePointerCapturingNode = m_pointerEventManager->getMouseCapt uringNode(); 1046 EventTarget* mousePointerCapturingNode = m_pointerEventManager->getMouseCapt uringNode();
1388 if (mousePointerCapturingNode 1047 if (mousePointerCapturingNode
1389 && !RuntimeEnabledFeatures::pointerEventV1SpecCapturingEnabled()) { 1048 && !RuntimeEnabledFeatures::pointerEventV1SpecCapturingEnabled()) {
1390 newNodeUnderMouse = mousePointerCapturingNode->toNode(); 1049 newNodeUnderMouse = mousePointerCapturingNode->toNode();
1391 DCHECK(newNodeUnderMouse); 1050 DCHECK(newNodeUnderMouse);
1392 } else if (m_capturingMouseEventsNode) { 1051 } else if (m_capturingMouseEventsNode) {
1393 newNodeUnderMouse = m_capturingMouseEventsNode.get(); 1052 newNodeUnderMouse = m_capturingMouseEventsNode.get();
1394 } else { 1053 } else {
1395 // If the target node is a text node, dispatch on the parent node - rdar ://4196646 1054 // If the target node is a text node, dispatch on the parent node - rdar ://4196646
1396 if (newNodeUnderMouse && newNodeUnderMouse->isTextNode()) 1055 if (newNodeUnderMouse && newNodeUnderMouse->isTextNode())
1397 newNodeUnderMouse = FlatTreeTraversal::parent(*newNodeUnderMouse); 1056 newNodeUnderMouse = FlatTreeTraversal::parent(*newNodeUnderMouse);
1398 } 1057 }
1399 Node* lastNodeUnderMouse = m_nodeUnderMouse; 1058 return newNodeUnderMouse;
1400 m_nodeUnderMouse = newNodeUnderMouse;
1401
1402 PaintLayer* layerForLastNode = layerForNode(lastNodeUnderMouse);
1403 PaintLayer* layerForNodeUnderMouse = layerForNode(m_nodeUnderMouse.get());
1404 Page* page = m_frame->page();
1405
1406 if (lastNodeUnderMouse && (!m_nodeUnderMouse || m_nodeUnderMouse->document() != m_frame->document())) {
1407 // The mouse has moved between frames.
1408 if (LocalFrame* frame = lastNodeUnderMouse->document().frame()) {
1409 if (FrameView* frameView = frame->view())
1410 frameView->mouseExitedContentArea();
1411 }
1412 } else if (page && (layerForLastNode && (!layerForNodeUnderMouse || layerFor NodeUnderMouse != layerForLastNode))) {
1413 // The mouse has moved between layers.
1414 if (ScrollableArea* scrollableAreaForLastNode = associatedScrollableArea (layerForLastNode))
1415 scrollableAreaForLastNode->mouseExitedContentArea();
1416 }
1417
1418 if (m_nodeUnderMouse && (!lastNodeUnderMouse || lastNodeUnderMouse->document () != m_frame->document())) {
1419 // The mouse has moved between frames.
1420 if (LocalFrame* frame = m_nodeUnderMouse->document().frame()) {
1421 if (FrameView* frameView = frame->view())
1422 frameView->mouseEnteredContentArea();
1423 }
1424 } else if (page && (layerForNodeUnderMouse && (!layerForLastNode || layerFor NodeUnderMouse != layerForLastNode))) {
1425 // The mouse has moved between layers.
1426 if (ScrollableArea* scrollableAreaForNodeUnderMouse = associatedScrollab leArea(layerForNodeUnderMouse))
1427 scrollableAreaForNodeUnderMouse->mouseEnteredContentArea();
1428 }
1429
1430 if (lastNodeUnderMouse && lastNodeUnderMouse->document() != m_frame->documen t()) {
1431 lastNodeUnderMouse = nullptr;
1432 m_lastScrollbarUnderMouse = nullptr;
1433 }
1434
1435 return lastNodeUnderMouse;
1436 }
1437
1438 void EventHandler::updateMouseEventTargetNodeAndSendEvents(Node* targetNode,
1439 const PlatformMouseEvent& mouseEvent, bool isFrameBoundaryTransition)
1440 {
1441 Node* lastNodeUnderMouse = updateMouseEventTargetNode(targetNode, mouseEvent );
1442 m_pointerEventManager->sendMouseAndPossiblyPointerBoundaryEvents(
1443 lastNodeUnderMouse, m_nodeUnderMouse, mouseEvent,
1444 isFrameBoundaryTransition);
1445 }
1446
1447 WebInputEventResult EventHandler::dispatchMouseEvent(const AtomicString& eventTy pe, Node* targetNode, int clickCount, const PlatformMouseEvent& mouseEvent)
1448 {
1449 updateMouseEventTargetNodeAndSendEvents(targetNode, mouseEvent);
1450
1451 return m_mouseEventManager->dispatchMouseEvent(m_nodeUnderMouse, eventType,
1452 mouseEvent, nullptr, clickCount);
1453 } 1059 }
1454 1060
1455 bool EventHandler::isPointerEventActive(int pointerId) 1061 bool EventHandler::isPointerEventActive(int pointerId)
1456 { 1062 {
1457 return m_pointerEventManager->isActive(pointerId); 1063 return m_pointerEventManager->isActive(pointerId);
1458 } 1064 }
1459 1065
1460 void EventHandler::setPointerCapture(int pointerId, EventTarget* target) 1066 void EventHandler::setPointerCapture(int pointerId, EventTarget* target)
1461 { 1067 {
1462 // TODO(crbug.com/591387): This functionality should be per page not per fra me. 1068 // TODO(crbug.com/591387): This functionality should be per page not per fra me.
(...skipping 13 matching lines...) Expand all
1476 bool EventHandler::hasProcessedPointerCapture(int pointerId, const EventTarget* target) const 1082 bool EventHandler::hasProcessedPointerCapture(int pointerId, const EventTarget* target) const
1477 { 1083 {
1478 return m_pointerEventManager->hasProcessedPointerCapture(pointerId, target); 1084 return m_pointerEventManager->hasProcessedPointerCapture(pointerId, target);
1479 } 1085 }
1480 1086
1481 void EventHandler::elementRemoved(EventTarget* target) 1087 void EventHandler::elementRemoved(EventTarget* target)
1482 { 1088 {
1483 m_pointerEventManager->elementRemoved(target); 1089 m_pointerEventManager->elementRemoved(target);
1484 } 1090 }
1485 1091
1486 // TODO(mustaq): Make PE drive ME dispatch & bookkeeping in EventHandler. 1092 WebInputEventResult EventHandler::updatePointerTargetAndDispatchEvents(const Ato micString& mouseEventType, Node* targetNode, const PlatformMouseEvent& mouseEven t)
1487 WebInputEventResult EventHandler::updatePointerTargetAndDispatchEvents(const Ato micString& mouseEventType, Node* targetNode, int clickCount, const PlatformMouse Event& mouseEvent)
1488 { 1093 {
1489 ASSERT(mouseEventType == EventTypeNames::mousedown 1094 ASSERT(mouseEventType == EventTypeNames::mousedown
1490 || mouseEventType == EventTypeNames::mousemove 1095 || mouseEventType == EventTypeNames::mousemove
1491 || mouseEventType == EventTypeNames::mouseup); 1096 || mouseEventType == EventTypeNames::mouseup);
1492 1097
1493 Node* lastNodeUnderMouse = updateMouseEventTargetNode(targetNode, mouseEvent );
1494
1495 Node* newNodeUnderMouse = nullptr;
1496 const auto& eventResult = m_pointerEventManager->sendMousePointerEvent( 1098 const auto& eventResult = m_pointerEventManager->sendMousePointerEvent(
1497 m_nodeUnderMouse, mouseEventType, clickCount, mouseEvent, 1099 updateMouseEventTargetNode(targetNode), mouseEventType, mouseEvent);
1498 lastNodeUnderMouse, &newNodeUnderMouse);
1499 m_nodeUnderMouse = newNodeUnderMouse;
1500 return eventResult; 1100 return eventResult;
1501 } 1101 }
1502 1102
1503 void EventHandler::setClickNode(Node* node)
1504 {
1505 m_clickNode = node;
1506 }
1507
1508 WebInputEventResult EventHandler::handleMouseFocus(const HitTestResult& hitTestR esult, InputDeviceCapabilities* sourceCapabilities)
1509 {
1510 // If clicking on a frame scrollbar, do not mess up with content focus.
1511 if (hitTestResult.scrollbar() && !m_frame->contentLayoutItem().isNull()) {
1512 if (hitTestResult.scrollbar()->getScrollableArea() == m_frame->contentLa youtItem().getScrollableArea())
1513 return WebInputEventResult::NotHandled;
1514 }
1515
1516 // The layout needs to be up to date to determine if an element is focusable .
1517 m_frame->document()->updateStyleAndLayoutIgnorePendingStylesheets();
1518
1519 Element* element = nullptr;
1520 if (m_nodeUnderMouse)
1521 element = m_nodeUnderMouse->isElementNode() ? toElement(m_nodeUnderMouse ) : m_nodeUnderMouse->parentOrShadowHostElement();
1522 for (; element; element = element->parentOrShadowHostElement()) {
1523 if (element->isFocusable() && element->isFocusedElementInDocument())
1524 return WebInputEventResult::NotHandled;
1525 if (element->isMouseFocusable())
1526 break;
1527 }
1528 ASSERT(!element || element->isMouseFocusable());
1529
1530 // To fix <rdar://problem/4895428> Can't drag selected ToDo, we don't focus
1531 // a node on mouse down if it's selected and inside a focused node. It will
1532 // be focused if the user does a mouseup over it, however, because the
1533 // mouseup will set a selection inside it, which will call
1534 // FrameSelection::setFocusedNodeIfNeeded.
1535 if (element && m_frame->selection().isRange()) {
1536 // TODO(yosin) We should not create |Range| object for calling
1537 // |isNodeFullyContained()|.
1538 if (createRange(m_frame->selection().selection().toNormalizedEphemeralRa nge())->isNodeFullyContained(*element)
1539 && element->isDescendantOf(m_frame->document()->focusedElement()))
1540 return WebInputEventResult::NotHandled;
1541 }
1542
1543
1544 // Only change the focus when clicking scrollbars if it can transfered to a
1545 // mouse focusable node.
1546 if (!element && hitTestResult.scrollbar())
1547 return WebInputEventResult::HandledSystem;
1548
1549 if (Page* page = m_frame->page()) {
1550 // If focus shift is blocked, we eat the event. Note we should never
1551 // clear swallowEvent if the page already set it (e.g., by canceling
1552 // default behavior).
1553 if (element) {
1554 if (slideFocusOnShadowHostIfNecessary(*element))
1555 return WebInputEventResult::HandledSystem;
1556 if (!page->focusController().setFocusedElement(element, m_frame, Foc usParams(SelectionBehaviorOnFocus::None, WebFocusTypeMouse, sourceCapabilities)) )
1557 return WebInputEventResult::HandledSystem;
1558 } else {
1559 // We call setFocusedElement even with !element in order to blur
1560 // current focus element when a link is clicked; this is expected by
1561 // some sites that rely on onChange handlers running from form
1562 // fields before the button click is processed.
1563 if (!page->focusController().setFocusedElement(nullptr, m_frame, Foc usParams(SelectionBehaviorOnFocus::None, WebFocusTypeNone, sourceCapabilities)))
1564 return WebInputEventResult::HandledSystem;
1565 }
1566 }
1567
1568 return WebInputEventResult::NotHandled;
1569 }
1570
1571 bool EventHandler::slideFocusOnShadowHostIfNecessary(const Element& element)
1572 {
1573 if (element.authorShadowRoot() && element.authorShadowRoot()->delegatesFocus ()) {
1574 Document* doc = m_frame->document();
1575 if (element.isShadowIncludingInclusiveAncestorOf(doc->focusedElement())) {
1576 // If the inner element is already focused, do nothing.
1577 return true;
1578 }
1579
1580 // If the host has a focusable inner element, focus it. Otherwise, the h ost takes focus.
1581 Page* page = m_frame->page();
1582 ASSERT(page);
1583 Element* found = page->focusController().findFocusableElementInShadowHos t(element);
1584 if (found && element.isShadowIncludingInclusiveAncestorOf(found)) {
1585 // Use WebFocusTypeForward instead of WebFocusTypeMouse here to mean the focus has slided.
1586 found->focus(FocusParams(SelectionBehaviorOnFocus::Reset, WebFocusTy peForward, nullptr));
1587 return true;
1588 }
1589 }
1590 return false;
1591 }
1592
1593 WebInputEventResult EventHandler::handleWheelEvent(const PlatformWheelEvent& eve nt) 1103 WebInputEventResult EventHandler::handleWheelEvent(const PlatformWheelEvent& eve nt)
1594 { 1104 {
1595 #if OS(MACOSX) 1105 #if OS(MACOSX)
1596 // Filter Mac OS specific phases, usually with a zero-delta. 1106 // Filter Mac OS specific phases, usually with a zero-delta.
1597 // https://crbug.com/553732 1107 // https://crbug.com/553732
1598 // TODO(chongz): EventSender sends events with |PlatformWheelEventPhaseNone| , but it shouldn't. 1108 // TODO(chongz): EventSender sends events with |PlatformWheelEventPhaseNone| , but it shouldn't.
1599 const int kPlatformWheelEventPhaseNoEventMask = PlatformWheelEventPhaseEnded | PlatformWheelEventPhaseCancelled | PlatformWheelEventPhaseMayBegin; 1109 const int kPlatformWheelEventPhaseNoEventMask = PlatformWheelEventPhaseEnded | PlatformWheelEventPhaseCancelled | PlatformWheelEventPhaseMayBegin;
1600 if ((event.phase() & kPlatformWheelEventPhaseNoEventMask) || (event.momentum Phase() & kPlatformWheelEventPhaseNoEventMask)) 1110 if ((event.phase() & kPlatformWheelEventPhaseNoEventMask) || (event.momentum Phase() & kPlatformWheelEventPhaseNoEventMask))
1601 return WebInputEventResult::NotHandled; 1111 return WebInputEventResult::NotHandled;
1602 #endif 1112 #endif
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after
1697 WebInputEventResult EventHandler::handleGestureScrollEnd(const PlatformGestureEv ent& gestureEvent) 1207 WebInputEventResult EventHandler::handleGestureScrollEnd(const PlatformGestureEv ent& gestureEvent)
1698 { 1208 {
1699 return m_scrollManager->handleGestureScrollEnd(gestureEvent); 1209 return m_scrollManager->handleGestureScrollEnd(gestureEvent);
1700 } 1210 }
1701 1211
1702 bool EventHandler::isScrollbarHandlingGestures() const 1212 bool EventHandler::isScrollbarHandlingGestures() const
1703 { 1213 {
1704 return m_scrollManager->isScrollbarHandlingGestures(); 1214 return m_scrollManager->isScrollbarHandlingGestures();
1705 } 1215 }
1706 1216
1217 void EventHandler::setMouseDownMayStartAutoscroll()
1218 {
1219 m_mouseEventManager->setMouseDownMayStartAutoscroll();
1220 }
1221
1707 bool EventHandler::shouldApplyTouchAdjustment(const PlatformGestureEvent& event) const 1222 bool EventHandler::shouldApplyTouchAdjustment(const PlatformGestureEvent& event) const
1708 { 1223 {
1709 if (m_frame->settings() && !m_frame->settings()->touchAdjustmentEnabled()) 1224 if (m_frame->settings() && !m_frame->settings()->touchAdjustmentEnabled())
1710 return false; 1225 return false;
1711 return !event.area().isEmpty(); 1226 return !event.area().isEmpty();
1712 } 1227 }
1713 1228
1714 bool EventHandler::bestClickableNodeForHitTestResult(const HitTestResult& result , IntPoint& targetPoint, Node*& targetNode) 1229 bool EventHandler::bestClickableNodeForHitTestResult(const HitTestResult& result , IntPoint& targetPoint, Node*& targetNode)
1715 { 1230 {
1716 // FIXME: Unify this with the other best* functions which are very similar. 1231 // FIXME: Unify this with the other best* functions which are very similar.
(...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after
1839 enteredFrameChain.append(enteredFrameInDocument); 1354 enteredFrameChain.append(enteredFrameInDocument);
1840 Frame* parentFrame = enteredFrameInDocument->tree().parent(); 1355 Frame* parentFrame = enteredFrameInDocument->tree().parent();
1841 enteredFrameInDocument = parentFrame && parentFrame->isLocalFrame() ? to LocalFrame(parentFrame) : nullptr; 1356 enteredFrameInDocument = parentFrame && parentFrame->isLocalFrame() ? to LocalFrame(parentFrame) : nullptr;
1842 } 1357 }
1843 1358
1844 size_t indexEnteredFrameChain = enteredFrameChain.size(); 1359 size_t indexEnteredFrameChain = enteredFrameChain.size();
1845 LocalFrame* exitedFrameInDocument = m_frame; 1360 LocalFrame* exitedFrameInDocument = m_frame;
1846 HeapVector<Member<LocalFrame>> exitedFrameChain; 1361 HeapVector<Member<LocalFrame>> exitedFrameChain;
1847 // Insert the frame from the disagreement between last frames and entered fr ames 1362 // Insert the frame from the disagreement between last frames and entered fr ames
1848 while (exitedFrameInDocument) { 1363 while (exitedFrameInDocument) {
1849 Node* lastNodeUnderTap = exitedFrameInDocument->eventHandler().m_nodeUnd erMouse.get(); 1364 Node* lastNodeUnderTap = exitedFrameInDocument->eventHandler().m_mouseEv entManager->getNodeUnderMouse();
1850 if (!lastNodeUnderTap) 1365 if (!lastNodeUnderTap)
1851 break; 1366 break;
1852 1367
1853 LocalFrame* nextExitedFrameInDocument = nullptr; 1368 LocalFrame* nextExitedFrameInDocument = nullptr;
1854 if (lastNodeUnderTap->isFrameOwnerElement()) { 1369 if (lastNodeUnderTap->isFrameOwnerElement()) {
1855 HTMLFrameOwnerElement* owner = toHTMLFrameOwnerElement(lastNodeUnder Tap); 1370 HTMLFrameOwnerElement* owner = toHTMLFrameOwnerElement(lastNodeUnder Tap);
1856 if (owner->contentFrame() && owner->contentFrame()->isLocalFrame()) 1371 if (owner->contentFrame() && owner->contentFrame()->isLocalFrame())
1857 nextExitedFrameInDocument = toLocalFrame(owner->contentFrame()); 1372 nextExitedFrameInDocument = toLocalFrame(owner->contentFrame());
1858 } 1373 }
1859 1374
(...skipping 13 matching lines...) Expand all
1873 unsigned modifiers = gestureEvent.getModifiers(); 1388 unsigned modifiers = gestureEvent.getModifiers();
1874 PlatformMouseEvent fakeMouseMove(gestureEvent.position(), gestureEvent.globa lPosition(), 1389 PlatformMouseEvent fakeMouseMove(gestureEvent.position(), gestureEvent.globa lPosition(),
1875 WebPointerProperties::Button::NoButton, PlatformEvent::MouseMoved, /* cl ickCount */ 0, 1390 WebPointerProperties::Button::NoButton, PlatformEvent::MouseMoved, /* cl ickCount */ 0,
1876 static_cast<PlatformEvent::Modifiers>(modifiers), 1391 static_cast<PlatformEvent::Modifiers>(modifiers),
1877 PlatformMouseEvent::FromTouch, gestureEvent.timestamp(), WebPointerPrope rties::PointerType::Mouse); 1392 PlatformMouseEvent::FromTouch, gestureEvent.timestamp(), WebPointerPrope rties::PointerType::Mouse);
1878 1393
1879 // Update the mouseout/mouseleave event 1394 // Update the mouseout/mouseleave event
1880 size_t indexExitedFrameChain = exitedFrameChain.size(); 1395 size_t indexExitedFrameChain = exitedFrameChain.size();
1881 while (indexExitedFrameChain) { 1396 while (indexExitedFrameChain) {
1882 LocalFrame* leaveFrame = exitedFrameChain[--indexExitedFrameChain]; 1397 LocalFrame* leaveFrame = exitedFrameChain[--indexExitedFrameChain];
1883 leaveFrame->eventHandler().updateMouseEventTargetNodeAndSendEvents(nullp tr, fakeMouseMove); 1398 leaveFrame->eventHandler().m_mouseEventManager->setNodeUnderMouse(update MouseEventTargetNode(nullptr), fakeMouseMove);
1884 } 1399 }
1885 1400
1886 // update the mouseover/mouseenter event 1401 // update the mouseover/mouseenter event
1887 while (indexEnteredFrameChain) { 1402 while (indexEnteredFrameChain) {
1888 Frame* parentFrame = enteredFrameChain[--indexEnteredFrameChain]->tree() .parent(); 1403 Frame* parentFrame = enteredFrameChain[--indexEnteredFrameChain]->tree() .parent();
1889 if (parentFrame && parentFrame->isLocalFrame()) 1404 if (parentFrame && parentFrame->isLocalFrame())
1890 toLocalFrame(parentFrame)->eventHandler().updateMouseEventTargetNode AndSendEvents(toHTMLFrameOwnerElement(enteredFrameChain[indexEnteredFrameChain]- >owner()), fakeMouseMove); 1405 toLocalFrame(parentFrame)->eventHandler().m_mouseEventManager->setNo deUnderMouse(updateMouseEventTargetNode(toHTMLFrameOwnerElement(enteredFrameChai n[indexEnteredFrameChain]->owner())), fakeMouseMove);
1891 } 1406 }
1892 } 1407 }
1893 1408
1894 GestureEventWithHitTestResults EventHandler::targetGestureEvent(const PlatformGe stureEvent& gestureEvent, bool readOnly) 1409 GestureEventWithHitTestResults EventHandler::targetGestureEvent(const PlatformGe stureEvent& gestureEvent, bool readOnly)
1895 { 1410 {
1896 TRACE_EVENT0("input", "EventHandler::targetGestureEvent"); 1411 TRACE_EVENT0("input", "EventHandler::targetGestureEvent");
1897 1412
1898 ASSERT(m_frame == m_frame->localFrameRoot()); 1413 ASSERT(m_frame == m_frame->localFrameRoot());
1899 // Scrolling events get hit tested per frame (like wheel events do). 1414 // Scrolling events get hit tested per frame (like wheel events do).
1900 ASSERT(!gestureEvent.isScrollEvent()); 1415 ASSERT(!gestureEvent.isScrollEvent());
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after
1999 } 1514 }
2000 } 1515 }
2001 1516
2002 WebInputEventResult EventHandler::sendContextMenuEvent(const PlatformMouseEvent& event, Node* overrideTargetNode) 1517 WebInputEventResult EventHandler::sendContextMenuEvent(const PlatformMouseEvent& event, Node* overrideTargetNode)
2003 { 1518 {
2004 FrameView* v = m_frame->view(); 1519 FrameView* v = m_frame->view();
2005 if (!v) 1520 if (!v)
2006 return WebInputEventResult::NotHandled; 1521 return WebInputEventResult::NotHandled;
2007 1522
2008 // Clear mouse press state to avoid initiating a drag while context menu is up. 1523 // Clear mouse press state to avoid initiating a drag while context menu is up.
2009 m_mousePressed = false; 1524 m_mouseEventManager->setMousePressed(false);
2010 LayoutPoint positionInContents = v->rootFrameToContents(event.position()); 1525 LayoutPoint positionInContents = v->rootFrameToContents(event.position());
2011 HitTestRequest request(HitTestRequest::Active); 1526 HitTestRequest request(HitTestRequest::Active);
2012 MouseEventWithHitTestResults mev = m_frame->document()->prepareMouseEvent(re quest, positionInContents, event); 1527 MouseEventWithHitTestResults mev = m_frame->document()->performMouseEventHit Test(request, positionInContents, event);
2013 // Since |Document::prepareMouseEvent()| modifies layout tree for setting 1528 // Since |Document::performMouseEventHitTest| modifies layout tree for setti ng
2014 // hover element, we need to update layout tree for requirement of 1529 // hover element, we need to update layout tree for requirement of
2015 // |SelectionController::sendContextMenuEvent()|. 1530 // |SelectionController::sendContextMenuEvent()|.
2016 m_frame->document()->updateStyleAndLayoutIgnorePendingStylesheets(); 1531 m_frame->document()->updateStyleAndLayoutIgnorePendingStylesheets();
2017 1532
2018 selectionController().sendContextMenuEvent(mev, positionInContents); 1533 selectionController().sendContextMenuEvent(mev, positionInContents);
2019 1534
2020 Node* targetNode = overrideTargetNode ? overrideTargetNode : mev.innerNode() ; 1535 Node* targetNode = overrideTargetNode ? overrideTargetNode : mev.innerNode() ;
2021 return dispatchMouseEvent(EventTypeNames::contextmenu, targetNode, 0, event) ; 1536 return m_mouseEventManager->dispatchMouseEvent(updateMouseEventTargetNode(ta rgetNode), EventTypeNames::contextmenu, event, 0);
2022 } 1537 }
2023 1538
2024 WebInputEventResult EventHandler::sendContextMenuEventForKey(Element* overrideTa rgetElement) 1539 WebInputEventResult EventHandler::sendContextMenuEventForKey(Element* overrideTa rgetElement)
2025 { 1540 {
2026 FrameView* view = m_frame->view(); 1541 FrameView* view = m_frame->view();
2027 if (!view) 1542 if (!view)
2028 return WebInputEventResult::NotHandled; 1543 return WebInputEventResult::NotHandled;
2029 1544
2030 Document* doc = m_frame->document(); 1545 Document* doc = m_frame->document();
2031 if (!doc) 1546 if (!doc)
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after
2107 m_cursorUpdateTimer.startOneShot(cursorUpdateInterval, BLINK_FROM_HERE); 1622 m_cursorUpdateTimer.startOneShot(cursorUpdateInterval, BLINK_FROM_HERE);
2108 } 1623 }
2109 1624
2110 bool EventHandler::cursorUpdatePending() 1625 bool EventHandler::cursorUpdatePending()
2111 { 1626 {
2112 return m_cursorUpdateTimer.isActive(); 1627 return m_cursorUpdateTimer.isActive();
2113 } 1628 }
2114 1629
2115 void EventHandler::dispatchFakeMouseMoveEventSoon() 1630 void EventHandler::dispatchFakeMouseMoveEventSoon()
2116 { 1631 {
2117 if (m_mousePressed) 1632 m_mouseEventManager->dispatchFakeMouseMoveEventSoon();
2118 return;
2119
2120 if (m_mousePositionIsUnknown)
2121 return;
2122
2123 Settings* settings = m_frame->settings();
2124 if (settings && !settings->deviceSupportsMouse())
2125 return;
2126
2127 // Reschedule the timer, to prevent dispatching mouse move events
2128 // during a scroll. This avoids a potential source of scroll jank.
2129 if (m_fakeMouseMoveEventTimer.isActive())
2130 m_fakeMouseMoveEventTimer.stop();
2131 m_fakeMouseMoveEventTimer.startOneShot(fakeMouseMoveInterval, BLINK_FROM_HER E);
2132 } 1633 }
2133 1634
2134 void EventHandler::dispatchFakeMouseMoveEventSoonInQuad(const FloatQuad& quad) 1635 void EventHandler::dispatchFakeMouseMoveEventSoonInQuad(const FloatQuad& quad)
2135 { 1636 {
2136 FrameView* view = m_frame->view(); 1637 m_mouseEventManager->dispatchFakeMouseMoveEventSoonInQuad(quad);
2137 if (!view)
2138 return;
2139
2140 if (!quad.containsPoint(view->rootFrameToContents(m_lastKnownMousePosition)) )
2141 return;
2142
2143 dispatchFakeMouseMoveEventSoon();
2144 }
2145
2146 void EventHandler::fakeMouseMoveEventTimerFired(TimerBase* timer)
2147 {
2148 TRACE_EVENT0("input", "EventHandler::fakeMouseMoveEventTimerFired");
2149 ASSERT_UNUSED(timer, timer == &m_fakeMouseMoveEventTimer);
2150 ASSERT(!m_mousePressed);
2151
2152 Settings* settings = m_frame->settings();
2153 if (settings && !settings->deviceSupportsMouse())
2154 return;
2155
2156 FrameView* view = m_frame->view();
2157 if (!view)
2158 return;
2159
2160 if (!m_frame->page() || !m_frame->page()->focusController().isActive())
2161 return;
2162
2163 // Don't dispatch a synthetic mouse move event if the mouse cursor is not vi sible to the user.
2164 if (!isCursorVisible())
2165 return;
2166
2167 PlatformMouseEvent fakeMouseMoveEvent(m_lastKnownMousePosition, m_lastKnownM ouseGlobalPosition, WebPointerProperties::Button::NoButton, PlatformEvent::Mouse Moved, 0, static_cast<PlatformEvent::Modifiers>(KeyboardEventManager::getCurrent ModifierState()), PlatformMouseEvent::RealOrIndistinguishable, monotonicallyIncr easingTime(), WebPointerProperties::PointerType::Mouse);
2168 handleMouseMoveEvent(fakeMouseMoveEvent);
2169 }
2170
2171 void EventHandler::cancelFakeMouseMoveEvent()
2172 {
2173 m_fakeMouseMoveEventTimer.stop();
2174 }
2175
2176 bool EventHandler::isCursorVisible() const
2177 {
2178 return m_frame->page()->isCursorVisible();
2179 } 1638 }
2180 1639
2181 void EventHandler::setResizingFrameSet(HTMLFrameSetElement* frameSet) 1640 void EventHandler::setResizingFrameSet(HTMLFrameSetElement* frameSet)
2182 { 1641 {
2183 m_frameSetBeingResized = frameSet; 1642 m_frameSetBeingResized = frameSet;
2184 } 1643 }
2185 1644
2186 void EventHandler::resizeScrollableAreaDestroyed() 1645 void EventHandler::resizeScrollableAreaDestroyed()
2187 { 1646 {
2188 m_scrollManager->clearResizeScrollableArea(true); 1647 m_scrollManager->clearResizeScrollableArea(true);
2189 } 1648 }
2190 1649
2191 void EventHandler::hoverTimerFired(TimerBase*) 1650 void EventHandler::hoverTimerFired(TimerBase*)
2192 { 1651 {
2193 TRACE_EVENT0("input", "EventHandler::hoverTimerFired"); 1652 TRACE_EVENT0("input", "EventHandler::hoverTimerFired");
2194 m_hoverTimer.stop(); 1653 m_hoverTimer.stop();
2195 1654
2196 ASSERT(m_frame); 1655 ASSERT(m_frame);
2197 ASSERT(m_frame->document()); 1656 ASSERT(m_frame->document());
2198 1657
2199 if (LayoutViewItem layoutItem = m_frame->contentLayoutItem()) { 1658 if (LayoutViewItem layoutItem = m_frame->contentLayoutItem()) {
2200 if (FrameView* view = m_frame->view()) { 1659 if (FrameView* view = m_frame->view()) {
2201 HitTestRequest request(HitTestRequest::Move); 1660 HitTestRequest request(HitTestRequest::Move);
2202 HitTestResult result(request, view->rootFrameToContents(m_lastKnownM ousePosition)); 1661 HitTestResult result(request, view->rootFrameToContents(m_mouseEvent Manager->lastKnownMousePosition()));
2203 layoutItem.hitTest(result); 1662 layoutItem.hitTest(result);
2204 m_frame->document()->updateHoverActiveState(request, result.innerEle ment()); 1663 m_frame->document()->updateHoverActiveState(request, result.innerEle ment());
2205 } 1664 }
2206 } 1665 }
2207 } 1666 }
2208 1667
2209 void EventHandler::activeIntervalTimerFired(TimerBase*) 1668 void EventHandler::activeIntervalTimerFired(TimerBase*)
2210 { 1669 {
2211 TRACE_EVENT0("input", "EventHandler::activeIntervalTimerFired"); 1670 TRACE_EVENT0("input", "EventHandler::activeIntervalTimerFired");
2212 m_activeIntervalTimer.stop(); 1671 m_activeIntervalTimer.stop();
(...skipping 22 matching lines...) Expand all
2235 return m_keyboardEventManager->handleAccessKey(evt); 1694 return m_keyboardEventManager->handleAccessKey(evt);
2236 } 1695 }
2237 1696
2238 WebInputEventResult EventHandler::keyEvent(const WebKeyboardEvent& initialKeyEve nt) 1697 WebInputEventResult EventHandler::keyEvent(const WebKeyboardEvent& initialKeyEve nt)
2239 { 1698 {
2240 return m_keyboardEventManager->keyEvent(initialKeyEvent); 1699 return m_keyboardEventManager->keyEvent(initialKeyEvent);
2241 } 1700 }
2242 1701
2243 void EventHandler::defaultKeyboardEventHandler(KeyboardEvent* event) 1702 void EventHandler::defaultKeyboardEventHandler(KeyboardEvent* event)
2244 { 1703 {
2245 m_keyboardEventManager->defaultKeyboardEventHandler(event, m_mousePressNode) ; 1704 m_keyboardEventManager->defaultKeyboardEventHandler(event, m_mouseEventManag er->mousePressNode());
2246 }
2247
2248 bool EventHandler::dragHysteresisExceeded(const IntPoint& dragLocationInRootFram e) const
2249 {
2250 FrameView* view = m_frame->view();
2251 if (!view)
2252 return false;
2253 IntPoint dragLocation = view->rootFrameToContents(dragLocationInRootFrame);
2254 IntSize delta = dragLocation - m_mouseDownPos;
2255
2256 int threshold = GeneralDragHysteresis;
2257 switch (dragState().m_dragType) {
2258 case DragSourceActionSelection:
2259 threshold = TextDragHysteresis;
2260 break;
2261 case DragSourceActionImage:
2262 threshold = ImageDragHysteresis;
2263 break;
2264 case DragSourceActionLink:
2265 threshold = LinkDragHysteresis;
2266 break;
2267 case DragSourceActionDHTML:
2268 break;
2269 case DragSourceActionNone:
2270 ASSERT_NOT_REACHED();
2271 }
2272
2273 return abs(delta.width()) >= threshold || abs(delta.height()) >= threshold;
2274 }
2275
2276 void EventHandler::clearDragDataTransfer()
2277 {
2278 if (dragState().m_dragDataTransfer) {
2279 dragState().m_dragDataTransfer->clearDragImage();
2280 dragState().m_dragDataTransfer->setAccessPolicy(DataTransferNumb);
2281 }
2282 } 1705 }
2283 1706
2284 void EventHandler::dragSourceEndedAt(const PlatformMouseEvent& event, DragOperat ion operation) 1707 void EventHandler::dragSourceEndedAt(const PlatformMouseEvent& event, DragOperat ion operation)
2285 { 1708 {
2286 // Send a hit test request so that Layer gets a chance to update the :hover and :active pseudoclasses. 1709 m_mouseEventManager->dragSourceEndedAt(event, operation);
2287 HitTestRequest request(HitTestRequest::Release);
2288 prepareMouseEvent(request, event);
2289
2290 if (dragState().m_dragSrc) {
2291 dragState().m_dragDataTransfer->setDestinationOperation(operation);
2292 // for now we don't care if event handler cancels default behavior, sinc e there is none
2293 dispatchDragSrcEvent(EventTypeNames::dragend, event);
2294 }
2295 clearDragDataTransfer();
2296 dragState().m_dragSrc = nullptr;
2297 // In case the drag was ended due to an escape key press we need to ensure
2298 // that consecutive mousemove events don't reinitiate the drag and drop.
2299 m_mouseDownMayStartDrag = false;
2300 } 1710 }
2301 1711
2302 void EventHandler::updateDragStateAfterEditDragIfNeeded(Element* rootEditableEle ment) 1712 void EventHandler::updateDragStateAfterEditDragIfNeeded(Element* rootEditableEle ment)
2303 { 1713 {
2304 // If inserting the dragged contents removed the drag source, we still want to fire dragend at the root editble element. 1714 // If inserting the dragged contents removed the drag source, we still want to fire dragend at the root editble element.
2305 if (dragState().m_dragSrc && !dragState().m_dragSrc->isConnected()) 1715 if (m_mouseEventManager->dragState().m_dragSrc && !m_mouseEventManager->drag State().m_dragSrc->isConnected())
2306 dragState().m_dragSrc = rootEditableElement; 1716 m_mouseEventManager->dragState().m_dragSrc = rootEditableElement;
2307 }
2308
2309 // returns if we should continue "default processing", i.e., whether eventhandle r canceled
2310 WebInputEventResult EventHandler::dispatchDragSrcEvent(const AtomicString& event Type, const PlatformMouseEvent& event)
2311 {
2312 return dispatchDragEvent(eventType, dragState().m_dragSrc.get(), event, drag State().m_dragDataTransfer.get());
2313 }
2314
2315 bool EventHandler::handleDragDropIfPossible(const GestureEventWithHitTestResults & targetedEvent)
2316 {
2317 if (m_frame->settings() && m_frame->settings()->touchDragDropEnabled() && m_ frame->view()) {
2318 const PlatformGestureEvent& gestureEvent = targetedEvent.event();
2319 IntPoint adjustedPoint = gestureEvent.position();
2320 unsigned modifiers = gestureEvent.getModifiers();
2321
2322 // TODO(mustaq): Suppressing long-tap MouseEvents could break
2323 // drag-drop. Will do separately because of the risk. crbug.com/606938.
2324 PlatformMouseEvent mouseDownEvent(adjustedPoint, gestureEvent.globalPosi tion(), WebPointerProperties::Button::Left, PlatformEvent::MousePressed, 1,
2325 static_cast<PlatformEvent::Modifiers>(modifiers | PlatformEvent::Lef tButtonDown),
2326 PlatformMouseEvent::FromTouch, WTF::monotonicallyIncreasingTime(), W ebPointerProperties::PointerType::Mouse);
2327 m_mouseDown = mouseDownEvent;
2328
2329 PlatformMouseEvent mouseDragEvent(adjustedPoint, gestureEvent.globalPosi tion(), WebPointerProperties::Button::Left, PlatformEvent::MouseMoved, 1,
2330 static_cast<PlatformEvent::Modifiers>(modifiers | PlatformEvent::Lef tButtonDown),
2331 PlatformMouseEvent::FromTouch, WTF::monotonicallyIncreasingTime(), W ebPointerProperties::PointerType::Mouse);
2332 HitTestRequest request(HitTestRequest::ReadOnly);
2333 MouseEventWithHitTestResults mev = prepareMouseEvent(request, mouseDragE vent);
2334 m_mouseDownMayStartDrag = true;
2335 dragState().m_dragSrc = nullptr;
2336 m_mouseDownPos = m_frame->view()->rootFrameToContents(mouseDragEvent.pos ition());
2337 return handleDrag(mev, DragInitiator::Touch);
2338 }
2339 return false;
2340 }
2341
2342 bool EventHandler::handleDrag(const MouseEventWithHitTestResults& event, DragIni tiator initiator)
2343 {
2344 ASSERT(event.event().type() == PlatformEvent::MouseMoved);
2345 // Callers must protect the reference to FrameView, since this function may dispatch DOM
2346 // events, causing page/FrameView to go away.
2347 ASSERT(m_frame);
2348 ASSERT(m_frame->view());
2349 if (!m_frame->page())
2350 return false;
2351
2352 if (m_mouseDownMayStartDrag) {
2353 HitTestRequest request(HitTestRequest::ReadOnly);
2354 HitTestResult result(request, m_mouseDownPos);
2355 m_frame->contentLayoutItem().hitTest(result);
2356 Node* node = result.innerNode();
2357 if (node) {
2358 DragController::SelectionDragPolicy selectionDragPolicy = event.even t().timestamp() - m_mouseDownTimestamp < TextDragDelay
2359 ? DragController::DelayedSelectionDragResolution
2360 : DragController::ImmediateSelectionDragResolution;
2361 dragState().m_dragSrc = m_frame->page()->dragController().draggableN ode(m_frame, node, m_mouseDownPos, selectionDragPolicy, dragState().m_dragType);
2362 } else {
2363 dragState().m_dragSrc = nullptr;
2364 }
2365
2366 if (!dragState().m_dragSrc)
2367 m_mouseDownMayStartDrag = false; // no element is draggable
2368 }
2369
2370 if (!m_mouseDownMayStartDrag)
2371 return initiator == DragInitiator::Mouse && !selectionController().mouse DownMayStartSelect() && !m_mouseDownMayStartAutoscroll;
2372
2373 // We are starting a text/image/url drag, so the cursor should be an arrow
2374 // FIXME <rdar://7577595>: Custom cursors aren't supported during drag and d rop (default to pointer).
2375 m_frame->view()->setCursor(pointerCursor());
2376
2377 if (initiator == DragInitiator::Mouse && !dragHysteresisExceeded(event.event ().position()))
2378 return true;
2379
2380 // Once we're past the hysteresis point, we don't want to treat this gesture as a click
2381 invalidateClick();
2382
2383 if (!tryStartDrag(event)) {
2384 // Something failed to start the drag, clean up.
2385 clearDragDataTransfer();
2386 dragState().m_dragSrc = nullptr;
2387 }
2388
2389 m_mouseDownMayStartDrag = false;
2390 // Whether or not the drag actually started, no more default handling (like selection).
2391 return true;
2392 }
2393
2394 bool EventHandler::tryStartDrag(const MouseEventWithHitTestResults& event)
2395 {
2396 // The DataTransfer would only be non-empty if we missed a dragEnd.
2397 // Clear it anyway, just to make sure it gets numbified.
2398 clearDragDataTransfer();
2399
2400 dragState().m_dragDataTransfer = createDraggingDataTransfer();
2401
2402 // Check to see if this a DOM based drag, if it is get the DOM specified dra g
2403 // image and offset
2404 if (dragState().m_dragType == DragSourceActionDHTML) {
2405 if (LayoutObject* layoutObject = dragState().m_dragSrc->layoutObject()) {
2406 IntRect boundingIncludingDescendants = layoutObject->absoluteBoundin gBoxRectIncludingDescendants();
2407 IntSize delta = m_mouseDownPos - boundingIncludingDescendants.locati on();
2408 dragState().m_dragDataTransfer->setDragImageElement(dragState().m_dr agSrc.get(), IntPoint(delta));
2409 } else {
2410 // The layoutObject has disappeared, this can happen if the onStartD rag handler has hidden
2411 // the element in some way. In this case we just kill the drag.
2412 return false;
2413 }
2414 }
2415
2416 DragController& dragController = m_frame->page()->dragController();
2417 if (!dragController.populateDragDataTransfer(m_frame, dragState(), m_mouseDo wnPos))
2418 return false;
2419
2420 // If dispatching dragstart brings about another mouse down -- one way
2421 // this will happen is if a DevTools user breaks within a dragstart
2422 // handler and then clicks on the suspended page -- the drag state is
2423 // reset. Hence, need to check if this particular drag operation can
2424 // continue even if dispatchEvent() indicates no (direct) cancellation.
2425 // Do that by checking if m_dragSrc is still set.
2426 m_mouseDownMayStartDrag = dispatchDragSrcEvent(EventTypeNames::dragstart, m_ mouseDown) == WebInputEventResult::NotHandled
2427 && !m_frame->selection().isInPasswordField() && dragState().m_dragSrc;
2428
2429 // Invalidate clipboard here against anymore pasteboard writing for security . The drag
2430 // image can still be changed as we drag, but not the pasteboard data.
2431 dragState().m_dragDataTransfer->setAccessPolicy(DataTransferImageWritable);
2432
2433 if (m_mouseDownMayStartDrag) {
2434 // Dispatching the event could cause Page to go away. Make sure it's sti ll valid before trying to use DragController.
2435 if (m_frame->page() && dragController.startDrag(m_frame, dragState(), ev ent.event(), m_mouseDownPos))
2436 return true;
2437 // Drag was canned at the last minute - we owe m_dragSrc a DRAGEND event
2438 dispatchDragSrcEvent(EventTypeNames::dragend, event.event());
2439 }
2440
2441 return false;
2442 } 1717 }
2443 1718
2444 bool EventHandler::handleTextInputEvent(const String& text, Event* underlyingEve nt, TextEventInputType inputType) 1719 bool EventHandler::handleTextInputEvent(const String& text, Event* underlyingEve nt, TextEventInputType inputType)
2445 { 1720 {
2446 // Platforms should differentiate real commands like selectAll from text inp ut in disguise (like insertNewline), 1721 // Platforms should differentiate real commands like selectAll from text inp ut in disguise (like insertNewline),
2447 // and avoid dispatching text input events from keydown default handlers. 1722 // and avoid dispatching text input events from keydown default handlers.
2448 ASSERT(!underlyingEvent || !underlyingEvent->isKeyboardEvent() || toKeyboard Event(underlyingEvent)->type() == EventTypeNames::keypress); 1723 ASSERT(!underlyingEvent || !underlyingEvent->isKeyboardEvent() || toKeyboard Event(underlyingEvent)->type() == EventTypeNames::keypress);
2449 1724
2450 if (!m_frame) 1725 if (!m_frame)
2451 return false; 1726 return false;
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
2504 m_lastScrollbarUnderMouse = setLast ? scrollbar : nullptr; 1779 m_lastScrollbarUnderMouse = setLast ? scrollbar : nullptr;
2505 } 1780 }
2506 } 1781 }
2507 1782
2508 WebInputEventResult EventHandler::handleTouchEvent(const PlatformTouchEvent& eve nt) 1783 WebInputEventResult EventHandler::handleTouchEvent(const PlatformTouchEvent& eve nt)
2509 { 1784 {
2510 TRACE_EVENT0("blink", "EventHandler::handleTouchEvent"); 1785 TRACE_EVENT0("blink", "EventHandler::handleTouchEvent");
2511 return m_pointerEventManager->handleTouchEvents(event); 1786 return m_pointerEventManager->handleTouchEvents(event);
2512 } 1787 }
2513 1788
2514 void EventHandler::setLastKnownMousePosition(const PlatformMouseEvent& event)
2515 {
2516 m_mousePositionIsUnknown = false;
2517 m_lastKnownMousePosition = event.position();
2518 m_lastKnownMouseGlobalPosition = event.globalPosition();
2519 }
2520
2521 WebInputEventResult EventHandler::passMousePressEventToSubframe(MouseEventWithHi tTestResults& mev, LocalFrame* subframe) 1789 WebInputEventResult EventHandler::passMousePressEventToSubframe(MouseEventWithHi tTestResults& mev, LocalFrame* subframe)
2522 { 1790 {
2523 selectionController().passMousePressEventToSubframe(mev); 1791 selectionController().passMousePressEventToSubframe(mev);
2524 WebInputEventResult result = subframe->eventHandler().handleMousePressEvent( mev.event()); 1792 WebInputEventResult result = subframe->eventHandler().handleMousePressEvent( mev.event());
2525 if (result != WebInputEventResult::NotHandled) 1793 if (result != WebInputEventResult::NotHandled)
2526 return result; 1794 return result;
2527 return WebInputEventResult::HandledSystem; 1795 return WebInputEventResult::HandledSystem;
2528 } 1796 }
2529 1797
2530 WebInputEventResult EventHandler::passMouseMoveEventToSubframe(MouseEventWithHit TestResults& mev, LocalFrame* subframe, HitTestResult* hoveredNode) 1798 WebInputEventResult EventHandler::passMouseMoveEventToSubframe(MouseEventWithHit TestResults& mev, LocalFrame* subframe, HitTestResult* hoveredNode)
2531 { 1799 {
2532 if (m_mouseDownMayStartDrag) 1800 if (m_mouseEventManager->mouseDownMayStartDrag())
2533 return WebInputEventResult::NotHandled; 1801 return WebInputEventResult::NotHandled;
2534 WebInputEventResult result = subframe->eventHandler().handleMouseMoveOrLeave Event(mev.event(), hoveredNode); 1802 WebInputEventResult result = subframe->eventHandler().handleMouseMoveOrLeave Event(mev.event(), hoveredNode);
2535 if (result != WebInputEventResult::NotHandled) 1803 if (result != WebInputEventResult::NotHandled)
2536 return result; 1804 return result;
2537 return WebInputEventResult::HandledSystem; 1805 return WebInputEventResult::HandledSystem;
2538 } 1806 }
2539 1807
2540 WebInputEventResult EventHandler::passMouseReleaseEventToSubframe(MouseEventWith HitTestResults& mev, LocalFrame* subframe) 1808 WebInputEventResult EventHandler::passMouseReleaseEventToSubframe(MouseEventWith HitTestResults& mev, LocalFrame* subframe)
2541 { 1809 {
2542 WebInputEventResult result = subframe->eventHandler().handleMouseReleaseEven t(mev.event()); 1810 WebInputEventResult result = subframe->eventHandler().handleMouseReleaseEven t(mev.event());
2543 if (result != WebInputEventResult::NotHandled) 1811 if (result != WebInputEventResult::NotHandled)
2544 return result; 1812 return result;
2545 return WebInputEventResult::HandledSystem; 1813 return WebInputEventResult::HandledSystem;
2546 } 1814 }
2547 1815
2548 DataTransfer* EventHandler::createDraggingDataTransfer() const
2549 {
2550 return DataTransfer::create(DataTransfer::DragAndDrop, DataTransferWritable, DataObject::create());
2551 }
2552
2553 void EventHandler::focusDocumentView()
2554 {
2555 Page* page = m_frame->page();
2556 if (!page)
2557 return;
2558 page->focusController().focusDocumentView(m_frame);
2559 }
2560
2561 FrameHost* EventHandler::frameHost() const 1816 FrameHost* EventHandler::frameHost() const
2562 { 1817 {
2563 if (!m_frame->page()) 1818 if (!m_frame->page())
2564 return nullptr; 1819 return nullptr;
2565 1820
2566 return &m_frame->page()->frameHost(); 1821 return &m_frame->page()->frameHost();
2567 } 1822 }
2568 1823
2569 } // namespace blink 1824 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698