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

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

Issue 1463823003: Return a enumeration of the state of handling of InputEvents. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Rebase Created 5 years 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 24 matching lines...) Expand all
35 #include "core/clipboard/DataTransfer.h" 35 #include "core/clipboard/DataTransfer.h"
36 #include "core/dom/Document.h" 36 #include "core/dom/Document.h"
37 #include "core/dom/TouchList.h" 37 #include "core/dom/TouchList.h"
38 #include "core/dom/shadow/ComposedTreeTraversal.h" 38 #include "core/dom/shadow/ComposedTreeTraversal.h"
39 #include "core/dom/shadow/ShadowRoot.h" 39 #include "core/dom/shadow/ShadowRoot.h"
40 #include "core/editing/Editor.h" 40 #include "core/editing/Editor.h"
41 #include "core/editing/FrameSelection.h" 41 #include "core/editing/FrameSelection.h"
42 #include "core/editing/SelectionController.h" 42 #include "core/editing/SelectionController.h"
43 #include "core/events/DragEvent.h" 43 #include "core/events/DragEvent.h"
44 #include "core/events/EventPath.h" 44 #include "core/events/EventPath.h"
45 #include "core/events/GestureEvent.h"
45 #include "core/events/KeyboardEvent.h" 46 #include "core/events/KeyboardEvent.h"
46 #include "core/events/MouseEvent.h" 47 #include "core/events/MouseEvent.h"
47 #include "core/events/PointerEvent.h" 48 #include "core/events/PointerEvent.h"
48 #include "core/events/TextEvent.h" 49 #include "core/events/TextEvent.h"
49 #include "core/events/TouchEvent.h" 50 #include "core/events/TouchEvent.h"
50 #include "core/events/WheelEvent.h" 51 #include "core/events/WheelEvent.h"
51 #include "core/fetch/ImageResource.h" 52 #include "core/fetch/ImageResource.h"
52 #include "core/frame/EventHandlerRegistry.h" 53 #include "core/frame/EventHandlerRegistry.h"
53 #include "core/frame/FrameHost.h" 54 #include "core/frame/FrameHost.h"
54 #include "core/frame/FrameView.h" 55 #include "core/frame/FrameView.h"
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
96 #include "platform/scroll/Scrollbar.h" 97 #include "platform/scroll/Scrollbar.h"
97 #include "wtf/Assertions.h" 98 #include "wtf/Assertions.h"
98 #include "wtf/CurrentTime.h" 99 #include "wtf/CurrentTime.h"
99 #include "wtf/StdLibExtras.h" 100 #include "wtf/StdLibExtras.h"
100 #include "wtf/TemporaryChange.h" 101 #include "wtf/TemporaryChange.h"
101 102
102 namespace blink { 103 namespace blink {
103 104
104 namespace { 105 namespace {
105 106
107 WebInputEventResult mergeEventResult(WebInputEventResult responseA, WebInputEven tResult responseB)
108 {
109 // The ordering of the enumeration is specific. There are times that
110 // multiple events fire and we need to combine them into a single
111 // result code. The enumeration is based on the level of consumption that
112 // is most significant. The enumeration is ordered with smaller specified
113 // numbers first. Examples of merged results are:
114 // (HandledApplication, HandledSystem) -> HandledSystem
115 // (NotHandled, HandledApplication) -> HandledApplication
116 static_assert(static_cast<int>(WebInputEventResult::NotHandled) == 0, "WebIn putEventResult not ordered");
117 static_assert(static_cast<int>(WebInputEventResult::HandledSuppressed) < sta tic_cast<int>(WebInputEventResult::HandledApplication), "WebInputEventResult not ordered");
118 static_assert(static_cast<int>(WebInputEventResult::HandledApplication) < st atic_cast<int>(WebInputEventResult::HandledSystem), "WebInputEventResult not ord ered");
119 return static_cast<WebInputEventResult>(max(static_cast<int>(responseA), sta tic_cast<int>(responseB)));
120 }
121
122 WebInputEventResult eventToEventResult(PassRefPtrWillBeRawPtr<Event> event, bool res)
123 {
124 if (event->defaultPrevented())
125 return WebInputEventResult::HandledApplication;
126 if (event->defaultHandled())
127 return WebInputEventResult::HandledSystem;
128
129 // TODO(dtapuska): There are cases in the code where dispatchEvent
130 // returns false (indicated handled) but event is not marked
131 // as default handled or default prevented. crbug.com/560355
132 if (!res)
133 return WebInputEventResult::HandledSuppressed;
134 return WebInputEventResult::NotHandled;
135 }
136
106 bool isNodeInDocument(Node* n) 137 bool isNodeInDocument(Node* n)
107 { 138 {
108 return n && n->inDocument(); 139 return n && n->inDocument();
109 } 140 }
110 141
111 const AtomicString& touchEventNameForTouchPointState(PlatformTouchPoint::State s tate) 142 const AtomicString& touchEventNameForTouchPointState(PlatformTouchPoint::State s tate)
112 { 143 {
113 switch (state) { 144 switch (state) {
114 case PlatformTouchPoint::TouchReleased: 145 case PlatformTouchPoint::TouchReleased:
115 return EventTypeNames::touchend; 146 return EventTypeNames::touchend;
(...skipping 277 matching lines...) Expand 10 before | Expand all | Expand 10 after
393 424
394 void EventHandler::nodeWillBeRemoved(Node& nodeToBeRemoved) 425 void EventHandler::nodeWillBeRemoved(Node& nodeToBeRemoved)
395 { 426 {
396 if (nodeToBeRemoved.containsIncludingShadowDOM(m_clickNode.get())) { 427 if (nodeToBeRemoved.containsIncludingShadowDOM(m_clickNode.get())) {
397 // We don't dispatch click events if the mousedown node is removed 428 // We don't dispatch click events if the mousedown node is removed
398 // before a mouseup event. It is compatible with IE and Firefox. 429 // before a mouseup event. It is compatible with IE and Firefox.
399 m_clickNode = nullptr; 430 m_clickNode = nullptr;
400 } 431 }
401 } 432 }
402 433
403 bool EventHandler::handleMousePressEvent(const MouseEventWithHitTestResults& eve nt) 434 WebInputEventResult EventHandler::handleMousePressEvent(const MouseEventWithHitT estResults& event)
404 { 435 {
405 TRACE_EVENT0("blink", "EventHandler::handleMousePressEvent"); 436 TRACE_EVENT0("blink", "EventHandler::handleMousePressEvent");
406 437
407 // Reset drag state. 438 // Reset drag state.
408 dragState().m_dragSrc = nullptr; 439 dragState().m_dragSrc = nullptr;
409 440
410 cancelFakeMouseMoveEvent(); 441 cancelFakeMouseMoveEvent();
411 442
412 m_frame->document()->updateLayoutIgnorePendingStylesheets(); 443 m_frame->document()->updateLayoutIgnorePendingStylesheets();
413 444
414 if (FrameView* frameView = m_frame->view()) { 445 if (FrameView* frameView = m_frame->view()) {
415 if (frameView->isPointInScrollbarCorner(event.event().position())) 446 if (frameView->isPointInScrollbarCorner(event.event().position()))
416 return false; 447 return WebInputEventResult::NotHandled;
417 } 448 }
418 449
419 bool singleClick = event.event().clickCount() <= 1; 450 bool singleClick = event.event().clickCount() <= 1;
420 451
421 m_mouseDownMayStartDrag = singleClick; 452 m_mouseDownMayStartDrag = singleClick;
422 453
423 selectionController().handleMousePressEvent(event); 454 selectionController().handleMousePressEvent(event);
424 455
425 m_mouseDown = event.event(); 456 m_mouseDown = event.event();
426 457
427 if (m_frame->document()->isSVGDocument() && m_frame->document()->accessSVGEx tensions().zoomAndPanEnabled()) { 458 if (m_frame->document()->isSVGDocument() && m_frame->document()->accessSVGEx tensions().zoomAndPanEnabled()) {
428 if (event.event().shiftKey() && singleClick) { 459 if (event.event().shiftKey() && singleClick) {
429 m_svgPan = true; 460 m_svgPan = true;
430 m_frame->document()->accessSVGExtensions().startPan(m_frame->view()- >rootFrameToContents(event.event().position())); 461 m_frame->document()->accessSVGExtensions().startPan(m_frame->view()- >rootFrameToContents(event.event().position()));
431 return true; 462 return WebInputEventResult::HandledSystem;
432 } 463 }
433 } 464 }
434 465
435 // We don't do this at the start of mouse down handling, 466 // We don't do this at the start of mouse down handling,
436 // because we don't want to do it until we know we didn't hit a widget. 467 // because we don't want to do it until we know we didn't hit a widget.
437 if (singleClick) 468 if (singleClick)
438 focusDocumentView(); 469 focusDocumentView();
439 470
440 Node* innerNode = event.innerNode(); 471 Node* innerNode = event.innerNode();
441 472
442 m_mousePressNode = innerNode; 473 m_mousePressNode = innerNode;
443 m_dragStartPos = event.event().position(); 474 m_dragStartPos = event.event().position();
444 475
445 bool swallowEvent = false; 476 bool swallowEvent = false;
446 m_mousePressed = true; 477 m_mousePressed = true;
447 478
448 if (event.event().clickCount() == 2) 479 if (event.event().clickCount() == 2)
449 swallowEvent = selectionController().handleMousePressEventDoubleClick(ev ent); 480 swallowEvent = selectionController().handleMousePressEventDoubleClick(ev ent);
450 else if (event.event().clickCount() >= 3) 481 else if (event.event().clickCount() >= 3)
451 swallowEvent = selectionController().handleMousePressEventTripleClick(ev ent); 482 swallowEvent = selectionController().handleMousePressEventTripleClick(ev ent);
452 else 483 else
453 swallowEvent = selectionController().handleMousePressEventSingleClick(ev ent); 484 swallowEvent = selectionController().handleMousePressEventSingleClick(ev ent);
454 485
455 m_mouseDownMayStartAutoscroll = selectionController().mouseDownMayStartSelec t() 486 m_mouseDownMayStartAutoscroll = selectionController().mouseDownMayStartSelec t()
456 || (m_mousePressNode && m_mousePressNode->layoutBox() && m_mousePressNod e->layoutBox()->canBeProgramaticallyScrolled()); 487 || (m_mousePressNode && m_mousePressNode->layoutBox() && m_mousePressNod e->layoutBox()->canBeProgramaticallyScrolled());
457 488
458 return swallowEvent; 489 return swallowEvent ? WebInputEventResult::HandledSystem : WebInputEventResu lt::NotHandled;
459 } 490 }
460 491
461 bool EventHandler::handleMouseDraggedEvent(const MouseEventWithHitTestResults& e vent) 492 WebInputEventResult EventHandler::handleMouseDraggedEvent(const MouseEventWithHi tTestResults& event)
462 { 493 {
463 TRACE_EVENT0("blink", "EventHandler::handleMouseDraggedEvent"); 494 TRACE_EVENT0("blink", "EventHandler::handleMouseDraggedEvent");
464 495
465 // While resetting m_mousePressed here may seem out of place, it turns out 496 // While resetting m_mousePressed here may seem out of place, it turns out
466 // to be needed to handle some bugs^Wfeatures in Blink mouse event handling: 497 // to be needed to handle some bugs^Wfeatures in Blink mouse event handling:
467 // 1. Certain elements, such as <embed>, capture mouse events. They do not 498 // 1. Certain elements, such as <embed>, capture mouse events. They do not
468 // bubble back up. One way for a <embed> to start capturing mouse events 499 // bubble back up. One way for a <embed> to start capturing mouse events
469 // is on a mouse press. The problem is the <embed> node only starts 500 // is on a mouse press. The problem is the <embed> node only starts
470 // capturing mouse events *after* m_mousePressed for the containing frame 501 // capturing mouse events *after* m_mousePressed for the containing frame
471 // has already been set to true. As a result, the frame's EventHandler 502 // has already been set to true. As a result, the frame's EventHandler
472 // never sees the mouse release event, which is supposed to reset 503 // never sees the mouse release event, which is supposed to reset
473 // m_mousePressed... so m_mousePressed ends up remaining true until the 504 // m_mousePressed... so m_mousePressed ends up remaining true until the
474 // event handler finally gets another mouse released event. Oops. 505 // event handler finally gets another mouse released event. Oops.
475 // 2. Dragging doesn't start until after a mouse press event, but a drag 506 // 2. Dragging doesn't start until after a mouse press event, but a drag
476 // that ends as a result of a mouse release does not send a mouse release 507 // that ends as a result of a mouse release does not send a mouse release
477 // event. As a result, m_mousePressed also ends up remaining true until 508 // event. As a result, m_mousePressed also ends up remaining true until
478 // the next mouse release event seen by the EventHandler. 509 // the next mouse release event seen by the EventHandler.
479 if (event.event().button() != LeftButton) 510 if (event.event().button() != LeftButton)
480 m_mousePressed = false; 511 m_mousePressed = false;
481 512
482 if (!m_mousePressed) 513 if (!m_mousePressed)
483 return false; 514 return WebInputEventResult::NotHandled;
484 515
485 if (handleDrag(event, DragInitiator::Mouse)) 516 if (handleDrag(event, DragInitiator::Mouse))
486 return true; 517 return WebInputEventResult::HandledSystem;
487 518
488 Node* targetNode = event.innerNode(); 519 Node* targetNode = event.innerNode();
489 if (!targetNode) 520 if (!targetNode)
490 return false; 521 return WebInputEventResult::NotHandled;
491 522
492 LayoutObject* layoutObject = targetNode->layoutObject(); 523 LayoutObject* layoutObject = targetNode->layoutObject();
493 if (!layoutObject) { 524 if (!layoutObject) {
494 Node* parent = ComposedTreeTraversal::parent(*targetNode); 525 Node* parent = ComposedTreeTraversal::parent(*targetNode);
495 if (!parent) 526 if (!parent)
496 return false; 527 return WebInputEventResult::NotHandled;
497 528
498 layoutObject = parent->layoutObject(); 529 layoutObject = parent->layoutObject();
499 if (!layoutObject || !layoutObject->isListBox()) 530 if (!layoutObject || !layoutObject->isListBox())
500 return false; 531 return WebInputEventResult::NotHandled;
501 } 532 }
502 533
503 m_mouseDownMayStartDrag = false; 534 m_mouseDownMayStartDrag = false;
504 535
505 if (m_mouseDownMayStartAutoscroll && !panScrollInProgress()) { 536 if (m_mouseDownMayStartAutoscroll && !panScrollInProgress()) {
506 if (AutoscrollController* controller = autoscrollController()) { 537 if (AutoscrollController* controller = autoscrollController()) {
507 controller->startAutoscrollForSelection(layoutObject); 538 controller->startAutoscrollForSelection(layoutObject);
508 m_mouseDownMayStartAutoscroll = false; 539 m_mouseDownMayStartAutoscroll = false;
509 } 540 }
510 } 541 }
511 542
512 selectionController().handleMouseDraggedEvent(event, m_mouseDownPos, m_dragS tartPos, m_mousePressNode.get(), m_lastKnownMousePosition); 543 selectionController().handleMouseDraggedEvent(event, m_mouseDownPos, m_dragS tartPos, m_mousePressNode.get(), m_lastKnownMousePosition);
513 return true; 544 return WebInputEventResult::HandledSystem;
514 } 545 }
515 546
516 void EventHandler::updateSelectionForMouseDrag() 547 void EventHandler::updateSelectionForMouseDrag()
517 { 548 {
518 selectionController().updateSelectionForMouseDrag(m_mousePressNode.get(), m_ dragStartPos, m_lastKnownMousePosition); 549 selectionController().updateSelectionForMouseDrag(m_mousePressNode.get(), m_ dragStartPos, m_lastKnownMousePosition);
519 } 550 }
520 551
521 bool EventHandler::handleMouseReleaseEvent(const MouseEventWithHitTestResults& e vent) 552 WebInputEventResult EventHandler::handleMouseReleaseEvent(const MouseEventWithHi tTestResults& event)
522 { 553 {
523 AutoscrollController* controller = autoscrollController(); 554 AutoscrollController* controller = autoscrollController();
524 if (controller && controller->autoscrollInProgress()) 555 if (controller && controller->autoscrollInProgress())
525 stopAutoscroll(); 556 stopAutoscroll();
526 557
527 // Used to prevent mouseMoveEvent from initiating a drag before 558 // Used to prevent mouseMoveEvent from initiating a drag before
528 // the mouse is pressed again. 559 // the mouse is pressed again.
529 m_mousePressed = false; 560 m_mousePressed = false;
530 m_capturesDragging = false; 561 m_capturesDragging = false;
531 m_mouseDownMayStartDrag = false; 562 m_mouseDownMayStartDrag = false;
532 m_mouseDownMayStartAutoscroll = false; 563 m_mouseDownMayStartAutoscroll = false;
533 564
534 return selectionController().handleMouseReleaseEvent(event, m_dragStartPos); 565 return selectionController().handleMouseReleaseEvent(event, m_dragStartPos) ? WebInputEventResult::HandledSystem : WebInputEventResult::NotHandled;
535 } 566 }
536 567
537 #if OS(WIN) 568 #if OS(WIN)
538 569
539 void EventHandler::startPanScrolling(LayoutObject* layoutObject) 570 void EventHandler::startPanScrolling(LayoutObject* layoutObject)
540 { 571 {
541 if (!layoutObject->isBox()) 572 if (!layoutObject->isBox())
542 return; 573 return;
543 AutoscrollController* controller = autoscrollController(); 574 AutoscrollController* controller = autoscrollController();
544 if (!controller) 575 if (!controller)
(...skipping 396 matching lines...) Expand 10 before | Expand all | Expand 10 after
941 } 972 }
942 973
943 static LayoutPoint contentPointFromRootFrame(LocalFrame* frame, const IntPoint& pointInRootFrame) 974 static LayoutPoint contentPointFromRootFrame(LocalFrame* frame, const IntPoint& pointInRootFrame)
944 { 975 {
945 FrameView* view = frame->view(); 976 FrameView* view = frame->view();
946 // FIXME: Is it really OK to use the wrong coordinates here when view is 0? 977 // FIXME: Is it really OK to use the wrong coordinates here when view is 0?
947 // Historically the code would just crash; this is clearly no worse than tha t. 978 // Historically the code would just crash; this is clearly no worse than tha t.
948 return view ? view->rootFrameToContents(pointInRootFrame) : pointInRootFrame ; 979 return view ? view->rootFrameToContents(pointInRootFrame) : pointInRootFrame ;
949 } 980 }
950 981
951 bool EventHandler::handleMousePressEvent(const PlatformMouseEvent& mouseEvent) 982 WebInputEventResult EventHandler::handleMousePressEvent(const PlatformMouseEvent & mouseEvent)
952 { 983 {
953 TRACE_EVENT0("blink", "EventHandler::handleMousePressEvent"); 984 TRACE_EVENT0("blink", "EventHandler::handleMousePressEvent");
954 985
955 RefPtrWillBeRawPtr<FrameView> protector(m_frame->view()); 986 RefPtrWillBeRawPtr<FrameView> protector(m_frame->view());
956 987
957 UserGestureIndicator gestureIndicator(DefinitelyProcessingUserGesture); 988 UserGestureIndicator gestureIndicator(DefinitelyProcessingUserGesture);
958 m_frame->localFrameRoot()->eventHandler().m_lastMouseDownUserGestureToken = gestureIndicator.currentToken(); 989 m_frame->localFrameRoot()->eventHandler().m_lastMouseDownUserGestureToken = gestureIndicator.currentToken();
959 990
960 cancelFakeMouseMoveEvent(); 991 cancelFakeMouseMoveEvent();
961 if (m_eventHandlerWillResetCapturingMouseEventsNode) 992 if (m_eventHandlerWillResetCapturingMouseEventsNode)
962 m_capturingMouseEventsNode = nullptr; 993 m_capturingMouseEventsNode = nullptr;
963 m_mousePressed = true; 994 m_mousePressed = true;
964 m_capturesDragging = true; 995 m_capturesDragging = true;
965 setLastKnownMousePosition(mouseEvent); 996 setLastKnownMousePosition(mouseEvent);
966 m_mouseDownTimestamp = mouseEvent.timestamp(); 997 m_mouseDownTimestamp = mouseEvent.timestamp();
967 m_mouseDownMayStartDrag = false; 998 m_mouseDownMayStartDrag = false;
968 selectionController().setMouseDownMayStartSelect(false); 999 selectionController().setMouseDownMayStartSelect(false);
969 m_mouseDownMayStartAutoscroll = false; 1000 m_mouseDownMayStartAutoscroll = false;
970 if (FrameView* view = m_frame->view()) { 1001 if (FrameView* view = m_frame->view()) {
971 m_mouseDownPos = view->rootFrameToContents(mouseEvent.position()); 1002 m_mouseDownPos = view->rootFrameToContents(mouseEvent.position());
972 } else { 1003 } else {
973 invalidateClick(); 1004 invalidateClick();
974 return false; 1005 return WebInputEventResult::NotHandled;
975 } 1006 }
976 1007
977 HitTestRequest request(HitTestRequest::Active); 1008 HitTestRequest request(HitTestRequest::Active);
978 // Save the document point we generate in case the window coordinate is inva lidated by what happens 1009 // Save the document point we generate in case the window coordinate is inva lidated by what happens
979 // when we dispatch the event. 1010 // when we dispatch the event.
980 LayoutPoint documentPoint = contentPointFromRootFrame(m_frame, mouseEvent.po sition()); 1011 LayoutPoint documentPoint = contentPointFromRootFrame(m_frame, mouseEvent.po sition());
981 MouseEventWithHitTestResults mev = m_frame->document()->prepareMouseEvent(re quest, documentPoint, mouseEvent); 1012 MouseEventWithHitTestResults mev = m_frame->document()->prepareMouseEvent(re quest, documentPoint, mouseEvent);
982 1013
983 if (!mev.innerNode()) { 1014 if (!mev.innerNode()) {
984 invalidateClick(); 1015 invalidateClick();
985 return false; 1016 return WebInputEventResult::NotHandled;
986 } 1017 }
987 1018
988 m_mousePressNode = mev.innerNode(); 1019 m_mousePressNode = mev.innerNode();
989 1020
990 RefPtrWillBeRawPtr<LocalFrame> subframe = subframeForHitTestResult(mev); 1021 RefPtrWillBeRawPtr<LocalFrame> subframe = subframeForHitTestResult(mev);
991 if (subframe && passMousePressEventToSubframe(mev, subframe.get())) { 1022 if (subframe) {
1023 WebInputEventResult result = passMousePressEventToSubframe(mev, subframe .get());
992 // Start capturing future events for this frame. We only do this if we didn't clear 1024 // Start capturing future events for this frame. We only do this if we didn't clear
993 // the m_mousePressed flag, which may happen if an AppKit widget entered a modal event loop. 1025 // the m_mousePressed flag, which may happen if an AppKit widget entered a modal event loop.
1026 // The capturing should be done only when the result indicates it
1027 // has been handled. See crbug.com/269917
994 m_capturesDragging = subframe->eventHandler().capturesDragging(); 1028 m_capturesDragging = subframe->eventHandler().capturesDragging();
995 if (m_mousePressed && m_capturesDragging) { 1029 if (m_mousePressed && m_capturesDragging) {
996 m_capturingMouseEventsNode = mev.innerNode(); 1030 m_capturingMouseEventsNode = mev.innerNode();
997 m_eventHandlerWillResetCapturingMouseEventsNode = true; 1031 m_eventHandlerWillResetCapturingMouseEventsNode = true;
998 } 1032 }
999 invalidateClick(); 1033 invalidateClick();
1000 return true; 1034 return result;
1001 } 1035 }
1002 1036
1003 #if OS(WIN) 1037 #if OS(WIN)
1004 // We store whether pan scrolling is in progress before calling stopAutoscro ll() 1038 // We store whether pan scrolling is in progress before calling stopAutoscro ll()
1005 // because it will set m_autoscrollType to NoAutoscroll on return. 1039 // because it will set m_autoscrollType to NoAutoscroll on return.
1006 bool isPanScrollInProgress = panScrollInProgress(); 1040 bool isPanScrollInProgress = panScrollInProgress();
1007 stopAutoscroll(); 1041 stopAutoscroll();
1008 if (isPanScrollInProgress) { 1042 if (isPanScrollInProgress) {
1009 // We invalidate the click when exiting pan scrolling so that we don't i nadvertently navigate 1043 // We invalidate the click when exiting pan scrolling so that we don't i nadvertently navigate
1010 // away from the current page (e.g. the click was on a hyperlink). See < rdar://problem/6095023>. 1044 // away from the current page (e.g. the click was on a hyperlink). See < rdar://problem/6095023>.
1011 invalidateClick(); 1045 invalidateClick();
1012 return true; 1046 return WebInputEventResult::HandledSuppressed;
1013 } 1047 }
1014 #endif 1048 #endif
1015 1049
1016 m_clickCount = mouseEvent.clickCount(); 1050 m_clickCount = mouseEvent.clickCount();
1017 m_clickNode = mev.innerNode()->isTextNode() ? ComposedTreeTraversal::parent (*mev.innerNode()) : mev.innerNode(); 1051 m_clickNode = mev.innerNode()->isTextNode() ? ComposedTreeTraversal::parent (*mev.innerNode()) : mev.innerNode();
1018 1052
1019 if (FrameView* view = m_frame->view()) { 1053 if (FrameView* view = m_frame->view()) {
1020 PaintLayer* layer = mev.innerNode()->layoutObject() ? mev.innerNode()->l ayoutObject()->enclosingLayer() : nullptr; 1054 PaintLayer* layer = mev.innerNode()->layoutObject() ? mev.innerNode()->l ayoutObject()->enclosingLayer() : nullptr;
1021 IntPoint p = view->rootFrameToContents(mouseEvent.position()); 1055 IntPoint p = view->rootFrameToContents(mouseEvent.position());
1022 if (layer && layer->scrollableArea() && layer->scrollableArea()->isPoint InResizeControl(p, ResizerForPointer)) { 1056 if (layer && layer->scrollableArea() && layer->scrollableArea()->isPoint InResizeControl(p, ResizerForPointer)) {
1023 m_resizeScrollableArea = layer->scrollableArea(); 1057 m_resizeScrollableArea = layer->scrollableArea();
1024 m_resizeScrollableArea->setInResizeMode(true); 1058 m_resizeScrollableArea->setInResizeMode(true);
1025 m_offsetFromResizeCorner = LayoutSize(m_resizeScrollableArea->offset FromResizeCorner(p)); 1059 m_offsetFromResizeCorner = LayoutSize(m_resizeScrollableArea->offset FromResizeCorner(p));
1026 invalidateClick(); 1060 invalidateClick();
1027 return true; 1061 return WebInputEventResult::HandledSuppressed;
1028 } 1062 }
1029 } 1063 }
1030 1064
1031 m_frame->selection().setCaretBlinkingSuspended(true); 1065 m_frame->selection().setCaretBlinkingSuspended(true);
1032 1066
1033 bool swallowEvent = updatePointerTargetAndDispatchEvents(EventTypeNames::mou sedown, mev.innerNode(), m_clickCount, mouseEvent); 1067 WebInputEventResult eventResult = updatePointerTargetAndDispatchEvents(Event TypeNames::mousedown, mev.innerNode(), m_clickCount, mouseEvent);
1034 1068
1035 // m_selectionInitiationState is initialized after dispatching mousedown 1069 // m_selectionInitiationState is initialized after dispatching mousedown
1036 // event in order not to keep the selection by DOM APIs Because we can't 1070 // event in order not to keep the selection by DOM APIs Because we can't
1037 // give the user the chance to handle the selection by user action like 1071 // give the user the chance to handle the selection by user action like
1038 // dragging if we keep the selection in case of mousedown. FireFox also has 1072 // dragging if we keep the selection in case of mousedown. FireFox also has
1039 // the same behavior and it's more compatible with other browsers. 1073 // the same behavior and it's more compatible with other browsers.
1040 selectionController().initializeSelectionState(); 1074 selectionController().initializeSelectionState();
1041 HitTestResult hitTestResult = hitTestResultInFrame(m_frame, documentPoint, H itTestRequest::ReadOnly); 1075 HitTestResult hitTestResult = hitTestResultInFrame(m_frame, documentPoint, H itTestRequest::ReadOnly);
1042 InputDeviceCapabilities* sourceCapabilities = mouseEvent.syntheticEventType( ) == PlatformMouseEvent::FromTouch ? InputDeviceCapabilities::firesTouchEventsSo urceCapabilities() : 1076 InputDeviceCapabilities* sourceCapabilities = mouseEvent.syntheticEventType( ) == PlatformMouseEvent::FromTouch ? InputDeviceCapabilities::firesTouchEventsSo urceCapabilities() :
1043 InputDeviceCapabilities::doesntFireTouchEventsSourceCapabilities(); 1077 InputDeviceCapabilities::doesntFireTouchEventsSourceCapabilities();
1044 swallowEvent = swallowEvent || handleMouseFocus(MouseEventWithHitTestResults (mouseEvent, hitTestResult), sourceCapabilities); 1078 if (eventResult == WebInputEventResult::NotHandled)
1045 m_capturesDragging = !swallowEvent || mev.scrollbar(); 1079 eventResult = handleMouseFocus(MouseEventWithHitTestResults(mouseEvent, hitTestResult), sourceCapabilities);
1080 m_capturesDragging = eventResult == WebInputEventResult::NotHandled || mev.s crollbar();
1046 1081
1047 // If the hit testing originally determined the event was in a scrollbar, re fetch the MouseEventWithHitTestResults 1082 // If the hit testing originally determined the event was in a scrollbar, re fetch the MouseEventWithHitTestResults
1048 // in case the scrollbar widget was destroyed when the mouse event was handl ed. 1083 // in case the scrollbar widget was destroyed when the mouse event was handl ed.
1049 if (mev.scrollbar()) { 1084 if (mev.scrollbar()) {
1050 const bool wasLastScrollBar = mev.scrollbar() == m_lastScrollbarUnderMou se.get(); 1085 const bool wasLastScrollBar = mev.scrollbar() == m_lastScrollbarUnderMou se.get();
1051 HitTestRequest request(HitTestRequest::ReadOnly | HitTestRequest::Active ); 1086 HitTestRequest request(HitTestRequest::ReadOnly | HitTestRequest::Active );
1052 mev = m_frame->document()->prepareMouseEvent(request, documentPoint, mou seEvent); 1087 mev = m_frame->document()->prepareMouseEvent(request, documentPoint, mou seEvent);
1053 if (wasLastScrollBar && mev.scrollbar() != m_lastScrollbarUnderMouse.get ()) 1088 if (wasLastScrollBar && mev.scrollbar() != m_lastScrollbarUnderMouse.get ())
1054 m_lastScrollbarUnderMouse = nullptr; 1089 m_lastScrollbarUnderMouse = nullptr;
1055 } 1090 }
1056 1091
1057 if (swallowEvent) { 1092 if (eventResult != WebInputEventResult::NotHandled) {
1058 // scrollbars should get events anyway, even disabled controls might be scrollable 1093 // scrollbars should get events anyway, even disabled controls might be scrollable
1059 passMousePressEventToScrollbar(mev); 1094 passMousePressEventToScrollbar(mev);
1060 } else { 1095 } else {
1061 if (shouldRefetchEventTarget(mev)) { 1096 if (shouldRefetchEventTarget(mev)) {
1062 HitTestRequest request(HitTestRequest::ReadOnly | HitTestRequest::Ac tive); 1097 HitTestRequest request(HitTestRequest::ReadOnly | HitTestRequest::Ac tive);
1063 mev = m_frame->document()->prepareMouseEvent(request, documentPoint, mouseEvent); 1098 mev = m_frame->document()->prepareMouseEvent(request, documentPoint, mouseEvent);
1064 } 1099 }
1065 1100
1066 if (passMousePressEventToScrollbar(mev)) 1101 if (passMousePressEventToScrollbar(mev))
1067 swallowEvent = true; 1102 eventResult = WebInputEventResult::HandledSystem;
1068 else 1103 else
1069 swallowEvent = handleMousePressEvent(mev); 1104 eventResult = handleMousePressEvent(mev);
1070 } 1105 }
1071 1106
1072 if (mev.hitTestResult().innerNode() && mouseEvent.button() == LeftButton) { 1107 if (mev.hitTestResult().innerNode() && mouseEvent.button() == LeftButton) {
1073 ASSERT(mouseEvent.type() == PlatformEvent::MousePressed); 1108 ASSERT(mouseEvent.type() == PlatformEvent::MousePressed);
1074 HitTestResult result = mev.hitTestResult(); 1109 HitTestResult result = mev.hitTestResult();
1075 result.setToShadowHostIfInUserAgentShadowRoot(); 1110 result.setToShadowHostIfInUserAgentShadowRoot();
1076 m_frame->chromeClient().onMouseDown(result.innerNode()); 1111 m_frame->chromeClient().onMouseDown(result.innerNode());
1077 } 1112 }
1078 1113
1079 return swallowEvent; 1114 return eventResult;
1080 } 1115 }
1081 1116
1082 static PaintLayer* layerForNode(Node* node) 1117 static PaintLayer* layerForNode(Node* node)
1083 { 1118 {
1084 if (!node) 1119 if (!node)
1085 return nullptr; 1120 return nullptr;
1086 1121
1087 LayoutObject* layoutObject = node->layoutObject(); 1122 LayoutObject* layoutObject = node->layoutObject();
1088 if (!layoutObject) 1123 if (!layoutObject)
1089 return nullptr; 1124 return nullptr;
1090 1125
1091 PaintLayer* layer = layoutObject->enclosingLayer(); 1126 PaintLayer* layer = layoutObject->enclosingLayer();
1092 if (!layer) 1127 if (!layer)
1093 return nullptr; 1128 return nullptr;
1094 1129
1095 return layer; 1130 return layer;
1096 } 1131 }
1097 1132
1098 ScrollableArea* EventHandler::associatedScrollableArea(const PaintLayer* layer) const 1133 ScrollableArea* EventHandler::associatedScrollableArea(const PaintLayer* layer) const
1099 { 1134 {
1100 if (PaintLayerScrollableArea* scrollableArea = layer->scrollableArea()) { 1135 if (PaintLayerScrollableArea* scrollableArea = layer->scrollableArea()) {
1101 if (scrollableArea->scrollsOverflow()) 1136 if (scrollableArea->scrollsOverflow())
1102 return scrollableArea; 1137 return scrollableArea;
1103 } 1138 }
1104 1139
1105 return nullptr; 1140 return nullptr;
1106 } 1141 }
1107 1142
1108 bool EventHandler::handleMouseMoveEvent(const PlatformMouseEvent& event) 1143 WebInputEventResult EventHandler::handleMouseMoveEvent(const PlatformMouseEvent& event)
1109 { 1144 {
1110 TRACE_EVENT0("blink", "EventHandler::handleMouseMoveEvent"); 1145 TRACE_EVENT0("blink", "EventHandler::handleMouseMoveEvent");
1111 1146
1112 conditionallyEnableMouseEventForPointerTypeMouse(event); 1147 conditionallyEnableMouseEventForPointerTypeMouse(event);
1113 1148
1114 RefPtrWillBeRawPtr<FrameView> protector(m_frame->view()); 1149 RefPtrWillBeRawPtr<FrameView> protector(m_frame->view());
1115 1150
1116 HitTestResult hoveredNode = HitTestResult(); 1151 HitTestResult hoveredNode = HitTestResult();
1117 bool result = handleMouseMoveOrLeaveEvent(event, &hoveredNode); 1152 WebInputEventResult result = handleMouseMoveOrLeaveEvent(event, &hoveredNode );
1118 1153
1119 Page* page = m_frame->page(); 1154 Page* page = m_frame->page();
1120 if (!page) 1155 if (!page)
1121 return result; 1156 return result;
1122 1157
1123 if (PaintLayer* layer = layerForNode(hoveredNode.innerNode())) { 1158 if (PaintLayer* layer = layerForNode(hoveredNode.innerNode())) {
1124 if (ScrollableArea* layerScrollableArea = associatedScrollableArea(layer )) 1159 if (ScrollableArea* layerScrollableArea = associatedScrollableArea(layer ))
1125 layerScrollableArea->mouseMovedInContentArea(); 1160 layerScrollableArea->mouseMovedInContentArea();
1126 } 1161 }
1127 1162
1128 if (FrameView* frameView = m_frame->view()) 1163 if (FrameView* frameView = m_frame->view())
1129 frameView->mouseMovedInContentArea(); 1164 frameView->mouseMovedInContentArea();
1130 1165
1131 hoveredNode.setToShadowHostIfInUserAgentShadowRoot(); 1166 hoveredNode.setToShadowHostIfInUserAgentShadowRoot();
1132 page->chromeClient().mouseDidMoveOverElement(hoveredNode); 1167 page->chromeClient().mouseDidMoveOverElement(hoveredNode);
1133 1168
1134 return result; 1169 return result;
1135 } 1170 }
1136 1171
1137 void EventHandler::handleMouseLeaveEvent(const PlatformMouseEvent& event) 1172 void EventHandler::handleMouseLeaveEvent(const PlatformMouseEvent& event)
1138 { 1173 {
1139 TRACE_EVENT0("blink", "EventHandler::handleMouseLeaveEvent"); 1174 TRACE_EVENT0("blink", "EventHandler::handleMouseLeaveEvent");
1140 1175
1141 conditionallyEnableMouseEventForPointerTypeMouse(event); 1176 conditionallyEnableMouseEventForPointerTypeMouse(event);
1142 1177
1143 RefPtrWillBeRawPtr<FrameView> protector(m_frame->view()); 1178 RefPtrWillBeRawPtr<FrameView> protector(m_frame->view());
1144 handleMouseMoveOrLeaveEvent(event, 0, false, true); 1179 handleMouseMoveOrLeaveEvent(event, 0, false, true);
1145 } 1180 }
1146 1181
1147 bool EventHandler::handleMouseMoveOrLeaveEvent(const PlatformMouseEvent& mouseEv ent, HitTestResult* hoveredNode, bool onlyUpdateScrollbars, bool forceLeave) 1182 WebInputEventResult EventHandler::handleMouseMoveOrLeaveEvent(const PlatformMous eEvent& mouseEvent, HitTestResult* hoveredNode, bool onlyUpdateScrollbars, bool forceLeave)
1148 { 1183 {
1149 ASSERT(m_frame); 1184 ASSERT(m_frame);
1150 ASSERT(m_frame->view()); 1185 ASSERT(m_frame->view());
1151 1186
1152 setLastKnownMousePosition(mouseEvent); 1187 setLastKnownMousePosition(mouseEvent);
1153 1188
1154 if (m_hoverTimer.isActive()) 1189 if (m_hoverTimer.isActive())
1155 m_hoverTimer.stop(); 1190 m_hoverTimer.stop();
1156 1191
1157 m_cursorUpdateTimer.stop(); 1192 m_cursorUpdateTimer.stop();
1158 1193
1159 cancelFakeMouseMoveEvent(); 1194 cancelFakeMouseMoveEvent();
1160 1195
1161 if (m_svgPan) { 1196 if (m_svgPan) {
1162 m_frame->document()->accessSVGExtensions().updatePan(m_frame->view()->ro otFrameToContents(m_lastKnownMousePosition)); 1197 m_frame->document()->accessSVGExtensions().updatePan(m_frame->view()->ro otFrameToContents(m_lastKnownMousePosition));
1163 return true; 1198 return WebInputEventResult::HandledSuppressed;
1164 } 1199 }
1165 1200
1166 if (m_frameSetBeingResized) 1201 if (m_frameSetBeingResized)
1167 return updatePointerTargetAndDispatchEvents(EventTypeNames::mousemove, m _frameSetBeingResized.get(), 0, mouseEvent); 1202 return updatePointerTargetAndDispatchEvents(EventTypeNames::mousemove, m _frameSetBeingResized.get(), 0, mouseEvent);
1168 1203
1169 // Send events right to a scrollbar if the mouse is pressed. 1204 // Send events right to a scrollbar if the mouse is pressed.
1170 if (m_lastScrollbarUnderMouse && m_mousePressed) { 1205 if (m_lastScrollbarUnderMouse && m_mousePressed) {
1171 m_lastScrollbarUnderMouse->mouseMoved(mouseEvent); 1206 m_lastScrollbarUnderMouse->mouseMoved(mouseEvent);
1172 return true; 1207 return WebInputEventResult::HandledSystem;
1173 } 1208 }
1174 1209
1175 // Mouse events simulated from touch should not hit-test again. 1210 // Mouse events simulated from touch should not hit-test again.
1176 ASSERT(!mouseEvent.fromTouch()); 1211 ASSERT(!mouseEvent.fromTouch());
1177 1212
1178 HitTestRequest::HitTestRequestType hitType = HitTestRequest::Move; 1213 HitTestRequest::HitTestRequestType hitType = HitTestRequest::Move;
1179 if (m_mousePressed) { 1214 if (m_mousePressed) {
1180 hitType |= HitTestRequest::Active; 1215 hitType |= HitTestRequest::Active;
1181 } else if (onlyUpdateScrollbars) { 1216 } else if (onlyUpdateScrollbars) {
1182 // Mouse events should be treated as "read-only" if we're updating only scrollbars. This 1217 // Mouse events should be treated as "read-only" if we're updating only scrollbars. This
(...skipping 22 matching lines...) Expand all
1205 Scrollbar* scrollbar = nullptr; 1240 Scrollbar* scrollbar = nullptr;
1206 1241
1207 if (m_resizeScrollableArea && m_resizeScrollableArea->inResizeMode()) { 1242 if (m_resizeScrollableArea && m_resizeScrollableArea->inResizeMode()) {
1208 m_resizeScrollableArea->resize(mouseEvent, m_offsetFromResizeCorner); 1243 m_resizeScrollableArea->resize(mouseEvent, m_offsetFromResizeCorner);
1209 } else { 1244 } else {
1210 if (!scrollbar) 1245 if (!scrollbar)
1211 scrollbar = mev.scrollbar(); 1246 scrollbar = mev.scrollbar();
1212 1247
1213 updateLastScrollbarUnderMouse(scrollbar, !m_mousePressed); 1248 updateLastScrollbarUnderMouse(scrollbar, !m_mousePressed);
1214 if (onlyUpdateScrollbars) 1249 if (onlyUpdateScrollbars)
1215 return true; 1250 return WebInputEventResult::HandledSuppressed;
1216 } 1251 }
1217 1252
1218 bool swallowEvent = false; 1253 WebInputEventResult eventResult = WebInputEventResult::NotHandled;
1219 RefPtrWillBeRawPtr<LocalFrame> newSubframe = m_capturingMouseEventsNode.get( ) ? subframeForTargetNode(m_capturingMouseEventsNode.get()) : subframeForHitTest Result(mev); 1254 RefPtrWillBeRawPtr<LocalFrame> newSubframe = m_capturingMouseEventsNode.get( ) ? subframeForTargetNode(m_capturingMouseEventsNode.get()) : subframeForHitTest Result(mev);
1220 1255
1221 // 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. 1256 // 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.
1222 if (m_lastMouseMoveEventSubframe && m_lastMouseMoveEventSubframe->tree().isD escendantOf(m_frame) && m_lastMouseMoveEventSubframe != newSubframe) 1257 if (m_lastMouseMoveEventSubframe && m_lastMouseMoveEventSubframe->tree().isD escendantOf(m_frame) && m_lastMouseMoveEventSubframe != newSubframe)
1223 m_lastMouseMoveEventSubframe->eventHandler().handleMouseLeaveEvent(mouse Event); 1258 m_lastMouseMoveEventSubframe->eventHandler().handleMouseLeaveEvent(mouse Event);
1224 1259
1225 if (newSubframe) { 1260 if (newSubframe) {
1226 // Update over/out state before passing the event to the subframe. 1261 // Update over/out state before passing the event to the subframe.
1227 updateMouseEventTargetNode(mev.innerNode(), mouseEvent); 1262 updateMouseEventTargetNode(mev.innerNode(), mouseEvent);
1228 1263
1229 // Event dispatch in updateMouseEventTargetNode may have caused the subf rame of the target 1264 // Event dispatch in updateMouseEventTargetNode may have caused the subf rame of the target
1230 // node to be detached from its FrameView, in which case the event shoul d not be passed. 1265 // node to be detached from its FrameView, in which case the event shoul d not be passed.
1231 if (newSubframe->view()) 1266 if (newSubframe->view())
1232 swallowEvent |= passMouseMoveEventToSubframe(mev, newSubframe.get(), hoveredNode); 1267 eventResult = passMouseMoveEventToSubframe(mev, newSubframe.get(), h overedNode);
1233 } else { 1268 } else {
1234 if (scrollbar && !m_mousePressed) 1269 if (scrollbar && !m_mousePressed)
1235 scrollbar->mouseMoved(mouseEvent); // Handle hover effects on platfo rms that support visual feedback on scrollbar hovering. 1270 scrollbar->mouseMoved(mouseEvent); // Handle hover effects on platfo rms that support visual feedback on scrollbar hovering.
1236 if (FrameView* view = m_frame->view()) { 1271 if (FrameView* view = m_frame->view()) {
1237 OptionalCursor optionalCursor = selectCursor(mev.hitTestResult()); 1272 OptionalCursor optionalCursor = selectCursor(mev.hitTestResult());
1238 if (optionalCursor.isCursorChange()) { 1273 if (optionalCursor.isCursorChange()) {
1239 view->setCursor(optionalCursor.cursor()); 1274 view->setCursor(optionalCursor.cursor());
1240 } 1275 }
1241 } 1276 }
1242 } 1277 }
1243 1278
1244 m_lastMouseMoveEventSubframe = newSubframe; 1279 m_lastMouseMoveEventSubframe = newSubframe;
1245 1280
1246 if (swallowEvent) 1281 if (eventResult != WebInputEventResult::NotHandled)
1247 return true; 1282 return eventResult;
1248 1283
1249 swallowEvent = updatePointerTargetAndDispatchEvents(EventTypeNames::mousemov e, mev.innerNode(), 0, mouseEvent); 1284 eventResult = updatePointerTargetAndDispatchEvents(EventTypeNames::mousemove , mev.innerNode(), 0, mouseEvent);
1285 if (eventResult != WebInputEventResult::NotHandled)
1286 return eventResult;
1250 1287
1251 if (!swallowEvent) 1288 return handleMouseDraggedEvent(mev);
1252 swallowEvent = handleMouseDraggedEvent(mev);
1253
1254 return swallowEvent;
1255 } 1289 }
1256 1290
1257 void EventHandler::invalidateClick() 1291 void EventHandler::invalidateClick()
1258 { 1292 {
1259 m_clickCount = 0; 1293 m_clickCount = 0;
1260 m_clickNode = nullptr; 1294 m_clickNode = nullptr;
1261 } 1295 }
1262 1296
1263 static ContainerNode* parentForClickEvent(const Node& node) 1297 static ContainerNode* parentForClickEvent(const Node& node)
1264 { 1298 {
1265 // IE doesn't dispatch click events for mousedown/mouseup events across form 1299 // IE doesn't dispatch click events for mousedown/mouseup events across form
1266 // controls. 1300 // controls.
1267 if (node.isHTMLElement() && toHTMLElement(node).isInteractiveContent()) 1301 if (node.isHTMLElement() && toHTMLElement(node).isInteractiveContent())
1268 return nullptr; 1302 return nullptr;
1269 1303
1270 return ComposedTreeTraversal::parent(node); 1304 return ComposedTreeTraversal::parent(node);
1271 } 1305 }
1272 1306
1273 bool EventHandler::handleMouseReleaseEvent(const PlatformMouseEvent& mouseEvent) 1307 WebInputEventResult EventHandler::handleMouseReleaseEvent(const PlatformMouseEve nt& mouseEvent)
1274 { 1308 {
1275 TRACE_EVENT0("blink", "EventHandler::handleMouseReleaseEvent"); 1309 TRACE_EVENT0("blink", "EventHandler::handleMouseReleaseEvent");
1276 1310
1277 RefPtrWillBeRawPtr<FrameView> protector(m_frame->view()); 1311 RefPtrWillBeRawPtr<FrameView> protector(m_frame->view());
1278 1312
1279 m_frame->selection().setCaretBlinkingSuspended(false); 1313 m_frame->selection().setCaretBlinkingSuspended(false);
1280 1314
1281 OwnPtr<UserGestureIndicator> gestureIndicator; 1315 OwnPtr<UserGestureIndicator> gestureIndicator;
1282 1316
1283 if (m_frame->localFrameRoot()->eventHandler().m_lastMouseDownUserGestureToke n) 1317 if (m_frame->localFrameRoot()->eventHandler().m_lastMouseDownUserGestureToke n)
1284 gestureIndicator = adoptPtr(new UserGestureIndicator(m_frame->localFrame Root()->eventHandler().m_lastMouseDownUserGestureToken.release())); 1318 gestureIndicator = adoptPtr(new UserGestureIndicator(m_frame->localFrame Root()->eventHandler().m_lastMouseDownUserGestureToken.release()));
1285 else 1319 else
1286 gestureIndicator = adoptPtr(new UserGestureIndicator(DefinitelyProcessin gUserGesture)); 1320 gestureIndicator = adoptPtr(new UserGestureIndicator(DefinitelyProcessin gUserGesture));
1287 1321
1288 #if OS(WIN) 1322 #if OS(WIN)
1289 if (Page* page = m_frame->page()) 1323 if (Page* page = m_frame->page())
1290 page->autoscrollController().handleMouseReleaseForPanScrolling(m_frame, mouseEvent); 1324 page->autoscrollController().handleMouseReleaseForPanScrolling(m_frame, mouseEvent);
1291 #endif 1325 #endif
1292 1326
1293 m_mousePressed = false; 1327 m_mousePressed = false;
1294 setLastKnownMousePosition(mouseEvent); 1328 setLastKnownMousePosition(mouseEvent);
1295 1329
1296 if (m_svgPan) { 1330 if (m_svgPan) {
1297 m_svgPan = false; 1331 m_svgPan = false;
1298 m_frame->document()->accessSVGExtensions().updatePan(m_frame->view()->ro otFrameToContents(m_lastKnownMousePosition)); 1332 m_frame->document()->accessSVGExtensions().updatePan(m_frame->view()->ro otFrameToContents(m_lastKnownMousePosition));
1299 return true; 1333 return WebInputEventResult::HandledSuppressed;
1300 } 1334 }
1301 1335
1302 if (m_frameSetBeingResized) 1336 if (m_frameSetBeingResized)
1303 return dispatchMouseEvent(EventTypeNames::mouseup, m_frameSetBeingResize d.get(), m_clickCount, mouseEvent); 1337 return dispatchMouseEvent(EventTypeNames::mouseup, m_frameSetBeingResize d.get(), m_clickCount, mouseEvent);
1304 1338
1305 if (m_lastScrollbarUnderMouse) { 1339 if (m_lastScrollbarUnderMouse) {
1306 invalidateClick(); 1340 invalidateClick();
1307 m_lastScrollbarUnderMouse->mouseUp(mouseEvent); 1341 m_lastScrollbarUnderMouse->mouseUp(mouseEvent);
1308 return dispatchMouseEvent(EventTypeNames::mouseup, m_nodeUnderMouse.get( ), m_clickCount, mouseEvent); 1342 return dispatchMouseEvent(EventTypeNames::mouseup, m_nodeUnderMouse.get( ), m_clickCount, mouseEvent);
1309 } 1343 }
1310 1344
1311 // Mouse events simulated from touch should not hit-test again. 1345 // Mouse events simulated from touch should not hit-test again.
1312 ASSERT(!mouseEvent.fromTouch()); 1346 ASSERT(!mouseEvent.fromTouch());
1313 1347
1314 HitTestRequest::HitTestRequestType hitType = HitTestRequest::Release; 1348 HitTestRequest::HitTestRequestType hitType = HitTestRequest::Release;
1315 HitTestRequest request(hitType); 1349 HitTestRequest request(hitType);
1316 MouseEventWithHitTestResults mev = prepareMouseEvent(request, mouseEvent); 1350 MouseEventWithHitTestResults mev = prepareMouseEvent(request, mouseEvent);
1317 LocalFrame* subframe = m_capturingMouseEventsNode.get() ? subframeForTargetN ode(m_capturingMouseEventsNode.get()) : subframeForHitTestResult(mev); 1351 LocalFrame* subframe = m_capturingMouseEventsNode.get() ? subframeForTargetN ode(m_capturingMouseEventsNode.get()) : subframeForHitTestResult(mev);
1318 if (m_eventHandlerWillResetCapturingMouseEventsNode) 1352 if (m_eventHandlerWillResetCapturingMouseEventsNode)
1319 m_capturingMouseEventsNode = nullptr; 1353 m_capturingMouseEventsNode = nullptr;
1320 if (subframe && passMouseReleaseEventToSubframe(mev, subframe)) 1354 if (subframe)
1321 return true; 1355 return passMouseReleaseEventToSubframe(mev, subframe);
1322 1356
1323 bool swallowUpEvent = updatePointerTargetAndDispatchEvents(EventTypeNames::m ouseup, mev.innerNode(), m_clickCount, mouseEvent); 1357 WebInputEventResult eventResult = updatePointerTargetAndDispatchEvents(Event TypeNames::mouseup, mev.innerNode(), m_clickCount, mouseEvent);
1324 1358
1325 // TODO(crbug/545647): This state should reset with pointercancel too. 1359 // TODO(crbug/545647): This state should reset with pointercancel too.
1326 m_preventMouseEventForPointerTypeMouse = false; 1360 m_preventMouseEventForPointerTypeMouse = false;
1327 1361
1328 bool contextMenuEvent = mouseEvent.button() == RightButton; 1362 bool contextMenuEvent = mouseEvent.button() == RightButton;
1329 #if OS(MACOSX) 1363 #if OS(MACOSX)
1330 // 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. 1364 // 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.
1331 if (mouseEvent.button() == LeftButton && mouseEvent.modifiers() & PlatformEv ent::CtrlKey) 1365 if (mouseEvent.button() == LeftButton && mouseEvent.modifiers() & PlatformEv ent::CtrlKey)
1332 contextMenuEvent = true; 1366 contextMenuEvent = true;
1333 #endif 1367 #endif
1334 1368
1335 bool swallowClickEvent = false; 1369 WebInputEventResult clickEventResult = WebInputEventResult::NotHandled;
1336 if (m_clickCount > 0 && !contextMenuEvent && mev.innerNode() && m_clickNode && mev.innerNode()->canParticipateInComposedTree() && m_clickNode->canParticipat eInComposedTree()) { 1370 if (m_clickCount > 0 && !contextMenuEvent && mev.innerNode() && m_clickNode && mev.innerNode()->canParticipateInComposedTree() && m_clickNode->canParticipat eInComposedTree()) {
1337 // Updates distribution because a 'mouseup' event listener can make the 1371 // Updates distribution because a 'mouseup' event listener can make the
1338 // tree dirty at dispatchMouseEvent() invocation above. 1372 // tree dirty at dispatchMouseEvent() invocation above.
1339 // Unless distribution is updated, commonAncestor would hit ASSERT. 1373 // Unless distribution is updated, commonAncestor would hit ASSERT.
1340 // Both m_clickNode and mev.innerNode() don't need to be updated 1374 // Both m_clickNode and mev.innerNode() don't need to be updated
1341 // because commonAncestor() will exit early if their documents are diffe rent. 1375 // because commonAncestor() will exit early if their documents are diffe rent.
1342 m_clickNode->updateDistribution(); 1376 m_clickNode->updateDistribution();
1343 if (Node* clickTargetNode = mev.innerNode()->commonAncestor( 1377 if (Node* clickTargetNode = mev.innerNode()->commonAncestor(
1344 *m_clickNode, parentForClickEvent)) { 1378 *m_clickNode, parentForClickEvent)) {
1345 1379
1346 // Dispatch mouseup directly w/o calling updateMouseEventTargetNode 1380 // Dispatch mouseup directly w/o calling updateMouseEventTargetNode
1347 // because the mouseup dispatch above has already updated it 1381 // because the mouseup dispatch above has already updated it
1348 // correctly. Moreover, clickTargetNode is different from 1382 // correctly. Moreover, clickTargetNode is different from
1349 // mev.innerNode at drag-release. 1383 // mev.innerNode at drag-release.
1350 clickTargetNode->dispatchMouseEvent(mouseEvent, 1384 if (clickTargetNode->dispatchMouseEvent(mouseEvent,
kotenkov 2016/01/12 20:55:00 There should be a negation here: |EventTarget::dis
dtapuska 2016/01/12 21:06:48 Thanks for the find; you are correct. This is in f
1351 EventTypeNames::click, m_clickCount); 1385 EventTypeNames::click, m_clickCount)) {
1386 clickEventResult = WebInputEventResult::HandledApplication;
1387 }
1352 } 1388 }
1353 } 1389 }
1354 1390
1355 if (m_resizeScrollableArea) { 1391 if (m_resizeScrollableArea) {
1356 m_resizeScrollableArea->setInResizeMode(false); 1392 m_resizeScrollableArea->setInResizeMode(false);
1357 m_resizeScrollableArea = nullptr; 1393 m_resizeScrollableArea = nullptr;
1358 } 1394 }
1359 1395
1360 bool swallowMouseReleaseEvent = false; 1396 if (eventResult == WebInputEventResult::NotHandled)
1361 if (!swallowUpEvent) 1397 eventResult = handleMouseReleaseEvent(mev);
1362 swallowMouseReleaseEvent = handleMouseReleaseEvent(mev);
1363 1398
1364 invalidateClick(); 1399 invalidateClick();
1365 1400
1366 return swallowUpEvent || swallowClickEvent || swallowMouseReleaseEvent; 1401 return mergeEventResult(clickEventResult, eventResult);
1367 } 1402 }
1368 1403
1369 bool EventHandler::dispatchDragEvent(const AtomicString& eventType, Node* dragTa rget, const PlatformMouseEvent& event, DataTransfer* dataTransfer) 1404 WebInputEventResult EventHandler::dispatchDragEvent(const AtomicString& eventTyp e, Node* dragTarget, const PlatformMouseEvent& event, DataTransfer* dataTransfer )
1370 { 1405 {
1371 FrameView* view = m_frame->view(); 1406 FrameView* view = m_frame->view();
1372 1407
1373 // FIXME: We might want to dispatch a dragleave even if the view is gone. 1408 // FIXME: We might want to dispatch a dragleave even if the view is gone.
1374 if (!view) 1409 if (!view)
1375 return false; 1410 return WebInputEventResult::NotHandled;
1376 1411
1377 RefPtrWillBeRawPtr<DragEvent> me = DragEvent::create(eventType, 1412 RefPtrWillBeRawPtr<DragEvent> me = DragEvent::create(eventType,
1378 true, true, m_frame->document()->domWindow(), 1413 true, true, m_frame->document()->domWindow(),
1379 0, event.globalPosition().x(), event.globalPosition().y(), event.positio n().x(), event.position().y(), 1414 0, event.globalPosition().x(), event.globalPosition().y(), event.positio n().x(), event.position().y(),
1380 event.movementDelta().x(), event.movementDelta().y(), 1415 event.movementDelta().x(), event.movementDelta().y(),
1381 event.modifiers(), 1416 event.modifiers(),
1382 0, MouseEvent::platformModifiersToButtons(event.modifiers()), nullptr, e vent.timestamp(), dataTransfer, event.syntheticEventType()); 1417 0, MouseEvent::platformModifiersToButtons(event.modifiers()), nullptr, e vent.timestamp(), dataTransfer, event.syntheticEventType());
1383 1418
1384 dragTarget->dispatchEvent(me.get()); 1419 bool dispatchResult = dragTarget->dispatchEvent(me.get());
1385 return me->defaultPrevented(); 1420 return eventToEventResult(me, dispatchResult);
1386 } 1421 }
1387 1422
1388 static bool targetIsFrame(Node* target, LocalFrame*& frame) 1423 static bool targetIsFrame(Node* target, LocalFrame*& frame)
1389 { 1424 {
1390 if (!isHTMLFrameElementBase(target)) 1425 if (!isHTMLFrameElementBase(target))
1391 return false; 1426 return false;
1392 1427
1393 // Cross-process drag and drop is not yet supported. 1428 // Cross-process drag and drop is not yet supported.
1394 if (toHTMLFrameElementBase(target)->contentFrame() && !toHTMLFrameElementBas e(target)->contentFrame()->isLocalFrame()) 1429 if (toHTMLFrameElementBase(target)->contentFrame() && !toHTMLFrameElementBas e(target)->contentFrame()->isLocalFrame())
1395 return false; 1430 return false;
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
1430 break; 1465 break;
1431 } 1466 }
1432 if (matched) { 1467 if (matched) {
1433 dataTransfer->setDropEffect(convertDragOperationToDropZoneOperation( dragOperation)); 1468 dataTransfer->setDropEffect(convertDragOperationToDropZoneOperation( dragOperation));
1434 return true; 1469 return true;
1435 } 1470 }
1436 } 1471 }
1437 return false; 1472 return false;
1438 } 1473 }
1439 1474
1440 bool EventHandler::updateDragAndDrop(const PlatformMouseEvent& event, DataTransf er* dataTransfer) 1475 WebInputEventResult EventHandler::updateDragAndDrop(const PlatformMouseEvent& ev ent, DataTransfer* dataTransfer)
1441 { 1476 {
1442 bool accept = false; 1477 WebInputEventResult eventResult = WebInputEventResult::NotHandled;
1443 1478
1444 if (!m_frame->view()) 1479 if (!m_frame->view())
1445 return false; 1480 return eventResult;
1446 1481
1447 HitTestRequest request(HitTestRequest::ReadOnly); 1482 HitTestRequest request(HitTestRequest::ReadOnly);
1448 MouseEventWithHitTestResults mev = prepareMouseEvent(request, event); 1483 MouseEventWithHitTestResults mev = prepareMouseEvent(request, event);
1449 1484
1450 // Drag events should never go to text nodes (following IE, and proper mouse over/out dispatch) 1485 // Drag events should never go to text nodes (following IE, and proper mouse over/out dispatch)
1451 RefPtrWillBeRawPtr<Node> newTarget = mev.innerNode(); 1486 RefPtrWillBeRawPtr<Node> newTarget = mev.innerNode();
1452 if (newTarget && newTarget->isTextNode()) 1487 if (newTarget && newTarget->isTextNode())
1453 newTarget = ComposedTreeTraversal::parent(*newTarget); 1488 newTarget = ComposedTreeTraversal::parent(*newTarget);
1454 1489
1455 if (AutoscrollController* controller = autoscrollController()) 1490 if (AutoscrollController* controller = autoscrollController())
1456 controller->updateDragAndDrop(newTarget.get(), event.position(), event.t imestamp()); 1491 controller->updateDragAndDrop(newTarget.get(), event.position(), event.t imestamp());
1457 1492
1458 if (m_dragTarget != newTarget) { 1493 if (m_dragTarget != newTarget) {
1459 // FIXME: this ordering was explicitly chosen to match WinIE. However, 1494 // FIXME: this ordering was explicitly chosen to match WinIE. However,
1460 // it is sometimes incorrect when dragging within subframes, as seen wit h 1495 // it is sometimes incorrect when dragging within subframes, as seen wit h
1461 // LayoutTests/fast/events/drag-in-frames.html. 1496 // LayoutTests/fast/events/drag-in-frames.html.
1462 // 1497 //
1463 // 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>. 1498 // 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>.
1464 LocalFrame* targetFrame; 1499 LocalFrame* targetFrame;
1465 if (targetIsFrame(newTarget.get(), targetFrame)) { 1500 if (targetIsFrame(newTarget.get(), targetFrame)) {
1466 if (targetFrame) 1501 if (targetFrame)
1467 accept = targetFrame->eventHandler().updateDragAndDrop(event, da taTransfer); 1502 eventResult = targetFrame->eventHandler().updateDragAndDrop(even t, dataTransfer);
1468 } else if (newTarget) { 1503 } else if (newTarget) {
1469 // 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. 1504 // 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.
1470 if (dragState().m_dragSrc) { 1505 if (dragState().m_dragSrc) {
1471 // for now we don't care if event handler cancels default behavi or, since there is none 1506 // for now we don't care if event handler cancels default behavi or, since there is none
1472 dispatchDragSrcEvent(EventTypeNames::drag, event); 1507 dispatchDragSrcEvent(EventTypeNames::drag, event);
1473 } 1508 }
1474 accept = dispatchDragEvent(EventTypeNames::dragenter, newTarget.get( ), event, dataTransfer); 1509 eventResult = dispatchDragEvent(EventTypeNames::dragenter, newTarget .get(), event, dataTransfer);
1475 if (!accept) 1510 if (eventResult == WebInputEventResult::NotHandled && findDropZone(n ewTarget.get(), dataTransfer))
1476 accept = findDropZone(newTarget.get(), dataTransfer); 1511 eventResult = WebInputEventResult::HandledSystem;
1477 } 1512 }
1478 1513
1479 if (targetIsFrame(m_dragTarget.get(), targetFrame)) { 1514 if (targetIsFrame(m_dragTarget.get(), targetFrame)) {
1480 if (targetFrame) 1515 if (targetFrame)
1481 accept = targetFrame->eventHandler().updateDragAndDrop(event, da taTransfer); 1516 eventResult = targetFrame->eventHandler().updateDragAndDrop(even t, dataTransfer);
1482 } else if (m_dragTarget) { 1517 } else if (m_dragTarget) {
1483 dispatchDragEvent(EventTypeNames::dragleave, m_dragTarget.get(), eve nt, dataTransfer); 1518 dispatchDragEvent(EventTypeNames::dragleave, m_dragTarget.get(), eve nt, dataTransfer);
1484 } 1519 }
1485 1520
1486 if (newTarget) { 1521 if (newTarget) {
1487 // We do not explicitly call dispatchDragEvent here because it could ultimately result in the appearance that 1522 // We do not explicitly call dispatchDragEvent here because it could ultimately result in the appearance that
1488 // two dragover events fired. So, we mark that we should only fire a dragover event on the next call to this function. 1523 // two dragover events fired. So, we mark that we should only fire a dragover event on the next call to this function.
1489 m_shouldOnlyFireDragOverEvent = true; 1524 m_shouldOnlyFireDragOverEvent = true;
1490 } 1525 }
1491 } else { 1526 } else {
1492 LocalFrame* targetFrame; 1527 LocalFrame* targetFrame;
1493 if (targetIsFrame(newTarget.get(), targetFrame)) { 1528 if (targetIsFrame(newTarget.get(), targetFrame)) {
1494 if (targetFrame) 1529 if (targetFrame)
1495 accept = targetFrame->eventHandler().updateDragAndDrop(event, da taTransfer); 1530 eventResult = targetFrame->eventHandler().updateDragAndDrop(even t, dataTransfer);
1496 } else if (newTarget) { 1531 } else if (newTarget) {
1497 // 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. 1532 // 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.
1498 if (!m_shouldOnlyFireDragOverEvent && dragState().m_dragSrc) { 1533 if (!m_shouldOnlyFireDragOverEvent && dragState().m_dragSrc) {
1499 // for now we don't care if event handler cancels default behavi or, since there is none 1534 // for now we don't care if event handler cancels default behavi or, since there is none
1500 dispatchDragSrcEvent(EventTypeNames::drag, event); 1535 dispatchDragSrcEvent(EventTypeNames::drag, event);
1501 } 1536 }
1502 accept = dispatchDragEvent(EventTypeNames::dragover, newTarget.get() , event, dataTransfer); 1537 eventResult = dispatchDragEvent(EventTypeNames::dragover, newTarget. get(), event, dataTransfer);
1503 if (!accept) 1538 if (eventResult == WebInputEventResult::NotHandled && findDropZone(n ewTarget.get(), dataTransfer))
1504 accept = findDropZone(newTarget.get(), dataTransfer); 1539 eventResult = WebInputEventResult::HandledSystem;
1505 m_shouldOnlyFireDragOverEvent = false; 1540 m_shouldOnlyFireDragOverEvent = false;
1506 } 1541 }
1507 } 1542 }
1508 m_dragTarget = newTarget; 1543 m_dragTarget = newTarget;
1509 1544
1510 return accept; 1545 return eventResult;
1511 } 1546 }
1512 1547
1513 void EventHandler::cancelDragAndDrop(const PlatformMouseEvent& event, DataTransf er* dataTransfer) 1548 void EventHandler::cancelDragAndDrop(const PlatformMouseEvent& event, DataTransf er* dataTransfer)
1514 { 1549 {
1515 LocalFrame* targetFrame; 1550 LocalFrame* targetFrame;
1516 if (targetIsFrame(m_dragTarget.get(), targetFrame)) { 1551 if (targetIsFrame(m_dragTarget.get(), targetFrame)) {
1517 if (targetFrame) 1552 if (targetFrame)
1518 targetFrame->eventHandler().cancelDragAndDrop(event, dataTransfer); 1553 targetFrame->eventHandler().cancelDragAndDrop(event, dataTransfer);
1519 } else if (m_dragTarget.get()) { 1554 } else if (m_dragTarget.get()) {
1520 if (dragState().m_dragSrc) 1555 if (dragState().m_dragSrc)
1521 dispatchDragSrcEvent(EventTypeNames::drag, event); 1556 dispatchDragSrcEvent(EventTypeNames::drag, event);
1522 dispatchDragEvent(EventTypeNames::dragleave, m_dragTarget.get(), event, dataTransfer); 1557 dispatchDragEvent(EventTypeNames::dragleave, m_dragTarget.get(), event, dataTransfer);
1523 } 1558 }
1524 clearDragState(); 1559 clearDragState();
1525 } 1560 }
1526 1561
1527 bool EventHandler::performDragAndDrop(const PlatformMouseEvent& event, DataTrans fer* dataTransfer) 1562 WebInputEventResult EventHandler::performDragAndDrop(const PlatformMouseEvent& e vent, DataTransfer* dataTransfer)
1528 { 1563 {
1529 LocalFrame* targetFrame; 1564 LocalFrame* targetFrame;
1530 bool preventedDefault = false; 1565 WebInputEventResult result = WebInputEventResult::NotHandled;
1531 if (targetIsFrame(m_dragTarget.get(), targetFrame)) { 1566 if (targetIsFrame(m_dragTarget.get(), targetFrame)) {
1532 if (targetFrame) 1567 if (targetFrame)
1533 preventedDefault = targetFrame->eventHandler().performDragAndDrop(ev ent, dataTransfer); 1568 result = targetFrame->eventHandler().performDragAndDrop(event, dataT ransfer);
1534 } else if (m_dragTarget.get()) { 1569 } else if (m_dragTarget.get()) {
1535 preventedDefault = dispatchDragEvent(EventTypeNames::drop, m_dragTarget. get(), event, dataTransfer); 1570 result = dispatchDragEvent(EventTypeNames::drop, m_dragTarget.get(), eve nt, dataTransfer);
1536 } 1571 }
1537 clearDragState(); 1572 clearDragState();
1538 return preventedDefault; 1573 return result;
1539 } 1574 }
1540 1575
1541 void EventHandler::clearDragState() 1576 void EventHandler::clearDragState()
1542 { 1577 {
1543 stopAutoscroll(); 1578 stopAutoscroll();
1544 m_dragTarget = nullptr; 1579 m_dragTarget = nullptr;
1545 m_capturingMouseEventsNode = nullptr; 1580 m_capturingMouseEventsNode = nullptr;
1546 m_shouldOnlyFireDragOverEvent = false; 1581 m_shouldOnlyFireDragOverEvent = false;
1547 } 1582 }
1548 1583
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
1605 1640
1606 if (lastNodeUnderMouse && lastNodeUnderMouse->document() != m_frame->documen t()) { 1641 if (lastNodeUnderMouse && lastNodeUnderMouse->document() != m_frame->documen t()) {
1607 lastNodeUnderMouse = nullptr; 1642 lastNodeUnderMouse = nullptr;
1608 m_lastScrollbarUnderMouse = nullptr; 1643 m_lastScrollbarUnderMouse = nullptr;
1609 } 1644 }
1610 1645
1611 if (lastNodeUnderMouse != m_nodeUnderMouse) 1646 if (lastNodeUnderMouse != m_nodeUnderMouse)
1612 sendMouseEventsForNodeTransition(lastNodeUnderMouse.get(), m_nodeUnderMo use.get(), mouseEvent); 1647 sendMouseEventsForNodeTransition(lastNodeUnderMouse.get(), m_nodeUnderMo use.get(), mouseEvent);
1613 } 1648 }
1614 1649
1615 bool EventHandler::dispatchPointerEvent(Node* target, const AtomicString& eventT ype, 1650 WebInputEventResult EventHandler::dispatchPointerEvent(Node* target, const Atomi cString& eventType,
1616 const PlatformMouseEvent& mouseEvent, Node* relatedTarget) 1651 const PlatformMouseEvent& mouseEvent, Node* relatedTarget)
1617 { 1652 {
1618 if (!RuntimeEnabledFeatures::pointerEventEnabled()) 1653 if (!RuntimeEnabledFeatures::pointerEventEnabled())
1619 return false; 1654 return WebInputEventResult::NotHandled;
1620 1655
1621 RefPtrWillBeRawPtr<PointerEvent> pointerEvent = PointerEvent::create(eventTy pe, true, 1656 RefPtrWillBeRawPtr<PointerEvent> pointerEvent = PointerEvent::create(eventTy pe, true,
1622 mouseEvent, relatedTarget, m_frame->document()->domWindow()); 1657 mouseEvent, relatedTarget, m_frame->document()->domWindow());
1623 target->dispatchEvent(pointerEvent.get()); 1658
1624 return pointerEvent->defaultPrevented() || pointerEvent->defaultHandled(); 1659 bool dispatchResult = target->dispatchEvent(pointerEvent.get());
1660 return eventToEventResult(pointerEvent, dispatchResult);
1625 } 1661 }
1626 1662
1627 void EventHandler::sendMouseEventsForNodeTransition(Node* exitedNode, Node* ente redNode, 1663 void EventHandler::sendMouseEventsForNodeTransition(Node* exitedNode, Node* ente redNode,
1628 const PlatformMouseEvent& mouseEvent) 1664 const PlatformMouseEvent& mouseEvent)
1629 { 1665 {
1630 ASSERT(exitedNode != enteredNode); 1666 ASSERT(exitedNode != enteredNode);
1631 1667
1632 // Dispatch pointerout/mouseout events 1668 // Dispatch pointerout/mouseout events
1633 if (isNodeInDocument(exitedNode)) { 1669 if (isNodeInDocument(exitedNode)) {
1634 dispatchPointerEvent(exitedNode, EventTypeNames::pointerout, mouseEvent, enteredNode); 1670 dispatchPointerEvent(exitedNode, EventTypeNames::pointerout, mouseEvent, enteredNode);
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after
1720 for (size_t i = enteredAncestorIndex; i > 0; i--) { 1756 for (size_t i = enteredAncestorIndex; i > 0; i--) {
1721 if (enteredNodeHasCapturingAncestor || enteredAncestors[i-1]->hasEventLi steners(EventTypeNames::pointerenter)) { 1757 if (enteredNodeHasCapturingAncestor || enteredAncestors[i-1]->hasEventLi steners(EventTypeNames::pointerenter)) {
1722 dispatchPointerEvent(enteredAncestors[i-1].get(), EventTypeNames::po interenter, mouseEvent, 1758 dispatchPointerEvent(enteredAncestors[i-1].get(), EventTypeNames::po interenter, mouseEvent,
1723 exitedNode); 1759 exitedNode);
1724 } 1760 }
1725 if (enteredNodeHasCapturingAncestor || enteredAncestors[i-1]->hasEventLi steners(EventTypeNames::mouseenter)) 1761 if (enteredNodeHasCapturingAncestor || enteredAncestors[i-1]->hasEventLi steners(EventTypeNames::mouseenter))
1726 enteredAncestors[i-1]->dispatchMouseEvent(mouseEvent, EventTypeNames ::mouseenter, 0, exitedNode); 1762 enteredAncestors[i-1]->dispatchMouseEvent(mouseEvent, EventTypeNames ::mouseenter, 0, exitedNode);
1727 } 1763 }
1728 } 1764 }
1729 1765
1730 bool EventHandler::dispatchMouseEvent(const AtomicString& eventType, Node* targe tNode, int clickCount, const PlatformMouseEvent& mouseEvent) 1766 WebInputEventResult EventHandler::dispatchMouseEvent(const AtomicString& eventTy pe, Node* targetNode, int clickCount, const PlatformMouseEvent& mouseEvent)
1731 { 1767 {
1732 updateMouseEventTargetNode(targetNode, mouseEvent); 1768 updateMouseEventTargetNode(targetNode, mouseEvent);
1733 return m_nodeUnderMouse && !m_nodeUnderMouse->dispatchMouseEvent(mouseEvent, eventType, clickCount); 1769 if (!m_nodeUnderMouse)
1770 return WebInputEventResult::NotHandled;
1771
1772 RefPtrWillBeRawPtr<MouseEvent> event = MouseEvent::create(eventType, m_nodeU nderMouse->document().domWindow(), mouseEvent, clickCount, nullptr);
1773 bool dispatchResult = m_nodeUnderMouse->dispatchEvent(event);
1774 return eventToEventResult(event, dispatchResult);
1734 } 1775 }
1735 1776
1736 // TODO(mustaq): Make PE drive ME dispatch & bookkeeping in EventHandler. 1777 // TODO(mustaq): Make PE drive ME dispatch & bookkeeping in EventHandler.
1737 bool EventHandler::updatePointerTargetAndDispatchEvents(const AtomicString& mous eEventType, Node* targetNode, int clickCount, const PlatformMouseEvent& mouseEve nt) 1778 WebInputEventResult EventHandler::updatePointerTargetAndDispatchEvents(const Ato micString& mouseEventType, Node* targetNode, int clickCount, const PlatformMouse Event& mouseEvent)
1738 { 1779 {
1739 ASSERT(mouseEventType == EventTypeNames::mousedown 1780 ASSERT(mouseEventType == EventTypeNames::mousedown
1740 || mouseEventType == EventTypeNames::mousemove 1781 || mouseEventType == EventTypeNames::mousemove
1741 || mouseEventType == EventTypeNames::mouseup); 1782 || mouseEventType == EventTypeNames::mouseup);
1742 1783
1743 updateMouseEventTargetNode(targetNode, mouseEvent); 1784 updateMouseEventTargetNode(targetNode, mouseEvent);
1744 if (!m_nodeUnderMouse) 1785 if (!m_nodeUnderMouse)
1745 return false; 1786 return WebInputEventResult::NotHandled;
1746 1787
1747 bool swallowEvent = dispatchPointerEvent(m_nodeUnderMouse.get(), 1788 WebInputEventResult result = dispatchPointerEvent(m_nodeUnderMouse.get(),
1748 pointerEventNameForMouseEventName(mouseEventType), 1789 pointerEventNameForMouseEventName(mouseEventType),
1749 mouseEvent); 1790 mouseEvent);
1750 1791
1751 if (swallowEvent && mouseEventType == EventTypeNames::mousedown) { 1792 if (result != WebInputEventResult::NotHandled && mouseEventType == EventType Names::mousedown) {
1752 m_preventMouseEventForPointerTypeMouse = true; 1793 m_preventMouseEventForPointerTypeMouse = true;
1753 } 1794 }
1754 1795
1755 if (!m_preventMouseEventForPointerTypeMouse) { 1796 if (!m_preventMouseEventForPointerTypeMouse) {
1756 swallowEvent |= !m_nodeUnderMouse->dispatchMouseEvent(mouseEvent, mouseE ventType, clickCount); 1797 RefPtrWillBeRawPtr<MouseEvent> event = MouseEvent::create(mouseEventType , m_nodeUnderMouse->document().domWindow(), mouseEvent, clickCount, nullptr);
1798 bool dispatchResult = m_nodeUnderMouse->dispatchEvent(event);
1799 result = mergeEventResult(result, eventToEventResult(event, dispatchResu lt));
1757 } 1800 }
1758 1801
1759 return swallowEvent; 1802 return result;
1760 } 1803 }
1761 1804
1762 bool EventHandler::handleMouseFocus(const MouseEventWithHitTestResults& targeted Event, InputDeviceCapabilities* sourceCapabilities) 1805 WebInputEventResult EventHandler::handleMouseFocus(const MouseEventWithHitTestRe sults& targetedEvent, InputDeviceCapabilities* sourceCapabilities)
1763 { 1806 {
1764 // If clicking on a frame scrollbar, do not mess up with content focus. 1807 // If clicking on a frame scrollbar, do not mess up with content focus.
1765 if (targetedEvent.hitTestResult().scrollbar() && m_frame->contentLayoutObjec t()) { 1808 if (targetedEvent.hitTestResult().scrollbar() && m_frame->contentLayoutObjec t()) {
1766 if (targetedEvent.hitTestResult().scrollbar()->scrollableArea() == m_fra me->contentLayoutObject()->scrollableArea()) 1809 if (targetedEvent.hitTestResult().scrollbar()->scrollableArea() == m_fra me->contentLayoutObject()->scrollableArea())
1767 return false; 1810 return WebInputEventResult::NotHandled;
1768 } 1811 }
1769 1812
1770 // The layout needs to be up to date to determine if an element is focusable . 1813 // The layout needs to be up to date to determine if an element is focusable .
1771 m_frame->document()->updateLayoutIgnorePendingStylesheets(); 1814 m_frame->document()->updateLayoutIgnorePendingStylesheets();
1772 1815
1773 Element* element = nullptr; 1816 Element* element = nullptr;
1774 if (m_nodeUnderMouse) 1817 if (m_nodeUnderMouse)
1775 element = m_nodeUnderMouse->isElementNode() ? toElement(m_nodeUnderMouse ) : m_nodeUnderMouse->parentOrShadowHostElement(); 1818 element = m_nodeUnderMouse->isElementNode() ? toElement(m_nodeUnderMouse ) : m_nodeUnderMouse->parentOrShadowHostElement();
1776 for (; element; element = element->parentOrShadowHostElement()) { 1819 for (; element; element = element->parentOrShadowHostElement()) {
1777 if (element->isFocusable() && element->isFocusedElementInDocument()) 1820 if (element->isFocusable() && element->isFocusedElementInDocument())
1778 return false; 1821 return WebInputEventResult::NotHandled;
1779 if (element->isMouseFocusable()) 1822 if (element->isMouseFocusable())
1780 break; 1823 break;
1781 } 1824 }
1782 ASSERT(!element || element->isMouseFocusable()); 1825 ASSERT(!element || element->isMouseFocusable());
1783 1826
1784 // To fix <rdar://problem/4895428> Can't drag selected ToDo, we don't focus 1827 // To fix <rdar://problem/4895428> Can't drag selected ToDo, we don't focus
1785 // a node on mouse down if it's selected and inside a focused node. It will 1828 // a node on mouse down if it's selected and inside a focused node. It will
1786 // be focused if the user does a mouseup over it, however, because the 1829 // be focused if the user does a mouseup over it, however, because the
1787 // mouseup will set a selection inside it, which will call 1830 // mouseup will set a selection inside it, which will call
1788 // FrameSelection::setFocusedNodeIfNeeded. 1831 // FrameSelection::setFocusedNodeIfNeeded.
1789 if (element && m_frame->selection().isRange()) { 1832 if (element && m_frame->selection().isRange()) {
1790 // TODO(yosin) We should not create |Range| object for calling 1833 // TODO(yosin) We should not create |Range| object for calling
1791 // |isNodeFullyContained()|. 1834 // |isNodeFullyContained()|.
1792 if (createRange(m_frame->selection().selection().toNormalizedEphemeralRa nge())->isNodeFullyContained(*element) 1835 if (createRange(m_frame->selection().selection().toNormalizedEphemeralRa nge())->isNodeFullyContained(*element)
1793 && element->isDescendantOf(m_frame->document()->focusedElement())) 1836 && element->isDescendantOf(m_frame->document()->focusedElement()))
1794 return false; 1837 return WebInputEventResult::NotHandled;
1795 } 1838 }
1796 1839
1797 1840
1798 // Only change the focus when clicking scrollbars if it can transfered to a 1841 // Only change the focus when clicking scrollbars if it can transfered to a
1799 // mouse focusable node. 1842 // mouse focusable node.
1800 if (!element && targetedEvent.hitTestResult().scrollbar()) 1843 if (!element && targetedEvent.hitTestResult().scrollbar())
1801 return true; 1844 return WebInputEventResult::HandledSystem;
1802 1845
1803 if (Page* page = m_frame->page()) { 1846 if (Page* page = m_frame->page()) {
1804 // If focus shift is blocked, we eat the event. Note we should never 1847 // If focus shift is blocked, we eat the event. Note we should never
1805 // clear swallowEvent if the page already set it (e.g., by canceling 1848 // clear swallowEvent if the page already set it (e.g., by canceling
1806 // default behavior). 1849 // default behavior).
1807 if (element) { 1850 if (element) {
1808 if (slideFocusOnShadowHostIfNecessary(*element)) 1851 if (slideFocusOnShadowHostIfNecessary(*element))
1809 return true; 1852 return WebInputEventResult::HandledSystem;
1810 if (!page->focusController().setFocusedElement(element, m_frame, Foc usParams(SelectionBehaviorOnFocus::None, WebFocusTypeMouse, sourceCapabilities)) ) 1853 if (!page->focusController().setFocusedElement(element, m_frame, Foc usParams(SelectionBehaviorOnFocus::None, WebFocusTypeMouse, sourceCapabilities)) )
1811 return true; 1854 return WebInputEventResult::HandledSystem;
1812 } else { 1855 } else {
1813 // We call setFocusedElement even with !element in order to blur 1856 // We call setFocusedElement even with !element in order to blur
1814 // current focus element when a link is clicked; this is expected by 1857 // current focus element when a link is clicked; this is expected by
1815 // some sites that rely on onChange handlers running from form 1858 // some sites that rely on onChange handlers running from form
1816 // fields before the button click is processed. 1859 // fields before the button click is processed.
1817 if (!page->focusController().setFocusedElement(nullptr, m_frame, Foc usParams(SelectionBehaviorOnFocus::None, WebFocusTypeNone, sourceCapabilities))) 1860 if (!page->focusController().setFocusedElement(nullptr, m_frame, Foc usParams(SelectionBehaviorOnFocus::None, WebFocusTypeNone, sourceCapabilities)))
1818 return true; 1861 return WebInputEventResult::HandledSystem;
1819 } 1862 }
1820 } 1863 }
1821 1864
1822 return false; 1865 return WebInputEventResult::NotHandled;
1823 } 1866 }
1824 1867
1825 bool EventHandler::slideFocusOnShadowHostIfNecessary(const Element& element) 1868 bool EventHandler::slideFocusOnShadowHostIfNecessary(const Element& element)
1826 { 1869 {
1827 if (element.authorShadowRoot() && element.authorShadowRoot()->delegatesFocus ()) { 1870 if (element.authorShadowRoot() && element.authorShadowRoot()->delegatesFocus ()) {
1828 Document* doc = m_frame->document(); 1871 Document* doc = m_frame->document();
1829 if (element.containsIncludingShadowDOM(doc->focusedElement())) { 1872 if (element.containsIncludingShadowDOM(doc->focusedElement())) {
1830 // If the inner element is already focused, do nothing. 1873 // If the inner element is already focused, do nothing.
1831 return true; 1874 return true;
1832 } 1875 }
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
1873 ScrollResult result; 1916 ScrollResult result;
1874 result.didScrollY = resultY.didScroll; 1917 result.didScrollY = resultY.didScroll;
1875 result.didScrollX = resultX.didScroll; 1918 result.didScrollX = resultX.didScroll;
1876 result.unusedScrollDeltaY = resultY.unusedScrollDelta; 1919 result.unusedScrollDeltaY = resultY.unusedScrollDelta;
1877 result.unusedScrollDeltaX = resultX.unusedScrollDelta; 1920 result.unusedScrollDeltaX = resultX.unusedScrollDelta;
1878 return result; 1921 return result;
1879 } 1922 }
1880 1923
1881 } // namespace 1924 } // namespace
1882 1925
1883 bool EventHandler::handleWheelEvent(const PlatformWheelEvent& event) 1926 WebInputEventResult EventHandler::handleWheelEvent(const PlatformWheelEvent& eve nt)
1884 { 1927 {
1885 #define RETURN_WHEEL_EVENT_HANDLED() \
1886 { \
1887 setFrameWasScrolledByUser(); \
1888 return true; \
1889 }
1890
1891 Document* doc = m_frame->document(); 1928 Document* doc = m_frame->document();
1892 1929
1893 if (!doc->layoutView()) 1930 if (!doc->layoutView())
1894 return false; 1931 return WebInputEventResult::NotHandled;
1895 1932
1896 RefPtrWillBeRawPtr<FrameView> protector(m_frame->view()); 1933 RefPtrWillBeRawPtr<FrameView> protector(m_frame->view());
1897 1934
1898 FrameView* view = m_frame->view(); 1935 FrameView* view = m_frame->view();
1899 if (!view) 1936 if (!view)
1900 return false; 1937 return WebInputEventResult::NotHandled;
1901 1938
1902 LayoutPoint vPoint = view->rootFrameToContents(event.position()); 1939 LayoutPoint vPoint = view->rootFrameToContents(event.position());
1903 1940
1904 HitTestRequest request(HitTestRequest::ReadOnly); 1941 HitTestRequest request(HitTestRequest::ReadOnly);
1905 HitTestResult result(request, vPoint); 1942 HitTestResult result(request, vPoint);
1906 doc->layoutView()->hitTest(result); 1943 doc->layoutView()->hitTest(result);
1907 1944
1908 Node* node = result.innerNode(); 1945 Node* node = result.innerNode();
1909 // Wheel events should not dispatch to text nodes. 1946 // Wheel events should not dispatch to text nodes.
1910 if (node && node->isTextNode()) 1947 if (node && node->isTextNode())
1911 node = ComposedTreeTraversal::parent(*node); 1948 node = ComposedTreeTraversal::parent(*node);
1912 1949
1913 if (m_previousWheelScrolledNode) 1950 if (m_previousWheelScrolledNode)
1914 m_previousWheelScrolledNode = nullptr; 1951 m_previousWheelScrolledNode = nullptr;
1915 1952
1916 bool isOverWidget = result.isOverWidget(); 1953 bool isOverWidget = result.isOverWidget();
1917 1954
1918 if (node) { 1955 if (node) {
1919 // Figure out which view to send the event to. 1956 // Figure out which view to send the event to.
1920 LayoutObject* target = node->layoutObject(); 1957 LayoutObject* target = node->layoutObject();
1921 1958
1922 if (isOverWidget && target && target->isLayoutPart()) { 1959 if (isOverWidget && target && target->isLayoutPart()) {
1923 Widget* widget = toLayoutPart(target)->widget(); 1960 if (Widget* widget = toLayoutPart(target)->widget()) {
1924 if (widget && passWheelEventToWidget(event, *widget)) 1961 WebInputEventResult result = passWheelEventToWidget(event, *widg et);
1925 RETURN_WHEEL_EVENT_HANDLED(); 1962 if (result != WebInputEventResult::NotHandled) {
1963 setFrameWasScrolledByUser();
1964 return result;
1965 }
1966 }
1926 } 1967 }
1927 1968
1928 if (node && !node->dispatchWheelEvent(event)) 1969 RefPtrWillBeRawPtr<Event> domEvent = WheelEvent::create(event, node->doc ument().domWindow());
1929 RETURN_WHEEL_EVENT_HANDLED(); 1970 if (!node->dispatchEvent(domEvent)) {
1971 setFrameWasScrolledByUser();
1972 return eventToEventResult(domEvent, false);
1973 }
1930 } 1974 }
1931 1975
1932 // We do another check on the frame view because the event handler can run 1976 // We do another check on the frame view because the event handler can run
1933 // JS which results in the frame getting destroyed. 1977 // JS which results in the frame getting destroyed.
1934 view = m_frame->view(); 1978 view = m_frame->view();
1935 if (!view) 1979 if (!view)
1936 return false; 1980 return WebInputEventResult::NotHandled;
1937 1981
1938 // Wheel events which do not scroll are used to trigger zooming. 1982 // Wheel events which do not scroll are used to trigger zooming.
1939 if (!event.canScroll()) 1983 if (!event.canScroll())
1940 return false; 1984 return WebInputEventResult::NotHandled;
1941 1985
1942 ScrollResult scrollResult = scrollAreaWithWheelEvent(event, *view->scrollabl eArea()); 1986 ScrollResult scrollResult = scrollAreaWithWheelEvent(event, *view->scrollabl eArea());
1943 if (m_frame->settings() && m_frame->settings()->reportWheelOverscroll()) 1987 if (m_frame->settings() && m_frame->settings()->reportWheelOverscroll())
1944 handleOverscroll(scrollResult); 1988 handleOverscroll(scrollResult);
1945 if (scrollResult.didScroll()) 1989 if (scrollResult.didScroll()) {
1946 RETURN_WHEEL_EVENT_HANDLED(); 1990 setFrameWasScrolledByUser();
1991 return WebInputEventResult::HandledSystem;
1992 }
1947 1993
1948 return false; 1994 return WebInputEventResult::NotHandled;
1949 #undef RETURN_WHEEL_EVENT_HANDLED
1950 } 1995 }
1951 1996
1952 void EventHandler::defaultWheelEventHandler(Node* startNode, WheelEvent* wheelEv ent) 1997 void EventHandler::defaultWheelEventHandler(Node* startNode, WheelEvent* wheelEv ent)
1953 { 1998 {
1954 if (!startNode || !wheelEvent) 1999 if (!startNode || !wheelEvent)
1955 return; 2000 return;
1956 2001
1957 // When the wheelEvent do not scroll, we trigger zoom in/out instead. 2002 // When the wheelEvent do not scroll, we trigger zoom in/out instead.
1958 if (!wheelEvent->canScroll()) 2003 if (!wheelEvent->canScroll())
1959 return; 2004 return;
(...skipping 10 matching lines...) Expand all
1970 && scroll(ScrollRightIgnoringWritingMode, granularity, startNode, &stopN ode, wheelEvent->deltaX(), absolutePosition).didScroll) 2015 && scroll(ScrollRightIgnoringWritingMode, granularity, startNode, &stopN ode, wheelEvent->deltaX(), absolutePosition).didScroll)
1971 wheelEvent->setDefaultHandled(); 2016 wheelEvent->setDefaultHandled();
1972 2017
1973 if (wheelEvent->railsMode() != Event::RailsModeHorizontal 2018 if (wheelEvent->railsMode() != Event::RailsModeHorizontal
1974 && scroll(ScrollDownIgnoringWritingMode, granularity, startNode, &stopNo de, wheelEvent->deltaY(), absolutePosition).didScroll) 2019 && scroll(ScrollDownIgnoringWritingMode, granularity, startNode, &stopNo de, wheelEvent->deltaY(), absolutePosition).didScroll)
1975 wheelEvent->setDefaultHandled(); 2020 wheelEvent->setDefaultHandled();
1976 2021
1977 m_previousWheelScrolledNode = stopNode; 2022 m_previousWheelScrolledNode = stopNode;
1978 } 2023 }
1979 2024
1980 bool EventHandler::handleGestureShowPress() 2025 WebInputEventResult EventHandler::handleGestureShowPress()
1981 { 2026 {
1982 m_lastShowPressTimestamp = WTF::monotonicallyIncreasingTime(); 2027 m_lastShowPressTimestamp = WTF::monotonicallyIncreasingTime();
1983 2028
1984 FrameView* view = m_frame->view(); 2029 FrameView* view = m_frame->view();
1985 if (!view) 2030 if (!view)
1986 return false; 2031 return WebInputEventResult::NotHandled;
1987 if (ScrollAnimatorBase* scrollAnimator = view->existingScrollAnimator()) 2032 if (ScrollAnimatorBase* scrollAnimator = view->existingScrollAnimator())
1988 scrollAnimator->cancelAnimations(); 2033 scrollAnimator->cancelAnimations();
1989 const FrameView::ScrollableAreaSet* areas = view->scrollableAreas(); 2034 const FrameView::ScrollableAreaSet* areas = view->scrollableAreas();
1990 if (!areas) 2035 if (!areas)
1991 return false; 2036 return WebInputEventResult::NotHandled;
1992 for (const ScrollableArea* scrollableArea : *areas) { 2037 for (const ScrollableArea* scrollableArea : *areas) {
1993 ScrollAnimatorBase* animator = scrollableArea->existingScrollAnimator(); 2038 ScrollAnimatorBase* animator = scrollableArea->existingScrollAnimator();
1994 if (animator) 2039 if (animator)
1995 animator->cancelAnimations(); 2040 animator->cancelAnimations();
1996 } 2041 }
1997 return false; 2042 return WebInputEventResult::NotHandled;
1998 } 2043 }
1999 2044
2000 bool EventHandler::handleGestureEvent(const PlatformGestureEvent& gestureEvent) 2045 WebInputEventResult EventHandler::handleGestureEvent(const PlatformGestureEvent& gestureEvent)
2001 { 2046 {
2002 // Propagation to inner frames is handled below this function. 2047 // Propagation to inner frames is handled below this function.
2003 ASSERT(m_frame == m_frame->localFrameRoot()); 2048 ASSERT(m_frame == m_frame->localFrameRoot());
2004 2049
2005 // Scrolling-related gesture events invoke EventHandler recursively for each frame down 2050 // Scrolling-related gesture events invoke EventHandler recursively for each frame down
2006 // the chain, doing a single-frame hit-test per frame. This matches handleWh eelEvent. 2051 // the chain, doing a single-frame hit-test per frame. This matches handleWh eelEvent.
2007 // FIXME: Add a test that traverses this path, e.g. for devtools overlay. 2052 // FIXME: Add a test that traverses this path, e.g. for devtools overlay.
2008 if (gestureEvent.isScrollEvent()) 2053 if (gestureEvent.isScrollEvent())
2009 return handleGestureScrollEvent(gestureEvent); 2054 return handleGestureScrollEvent(gestureEvent);
2010 2055
2011 // Hit test across all frames and do touch adjustment as necessary for the e vent type. 2056 // Hit test across all frames and do touch adjustment as necessary for the e vent type.
2012 GestureEventWithHitTestResults targetedEvent = targetGestureEvent(gestureEve nt); 2057 GestureEventWithHitTestResults targetedEvent = targetGestureEvent(gestureEve nt);
2013 2058
2014 return handleGestureEvent(targetedEvent); 2059 return handleGestureEvent(targetedEvent);
2015 } 2060 }
2016 2061
2017 bool EventHandler::handleGestureEvent(const GestureEventWithHitTestResults& targ etedEvent) 2062 WebInputEventResult EventHandler::handleGestureEvent(const GestureEventWithHitTe stResults& targetedEvent)
2018 { 2063 {
2019 TRACE_EVENT0("input", "EventHandler::handleGestureEvent"); 2064 TRACE_EVENT0("input", "EventHandler::handleGestureEvent");
2020 2065
2021 // Propagation to inner frames is handled below this function. 2066 // Propagation to inner frames is handled below this function.
2022 ASSERT(m_frame == m_frame->localFrameRoot()); 2067 ASSERT(m_frame == m_frame->localFrameRoot());
2023 2068
2024 // Non-scrolling related gesture events do a single cross-frame hit-test and jump 2069 // Non-scrolling related gesture events do a single cross-frame hit-test and jump
2025 // directly to the inner most frame. This matches handleMousePressEvent etc. 2070 // directly to the inner most frame. This matches handleMousePressEvent etc.
2026 ASSERT(!targetedEvent.event().isScrollEvent()); 2071 ASSERT(!targetedEvent.event().isScrollEvent());
2027 2072
2028 // update mouseout/leave/over/enter events before jumping directly to the in ner most frame 2073 // update mouseout/leave/over/enter events before jumping directly to the in ner most frame
2029 if (targetedEvent.event().type() == PlatformEvent::GestureTap) 2074 if (targetedEvent.event().type() == PlatformEvent::GestureTap)
2030 updateGestureTargetNodeForMouseEvent(targetedEvent); 2075 updateGestureTargetNodeForMouseEvent(targetedEvent);
2031 2076
2032 // Route to the correct frame. 2077 // Route to the correct frame.
2033 if (LocalFrame* innerFrame = targetedEvent.hitTestResult().innerNodeFrame()) 2078 if (LocalFrame* innerFrame = targetedEvent.hitTestResult().innerNodeFrame())
2034 return innerFrame->eventHandler().handleGestureEventInFrame(targetedEven t); 2079 return innerFrame->eventHandler().handleGestureEventInFrame(targetedEven t);
2035 2080
2036 // No hit test result, handle in root instance. Perhaps we should just retur n false instead? 2081 // No hit test result, handle in root instance. Perhaps we should just retur n false instead?
2037 return handleGestureEventInFrame(targetedEvent); 2082 return handleGestureEventInFrame(targetedEvent);
2038 } 2083 }
2039 2084
2040 bool EventHandler::handleGestureEventInFrame(const GestureEventWithHitTestResult s& targetedEvent) 2085 WebInputEventResult EventHandler::handleGestureEventInFrame(const GestureEventWi thHitTestResults& targetedEvent)
2041 { 2086 {
2042 ASSERT(!targetedEvent.event().isScrollEvent()); 2087 ASSERT(!targetedEvent.event().isScrollEvent());
2043 2088
2044 RefPtrWillBeRawPtr<Node> eventTarget = targetedEvent.hitTestResult().innerNo de(); 2089 RefPtrWillBeRawPtr<Node> eventTarget = targetedEvent.hitTestResult().innerNo de();
2045 RefPtrWillBeRawPtr<Scrollbar> scrollbar = targetedEvent.hitTestResult().scro llbar(); 2090 RefPtrWillBeRawPtr<Scrollbar> scrollbar = targetedEvent.hitTestResult().scro llbar();
2046 const PlatformGestureEvent& gestureEvent = targetedEvent.event(); 2091 const PlatformGestureEvent& gestureEvent = targetedEvent.event();
2047 2092
2048 if (scrollbar) { 2093 if (scrollbar) {
2049 bool eventSwallowed = scrollbar->gestureEvent(gestureEvent); 2094 bool eventSwallowed = scrollbar->gestureEvent(gestureEvent);
2050 if (gestureEvent.type() == PlatformEvent::GestureTapDown && eventSwallow ed) 2095 if (gestureEvent.type() == PlatformEvent::GestureTapDown && eventSwallow ed)
2051 m_scrollbarHandlingScrollGesture = scrollbar; 2096 m_scrollbarHandlingScrollGesture = scrollbar;
2052 if (eventSwallowed) 2097 if (eventSwallowed)
2053 return true; 2098 return WebInputEventResult::HandledSuppressed;
2054 } 2099 }
2055 2100
2056 if (eventTarget && eventTarget->dispatchGestureEvent(gestureEvent)) 2101 if (eventTarget) {
2057 return true; 2102 RefPtrWillBeRawPtr<GestureEvent> gestureDomEvent = GestureEvent::create( eventTarget->document().domWindow(), gestureEvent);
2103 // TODO(dtapuska): dispatchEvent is inverted for Gesture Events
2104 // crbug.com/560357
2105 if (gestureDomEvent.get() && eventTarget->dispatchEvent(gestureDomEvent) )
2106 return eventToEventResult(gestureDomEvent, false);
2107 }
2058 2108
2059 switch (gestureEvent.type()) { 2109 switch (gestureEvent.type()) {
2060 case PlatformEvent::GestureTap: 2110 case PlatformEvent::GestureTap:
2061 return handleGestureTap(targetedEvent); 2111 return handleGestureTap(targetedEvent);
2062 case PlatformEvent::GestureShowPress: 2112 case PlatformEvent::GestureShowPress:
2063 return handleGestureShowPress(); 2113 return handleGestureShowPress();
2064 case PlatformEvent::GestureLongPress: 2114 case PlatformEvent::GestureLongPress:
2065 return handleGestureLongPress(targetedEvent); 2115 return handleGestureLongPress(targetedEvent);
2066 case PlatformEvent::GestureLongTap: 2116 case PlatformEvent::GestureLongTap:
2067 return handleGestureLongTap(targetedEvent); 2117 return handleGestureLongTap(targetedEvent);
2068 case PlatformEvent::GestureTwoFingerTap: 2118 case PlatformEvent::GestureTwoFingerTap:
2069 return sendContextMenuEventForGesture(targetedEvent); 2119 return sendContextMenuEventForGesture(targetedEvent);
2070 case PlatformEvent::GestureTapDown: 2120 case PlatformEvent::GestureTapDown:
2071 case PlatformEvent::GesturePinchBegin: 2121 case PlatformEvent::GesturePinchBegin:
2072 case PlatformEvent::GesturePinchEnd: 2122 case PlatformEvent::GesturePinchEnd:
2073 case PlatformEvent::GesturePinchUpdate: 2123 case PlatformEvent::GesturePinchUpdate:
2074 case PlatformEvent::GestureTapDownCancel: 2124 case PlatformEvent::GestureTapDownCancel:
2075 case PlatformEvent::GestureTapUnconfirmed: 2125 case PlatformEvent::GestureTapUnconfirmed:
2076 break; 2126 break;
2077 default: 2127 default:
2078 ASSERT_NOT_REACHED(); 2128 ASSERT_NOT_REACHED();
2079 } 2129 }
2080 2130
2081 return false; 2131 return WebInputEventResult::NotHandled;
2082 } 2132 }
2083 2133
2084 bool EventHandler::handleGestureScrollEvent(const PlatformGestureEvent& gestureE vent) 2134 WebInputEventResult EventHandler::handleGestureScrollEvent(const PlatformGesture Event& gestureEvent)
2085 { 2135 {
2086 TRACE_EVENT0("input", "EventHandler::handleGestureScrollEvent"); 2136 TRACE_EVENT0("input", "EventHandler::handleGestureScrollEvent");
2087 2137
2088 RefPtrWillBeRawPtr<Node> eventTarget = nullptr; 2138 RefPtrWillBeRawPtr<Node> eventTarget = nullptr;
2089 RefPtrWillBeRawPtr<Scrollbar> scrollbar = nullptr; 2139 RefPtrWillBeRawPtr<Scrollbar> scrollbar = nullptr;
2090 if (gestureEvent.type() != PlatformEvent::GestureScrollBegin) { 2140 if (gestureEvent.type() != PlatformEvent::GestureScrollBegin) {
2091 scrollbar = m_scrollbarHandlingScrollGesture.get(); 2141 scrollbar = m_scrollbarHandlingScrollGesture.get();
2092 eventTarget = m_scrollGestureHandlingNode.get(); 2142 eventTarget = m_scrollGestureHandlingNode.get();
2093 } 2143 }
2094 2144
2095 if (!eventTarget) { 2145 if (!eventTarget) {
2096 Document* document = m_frame->document(); 2146 Document* document = m_frame->document();
2097 if (!document->layoutView()) 2147 if (!document->layoutView())
2098 return false; 2148 return WebInputEventResult::NotHandled;
2099 2149
2100 FrameView* view = m_frame->view(); 2150 FrameView* view = m_frame->view();
2101 LayoutPoint viewPoint = view->rootFrameToContents(gestureEvent.position( )); 2151 LayoutPoint viewPoint = view->rootFrameToContents(gestureEvent.position( ));
2102 HitTestRequest request(HitTestRequest::ReadOnly); 2152 HitTestRequest request(HitTestRequest::ReadOnly);
2103 HitTestResult result(request, viewPoint); 2153 HitTestResult result(request, viewPoint);
2104 document->layoutView()->hitTest(result); 2154 document->layoutView()->hitTest(result);
2105 2155
2106 eventTarget = result.innerNode(); 2156 eventTarget = result.innerNode();
2107 2157
2108 m_lastGestureScrollOverWidget = result.isOverWidget(); 2158 m_lastGestureScrollOverWidget = result.isOverWidget();
2109 m_scrollGestureHandlingNode = eventTarget; 2159 m_scrollGestureHandlingNode = eventTarget;
2110 m_previousGestureScrolledNode = nullptr; 2160 m_previousGestureScrolledNode = nullptr;
2111 2161
2112 if (!scrollbar) 2162 if (!scrollbar)
2113 scrollbar = result.scrollbar(); 2163 scrollbar = result.scrollbar();
2114 } 2164 }
2115 2165
2116 if (scrollbar) { 2166 if (scrollbar) {
2117 bool eventSwallowed = scrollbar->gestureEvent(gestureEvent); 2167 bool eventSwallowed = scrollbar->gestureEvent(gestureEvent);
2118 if (gestureEvent.type() == PlatformEvent::GestureScrollEnd 2168 if (gestureEvent.type() == PlatformEvent::GestureScrollEnd
2119 || gestureEvent.type() == PlatformEvent::GestureFlingStart 2169 || gestureEvent.type() == PlatformEvent::GestureFlingStart
2120 || !eventSwallowed) { 2170 || !eventSwallowed) {
2121 m_scrollbarHandlingScrollGesture = nullptr; 2171 m_scrollbarHandlingScrollGesture = nullptr;
2122 } 2172 }
2123 if (eventSwallowed) 2173 if (eventSwallowed)
2124 return true; 2174 return WebInputEventResult::HandledSuppressed;
2125 } 2175 }
2126 2176
2127 if (eventTarget) { 2177 if (eventTarget) {
2128 bool eventSwallowed = handleScrollGestureOnResizer(eventTarget.get(), ge stureEvent); 2178 if (handleScrollGestureOnResizer(eventTarget.get(), gestureEvent))
2129 if (!eventSwallowed) 2179 return WebInputEventResult::HandledSuppressed;
2130 eventSwallowed = eventTarget->dispatchGestureEvent(gestureEvent); 2180
2131 if (eventSwallowed) 2181 RefPtrWillBeRawPtr<GestureEvent> gestureDomEvent = GestureEvent::create( eventTarget->document().domWindow(), gestureEvent);
2132 return true; 2182 // TODO(dtapuska): dispatchEvent is inverted for Gesture Events
2183 // crbug.com/560357
2184 if (gestureDomEvent.get() && eventTarget->dispatchEvent(gestureDomEvent) )
2185 return eventToEventResult(gestureDomEvent, false);
2133 } 2186 }
2134 2187
2135 switch (gestureEvent.type()) { 2188 switch (gestureEvent.type()) {
2136 case PlatformEvent::GestureScrollBegin: 2189 case PlatformEvent::GestureScrollBegin:
2137 return handleGestureScrollBegin(gestureEvent); 2190 return handleGestureScrollBegin(gestureEvent);
2138 case PlatformEvent::GestureScrollUpdate: 2191 case PlatformEvent::GestureScrollUpdate:
2139 return handleGestureScrollUpdate(gestureEvent); 2192 return handleGestureScrollUpdate(gestureEvent);
2140 case PlatformEvent::GestureScrollEnd: 2193 case PlatformEvent::GestureScrollEnd:
2141 return handleGestureScrollEnd(gestureEvent); 2194 return handleGestureScrollEnd(gestureEvent);
2142 case PlatformEvent::GestureFlingStart: 2195 case PlatformEvent::GestureFlingStart:
2143 case PlatformEvent::GesturePinchBegin: 2196 case PlatformEvent::GesturePinchBegin:
2144 case PlatformEvent::GesturePinchEnd: 2197 case PlatformEvent::GesturePinchEnd:
2145 case PlatformEvent::GesturePinchUpdate: 2198 case PlatformEvent::GesturePinchUpdate:
2146 return false; 2199 return WebInputEventResult::NotHandled;
2147 default: 2200 default:
2148 ASSERT_NOT_REACHED(); 2201 ASSERT_NOT_REACHED();
2149 return false; 2202 return WebInputEventResult::NotHandled;
2150 } 2203 }
2151 } 2204 }
2152 2205
2153 bool EventHandler::handleGestureTap(const GestureEventWithHitTestResults& target edEvent) 2206 WebInputEventResult EventHandler::handleGestureTap(const GestureEventWithHitTest Results& targetedEvent)
2154 { 2207 {
2155 RefPtrWillBeRawPtr<FrameView> frameView(m_frame->view()); 2208 RefPtrWillBeRawPtr<FrameView> frameView(m_frame->view());
2156 const PlatformGestureEvent& gestureEvent = targetedEvent.event(); 2209 const PlatformGestureEvent& gestureEvent = targetedEvent.event();
2157 HitTestRequest::HitTestRequestType hitType = getHitTypeForGestureType(gestur eEvent.type()); 2210 HitTestRequest::HitTestRequestType hitType = getHitTypeForGestureType(gestur eEvent.type());
2158 uint64_t preDispatchDomTreeVersion = m_frame->document()->domTreeVersion(); 2211 uint64_t preDispatchDomTreeVersion = m_frame->document()->domTreeVersion();
2159 uint64_t preDispatchStyleVersion = m_frame->document()->styleVersion(); 2212 uint64_t preDispatchStyleVersion = m_frame->document()->styleVersion();
2160 2213
2161 UserGestureIndicator gestureIndicator(DefinitelyProcessingUserGesture); 2214 UserGestureIndicator gestureIndicator(DefinitelyProcessingUserGesture);
2162 2215
2163 HitTestResult currentHitTest = targetedEvent.hitTestResult(); 2216 HitTestResult currentHitTest = targetedEvent.hitTestResult();
(...skipping 29 matching lines...) Expand all
2193 RefPtrWillBeRawPtr<Node> tappedNode = m_clickNode; 2246 RefPtrWillBeRawPtr<Node> tappedNode = m_clickNode;
2194 IntPoint tappedPosition = gestureEvent.position(); 2247 IntPoint tappedPosition = gestureEvent.position();
2195 2248
2196 if (m_clickNode && m_clickNode->isTextNode()) 2249 if (m_clickNode && m_clickNode->isTextNode())
2197 m_clickNode = ComposedTreeTraversal::parent(*m_clickNode); 2250 m_clickNode = ComposedTreeTraversal::parent(*m_clickNode);
2198 2251
2199 PlatformMouseEvent fakeMouseDown(gestureEvent.position(), gestureEvent.globa lPosition(), 2252 PlatformMouseEvent fakeMouseDown(gestureEvent.position(), gestureEvent.globa lPosition(),
2200 LeftButton, PlatformEvent::MousePressed, gestureEvent.tapCount(), 2253 LeftButton, PlatformEvent::MousePressed, gestureEvent.tapCount(),
2201 static_cast<PlatformEvent::Modifiers>(modifiers | PlatformEvent::LeftBut tonDown), 2254 static_cast<PlatformEvent::Modifiers>(modifiers | PlatformEvent::LeftBut tonDown),
2202 PlatformMouseEvent::FromTouch, gestureEvent.timestamp()); 2255 PlatformMouseEvent::FromTouch, gestureEvent.timestamp());
2203 bool swallowMouseDownEvent = dispatchMouseEvent(EventTypeNames::mousedown, c urrentHitTest.innerNode(), gestureEvent.tapCount(), fakeMouseDown); 2256 WebInputEventResult mouseDownEventResult = dispatchMouseEvent(EventTypeNames ::mousedown, currentHitTest.innerNode(), gestureEvent.tapCount(), fakeMouseDown) ;
2204 selectionController().initializeSelectionState(); 2257 selectionController().initializeSelectionState();
2205 if (!swallowMouseDownEvent) 2258 if (mouseDownEventResult == WebInputEventResult::NotHandled)
2206 swallowMouseDownEvent = handleMouseFocus(MouseEventWithHitTestResults(fa keMouseDown, currentHitTest), InputDeviceCapabilities::firesTouchEventsSourceCap abilities()); 2259 mouseDownEventResult = handleMouseFocus(MouseEventWithHitTestResults(fak eMouseDown, currentHitTest), InputDeviceCapabilities::firesTouchEventsSourceCapa bilities());
2207 if (!swallowMouseDownEvent) 2260 if (mouseDownEventResult == WebInputEventResult::NotHandled)
2208 swallowMouseDownEvent = handleMousePressEvent(MouseEventWithHitTestResul ts(fakeMouseDown, currentHitTest)); 2261 mouseDownEventResult = handleMousePressEvent(MouseEventWithHitTestResult s(fakeMouseDown, currentHitTest));
2209 2262
2210 if (currentHitTest.innerNode()) { 2263 if (currentHitTest.innerNode()) {
2211 ASSERT(gestureEvent.type() == PlatformEvent::GestureTap); 2264 ASSERT(gestureEvent.type() == PlatformEvent::GestureTap);
2212 HitTestResult result = currentHitTest; 2265 HitTestResult result = currentHitTest;
2213 result.setToShadowHostIfInUserAgentShadowRoot(); 2266 result.setToShadowHostIfInUserAgentShadowRoot();
2214 m_frame->chromeClient().onMouseDown(result.innerNode()); 2267 m_frame->chromeClient().onMouseDown(result.innerNode());
2215 } 2268 }
2216 2269
2217 // FIXME: Use a hit-test cache to avoid unnecessary hit tests. http://crbug. com/398920 2270 // FIXME: Use a hit-test cache to avoid unnecessary hit tests. http://crbug. com/398920
2218 if (currentHitTest.innerNode()) { 2271 if (currentHitTest.innerNode()) {
2219 LocalFrame* mainFrame = m_frame->localFrameRoot(); 2272 LocalFrame* mainFrame = m_frame->localFrameRoot();
2220 if (mainFrame && mainFrame->view()) 2273 if (mainFrame && mainFrame->view())
2221 mainFrame->view()->updateAllLifecyclePhases(); 2274 mainFrame->view()->updateAllLifecyclePhases();
2222 adjustedPoint = frameView->rootFrameToContents(gestureEvent.position()); 2275 adjustedPoint = frameView->rootFrameToContents(gestureEvent.position());
2223 currentHitTest = hitTestResultInFrame(m_frame, adjustedPoint, hitType); 2276 currentHitTest = hitTestResultInFrame(m_frame, adjustedPoint, hitType);
2224 } 2277 }
2225 PlatformMouseEvent fakeMouseUp(gestureEvent.position(), gestureEvent.globalP osition(), 2278 PlatformMouseEvent fakeMouseUp(gestureEvent.position(), gestureEvent.globalP osition(),
2226 LeftButton, PlatformEvent::MouseReleased, gestureEvent.tapCount(), 2279 LeftButton, PlatformEvent::MouseReleased, gestureEvent.tapCount(),
2227 static_cast<PlatformEvent::Modifiers>(modifiers), 2280 static_cast<PlatformEvent::Modifiers>(modifiers),
2228 PlatformMouseEvent::FromTouch, gestureEvent.timestamp()); 2281 PlatformMouseEvent::FromTouch, gestureEvent.timestamp());
2229 bool swallowMouseUpEvent = dispatchMouseEvent(EventTypeNames::mouseup, curre ntHitTest.innerNode(), gestureEvent.tapCount(), fakeMouseUp); 2282 WebInputEventResult mouseUpEventResult = dispatchMouseEvent(EventTypeNames:: mouseup, currentHitTest.innerNode(), gestureEvent.tapCount(), fakeMouseUp);
2230 2283
2231 bool swallowClickEvent = false; 2284 WebInputEventResult clickEventResult = WebInputEventResult::NotHandled;
2232 if (m_clickNode) { 2285 if (m_clickNode) {
2233 if (currentHitTest.innerNode()) { 2286 if (currentHitTest.innerNode()) {
2234 // Updates distribution because a mouseup (or mousedown) event liste ner can make the 2287 // Updates distribution because a mouseup (or mousedown) event liste ner can make the
2235 // tree dirty at dispatchMouseEvent() invocation above. 2288 // tree dirty at dispatchMouseEvent() invocation above.
2236 // Unless distribution is updated, commonAncestor would hit ASSERT. 2289 // Unless distribution is updated, commonAncestor would hit ASSERT.
2237 // Both m_clickNode and currentHitTest.innerNode()) don't need to be updated 2290 // Both m_clickNode and currentHitTest.innerNode()) don't need to be updated
2238 // because commonAncestor() will exit early if their documents are d ifferent. 2291 // because commonAncestor() will exit early if their documents are d ifferent.
2239 m_clickNode->updateDistribution(); 2292 m_clickNode->updateDistribution();
2240 Node* clickTargetNode = currentHitTest.innerNode()->commonAncestor(* m_clickNode, parentForClickEvent); 2293 Node* clickTargetNode = currentHitTest.innerNode()->commonAncestor(* m_clickNode, parentForClickEvent);
2241 swallowClickEvent = dispatchMouseEvent(EventTypeNames::click, clickT argetNode, gestureEvent.tapCount(), fakeMouseUp); 2294 clickEventResult = dispatchMouseEvent(EventTypeNames::click, clickTa rgetNode, gestureEvent.tapCount(), fakeMouseUp);
2242 } 2295 }
2243 m_clickNode = nullptr; 2296 m_clickNode = nullptr;
2244 } 2297 }
2245 2298
2246 if (!swallowMouseUpEvent) 2299 if (mouseUpEventResult == WebInputEventResult::NotHandled)
2247 swallowMouseUpEvent = handleMouseReleaseEvent(MouseEventWithHitTestResul ts(fakeMouseUp, currentHitTest)); 2300 mouseUpEventResult = handleMouseReleaseEvent(MouseEventWithHitTestResult s(fakeMouseUp, currentHitTest));
2248 2301
2249 bool swallowed = swallowMouseDownEvent | swallowMouseUpEvent | swallowClickE vent; 2302 WebInputEventResult eventResult = mergeEventResult(mergeEventResult(mouseDow nEventResult, mouseUpEventResult), clickEventResult);
2250 if (!swallowed && tappedNode && m_frame->page()) { 2303 if (eventResult == WebInputEventResult::NotHandled && tappedNode && m_frame- >page()) {
2251 bool domTreeChanged = preDispatchDomTreeVersion != m_frame->document()-> domTreeVersion(); 2304 bool domTreeChanged = preDispatchDomTreeVersion != m_frame->document()-> domTreeVersion();
2252 bool styleChanged = preDispatchStyleVersion != m_frame->document()->styl eVersion(); 2305 bool styleChanged = preDispatchStyleVersion != m_frame->document()->styl eVersion();
2253 2306
2254 IntPoint tappedPositionInViewport = m_frame->page()->frameHost().visualV iewport().rootFrameToViewport(tappedPosition); 2307 IntPoint tappedPositionInViewport = m_frame->page()->frameHost().visualV iewport().rootFrameToViewport(tappedPosition);
2255 m_frame->chromeClient().showUnhandledTapUIIfNeeded(tappedPositionInViewp ort, tappedNode.get(), domTreeChanged || styleChanged); 2308 m_frame->chromeClient().showUnhandledTapUIIfNeeded(tappedPositionInViewp ort, tappedNode.get(), domTreeChanged || styleChanged);
2256 } 2309 }
2257 return swallowed; 2310 return eventResult;
2258 } 2311 }
2259 2312
2260 bool EventHandler::handleGestureLongPress(const GestureEventWithHitTestResults& targetedEvent) 2313 WebInputEventResult EventHandler::handleGestureLongPress(const GestureEventWithH itTestResults& targetedEvent)
2261 { 2314 {
2262 const PlatformGestureEvent& gestureEvent = targetedEvent.event(); 2315 const PlatformGestureEvent& gestureEvent = targetedEvent.event();
2263 IntPoint adjustedPoint = gestureEvent.position(); 2316 IntPoint adjustedPoint = gestureEvent.position();
2264 2317
2265 unsigned modifiers = gestureEvent.modifiers(); 2318 unsigned modifiers = gestureEvent.modifiers();
2266 2319
2267 // FIXME: Ideally we should try to remove the extra mouse-specific hit-tests here (re-using the 2320 // FIXME: Ideally we should try to remove the extra mouse-specific hit-tests here (re-using the
2268 // supplied HitTestResult), but that will require some overhaul of the touch drag-and-drop code 2321 // supplied HitTestResult), but that will require some overhaul of the touch drag-and-drop code
2269 // and LongPress is such a special scenario that it's unlikely to matter muc h in practice. 2322 // and LongPress is such a special scenario that it's unlikely to matter muc h in practice.
2270 2323
2271 m_longTapShouldInvokeContextMenu = false; 2324 m_longTapShouldInvokeContextMenu = false;
2272 if (m_frame->settings() && m_frame->settings()->touchDragDropEnabled() && m_ frame->view()) { 2325 if (m_frame->settings() && m_frame->settings()->touchDragDropEnabled() && m_ frame->view()) {
2273 PlatformMouseEvent mouseDownEvent(adjustedPoint, gestureEvent.globalPosi tion(), LeftButton, PlatformEvent::MousePressed, 1, 2326 PlatformMouseEvent mouseDownEvent(adjustedPoint, gestureEvent.globalPosi tion(), LeftButton, PlatformEvent::MousePressed, 1,
2274 static_cast<PlatformEvent::Modifiers>(modifiers | PlatformEvent::Lef tButtonDown), 2327 static_cast<PlatformEvent::Modifiers>(modifiers | PlatformEvent::Lef tButtonDown),
2275 PlatformMouseEvent::FromTouch, WTF::monotonicallyIncreasingTime()); 2328 PlatformMouseEvent::FromTouch, WTF::monotonicallyIncreasingTime());
2276 m_mouseDown = mouseDownEvent; 2329 m_mouseDown = mouseDownEvent;
2277 2330
2278 PlatformMouseEvent mouseDragEvent(adjustedPoint, gestureEvent.globalPosi tion(), LeftButton, PlatformEvent::MouseMoved, 1, 2331 PlatformMouseEvent mouseDragEvent(adjustedPoint, gestureEvent.globalPosi tion(), LeftButton, PlatformEvent::MouseMoved, 1,
2279 static_cast<PlatformEvent::Modifiers>(modifiers | PlatformEvent::Lef tButtonDown), 2332 static_cast<PlatformEvent::Modifiers>(modifiers | PlatformEvent::Lef tButtonDown),
2280 PlatformMouseEvent::FromTouch, WTF::monotonicallyIncreasingTime()); 2333 PlatformMouseEvent::FromTouch, WTF::monotonicallyIncreasingTime());
2281 HitTestRequest request(HitTestRequest::ReadOnly); 2334 HitTestRequest request(HitTestRequest::ReadOnly);
2282 MouseEventWithHitTestResults mev = prepareMouseEvent(request, mouseDragE vent); 2335 MouseEventWithHitTestResults mev = prepareMouseEvent(request, mouseDragE vent);
2283 m_mouseDownMayStartDrag = true; 2336 m_mouseDownMayStartDrag = true;
2284 dragState().m_dragSrc = nullptr; 2337 dragState().m_dragSrc = nullptr;
2285 m_mouseDownPos = m_frame->view()->rootFrameToContents(mouseDragEvent.pos ition()); 2338 m_mouseDownPos = m_frame->view()->rootFrameToContents(mouseDragEvent.pos ition());
2286 RefPtrWillBeRawPtr<FrameView> protector(m_frame->view()); 2339 RefPtrWillBeRawPtr<FrameView> protector(m_frame->view());
2287 if (handleDrag(mev, DragInitiator::Touch)) { 2340 if (handleDrag(mev, DragInitiator::Touch)) {
2288 m_longTapShouldInvokeContextMenu = true; 2341 m_longTapShouldInvokeContextMenu = true;
2289 return true; 2342 return WebInputEventResult::HandledSystem;
2290 } 2343 }
2291 } 2344 }
2292 2345
2293 IntPoint hitTestPoint = m_frame->view()->rootFrameToContents(gestureEvent.po sition()); 2346 IntPoint hitTestPoint = m_frame->view()->rootFrameToContents(gestureEvent.po sition());
2294 HitTestResult result = hitTestResultAtPoint(hitTestPoint); 2347 HitTestResult result = hitTestResultAtPoint(hitTestPoint);
2295 RefPtrWillBeRawPtr<FrameView> protector(m_frame->view()); 2348 RefPtrWillBeRawPtr<FrameView> protector(m_frame->view());
2296 if (selectionController().handleGestureLongPress(gestureEvent, result)) { 2349 if (selectionController().handleGestureLongPress(gestureEvent, result)) {
2297 focusDocumentView(); 2350 focusDocumentView();
2298 return true; 2351 return WebInputEventResult::HandledSystem;
2299 } 2352 }
2300 2353
2301 return sendContextMenuEventForGesture(targetedEvent); 2354 return sendContextMenuEventForGesture(targetedEvent);
2302 } 2355 }
2303 2356
2304 bool EventHandler::handleGestureLongTap(const GestureEventWithHitTestResults& ta rgetedEvent) 2357 WebInputEventResult EventHandler::handleGestureLongTap(const GestureEventWithHit TestResults& targetedEvent)
2305 { 2358 {
2306 #if !OS(ANDROID) 2359 #if !OS(ANDROID)
2307 if (m_longTapShouldInvokeContextMenu) { 2360 if (m_longTapShouldInvokeContextMenu) {
2308 m_longTapShouldInvokeContextMenu = false; 2361 m_longTapShouldInvokeContextMenu = false;
2309 return sendContextMenuEventForGesture(targetedEvent); 2362 return sendContextMenuEventForGesture(targetedEvent);
2310 } 2363 }
2311 #endif 2364 #endif
2312 return false; 2365 return WebInputEventResult::NotHandled;
2313 } 2366 }
2314 2367
2315 bool EventHandler::handleScrollGestureOnResizer(Node* eventTarget, const Platfor mGestureEvent& gestureEvent) 2368 bool EventHandler::handleScrollGestureOnResizer(Node* eventTarget, const Platfor mGestureEvent& gestureEvent)
2316 { 2369 {
2317 if (gestureEvent.type() == PlatformEvent::GestureScrollBegin) { 2370 if (gestureEvent.type() == PlatformEvent::GestureScrollBegin) {
2318 PaintLayer* layer = eventTarget->layoutObject() ? eventTarget->layoutObj ect()->enclosingLayer() : nullptr; 2371 PaintLayer* layer = eventTarget->layoutObject() ? eventTarget->layoutObj ect()->enclosingLayer() : nullptr;
2319 IntPoint p = m_frame->view()->rootFrameToContents(gestureEvent.position( )); 2372 IntPoint p = m_frame->view()->rootFrameToContents(gestureEvent.position( ));
2320 if (layer && layer->scrollableArea() && layer->scrollableArea()->isPoint InResizeControl(p, ResizerForTouch)) { 2373 if (layer && layer->scrollableArea() && layer->scrollableArea()->isPoint InResizeControl(p, ResizerForTouch)) {
2321 m_resizeScrollableArea = layer->scrollableArea(); 2374 m_resizeScrollableArea = layer->scrollableArea();
2322 m_resizeScrollableArea->setInResizeMode(true); 2375 m_resizeScrollableArea->setInResizeMode(true);
2323 m_offsetFromResizeCorner = LayoutSize(m_resizeScrollableArea->offset FromResizeCorner(p)); 2376 m_offsetFromResizeCorner = LayoutSize(m_resizeScrollableArea->offset FromResizeCorner(p));
2324 return true; 2377 return true;
2325 } 2378 }
2326 } else if (gestureEvent.type() == PlatformEvent::GestureScrollUpdate) { 2379 } else if (gestureEvent.type() == PlatformEvent::GestureScrollUpdate) {
2327 if (m_resizeScrollableArea && m_resizeScrollableArea->inResizeMode()) { 2380 if (m_resizeScrollableArea && m_resizeScrollableArea->inResizeMode()) {
2328 m_resizeScrollableArea->resize(gestureEvent, m_offsetFromResizeCorne r); 2381 m_resizeScrollableArea->resize(gestureEvent, m_offsetFromResizeCorne r);
2329 return true; 2382 return true;
2330 } 2383 }
2331 } else if (gestureEvent.type() == PlatformEvent::GestureScrollEnd) { 2384 } else if (gestureEvent.type() == PlatformEvent::GestureScrollEnd) {
2332 if (m_resizeScrollableArea && m_resizeScrollableArea->inResizeMode()) { 2385 if (m_resizeScrollableArea && m_resizeScrollableArea->inResizeMode()) {
2333 m_resizeScrollableArea->setInResizeMode(false); 2386 m_resizeScrollableArea->setInResizeMode(false);
2334 m_resizeScrollableArea = nullptr; 2387 m_resizeScrollableArea = nullptr;
2335 return false; 2388 return false;
2336 } 2389 }
2337 } 2390 }
2338 2391
2339 return false; 2392 return false;
2340 } 2393 }
2341 2394
2342 bool EventHandler::passScrollGestureEventToWidget(const PlatformGestureEvent& ge stureEvent, LayoutObject* layoutObject) 2395 WebInputEventResult EventHandler::passScrollGestureEventToWidget(const PlatformG estureEvent& gestureEvent, LayoutObject* layoutObject)
2343 { 2396 {
2344 ASSERT(gestureEvent.isScrollEvent()); 2397 ASSERT(gestureEvent.isScrollEvent());
2345 2398
2346 if (!m_lastGestureScrollOverWidget) 2399 if (!m_lastGestureScrollOverWidget || !layoutObject || !layoutObject->isLayo utPart())
2347 return false; 2400 return WebInputEventResult::NotHandled;
2348
2349 if (!layoutObject || !layoutObject->isLayoutPart())
2350 return false;
2351 2401
2352 Widget* widget = toLayoutPart(layoutObject)->widget(); 2402 Widget* widget = toLayoutPart(layoutObject)->widget();
2353 2403
2354 if (!widget || !widget->isFrameView()) 2404 if (!widget || !widget->isFrameView())
2355 return false; 2405 return WebInputEventResult::NotHandled;
2356 2406
2357 return toFrameView(widget)->frame().eventHandler().handleGestureScrollEvent( gestureEvent); 2407 return toFrameView(widget)->frame().eventHandler().handleGestureScrollEvent( gestureEvent);
2358 } 2408 }
2359 2409
2360 bool EventHandler::handleGestureScrollEnd(const PlatformGestureEvent& gestureEve nt) 2410 WebInputEventResult EventHandler::handleGestureScrollEnd(const PlatformGestureEv ent& gestureEvent)
2361 { 2411 {
2362 RefPtrWillBeRawPtr<Node> node = m_scrollGestureHandlingNode; 2412 RefPtrWillBeRawPtr<Node> node = m_scrollGestureHandlingNode;
2363 2413
2364 if (node) { 2414 if (node) {
2365 passScrollGestureEventToWidget(gestureEvent, node->layoutObject()); 2415 passScrollGestureEventToWidget(gestureEvent, node->layoutObject());
2366 if (RuntimeEnabledFeatures::scrollCustomizationEnabled()) { 2416 if (RuntimeEnabledFeatures::scrollCustomizationEnabled()) {
2367 RefPtrWillBeRawPtr<ScrollState> scrollState = ScrollState::create( 2417 RefPtrWillBeRawPtr<ScrollState> scrollState = ScrollState::create(
2368 0, 0, 0, 0, 0, gestureEvent.inertial(), /* isBeginning */ 2418 0, 0, 0, 0, 0, gestureEvent.inertial(), /* isBeginning */
2369 false, /* isEnding */ true, /* fromUserInput */ true); 2419 false, /* isEnding */ true, /* fromUserInput */ true);
2370 customizedScroll(*node.get(), *scrollState); 2420 customizedScroll(*node.get(), *scrollState);
2371 } 2421 }
2372 } 2422 }
2373 2423
2374 clearGestureScrollState(); 2424 clearGestureScrollState();
2375 return false; 2425 return WebInputEventResult::NotHandled;
2376 } 2426 }
2377 2427
2378 bool EventHandler::handleGestureScrollBegin(const PlatformGestureEvent& gestureE vent) 2428 WebInputEventResult EventHandler::handleGestureScrollBegin(const PlatformGesture Event& gestureEvent)
2379 { 2429 {
2380 Document* document = m_frame->document(); 2430 Document* document = m_frame->document();
2381 if (!document->layoutView()) 2431 if (!document->layoutView())
2382 return false; 2432 return WebInputEventResult::NotHandled;
2383 2433
2384 FrameView* view = m_frame->view(); 2434 FrameView* view = m_frame->view();
2385 if (!view) 2435 if (!view)
2386 return false; 2436 return WebInputEventResult::NotHandled;
2387 2437
2388 // If there's no layoutObject on the node, send the event to the nearest anc estor with a layoutObject. 2438 // If there's no layoutObject on the node, send the event to the nearest anc estor with a layoutObject.
2389 // Needed for <option> and <optgroup> elements so we can touch scroll <selec t>s 2439 // Needed for <option> and <optgroup> elements so we can touch scroll <selec t>s
2390 while (m_scrollGestureHandlingNode && !m_scrollGestureHandlingNode->layoutOb ject()) 2440 while (m_scrollGestureHandlingNode && !m_scrollGestureHandlingNode->layoutOb ject())
2391 m_scrollGestureHandlingNode = m_scrollGestureHandlingNode->parentOrShado wHostNode(); 2441 m_scrollGestureHandlingNode = m_scrollGestureHandlingNode->parentOrShado wHostNode();
2392 2442
2393 if (!m_scrollGestureHandlingNode) { 2443 if (!m_scrollGestureHandlingNode) {
2394 if (RuntimeEnabledFeatures::scrollCustomizationEnabled()) 2444 if (RuntimeEnabledFeatures::scrollCustomizationEnabled())
2395 m_scrollGestureHandlingNode = m_frame->document()->documentElement() ; 2445 m_scrollGestureHandlingNode = m_frame->document()->documentElement() ;
2396 else 2446 else
2397 return false; 2447 return WebInputEventResult::NotHandled;
2398 } 2448 }
2399 ASSERT(m_scrollGestureHandlingNode); 2449 ASSERT(m_scrollGestureHandlingNode);
2400 2450
2401 passScrollGestureEventToWidget(gestureEvent, m_scrollGestureHandlingNode->la youtObject()); 2451 passScrollGestureEventToWidget(gestureEvent, m_scrollGestureHandlingNode->la youtObject());
2402 if (RuntimeEnabledFeatures::scrollCustomizationEnabled()) { 2452 if (RuntimeEnabledFeatures::scrollCustomizationEnabled()) {
2403 m_currentScrollChain.clear(); 2453 m_currentScrollChain.clear();
2404 RefPtrWillBeRawPtr<ScrollState> scrollState = ScrollState::create( 2454 RefPtrWillBeRawPtr<ScrollState> scrollState = ScrollState::create(
2405 0, 0, 0, 0, 0, /* inInertialPhase */ false, /* isBeginning */ 2455 0, 0, 0, 0, 0, /* inInertialPhase */ false, /* isBeginning */
2406 true, /* isEnding */ false, /* fromUserInput */ true); 2456 true, /* isEnding */ false, /* fromUserInput */ true);
2407 customizedScroll(*m_scrollGestureHandlingNode.get(), *scrollState); 2457 customizedScroll(*m_scrollGestureHandlingNode.get(), *scrollState);
2408 } else { 2458 } else {
2409 if (m_frame->isMainFrame()) 2459 if (m_frame->isMainFrame())
2410 m_frame->host()->topControls().scrollBegin(); 2460 m_frame->host()->topControls().scrollBegin();
2411 } 2461 }
2412 return true; 2462 return WebInputEventResult::HandledSystem;
2413 } 2463 }
2414 2464
2415 void EventHandler::resetOverscroll(bool didScrollX, bool didScrollY) 2465 void EventHandler::resetOverscroll(bool didScrollX, bool didScrollY)
2416 { 2466 {
2417 if (didScrollX) 2467 if (didScrollX)
2418 m_accumulatedRootOverscroll.setWidth(0); 2468 m_accumulatedRootOverscroll.setWidth(0);
2419 if (didScrollY) 2469 if (didScrollY)
2420 m_accumulatedRootOverscroll.setHeight(0); 2470 m_accumulatedRootOverscroll.setHeight(0);
2421 } 2471 }
2422 2472
(...skipping 11 matching lines...) Expand all
2434 { 2484 {
2435 FloatSize unusedDelta(scrollResult.unusedScrollDeltaX, scrollResult.unusedSc rollDeltaY); 2485 FloatSize unusedDelta(scrollResult.unusedScrollDeltaX, scrollResult.unusedSc rollDeltaY);
2436 unusedDelta = adjustOverscoll(unusedDelta); 2486 unusedDelta = adjustOverscoll(unusedDelta);
2437 resetOverscroll(scrollResult.didScrollX, scrollResult.didScrollY); 2487 resetOverscroll(scrollResult.didScrollX, scrollResult.didScrollY);
2438 if (unusedDelta != FloatSize()) { 2488 if (unusedDelta != FloatSize()) {
2439 m_accumulatedRootOverscroll += unusedDelta; 2489 m_accumulatedRootOverscroll += unusedDelta;
2440 m_frame->chromeClient().didOverscroll(unusedDelta, m_accumulatedRootOver scroll, position, velocity); 2490 m_frame->chromeClient().didOverscroll(unusedDelta, m_accumulatedRootOver scroll, position, velocity);
2441 } 2491 }
2442 } 2492 }
2443 2493
2444 bool EventHandler::handleGestureScrollUpdate(const PlatformGestureEvent& gesture Event) 2494 WebInputEventResult EventHandler::handleGestureScrollUpdate(const PlatformGestur eEvent& gestureEvent)
2445 { 2495 {
2446 ASSERT(gestureEvent.type() == PlatformEvent::GestureScrollUpdate); 2496 ASSERT(gestureEvent.type() == PlatformEvent::GestureScrollUpdate);
2447 2497
2448 FloatSize delta(gestureEvent.deltaX(), gestureEvent.deltaY()); 2498 FloatSize delta(gestureEvent.deltaX(), gestureEvent.deltaY());
2449 if (delta.isZero()) 2499 if (delta.isZero())
2450 return false; 2500 return WebInputEventResult::NotHandled;
2451 2501
2452 Node* node = m_scrollGestureHandlingNode.get(); 2502 Node* node = m_scrollGestureHandlingNode.get();
2453 if (node) { 2503 if (node) {
2454 LayoutObject* layoutObject = node->layoutObject(); 2504 LayoutObject* layoutObject = node->layoutObject();
2455 if (!layoutObject) 2505 if (!layoutObject)
2456 return false; 2506 return WebInputEventResult::NotHandled;
2457 2507
2458 RefPtrWillBeRawPtr<FrameView> protector(m_frame->view()); 2508 RefPtrWillBeRawPtr<FrameView> protector(m_frame->view());
2459 2509
2460 Node* stopNode = nullptr; 2510 Node* stopNode = nullptr;
2461 2511
2462 // Try to send the event to the correct view. 2512 // Try to send the event to the correct view.
2463 if (passScrollGestureEventToWidget(gestureEvent, layoutObject)) { 2513 WebInputEventResult result = passScrollGestureEventToWidget(gestureEvent , layoutObject);
2514 if (result != WebInputEventResult::NotHandled) {
2464 if (gestureEvent.preventPropagation() 2515 if (gestureEvent.preventPropagation()
2465 && !RuntimeEnabledFeatures::scrollCustomizationEnabled()) { 2516 && !RuntimeEnabledFeatures::scrollCustomizationEnabled()) {
2466 // This is an optimization which doesn't apply with 2517 // This is an optimization which doesn't apply with
2467 // scroll customization enabled. 2518 // scroll customization enabled.
2468 m_previousGestureScrolledNode = m_scrollGestureHandlingNode; 2519 m_previousGestureScrolledNode = m_scrollGestureHandlingNode;
2469 } 2520 }
2470 // FIXME: we should allow simultaneous scrolling of nested 2521 // FIXME: we should allow simultaneous scrolling of nested
2471 // iframes along perpendicular axes. See crbug.com/466991. 2522 // iframes along perpendicular axes. See crbug.com/466991.
2472 m_deltaConsumedForScrollSequence = true; 2523 m_deltaConsumedForScrollSequence = true;
2473 return true; 2524 return result;
2474 } 2525 }
2475 2526
2476 bool scrolled = false; 2527 bool scrolled = false;
2477 if (RuntimeEnabledFeatures::scrollCustomizationEnabled()) { 2528 if (RuntimeEnabledFeatures::scrollCustomizationEnabled()) {
2478 RefPtrWillBeRawPtr<ScrollState> scrollState = ScrollState::create( 2529 RefPtrWillBeRawPtr<ScrollState> scrollState = ScrollState::create(
2479 gestureEvent.deltaX(), gestureEvent.deltaY(), 2530 gestureEvent.deltaX(), gestureEvent.deltaY(),
2480 0, gestureEvent.velocityX(), gestureEvent.velocityY(), 2531 0, gestureEvent.velocityX(), gestureEvent.velocityY(),
2481 gestureEvent.inertial(), /* isBeginning */ 2532 gestureEvent.inertial(), /* isBeginning */
2482 false, /* isEnding */ false, /* fromUserInput */ true, 2533 false, /* isEnding */ false, /* fromUserInput */ true,
2483 !gestureEvent.preventPropagation(), m_deltaConsumedForScrollSequ ence); 2534 !gestureEvent.preventPropagation(), m_deltaConsumedForScrollSequ ence);
(...skipping 24 matching lines...) Expand all
2508 bool verticalScroll = result.didScroll; 2559 bool verticalScroll = result.didScroll;
2509 scrolled = horizontalScroll || verticalScroll; 2560 scrolled = horizontalScroll || verticalScroll;
2510 2561
2511 if (gestureEvent.preventPropagation()) 2562 if (gestureEvent.preventPropagation())
2512 m_previousGestureScrolledNode = stopNode; 2563 m_previousGestureScrolledNode = stopNode;
2513 2564
2514 resetOverscroll(horizontalScroll, verticalScroll); 2565 resetOverscroll(horizontalScroll, verticalScroll);
2515 } 2566 }
2516 if (scrolled) { 2567 if (scrolled) {
2517 setFrameWasScrolledByUser(); 2568 setFrameWasScrolledByUser();
2518 return true; 2569 return WebInputEventResult::HandledSystem;
2519 } 2570 }
2520 } 2571 }
2521 2572
2522 if (RuntimeEnabledFeatures::scrollCustomizationEnabled()) 2573 if (RuntimeEnabledFeatures::scrollCustomizationEnabled())
2523 return false; 2574 return WebInputEventResult::NotHandled;
2524 2575
2525 // Try to scroll the frame view. 2576 // Try to scroll the frame view.
2526 ScrollResult scrollResult = m_frame->applyScrollDelta(delta, false); 2577 ScrollResult scrollResult = m_frame->applyScrollDelta(delta, false);
2527 FloatPoint position = FloatPoint(gestureEvent.position().x(), gestureEvent.p osition().y()); 2578 FloatPoint position = FloatPoint(gestureEvent.position().x(), gestureEvent.p osition().y());
2528 FloatSize velocity = FloatSize(gestureEvent.velocityX(), gestureEvent.veloci tyY()); 2579 FloatSize velocity = FloatSize(gestureEvent.velocityX(), gestureEvent.veloci tyY());
2529 handleOverscroll(scrollResult, position, velocity); 2580 handleOverscroll(scrollResult, position, velocity);
2530 if (scrollResult.didScroll()) { 2581 if (scrollResult.didScroll()) {
2531 setFrameWasScrolledByUser(); 2582 setFrameWasScrolledByUser();
2532 return true; 2583 return WebInputEventResult::HandledSystem;
2533 } 2584 }
2534 2585
2535 return false; 2586 return WebInputEventResult::NotHandled;
2536 } 2587 }
2537 2588
2538 void EventHandler::clearGestureScrollState() 2589 void EventHandler::clearGestureScrollState()
2539 { 2590 {
2540 m_scrollGestureHandlingNode = nullptr; 2591 m_scrollGestureHandlingNode = nullptr;
2541 m_previousGestureScrolledNode = nullptr; 2592 m_previousGestureScrolledNode = nullptr;
2542 m_deltaConsumedForScrollSequence = false; 2593 m_deltaConsumedForScrollSequence = false;
2543 m_currentScrollChain.clear(); 2594 m_currentScrollChain.clear();
2544 m_accumulatedRootOverscroll = FloatSize(); 2595 m_accumulatedRootOverscroll = FloatSize();
2545 } 2596 }
(...skipping 317 matching lines...) Expand 10 before | Expand all | Expand 10 after
2863 } 2914 }
2864 2915
2865 // Update the hit-test result to be a point-based result instead of a rect-b ased result. 2916 // Update the hit-test result to be a point-based result instead of a rect-b ased result.
2866 // FIXME: We should do this even when no candidate matches the node filter. crbug.com/398914 2917 // FIXME: We should do this even when no candidate matches the node filter. crbug.com/398914
2867 if (adjusted) { 2918 if (adjusted) {
2868 hitTestResult->resolveRectBasedTest(adjustedNode, m_frame->view()->rootF rameToContents(adjustedPoint)); 2919 hitTestResult->resolveRectBasedTest(adjustedNode, m_frame->view()->rootF rameToContents(adjustedPoint));
2869 gestureEvent->applyTouchAdjustment(adjustedPoint); 2920 gestureEvent->applyTouchAdjustment(adjustedPoint);
2870 } 2921 }
2871 } 2922 }
2872 2923
2873 bool EventHandler::sendContextMenuEvent(const PlatformMouseEvent& event, Node* o verrideTargetNode) 2924 WebInputEventResult EventHandler::sendContextMenuEvent(const PlatformMouseEvent& event, Node* overrideTargetNode)
2874 { 2925 {
2875 FrameView* v = m_frame->view(); 2926 FrameView* v = m_frame->view();
2876 if (!v) 2927 if (!v)
2877 return false; 2928 return WebInputEventResult::NotHandled;
2878 2929
2879 // Clear mouse press state to avoid initiating a drag while context menu is up. 2930 // Clear mouse press state to avoid initiating a drag while context menu is up.
2880 m_mousePressed = false; 2931 m_mousePressed = false;
2881 LayoutPoint positionInContents = v->rootFrameToContents(event.position()); 2932 LayoutPoint positionInContents = v->rootFrameToContents(event.position());
2882 HitTestRequest request(HitTestRequest::Active); 2933 HitTestRequest request(HitTestRequest::Active);
2883 MouseEventWithHitTestResults mev = m_frame->document()->prepareMouseEvent(re quest, positionInContents, event); 2934 MouseEventWithHitTestResults mev = m_frame->document()->prepareMouseEvent(re quest, positionInContents, event);
2884 2935
2885 selectionController().sendContextMenuEvent(mev, positionInContents); 2936 selectionController().sendContextMenuEvent(mev, positionInContents);
2886 2937
2887 Node* targetNode = overrideTargetNode ? overrideTargetNode : mev.innerNode() ; 2938 Node* targetNode = overrideTargetNode ? overrideTargetNode : mev.innerNode() ;
2888 return dispatchMouseEvent(EventTypeNames::contextmenu, targetNode, 0, event) ; 2939 return dispatchMouseEvent(EventTypeNames::contextmenu, targetNode, 0, event) ;
2889 } 2940 }
2890 2941
2891 bool EventHandler::sendContextMenuEventForKey(Element* overrideTargetElement) 2942 WebInputEventResult EventHandler::sendContextMenuEventForKey(Element* overrideTa rgetElement)
2892 { 2943 {
2893 FrameView* view = m_frame->view(); 2944 FrameView* view = m_frame->view();
2894 if (!view) 2945 if (!view)
2895 return false; 2946 return WebInputEventResult::NotHandled;
2896 2947
2897 Document* doc = m_frame->document(); 2948 Document* doc = m_frame->document();
2898 if (!doc) 2949 if (!doc)
2899 return false; 2950 return WebInputEventResult::NotHandled;
2900 2951
2901 // Clear mouse press state to avoid initiating a drag while context menu is up. 2952 // Clear mouse press state to avoid initiating a drag while context menu is up.
2902 m_mousePressed = false; 2953 m_mousePressed = false;
2903 2954
2904 static const int kContextMenuMargin = 1; 2955 static const int kContextMenuMargin = 1;
2905 2956
2906 #if OS(WIN) 2957 #if OS(WIN)
2907 int rightAligned = ::GetSystemMetrics(SM_MENUDROPALIGNMENT); 2958 int rightAligned = ::GetSystemMetrics(SM_MENUDROPALIGNMENT);
2908 #else 2959 #else
2909 int rightAligned = 0; 2960 int rightAligned = 0;
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
2953 // This is required for web compatibility. 3004 // This is required for web compatibility.
2954 PlatformEvent::Type eventType = PlatformEvent::MousePressed; 3005 PlatformEvent::Type eventType = PlatformEvent::MousePressed;
2955 if (m_frame->settings() && m_frame->settings()->showContextMenuOnMouseUp()) 3006 if (m_frame->settings() && m_frame->settings()->showContextMenuOnMouseUp())
2956 eventType = PlatformEvent::MouseReleased; 3007 eventType = PlatformEvent::MouseReleased;
2957 3008
2958 PlatformMouseEvent mouseEvent(locationInRootFrame, globalPosition, RightButt on, eventType, 1, PlatformEvent::NoModifiers, PlatformMouseEvent::RealOrIndistin guishable, WTF::monotonicallyIncreasingTime()); 3009 PlatformMouseEvent mouseEvent(locationInRootFrame, globalPosition, RightButt on, eventType, 1, PlatformEvent::NoModifiers, PlatformMouseEvent::RealOrIndistin guishable, WTF::monotonicallyIncreasingTime());
2959 3010
2960 return sendContextMenuEvent(mouseEvent, overrideTargetElement); 3011 return sendContextMenuEvent(mouseEvent, overrideTargetElement);
2961 } 3012 }
2962 3013
2963 bool EventHandler::sendContextMenuEventForGesture(const GestureEventWithHitTestR esults& targetedEvent) 3014 WebInputEventResult EventHandler::sendContextMenuEventForGesture(const GestureEv entWithHitTestResults& targetedEvent)
2964 { 3015 {
2965 const PlatformGestureEvent& gestureEvent = targetedEvent.event(); 3016 const PlatformGestureEvent& gestureEvent = targetedEvent.event();
2966 unsigned modifiers = gestureEvent.modifiers(); 3017 unsigned modifiers = gestureEvent.modifiers();
2967 3018
2968 // Send MouseMoved event prior to handling (https://crbug.com/485290). 3019 // Send MouseMoved event prior to handling (https://crbug.com/485290).
2969 PlatformMouseEvent fakeMouseMove(gestureEvent.position(), gestureEvent.globa lPosition(), 3020 PlatformMouseEvent fakeMouseMove(gestureEvent.position(), gestureEvent.globa lPosition(),
2970 NoButton, PlatformEvent::MouseMoved, /* clickCount */ 0, 3021 NoButton, PlatformEvent::MouseMoved, /* clickCount */ 0,
2971 static_cast<PlatformEvent::Modifiers>(modifiers), 3022 static_cast<PlatformEvent::Modifiers>(modifiers),
2972 PlatformMouseEvent::FromTouch, gestureEvent.timestamp()); 3023 PlatformMouseEvent::FromTouch, gestureEvent.timestamp());
2973 dispatchMouseEvent(EventTypeNames::mousemove, targetedEvent.hitTestResult(). innerNode(), 0, fakeMouseMove); 3024 dispatchMouseEvent(EventTypeNames::mousemove, targetedEvent.hitTestResult(). innerNode(), 0, fakeMouseMove);
(...skipping 167 matching lines...) Expand 10 before | Expand all | Expand 10 after
3141 if ((evt.modifiers() & (PlatformEvent::KeyModifiers & ~PlatformEvent::ShiftK ey)) != accessKeyModifiers()) 3192 if ((evt.modifiers() & (PlatformEvent::KeyModifiers & ~PlatformEvent::ShiftK ey)) != accessKeyModifiers())
3142 return false; 3193 return false;
3143 String key = evt.unmodifiedText(); 3194 String key = evt.unmodifiedText();
3144 Element* elem = m_frame->document()->getElementByAccessKey(key.lower()); 3195 Element* elem = m_frame->document()->getElementByAccessKey(key.lower());
3145 if (!elem) 3196 if (!elem)
3146 return false; 3197 return false;
3147 elem->accessKeyAction(false); 3198 elem->accessKeyAction(false);
3148 return true; 3199 return true;
3149 } 3200 }
3150 3201
3151 bool EventHandler::keyEvent(const PlatformKeyboardEvent& initialKeyEvent) 3202 WebInputEventResult EventHandler::keyEvent(const PlatformKeyboardEvent& initialK eyEvent)
3152 { 3203 {
3153 RefPtrWillBeRawPtr<FrameView> protector(m_frame->view()); 3204 RefPtrWillBeRawPtr<FrameView> protector(m_frame->view());
3154 m_frame->chromeClient().setToolTip(String(), LTR); 3205 m_frame->chromeClient().setToolTip(String(), LTR);
3155 3206
3156 if (initialKeyEvent.windowsVirtualKeyCode() == VK_CAPITAL) 3207 if (initialKeyEvent.windowsVirtualKeyCode() == VK_CAPITAL)
3157 capsLockStateMayHaveChanged(); 3208 capsLockStateMayHaveChanged();
3158 3209
3159 #if OS(WIN) 3210 #if OS(WIN)
3160 if (panScrollInProgress()) { 3211 if (panScrollInProgress()) {
3161 // If a key is pressed while the panScroll is in progress then we want t o stop 3212 // If a key is pressed while the panScroll is in progress then we want t o stop
3162 if (initialKeyEvent.type() == PlatformEvent::KeyDown || initialKeyEvent. type() == PlatformEvent::RawKeyDown) 3213 if (initialKeyEvent.type() == PlatformEvent::KeyDown || initialKeyEvent. type() == PlatformEvent::RawKeyDown)
3163 stopAutoscroll(); 3214 stopAutoscroll();
3164 3215
3165 // If we were in panscroll mode, we swallow the key event 3216 // If we were in panscroll mode, we swallow the key event
3166 return true; 3217 return WebInputEventResult::HandledSuppressed;
3167 } 3218 }
3168 #endif 3219 #endif
3169 3220
3170 // Check for cases where we are too early for events -- possible unmatched k ey up 3221 // Check for cases where we are too early for events -- possible unmatched k ey up
3171 // from pressing return in the location bar. 3222 // from pressing return in the location bar.
3172 RefPtrWillBeRawPtr<Node> node = eventTargetNodeForDocument(m_frame->document ()); 3223 RefPtrWillBeRawPtr<Node> node = eventTargetNodeForDocument(m_frame->document ());
3173 if (!node) 3224 if (!node)
3174 return false; 3225 return WebInputEventResult::NotHandled;
3175 3226
3176 UserGestureIndicator gestureIndicator(DefinitelyProcessingUserGesture); 3227 UserGestureIndicator gestureIndicator(DefinitelyProcessingUserGesture);
3177 3228
3178 // In IE, access keys are special, they are handled after default keydown pr ocessing, but cannot be canceled - this is hard to match. 3229 // In IE, access keys are special, they are handled after default keydown pr ocessing, but cannot be canceled - this is hard to match.
3179 // On Mac OS X, we process them before dispatching keydown, as the default k eydown handler implements Emacs key bindings, which may conflict 3230 // On Mac OS X, we process them before dispatching keydown, as the default k eydown handler implements Emacs key bindings, which may conflict
3180 // with access keys. Then we dispatch keydown, but suppress its default hand ling. 3231 // with access keys. Then we dispatch keydown, but suppress its default hand ling.
3181 // On Windows, WebKit explicitly calls handleAccessKey() instead of dispatch ing a keypress event for WM_SYSCHAR messages. 3232 // On Windows, WebKit explicitly calls handleAccessKey() instead of dispatch ing a keypress event for WM_SYSCHAR messages.
3182 // Other platforms currently match either Mac or Windows behavior, depending on whether they send combined KeyDown events. 3233 // Other platforms currently match either Mac or Windows behavior, depending on whether they send combined KeyDown events.
3183 bool matchedAnAccessKey = false; 3234 bool matchedAnAccessKey = false;
3184 if (initialKeyEvent.type() == PlatformEvent::KeyDown) 3235 if (initialKeyEvent.type() == PlatformEvent::KeyDown)
3185 matchedAnAccessKey = handleAccessKey(initialKeyEvent); 3236 matchedAnAccessKey = handleAccessKey(initialKeyEvent);
3186 3237
3187 // FIXME: it would be fair to let an input method handle KeyUp events before DOM dispatch. 3238 // FIXME: it would be fair to let an input method handle KeyUp events before DOM dispatch.
3188 if (initialKeyEvent.type() == PlatformEvent::KeyUp || initialKeyEvent.type() == PlatformEvent::Char) 3239 if (initialKeyEvent.type() == PlatformEvent::KeyUp || initialKeyEvent.type() == PlatformEvent::Char) {
3189 return !node->dispatchKeyEvent(initialKeyEvent); 3240 RefPtrWillBeRawPtr<KeyboardEvent> domEvent = KeyboardEvent::create(initi alKeyEvent, m_frame->document()->domWindow());
3241
3242 bool dispatchResult = node->dispatchEvent(domEvent);
3243 return eventToEventResult(domEvent, dispatchResult);
3244 }
3190 3245
3191 PlatformKeyboardEvent keyDownEvent = initialKeyEvent; 3246 PlatformKeyboardEvent keyDownEvent = initialKeyEvent;
3192 if (keyDownEvent.type() != PlatformEvent::RawKeyDown) 3247 if (keyDownEvent.type() != PlatformEvent::RawKeyDown)
3193 keyDownEvent.disambiguateKeyDownEvent(PlatformEvent::RawKeyDown); 3248 keyDownEvent.disambiguateKeyDownEvent(PlatformEvent::RawKeyDown);
3194 RefPtrWillBeRawPtr<KeyboardEvent> keydown = KeyboardEvent::create(keyDownEve nt, m_frame->document()->domWindow()); 3249 RefPtrWillBeRawPtr<KeyboardEvent> keydown = KeyboardEvent::create(keyDownEve nt, m_frame->document()->domWindow());
3195 if (matchedAnAccessKey) 3250 if (matchedAnAccessKey)
3196 keydown->setDefaultPrevented(true); 3251 keydown->setDefaultPrevented(true);
3197 keydown->setTarget(node); 3252 keydown->setTarget(node);
3198 3253
3199 if (initialKeyEvent.type() == PlatformEvent::RawKeyDown) { 3254 if (initialKeyEvent.type() == PlatformEvent::RawKeyDown) {
3200 node->dispatchEvent(keydown); 3255 if (!node->dispatchEvent(keydown))
3256 return eventToEventResult(keydown, false);
3201 // If frame changed as a result of keydown dispatch, then return true to avoid sending a subsequent keypress message to the new frame. 3257 // If frame changed as a result of keydown dispatch, then return true to avoid sending a subsequent keypress message to the new frame.
3202 bool changedFocusedFrame = m_frame->page() && m_frame != m_frame->page() ->focusController().focusedOrMainFrame(); 3258 bool changedFocusedFrame = m_frame->page() && m_frame != m_frame->page() ->focusController().focusedOrMainFrame();
3203 return keydown->defaultHandled() || keydown->defaultPrevented() || chang edFocusedFrame; 3259 if (changedFocusedFrame)
3260 return WebInputEventResult::HandledSystem;
3261 return WebInputEventResult::NotHandled;
3204 } 3262 }
3205 3263
3206 node->dispatchEvent(keydown); 3264 if (!node->dispatchEvent(keydown))
3265 return eventToEventResult(keydown, false);
3207 // If frame changed as a result of keydown dispatch, then return early to av oid sending a subsequent keypress message to the new frame. 3266 // If frame changed as a result of keydown dispatch, then return early to av oid sending a subsequent keypress message to the new frame.
3208 bool changedFocusedFrame = m_frame->page() && m_frame != m_frame->page()->fo cusController().focusedOrMainFrame(); 3267 bool changedFocusedFrame = m_frame->page() && m_frame != m_frame->page()->fo cusController().focusedOrMainFrame();
3209 bool keydownResult = keydown->defaultHandled() || keydown->defaultPrevented( ) || changedFocusedFrame; 3268 if (changedFocusedFrame)
3210 if (keydownResult) 3269 return WebInputEventResult::HandledSystem;
3211 return keydownResult;
3212 3270
3213 // Focus may have changed during keydown handling, so refetch node. 3271 // Focus may have changed during keydown handling, so refetch node.
3214 // But if we are dispatching a fake backward compatibility keypress, then we pretend that the keypress happened on the original node. 3272 // But if we are dispatching a fake backward compatibility keypress, then we pretend that the keypress happened on the original node.
3215 node = eventTargetNodeForDocument(m_frame->document()); 3273 node = eventTargetNodeForDocument(m_frame->document());
3216 if (!node) 3274 if (!node)
3217 return false; 3275 return WebInputEventResult::NotHandled;
3218 3276
3219 PlatformKeyboardEvent keyPressEvent = initialKeyEvent; 3277 PlatformKeyboardEvent keyPressEvent = initialKeyEvent;
3220 keyPressEvent.disambiguateKeyDownEvent(PlatformEvent::Char); 3278 keyPressEvent.disambiguateKeyDownEvent(PlatformEvent::Char);
3221 if (keyPressEvent.text().isEmpty()) 3279 if (keyPressEvent.text().isEmpty())
3222 return keydownResult; 3280 return WebInputEventResult::NotHandled;
3223 RefPtrWillBeRawPtr<KeyboardEvent> keypress = KeyboardEvent::create(keyPressE vent, m_frame->document()->domWindow()); 3281 RefPtrWillBeRawPtr<KeyboardEvent> keypress = KeyboardEvent::create(keyPressE vent, m_frame->document()->domWindow());
3224 keypress->setTarget(node); 3282 keypress->setTarget(node);
3225 if (keydownResult) 3283 bool dispatchResult = node->dispatchEvent(keypress);
3226 keypress->setDefaultPrevented(true); 3284 return eventToEventResult(keypress, dispatchResult);
3227 node->dispatchEvent(keypress);
3228
3229 return keydownResult || keypress->defaultPrevented() || keypress->defaultHan dled();
3230 } 3285 }
3231 3286
3232 static WebFocusType focusDirectionForKey(const AtomicString& keyIdentifier) 3287 static WebFocusType focusDirectionForKey(const AtomicString& keyIdentifier)
3233 { 3288 {
3234 DEFINE_STATIC_LOCAL(AtomicString, Down, ("Down", AtomicString::ConstructFrom Literal)); 3289 DEFINE_STATIC_LOCAL(AtomicString, Down, ("Down", AtomicString::ConstructFrom Literal));
3235 DEFINE_STATIC_LOCAL(AtomicString, Up, ("Up", AtomicString::ConstructFromLite ral)); 3290 DEFINE_STATIC_LOCAL(AtomicString, Up, ("Up", AtomicString::ConstructFromLite ral));
3236 DEFINE_STATIC_LOCAL(AtomicString, Left, ("Left", AtomicString::ConstructFrom Literal)); 3291 DEFINE_STATIC_LOCAL(AtomicString, Left, ("Left", AtomicString::ConstructFrom Literal));
3237 DEFINE_STATIC_LOCAL(AtomicString, Right, ("Right", AtomicString::ConstructFr omLiteral)); 3292 DEFINE_STATIC_LOCAL(AtomicString, Right, ("Right", AtomicString::ConstructFr omLiteral));
3238 3293
3239 WebFocusType retVal = WebFocusTypeNone; 3294 WebFocusType retVal = WebFocusTypeNone;
(...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after
3337 } 3392 }
3338 3393
3339 void EventHandler::updateDragStateAfterEditDragIfNeeded(Element* rootEditableEle ment) 3394 void EventHandler::updateDragStateAfterEditDragIfNeeded(Element* rootEditableEle ment)
3340 { 3395 {
3341 // If inserting the dragged contents removed the drag source, we still want to fire dragend at the root editble element. 3396 // If inserting the dragged contents removed the drag source, we still want to fire dragend at the root editble element.
3342 if (dragState().m_dragSrc && !dragState().m_dragSrc->inDocument()) 3397 if (dragState().m_dragSrc && !dragState().m_dragSrc->inDocument())
3343 dragState().m_dragSrc = rootEditableElement; 3398 dragState().m_dragSrc = rootEditableElement;
3344 } 3399 }
3345 3400
3346 // returns if we should continue "default processing", i.e., whether eventhandle r canceled 3401 // returns if we should continue "default processing", i.e., whether eventhandle r canceled
3347 bool EventHandler::dispatchDragSrcEvent(const AtomicString& eventType, const Pla tformMouseEvent& event) 3402 WebInputEventResult EventHandler::dispatchDragSrcEvent(const AtomicString& event Type, const PlatformMouseEvent& event)
3348 { 3403 {
3349 return dispatchDragEvent(eventType, dragState().m_dragSrc.get(), event, drag State().m_dragDataTransfer.get()); 3404 return dispatchDragEvent(eventType, dragState().m_dragSrc.get(), event, drag State().m_dragDataTransfer.get());
3350 } 3405 }
3351 3406
3352 bool EventHandler::handleDrag(const MouseEventWithHitTestResults& event, DragIni tiator initiator) 3407 bool EventHandler::handleDrag(const MouseEventWithHitTestResults& event, DragIni tiator initiator)
3353 { 3408 {
3354 ASSERT(event.event().type() == PlatformEvent::MouseMoved); 3409 ASSERT(event.event().type() == PlatformEvent::MouseMoved);
3355 // Callers must protect the reference to FrameView, since this function may dispatch DOM 3410 // Callers must protect the reference to FrameView, since this function may dispatch DOM
3356 // events, causing page/FrameView to go away. 3411 // events, causing page/FrameView to go away.
3357 ASSERT(m_frame); 3412 ASSERT(m_frame);
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after
3426 DragController& dragController = m_frame->page()->dragController(); 3481 DragController& dragController = m_frame->page()->dragController();
3427 if (!dragController.populateDragDataTransfer(m_frame, dragState(), m_mouseDo wnPos)) 3482 if (!dragController.populateDragDataTransfer(m_frame, dragState(), m_mouseDo wnPos))
3428 return false; 3483 return false;
3429 3484
3430 // If dispatching dragstart brings about another mouse down -- one way 3485 // If dispatching dragstart brings about another mouse down -- one way
3431 // this will happen is if a DevTools user breaks within a dragstart 3486 // this will happen is if a DevTools user breaks within a dragstart
3432 // handler and then clicks on the suspended page -- the drag state is 3487 // handler and then clicks on the suspended page -- the drag state is
3433 // reset. Hence, need to check if this particular drag operation can 3488 // reset. Hence, need to check if this particular drag operation can
3434 // continue even if dispatchEvent() indicates no (direct) cancellation. 3489 // continue even if dispatchEvent() indicates no (direct) cancellation.
3435 // Do that by checking if m_dragSrc is still set. 3490 // Do that by checking if m_dragSrc is still set.
3436 m_mouseDownMayStartDrag = !dispatchDragSrcEvent(EventTypeNames::dragstart, m _mouseDown) 3491 m_mouseDownMayStartDrag = dispatchDragSrcEvent(EventTypeNames::dragstart, m_ mouseDown) == WebInputEventResult::NotHandled
3437 && !m_frame->selection().isInPasswordField() && dragState().m_dragSrc; 3492 && !m_frame->selection().isInPasswordField() && dragState().m_dragSrc;
3438 3493
3439 // Invalidate clipboard here against anymore pasteboard writing for security . The drag 3494 // Invalidate clipboard here against anymore pasteboard writing for security . The drag
3440 // image can still be changed as we drag, but not the pasteboard data. 3495 // image can still be changed as we drag, but not the pasteboard data.
3441 dragState().m_dragDataTransfer->setAccessPolicy(DataTransferImageWritable); 3496 dragState().m_dragDataTransfer->setAccessPolicy(DataTransferImageWritable);
3442 3497
3443 if (m_mouseDownMayStartDrag) { 3498 if (m_mouseDownMayStartDrag) {
3444 // Dispatching the event could cause Page to go away. Make sure it's sti ll valid before trying to use DragController. 3499 // Dispatching the event could cause Page to go away. Make sure it's sti ll valid before trying to use DragController.
3445 if (m_frame->page() && dragController.startDrag(m_frame, dragState(), ev ent.event(), m_mouseDownPos)) 3500 if (m_frame->page() && dragController.startDrag(m_frame, dragState(), ev ent.event(), m_mouseDownPos))
3446 return true; 3501 return true;
(...skipping 280 matching lines...) Expand 10 before | Expand all | Expand 10 after
3727 // instance represents. 3782 // instance represents.
3728 RefPtrWillBeMember<TouchList> m_touches; 3783 RefPtrWillBeMember<TouchList> m_touches;
3729 3784
3730 using EventTargetSet = WillBeHeapHashSet<RefPtrWillBeMember<EventTarget>>; 3785 using EventTargetSet = WillBeHeapHashSet<RefPtrWillBeMember<EventTarget>>;
3731 // Set of targets involved in m_touches. 3786 // Set of targets involved in m_touches.
3732 EventTargetSet m_targets; 3787 EventTargetSet m_targets;
3733 }; 3788 };
3734 3789
3735 } // namespace 3790 } // namespace
3736 3791
3737 bool EventHandler::dispatchTouchEvents(const PlatformTouchEvent& event, 3792 WebInputEventResult EventHandler::dispatchTouchEvents(const PlatformTouchEvent& event,
3738 WillBeHeapVector<TouchInfo>& touchInfos, bool freshTouchEvents, bool allTouc hReleased) 3793 WillBeHeapVector<TouchInfo>& touchInfos, bool freshTouchEvents, bool allTouc hReleased)
3739 { 3794 {
3740 // Build up the lists to use for the 'touches', 'targetTouches' and 3795 // Build up the lists to use for the 'touches', 'targetTouches' and
3741 // 'changedTouches' attributes in the JS event. See 3796 // 'changedTouches' attributes in the JS event. See
3742 // http://www.w3.org/TR/touch-events/#touchevent-interface for how these 3797 // http://www.w3.org/TR/touch-events/#touchevent-interface for how these
3743 // lists fit together. 3798 // lists fit together.
3744 3799
3745 // Holds the complete set of touches on the screen. 3800 // Holds the complete set of touches on the screen.
3746 RefPtrWillBeRawPtr<TouchList> touches = TouchList::create(); 3801 RefPtrWillBeRawPtr<TouchList> touches = TouchList::create();
3747 3802
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
3799 changedTouches[pointState].m_touches = TouchList::create(); 3854 changedTouches[pointState].m_touches = TouchList::create();
3800 changedTouches[pointState].m_touches->append(touch); 3855 changedTouches[pointState].m_touches->append(touch);
3801 changedTouches[pointState].m_targets.add(touchInfo.touchTarget); 3856 changedTouches[pointState].m_targets.add(touchInfo.touchTarget);
3802 } 3857 }
3803 } 3858 }
3804 if (allTouchReleased) { 3859 if (allTouchReleased) {
3805 m_touchSequenceDocument.clear(); 3860 m_touchSequenceDocument.clear();
3806 m_touchSequenceUserGestureToken.clear(); 3861 m_touchSequenceUserGestureToken.clear();
3807 } 3862 }
3808 3863
3809 bool swallowedEvent = false; 3864 WebInputEventResult eventResult = WebInputEventResult::NotHandled;
3810 3865
3811 // Now iterate through the changedTouches list and m_targets within it, send ing 3866 // Now iterate through the changedTouches list and m_targets within it, send ing
3812 // TouchEvents to the targets as required. 3867 // TouchEvents to the targets as required.
3813 for (unsigned state = 0; state != PlatformTouchPoint::TouchStateEnd; ++state ) { 3868 for (unsigned state = 0; state != PlatformTouchPoint::TouchStateEnd; ++state ) {
3814 if (!changedTouches[state].m_touches) 3869 if (!changedTouches[state].m_touches)
3815 continue; 3870 continue;
3816 3871
3817 const AtomicString& eventName(touchEventNameForTouchPointState(static_ca st<PlatformTouchPoint::State>(state))); 3872 const AtomicString& eventName(touchEventNameForTouchPointState(static_ca st<PlatformTouchPoint::State>(state)));
3818 for (const auto& eventTarget : changedTouches[state].m_targets) { 3873 for (const auto& eventTarget : changedTouches[state].m_targets) {
3819 EventTarget* touchEventTarget = eventTarget.get(); 3874 EventTarget* touchEventTarget = eventTarget.get();
3820 RefPtrWillBeRawPtr<TouchEvent> touchEvent = TouchEvent::create( 3875 RefPtrWillBeRawPtr<TouchEvent> touchEvent = TouchEvent::create(
3821 touches.get(), touchesByTarget.get(touchEventTarget), changedTou ches[state].m_touches.get(), 3876 touches.get(), touchesByTarget.get(touchEventTarget), changedTou ches[state].m_touches.get(),
3822 eventName, touchEventTarget->toNode()->document().domWindow(), 3877 eventName, touchEventTarget->toNode()->document().domWindow(),
3823 event.modifiers(), event.cancelable(), event.causesScrollingIfUn canceled(), event.timestamp()); 3878 event.modifiers(), event.cancelable(), event.causesScrollingIfUn canceled(), event.timestamp());
3824 3879
3825 touchEventTarget->dispatchEvent(touchEvent.get()); 3880 bool dispatchResult = touchEventTarget->dispatchEvent(touchEvent.get ());
3826 swallowedEvent = swallowedEvent || touchEvent->defaultPrevented() || touchEvent->defaultHandled(); 3881 eventResult = mergeEventResult(eventResult, eventToEventResult(touch Event, dispatchResult));
3827 } 3882 }
3828 } 3883 }
3829 3884
3830 return swallowedEvent; 3885 return eventResult;
3831 } 3886 }
3832 3887
3833 bool EventHandler::handleTouchEvent(const PlatformTouchEvent& event) 3888 WebInputEventResult EventHandler::handleTouchEvent(const PlatformTouchEvent& eve nt)
3834 { 3889 {
3835 TRACE_EVENT0("blink", "EventHandler::handleTouchEvent"); 3890 TRACE_EVENT0("blink", "EventHandler::handleTouchEvent");
3836 3891
3837 const Vector<PlatformTouchPoint>& points = event.touchPoints(); 3892 const Vector<PlatformTouchPoint>& points = event.touchPoints();
3838 3893
3839 bool freshTouchEvents = true; 3894 bool freshTouchEvents = true;
3840 bool allTouchReleased = true; 3895 bool allTouchReleased = true;
3841 for (unsigned i = 0; i < points.size(); ++i) { 3896 for (unsigned i = 0; i < points.size(); ++i) {
3842 const PlatformTouchPoint& point = points[i]; 3897 const PlatformTouchPoint& point = points[i];
3843 3898
(...skipping 18 matching lines...) Expand all
3862 gestureIndicator = adoptPtr(new UserGestureIndicator(m_touchSequenceUser GestureToken.release())); 3917 gestureIndicator = adoptPtr(new UserGestureIndicator(m_touchSequenceUser GestureToken.release()));
3863 else 3918 else
3864 gestureIndicator = adoptPtr(new UserGestureIndicator(DefinitelyProcessin gUserGesture)); 3919 gestureIndicator = adoptPtr(new UserGestureIndicator(DefinitelyProcessin gUserGesture));
3865 3920
3866 m_touchSequenceUserGestureToken = gestureIndicator->currentToken(); 3921 m_touchSequenceUserGestureToken = gestureIndicator->currentToken();
3867 3922
3868 ASSERT(m_frame->view()); 3923 ASSERT(m_frame->view());
3869 if (m_touchSequenceDocument && (!m_touchSequenceDocument->frame() || !m_touc hSequenceDocument->frame()->view())) { 3924 if (m_touchSequenceDocument && (!m_touchSequenceDocument->frame() || !m_touc hSequenceDocument->frame()->view())) {
3870 // If the active touch document has no frame or view, it's probably bein g destroyed 3925 // If the active touch document has no frame or view, it's probably bein g destroyed
3871 // so we can't dispatch events. 3926 // so we can't dispatch events.
3872 return false; 3927 return WebInputEventResult::NotHandled;
3873 } 3928 }
3874 3929
3875 // First do hit tests for any new touch points. 3930 // First do hit tests for any new touch points.
3876 for (unsigned i = 0; i < points.size(); ++i) { 3931 for (unsigned i = 0; i < points.size(); ++i) {
3877 const PlatformTouchPoint& point = points[i]; 3932 const PlatformTouchPoint& point = points[i];
3878 3933
3879 // Touch events implicitly capture to the touched node, and don't change 3934 // Touch events implicitly capture to the touched node, and don't change
3880 // active/hover states themselves (Gesture events do). So we only need 3935 // active/hover states themselves (Gesture events do). So we only need
3881 // to hit-test on touchstart, and it can be read-only. 3936 // to hit-test on touchstart, and it can be read-only.
3882 if (point.state() == PlatformTouchPoint::TouchPressed) { 3937 if (point.state() == PlatformTouchPoint::TouchPressed) {
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
3925 m_touchPressed = !allTouchReleased; 3980 m_touchPressed = !allTouchReleased;
3926 3981
3927 // If there's no document receiving touch events, or no handlers on the 3982 // If there's no document receiving touch events, or no handlers on the
3928 // document set to receive the events, then we can skip all the rest of 3983 // document set to receive the events, then we can skip all the rest of
3929 // this work. 3984 // this work.
3930 if (!m_touchSequenceDocument || !m_touchSequenceDocument->frameHost() || !m_ touchSequenceDocument->frameHost()->eventHandlerRegistry().hasEventHandlers(Even tHandlerRegistry::TouchEvent) || !m_touchSequenceDocument->frame()) { 3985 if (!m_touchSequenceDocument || !m_touchSequenceDocument->frameHost() || !m_ touchSequenceDocument->frameHost()->eventHandlerRegistry().hasEventHandlers(Even tHandlerRegistry::TouchEvent) || !m_touchSequenceDocument->frame()) {
3931 if (allTouchReleased) { 3986 if (allTouchReleased) {
3932 m_touchSequenceDocument.clear(); 3987 m_touchSequenceDocument.clear();
3933 m_touchSequenceUserGestureToken.clear(); 3988 m_touchSequenceUserGestureToken.clear();
3934 } 3989 }
3935 return false; 3990 return WebInputEventResult::NotHandled;
3936 } 3991 }
3937 3992
3938 // Compute and store the common info used by both PointerEvent and TouchEven t. 3993 // Compute and store the common info used by both PointerEvent and TouchEven t.
3939 WillBeHeapVector<TouchInfo> touchInfos(points.size()); 3994 WillBeHeapVector<TouchInfo> touchInfos(points.size());
3940 3995
3941 for (unsigned i = 0; i < points.size(); ++i) { 3996 for (unsigned i = 0; i < points.size(); ++i) {
3942 const PlatformTouchPoint& point = points[i]; 3997 const PlatformTouchPoint& point = points[i];
3943 PlatformTouchPoint::State pointState = point.state(); 3998 PlatformTouchPoint::State pointState = point.state();
3944 RefPtrWillBeRawPtr<EventTarget> touchTarget = nullptr; 3999 RefPtrWillBeRawPtr<EventTarget> touchTarget = nullptr;
3945 4000
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after
4004 // Note that the disposition of any pointer events affects only the gene ration of touch 4059 // Note that the disposition of any pointer events affects only the gene ration of touch
4005 // events. If all pointer events were handled (and hence no touch events were fired), that 4060 // events. If all pointer events were handled (and hence no touch events were fired), that
4006 // is still equivalent to the touch events going unhandled because point er event handler 4061 // is still equivalent to the touch events going unhandled because point er event handler
4007 // don't block scroll gesture generation. 4062 // don't block scroll gesture generation.
4008 } 4063 }
4009 4064
4010 // TODO(crbug.com/507408): If PE handlers always call preventDefault, we won 't see TEs until after 4065 // TODO(crbug.com/507408): If PE handlers always call preventDefault, we won 't see TEs until after
4011 // scrolling starts because the scrolling would suppress upcoming PEs. This sudden "break" in TE 4066 // scrolling starts because the scrolling would suppress upcoming PEs. This sudden "break" in TE
4012 // suppression can make the visible TEs inconsistent (e.g. touchmove without a touchstart). 4067 // suppression can make the visible TEs inconsistent (e.g. touchmove without a touchstart).
4013 4068
4014 bool swallowedTouchEvent = dispatchTouchEvents(event, touchInfos, freshTouch Events, 4069 WebInputEventResult eventResult = dispatchTouchEvents(event, touchInfos, fre shTouchEvents,
4015 allTouchReleased); 4070 allTouchReleased);
4016 4071
4017 if (!m_inPointerCanceledState) { 4072 if (!m_inPointerCanceledState) {
4018 // Check if we need to stop firing pointer events because of a touch act ion. 4073 // Check if we need to stop firing pointer events because of a touch act ion.
4019 // See: www.w3.org/TR/pointerevents/#declaring-candidate-regions-for-def ault-touch-behaviors 4074 // See: www.w3.org/TR/pointerevents/#declaring-candidate-regions-for-def ault-touch-behaviors
4020 if (event.causesScrollingIfUncanceled() && !swallowedTouchEvent) { 4075 if (event.causesScrollingIfUncanceled() && eventResult == WebInputEventR esult::NotHandled) {
4021 m_inPointerCanceledState = true; 4076 m_inPointerCanceledState = true;
4022 sendPointerCancels(touchInfos); 4077 sendPointerCancels(touchInfos);
4023 } 4078 }
4024 } else if (allTouchReleased) { 4079 } else if (allTouchReleased) {
4025 m_inPointerCanceledState = false; 4080 m_inPointerCanceledState = false;
4026 } 4081 }
4027 4082
4028 return swallowedTouchEvent; 4083 return eventResult;
4029 } 4084 }
4030 4085
4031 void EventHandler::setLastKnownMousePosition(const PlatformMouseEvent& event) 4086 void EventHandler::setLastKnownMousePosition(const PlatformMouseEvent& event)
4032 { 4087 {
4033 m_mousePositionIsUnknown = false; 4088 m_mousePositionIsUnknown = false;
4034 m_lastKnownMousePosition = event.position(); 4089 m_lastKnownMousePosition = event.position();
4035 m_lastKnownMouseGlobalPosition = event.globalPosition(); 4090 m_lastKnownMouseGlobalPosition = event.globalPosition();
4036 } 4091 }
4037 4092
4038 void EventHandler::conditionallyEnableMouseEventForPointerTypeMouse(const Platfo rmMouseEvent& event) 4093 void EventHandler::conditionallyEnableMouseEventForPointerTypeMouse(const Platfo rmMouseEvent& event)
4039 { 4094 {
4040 if (event.button() == NoButton) 4095 if (event.button() == NoButton)
4041 m_preventMouseEventForPointerTypeMouse = false; 4096 m_preventMouseEventForPointerTypeMouse = false;
4042 } 4097 }
4043 4098
4044 bool EventHandler::passMousePressEventToSubframe(MouseEventWithHitTestResults& m ev, LocalFrame* subframe) 4099 WebInputEventResult EventHandler::passMousePressEventToSubframe(MouseEventWithHi tTestResults& mev, LocalFrame* subframe)
4045 { 4100 {
4046 selectionController().passMousePressEventToSubframe(mev); 4101 selectionController().passMousePressEventToSubframe(mev);
4047 subframe->eventHandler().handleMousePressEvent(mev.event()); 4102 WebInputEventResult result = subframe->eventHandler().handleMousePressEvent( mev.event());
4048 return true; 4103 if (result != WebInputEventResult::NotHandled)
4104 return result;
4105 return WebInputEventResult::HandledSystem;
4049 } 4106 }
4050 4107
4051 bool EventHandler::passMouseMoveEventToSubframe(MouseEventWithHitTestResults& me v, LocalFrame* subframe, HitTestResult* hoveredNode) 4108 WebInputEventResult EventHandler::passMouseMoveEventToSubframe(MouseEventWithHit TestResults& mev, LocalFrame* subframe, HitTestResult* hoveredNode)
4052 { 4109 {
4053 if (m_mouseDownMayStartDrag) 4110 if (m_mouseDownMayStartDrag)
4054 return false; 4111 return WebInputEventResult::NotHandled;
4055 subframe->eventHandler().handleMouseMoveOrLeaveEvent(mev.event(), hoveredNod e); 4112 WebInputEventResult result = subframe->eventHandler().handleMouseMoveOrLeave Event(mev.event(), hoveredNode);
4056 return true; 4113 if (result != WebInputEventResult::NotHandled)
4114 return result;
4115 return WebInputEventResult::HandledSystem;
4057 } 4116 }
4058 4117
4059 bool EventHandler::passMouseReleaseEventToSubframe(MouseEventWithHitTestResults& mev, LocalFrame* subframe) 4118 WebInputEventResult EventHandler::passMouseReleaseEventToSubframe(MouseEventWith HitTestResults& mev, LocalFrame* subframe)
4060 { 4119 {
4061 subframe->eventHandler().handleMouseReleaseEvent(mev.event()); 4120 WebInputEventResult result = subframe->eventHandler().handleMouseReleaseEven t(mev.event());
4062 return true; 4121 if (result != WebInputEventResult::NotHandled)
4122 return result;
4123 return WebInputEventResult::HandledSystem;
4063 } 4124 }
4064 4125
4065 bool EventHandler::passWheelEventToWidget(const PlatformWheelEvent& wheelEvent, Widget& widget) 4126 WebInputEventResult EventHandler::passWheelEventToWidget(const PlatformWheelEven t& wheelEvent, Widget& widget)
4066 { 4127 {
4067 // If not a FrameView, then probably a plugin widget. Those will receive 4128 // If not a FrameView, then probably a plugin widget. Those will receive
4068 // the event via an EventTargetNode dispatch when this returns false. 4129 // the event via an EventTargetNode dispatch when this returns false.
4069 if (!widget.isFrameView()) 4130 if (!widget.isFrameView())
4070 return false; 4131 return WebInputEventResult::NotHandled;
4071 4132
4072 return toFrameView(&widget)->frame().eventHandler().handleWheelEvent(wheelEv ent); 4133 return toFrameView(&widget)->frame().eventHandler().handleWheelEvent(wheelEv ent);
4073 } 4134 }
4074 4135
4075 DataTransfer* EventHandler::createDraggingDataTransfer() const 4136 DataTransfer* EventHandler::createDraggingDataTransfer() const
4076 { 4137 {
4077 return DataTransfer::create(DataTransfer::DragAndDrop, DataTransferWritable, DataObject::create()); 4138 return DataTransfer::create(DataTransfer::DragAndDrop, DataTransferWritable, DataObject::create());
4078 } 4139 }
4079 4140
4080 void EventHandler::focusDocumentView() 4141 void EventHandler::focusDocumentView()
4081 { 4142 {
4082 Page* page = m_frame->page(); 4143 Page* page = m_frame->page();
4083 if (!page) 4144 if (!page)
4084 return; 4145 return;
4085 page->focusController().focusDocumentView(m_frame); 4146 page->focusController().focusDocumentView(m_frame);
4086 } 4147 }
4087 4148
4088 PlatformEvent::Modifiers EventHandler::accessKeyModifiers() 4149 PlatformEvent::Modifiers EventHandler::accessKeyModifiers()
4089 { 4150 {
4090 #if OS(MACOSX) 4151 #if OS(MACOSX)
4091 return static_cast<PlatformEvent::Modifiers>(PlatformEvent::CtrlKey | Platfo rmEvent::AltKey); 4152 return static_cast<PlatformEvent::Modifiers>(PlatformEvent::CtrlKey | Platfo rmEvent::AltKey);
4092 #else 4153 #else
4093 return PlatformEvent::AltKey; 4154 return PlatformEvent::AltKey;
4094 #endif 4155 #endif
4095 } 4156 }
4096 4157
4097 } // namespace blink 4158 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698