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

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

Issue 2397723004: reflow comments in core/input (Closed)
Patch Set: Created 4 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc. All rights reserv ed. 2 * Copyright (C) 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc. All rights
3 * reserved.
3 * Copyright (C) 2006 Alexey Proskuryakov (ap@webkit.org) 4 * Copyright (C) 2006 Alexey Proskuryakov (ap@webkit.org)
4 * Copyright (C) 2012 Digia Plc. and/or its subsidiary(-ies) 5 * Copyright (C) 2012 Digia Plc. and/or its subsidiary(-ies)
5 * 6 *
6 * Redistribution and use in source and binary forms, with or without 7 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions 8 * modification, are permitted provided that the following conditions
8 * are met: 9 * are met:
9 * 1. Redistributions of source code must retain the above copyright 10 * 1. Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer. 11 * notice, this list of conditions and the following disclaimer.
11 * 2. Redistributions in binary form must reproduce the above copyright 12 * 2. Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the 13 * notice, this list of conditions and the following disclaimer in the
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after
100 #include "wtf/Assertions.h" 101 #include "wtf/Assertions.h"
101 #include "wtf/CurrentTime.h" 102 #include "wtf/CurrentTime.h"
102 #include "wtf/PtrUtil.h" 103 #include "wtf/PtrUtil.h"
103 #include "wtf/StdLibExtras.h" 104 #include "wtf/StdLibExtras.h"
104 #include <memory> 105 #include <memory>
105 106
106 namespace blink { 107 namespace blink {
107 108
108 namespace { 109 namespace {
109 110
110 // Refetch the event target node if it is removed or currently is the shadow nod e inside an <input> element. 111 // Refetch the event target node if it is removed or currently is the shadow
111 // If a mouse event handler changes the input element type to one that has a wid get associated, 112 // node inside an <input> element. If a mouse event handler changes the input
112 // we'd like to EventHandler::handleMousePressEvent to pass the event to the wid get and thus the 113 // element type to one that has a widget associated, we'd like to
113 // event target node can't still be the shadow node. 114 // EventHandler::handleMousePressEvent to pass the event to the widget and thus
115 // the event target node can't still be the shadow node.
114 bool shouldRefetchEventTarget(const MouseEventWithHitTestResults& mev) { 116 bool shouldRefetchEventTarget(const MouseEventWithHitTestResults& mev) {
115 Node* targetNode = mev.innerNode(); 117 Node* targetNode = mev.innerNode();
116 if (!targetNode || !targetNode->parentNode()) 118 if (!targetNode || !targetNode->parentNode())
117 return true; 119 return true;
118 return targetNode->isShadowRoot() && 120 return targetNode->isShadowRoot() &&
119 isHTMLInputElement(toShadowRoot(targetNode)->host()); 121 isHTMLInputElement(toShadowRoot(targetNode)->host());
120 } 122 }
121 123
122 } // namespace 124 } // namespace
123 125
124 using namespace HTMLNames; 126 using namespace HTMLNames;
125 127
126 // The amount of time to wait for a cursor update on style and layout changes 128 // The amount of time to wait for a cursor update on style and layout changes
127 // Set to 50Hz, no need to be faster than common screen refresh rate 129 // Set to 50Hz, no need to be faster than common screen refresh rate
128 static const double cursorUpdateInterval = 0.02; 130 static const double cursorUpdateInterval = 0.02;
129 131
130 static const int maximumCursorSize = 128; 132 static const int maximumCursorSize = 128;
131 133
132 // It's pretty unlikely that a scale of less than one would ever be used. But al l we really 134 // It's pretty unlikely that a scale of less than one would ever be used. But
133 // need to ensure here is that the scale isn't so small that integer overflow ca n occur when 135 // all we really need to ensure here is that the scale isn't so small that
134 // dividing cursor sizes (limited above) by the scale. 136 // integer overflow can occur when dividing cursor sizes (limited above) by the
137 // scale.
135 static const double minimumCursorScale = 0.001; 138 static const double minimumCursorScale = 0.001;
136 139
137 // The minimum amount of time an element stays active after a ShowPress 140 // The minimum amount of time an element stays active after a ShowPress
138 // This is roughly 9 frames, which should be long enough to be noticeable. 141 // This is roughly 9 frames, which should be long enough to be noticeable.
139 static const double minimumActiveInterval = 0.15; 142 static const double minimumActiveInterval = 0.15;
140 143
141 enum NoCursorChangeType { NoCursorChange }; 144 enum NoCursorChangeType { NoCursorChange };
142 145
143 class OptionalCursor { 146 class OptionalCursor {
144 public: 147 public:
(...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after
248 FrameView* mainView = mainFrame->view(); 251 FrameView* mainView = mainFrame->view();
249 if (frameView && mainView) { 252 if (frameView && mainView) {
250 IntPoint mainFramePoint = mainView->rootFrameToContents( 253 IntPoint mainFramePoint = mainView->rootFrameToContents(
251 frameView->contentsToRootFrame(roundedIntPoint(point))); 254 frameView->contentsToRootFrame(roundedIntPoint(point)));
252 return mainFrame->eventHandler().hitTestResultAtPoint(mainFramePoint, 255 return mainFrame->eventHandler().hitTestResultAtPoint(mainFramePoint,
253 hitType, padding); 256 hitType, padding);
254 } 257 }
255 } 258 }
256 } 259 }
257 260
258 // hitTestResultAtPoint is specifically used to hitTest into all frames, thus it always allows child frame content. 261 // hitTestResultAtPoint is specifically used to hitTest into all frames, thus
262 // it always allows child frame content.
259 HitTestRequest request(hitType | HitTestRequest::AllowChildFrameContent); 263 HitTestRequest request(hitType | HitTestRequest::AllowChildFrameContent);
260 HitTestResult result(request, point, padding.height().toUnsigned(), 264 HitTestResult result(request, point, padding.height().toUnsigned(),
261 padding.width().toUnsigned(), 265 padding.width().toUnsigned(),
262 padding.height().toUnsigned(), 266 padding.height().toUnsigned(),
263 padding.width().toUnsigned()); 267 padding.width().toUnsigned());
264 268
265 // LayoutView::hitTest causes a layout, and we don't want to hit that until th e first 269 // LayoutView::hitTest causes a layout, and we don't want to hit that until
266 // layout because until then, there is nothing shown on the screen - the user can't 270 // the first layout because until then, there is nothing shown on the screen -
267 // have intentionally clicked on something belonging to this page. Furthermore , 271 // the user can't have intentionally clicked on something belonging to this
268 // mousemove events before the first layout should not lead to a premature lay out() 272 // page. Furthermore, mousemove events before the first layout should not
269 // happening, which could show a flash of white. 273 // lead to a premature layout() happening, which could show a flash of white.
270 // See also the similar code in Document::performMouseEventHitTest. 274 // See also the similar code in Document::performMouseEventHitTest.
271 if (m_frame->contentLayoutItem().isNull() || !m_frame->view() || 275 if (m_frame->contentLayoutItem().isNull() || !m_frame->view() ||
272 !m_frame->view()->didFirstLayout()) 276 !m_frame->view()->didFirstLayout())
273 return result; 277 return result;
274 278
275 m_frame->contentLayoutItem().hitTest(result); 279 m_frame->contentLayoutItem().hitTest(result);
276 if (!request.readOnly()) 280 if (!request.readOnly())
277 m_frame->document()->updateHoverActiveState(request, result.innerElement()); 281 m_frame->document()->updateHoverActiveState(request, result.innerElement());
278 282
279 return result; 283 return result;
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after
340 void EventHandler::cursorUpdateTimerFired(TimerBase*) { 344 void EventHandler::cursorUpdateTimerFired(TimerBase*) {
341 ASSERT(m_frame); 345 ASSERT(m_frame);
342 ASSERT(m_frame->document()); 346 ASSERT(m_frame->document());
343 347
344 updateCursor(); 348 updateCursor();
345 } 349 }
346 350
347 void EventHandler::updateCursor() { 351 void EventHandler::updateCursor() {
348 TRACE_EVENT0("input", "EventHandler::updateCursor"); 352 TRACE_EVENT0("input", "EventHandler::updateCursor");
349 353
350 // We must do a cross-frame hit test because the frame that triggered the curs or 354 // We must do a cross-frame hit test because the frame that triggered the
351 // update could be occluded by a different frame. 355 // cursor update could be occluded by a different frame.
352 ASSERT(m_frame == m_frame->localFrameRoot()); 356 ASSERT(m_frame == m_frame->localFrameRoot());
353 357
354 if (m_mouseEventManager->isMousePositionUnknown()) 358 if (m_mouseEventManager->isMousePositionUnknown())
355 return; 359 return;
356 360
357 FrameView* view = m_frame->view(); 361 FrameView* view = m_frame->view();
358 if (!view || !view->shouldSetCursor()) 362 if (!view || !view->shouldSetCursor())
359 return; 363 return;
360 364
361 LayoutViewItem layoutViewItem = view->layoutViewItem(); 365 LayoutViewItem layoutViewItem = view->layoutViewItem();
(...skipping 172 matching lines...) Expand 10 before | Expand all | Expand 10 after
534 bool inResizer = false; 538 bool inResizer = false;
535 LayoutObject* layoutObject = node ? node->layoutObject() : nullptr; 539 LayoutObject* layoutObject = node ? node->layoutObject() : nullptr;
536 if (layoutObject && m_frame->view()) { 540 if (layoutObject && m_frame->view()) {
537 PaintLayer* layer = layoutObject->enclosingLayer(); 541 PaintLayer* layer = layoutObject->enclosingLayer();
538 inResizer = layer->getScrollableArea() && 542 inResizer = layer->getScrollableArea() &&
539 layer->getScrollableArea()->isPointInResizeControl( 543 layer->getScrollableArea()->isPointInResizeControl(
540 result.roundedPointInMainFrame(), ResizerForPointer); 544 result.roundedPointInMainFrame(), ResizerForPointer);
541 } 545 }
542 546
543 // During selection, use an I-beam no matter what we're over. 547 // During selection, use an I-beam no matter what we're over.
544 // If a drag may be starting or we're capturing mouse events for a particular node, don't treat this as a selection. 548 // If a drag may be starting or we're capturing mouse events for a particular
549 // node, don't treat this as a selection.
545 if (m_mouseEventManager->mousePressed() && 550 if (m_mouseEventManager->mousePressed() &&
546 selectionController().mouseDownMayStartSelect() && 551 selectionController().mouseDownMayStartSelect() &&
547 !m_mouseEventManager->mouseDownMayStartDrag() && 552 !m_mouseEventManager->mouseDownMayStartDrag() &&
548 !m_frame->selection().isNone() && !m_capturingMouseEventsNode) { 553 !m_frame->selection().isNone() && !m_capturingMouseEventsNode) {
549 return iBeam; 554 return iBeam;
550 } 555 }
551 556
552 if ((editable || 557 if ((editable ||
553 (layoutObject && layoutObject->isText() && node->canStartSelection())) && 558 (layoutObject && layoutObject->isText() && node->canStartSelection())) &&
554 !inResizer && !result.scrollbar()) 559 !inResizer && !result.scrollbar())
(...skipping 17 matching lines...) Expand all
572 UserGestureIndicator::currentToken(); 577 UserGestureIndicator::currentToken();
573 578
574 if (m_eventHandlerWillResetCapturingMouseEventsNode) 579 if (m_eventHandlerWillResetCapturingMouseEventsNode)
575 m_capturingMouseEventsNode = nullptr; 580 m_capturingMouseEventsNode = nullptr;
576 m_mouseEventManager->handleMousePressEventUpdateStates(mouseEvent); 581 m_mouseEventManager->handleMousePressEventUpdateStates(mouseEvent);
577 selectionController().setMouseDownMayStartSelect(false); 582 selectionController().setMouseDownMayStartSelect(false);
578 if (!m_frame->view()) 583 if (!m_frame->view())
579 return WebInputEventResult::NotHandled; 584 return WebInputEventResult::NotHandled;
580 585
581 HitTestRequest request(HitTestRequest::Active); 586 HitTestRequest request(HitTestRequest::Active);
582 // Save the document point we generate in case the window coordinate is invali dated by what happens 587 // Save the document point we generate in case the window coordinate is
583 // when we dispatch the event. 588 // invalidated by what happens when we dispatch the event.
584 LayoutPoint documentPoint = 589 LayoutPoint documentPoint =
585 m_frame->view()->rootFrameToContents(mouseEvent.position()); 590 m_frame->view()->rootFrameToContents(mouseEvent.position());
586 MouseEventWithHitTestResults mev = 591 MouseEventWithHitTestResults mev =
587 m_frame->document()->performMouseEventHitTest(request, documentPoint, 592 m_frame->document()->performMouseEventHitTest(request, documentPoint,
588 mouseEvent); 593 mouseEvent);
589 594
590 if (!mev.innerNode()) { 595 if (!mev.innerNode()) {
591 m_mouseEventManager->invalidateClick(); 596 m_mouseEventManager->invalidateClick();
592 return WebInputEventResult::NotHandled; 597 return WebInputEventResult::NotHandled;
593 } 598 }
594 599
595 m_mouseEventManager->setMousePressNode(mev.innerNode()); 600 m_mouseEventManager->setMousePressNode(mev.innerNode());
596 m_frame->document()->setSequentialFocusNavigationStartingPoint( 601 m_frame->document()->setSequentialFocusNavigationStartingPoint(
597 mev.innerNode()); 602 mev.innerNode());
598 603
599 LocalFrame* subframe = subframeForHitTestResult(mev); 604 LocalFrame* subframe = subframeForHitTestResult(mev);
600 if (subframe) { 605 if (subframe) {
601 WebInputEventResult result = passMousePressEventToSubframe(mev, subframe); 606 WebInputEventResult result = passMousePressEventToSubframe(mev, subframe);
602 // Start capturing future events for this frame. We only do this if we didn 't clear 607 // Start capturing future events for this frame. We only do this if we
603 // the m_mousePressed flag, which may happen if an AppKit widget entered a m odal event loop. 608 // didn't clear the m_mousePressed flag, which may happen if an AppKit
604 // The capturing should be done only when the result indicates it 609 // widget entered a modal event loop. The capturing should be done only
605 // has been handled. See crbug.com/269917 610 // when the result indicates it has been handled. See crbug.com/269917
606 m_mouseEventManager->setCapturesDragging( 611 m_mouseEventManager->setCapturesDragging(
607 subframe->eventHandler().m_mouseEventManager->capturesDragging()); 612 subframe->eventHandler().m_mouseEventManager->capturesDragging());
608 if (m_mouseEventManager->mousePressed() && 613 if (m_mouseEventManager->mousePressed() &&
609 m_mouseEventManager->capturesDragging()) { 614 m_mouseEventManager->capturesDragging()) {
610 m_capturingMouseEventsNode = mev.innerNode(); 615 m_capturingMouseEventsNode = mev.innerNode();
611 m_eventHandlerWillResetCapturingMouseEventsNode = true; 616 m_eventHandlerWillResetCapturingMouseEventsNode = true;
612 } 617 }
613 m_mouseEventManager->invalidateClick(); 618 m_mouseEventManager->invalidateClick();
614 return result; 619 return result;
615 } 620 }
616 621
617 if (RuntimeEnabledFeatures::middleClickAutoscrollEnabled()) { 622 if (RuntimeEnabledFeatures::middleClickAutoscrollEnabled()) {
618 // We store whether middle click autoscroll is in progress before calling st opAutoscroll() 623 // We store whether middle click autoscroll is in progress before calling
619 // because it will set m_autoscrollType to NoAutoscroll on return. 624 // stopAutoscroll() because it will set m_autoscrollType to NoAutoscroll on
625 // return.
620 bool isMiddleClickAutoscrollInProgress = 626 bool isMiddleClickAutoscrollInProgress =
621 m_scrollManager->middleClickAutoscrollInProgress(); 627 m_scrollManager->middleClickAutoscrollInProgress();
622 m_scrollManager->stopAutoscroll(); 628 m_scrollManager->stopAutoscroll();
623 if (isMiddleClickAutoscrollInProgress) { 629 if (isMiddleClickAutoscrollInProgress) {
624 // We invalidate the click when exiting middle click auto scroll so that w e don't inadvertently navigate 630 // We invalidate the click when exiting middle click auto scroll so that
625 // away from the current page (e.g. the click was on a hyperlink). See <rd ar://problem/6095023>. 631 // we don't inadvertently navigate away from the current page (e.g. the
632 // click was on a hyperlink). See <rdar://problem/6095023>.
626 m_mouseEventManager->invalidateClick(); 633 m_mouseEventManager->invalidateClick();
627 return WebInputEventResult::HandledSuppressed; 634 return WebInputEventResult::HandledSuppressed;
628 } 635 }
629 } 636 }
630 637
631 m_mouseEventManager->setClickCount(mouseEvent.clickCount()); 638 m_mouseEventManager->setClickCount(mouseEvent.clickCount());
632 m_mouseEventManager->setClickNode( 639 m_mouseEventManager->setClickNode(
633 mev.innerNode()->isTextNode() 640 mev.innerNode()->isTextNode()
634 ? FlatTreeTraversal::parent(*mev.innerNode()) 641 ? FlatTreeTraversal::parent(*mev.innerNode())
635 : mev.innerNode()); 642 : mev.innerNode());
(...skipping 30 matching lines...) Expand all
666 mouseEvent.getSyntheticEventType() == PlatformMouseEvent::FromTouch 673 mouseEvent.getSyntheticEventType() == PlatformMouseEvent::FromTouch
667 ? InputDeviceCapabilities::firesTouchEventsSourceCapabilities() 674 ? InputDeviceCapabilities::firesTouchEventsSourceCapabilities()
668 : InputDeviceCapabilities::doesntFireTouchEventsSourceCapabilities(); 675 : InputDeviceCapabilities::doesntFireTouchEventsSourceCapabilities();
669 if (eventResult == WebInputEventResult::NotHandled) { 676 if (eventResult == WebInputEventResult::NotHandled) {
670 eventResult = m_mouseEventManager->handleMouseFocus(hitTestResult, 677 eventResult = m_mouseEventManager->handleMouseFocus(hitTestResult,
671 sourceCapabilities); 678 sourceCapabilities);
672 } 679 }
673 m_mouseEventManager->setCapturesDragging( 680 m_mouseEventManager->setCapturesDragging(
674 eventResult == WebInputEventResult::NotHandled || mev.scrollbar()); 681 eventResult == WebInputEventResult::NotHandled || mev.scrollbar());
675 682
676 // If the hit testing originally determined the event was in a scrollbar, refe tch the MouseEventWithHitTestResults 683 // If the hit testing originally determined the event was in a scrollbar,
677 // in case the scrollbar widget was destroyed when the mouse event was handled . 684 // refetch the MouseEventWithHitTestResults in case the scrollbar widget was
685 // destroyed when the mouse event was handled.
678 if (mev.scrollbar()) { 686 if (mev.scrollbar()) {
679 const bool wasLastScrollBar = 687 const bool wasLastScrollBar =
680 mev.scrollbar() == m_lastScrollbarUnderMouse.get(); 688 mev.scrollbar() == m_lastScrollbarUnderMouse.get();
681 HitTestRequest request(HitTestRequest::ReadOnly | HitTestRequest::Active); 689 HitTestRequest request(HitTestRequest::ReadOnly | HitTestRequest::Active);
682 mev = m_frame->document()->performMouseEventHitTest(request, documentPoint, 690 mev = m_frame->document()->performMouseEventHitTest(request, documentPoint,
683 mouseEvent); 691 mouseEvent);
684 if (wasLastScrollBar && mev.scrollbar() != m_lastScrollbarUnderMouse.get()) 692 if (wasLastScrollBar && mev.scrollbar() != m_lastScrollbarUnderMouse.get())
685 m_lastScrollbarUnderMouse = nullptr; 693 m_lastScrollbarUnderMouse = nullptr;
686 } 694 }
687 695
688 if (eventResult != WebInputEventResult::NotHandled) { 696 if (eventResult != WebInputEventResult::NotHandled) {
689 // scrollbars should get events anyway, even disabled controls might be scro llable 697 // Scrollbars should get events anyway, even disabled controls might be
698 // scrollable.
690 passMousePressEventToScrollbar(mev); 699 passMousePressEventToScrollbar(mev);
691 } else { 700 } else {
692 if (shouldRefetchEventTarget(mev)) { 701 if (shouldRefetchEventTarget(mev)) {
693 HitTestRequest request(HitTestRequest::ReadOnly | HitTestRequest::Active); 702 HitTestRequest request(HitTestRequest::ReadOnly | HitTestRequest::Active);
694 mev = m_frame->document()->performMouseEventHitTest( 703 mev = m_frame->document()->performMouseEventHitTest(
695 request, documentPoint, mouseEvent); 704 request, documentPoint, mouseEvent);
696 } 705 }
697 706
698 if (passMousePressEventToScrollbar(mev)) 707 if (passMousePressEventToScrollbar(mev))
699 eventResult = WebInputEventResult::HandledSystem; 708 eventResult = WebInputEventResult::HandledSystem;
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after
776 return WebInputEventResult::HandledSystem; 785 return WebInputEventResult::HandledSystem;
777 } 786 }
778 787
779 // Mouse events simulated from touch should not hit-test again. 788 // Mouse events simulated from touch should not hit-test again.
780 ASSERT(!mouseEvent.fromTouch()); 789 ASSERT(!mouseEvent.fromTouch());
781 790
782 HitTestRequest::HitTestRequestType hitType = HitTestRequest::Move; 791 HitTestRequest::HitTestRequestType hitType = HitTestRequest::Move;
783 if (m_mouseEventManager->mousePressed()) { 792 if (m_mouseEventManager->mousePressed()) {
784 hitType |= HitTestRequest::Active; 793 hitType |= HitTestRequest::Active;
785 } else if (onlyUpdateScrollbars) { 794 } else if (onlyUpdateScrollbars) {
786 // Mouse events should be treated as "read-only" if we're updating only scro llbars. This 795 // Mouse events should be treated as "read-only" if we're updating only
787 // means that :hover and :active freeze in the state they were in, rather th an updating 796 // scrollbars. This means that :hover and :active freeze in the state they
788 // for nodes the mouse moves while the window is not key (which will be the case if 797 // were in, rather than updating for nodes the mouse moves while the window
789 // onlyUpdateScrollbars is true). 798 // is not key (which will be the case if onlyUpdateScrollbars is true).
790 hitType |= HitTestRequest::ReadOnly; 799 hitType |= HitTestRequest::ReadOnly;
791 } 800 }
792 801
793 // Treat any mouse move events as readonly if the user is currently touching t he screen. 802 // Treat any mouse move events as readonly if the user is currently touching
803 // the screen.
794 if (m_pointerEventManager->isAnyTouchActive()) 804 if (m_pointerEventManager->isAnyTouchActive())
795 hitType |= HitTestRequest::Active | HitTestRequest::ReadOnly; 805 hitType |= HitTestRequest::Active | HitTestRequest::ReadOnly;
796 HitTestRequest request(hitType); 806 HitTestRequest request(hitType);
797 MouseEventWithHitTestResults mev = MouseEventWithHitTestResults( 807 MouseEventWithHitTestResults mev = MouseEventWithHitTestResults(
798 mouseEvent, HitTestResult(request, LayoutPoint())); 808 mouseEvent, HitTestResult(request, LayoutPoint()));
799 809
800 // We don't want to do a hit-test in forceLeave scenarios because there might actually be some other frame above this one at the specified co-ordinate. 810 // We don't want to do a hit-test in forceLeave scenarios because there might
801 // So we must force the hit-test to fail, while still clearing hover/active st ate. 811 // actually be some other frame above this one at the specified co-ordinate.
812 // So we must force the hit-test to fail, while still clearing hover/active
813 // state.
802 if (forceLeave) { 814 if (forceLeave) {
803 m_frame->document()->updateHoverActiveState(request, 0); 815 m_frame->document()->updateHoverActiveState(request, 0);
804 } else { 816 } else {
805 mev = EventHandlingUtil::performMouseEventHitTest(m_frame, request, 817 mev = EventHandlingUtil::performMouseEventHitTest(m_frame, request,
806 mouseEvent); 818 mouseEvent);
807 } 819 }
808 820
809 if (hoveredNode) 821 if (hoveredNode)
810 *hoveredNode = mev.hitTestResult(); 822 *hoveredNode = mev.hitTestResult();
811 823
(...skipping 10 matching lines...) Expand all
822 if (onlyUpdateScrollbars) 834 if (onlyUpdateScrollbars)
823 return WebInputEventResult::HandledSuppressed; 835 return WebInputEventResult::HandledSuppressed;
824 } 836 }
825 837
826 WebInputEventResult eventResult = WebInputEventResult::NotHandled; 838 WebInputEventResult eventResult = WebInputEventResult::NotHandled;
827 LocalFrame* newSubframe = 839 LocalFrame* newSubframe =
828 m_capturingMouseEventsNode.get() 840 m_capturingMouseEventsNode.get()
829 ? subframeForTargetNode(m_capturingMouseEventsNode.get()) 841 ? subframeForTargetNode(m_capturingMouseEventsNode.get())
830 : subframeForHitTestResult(mev); 842 : subframeForHitTestResult(mev);
831 843
832 // We want mouseouts to happen first, from the inside out. First send a move event to the last subframe so that it will fire mouseouts. 844 // We want mouseouts to happen first, from the inside out. First send a move
845 // event to the last subframe so that it will fire mouseouts.
833 if (m_lastMouseMoveEventSubframe && 846 if (m_lastMouseMoveEventSubframe &&
834 m_lastMouseMoveEventSubframe->tree().isDescendantOf(m_frame) && 847 m_lastMouseMoveEventSubframe->tree().isDescendantOf(m_frame) &&
835 m_lastMouseMoveEventSubframe != newSubframe) 848 m_lastMouseMoveEventSubframe != newSubframe)
836 m_lastMouseMoveEventSubframe->eventHandler().handleMouseLeaveEvent( 849 m_lastMouseMoveEventSubframe->eventHandler().handleMouseLeaveEvent(
837 mev.event()); 850 mev.event());
838 851
839 if (newSubframe) { 852 if (newSubframe) {
840 // Update over/out state before passing the event to the subframe. 853 // Update over/out state before passing the event to the subframe.
841 m_pointerEventManager->sendMouseAndPointerBoundaryEvents( 854 m_pointerEventManager->sendMouseAndPointerBoundaryEvents(
842 updateMouseEventTargetNode(mev.innerNode()), mev.event()); 855 updateMouseEventTargetNode(mev.innerNode()), mev.event());
843 856
844 // Event dispatch in sendMouseAndPointerBoundaryEvents may have caused the s ubframe of the target 857 // Event dispatch in sendMouseAndPointerBoundaryEvents may have caused the
845 // node to be detached from its FrameView, in which case the event should no t be passed. 858 // subframe of the target node to be detached from its FrameView, in which
859 // case the event should not be passed.
846 if (newSubframe->view()) 860 if (newSubframe->view())
847 eventResult = passMouseMoveEventToSubframe(mev, newSubframe, hoveredNode); 861 eventResult = passMouseMoveEventToSubframe(mev, newSubframe, hoveredNode);
848 } else { 862 } else {
849 if (scrollbar && !m_mouseEventManager->mousePressed()) 863 if (scrollbar && !m_mouseEventManager->mousePressed()) {
850 scrollbar->mouseMoved( 864 // Handle hover effects on platforms that support visual feedback on
851 mev.event()); // Handle hover effects on platforms that support visua l feedback on scrollbar hovering. 865 // scrollbar hovering.
866 scrollbar->mouseMoved(mev.event());
867 }
852 if (FrameView* view = m_frame->view()) { 868 if (FrameView* view = m_frame->view()) {
853 OptionalCursor optionalCursor = selectCursor(mev.hitTestResult()); 869 OptionalCursor optionalCursor = selectCursor(mev.hitTestResult());
854 if (optionalCursor.isCursorChange()) { 870 if (optionalCursor.isCursorChange()) {
855 view->setCursor(optionalCursor.cursor()); 871 view->setCursor(optionalCursor.cursor());
856 } 872 }
857 } 873 }
858 } 874 }
859 875
860 m_lastMouseMoveEventSubframe = newSubframe; 876 m_lastMouseMoveEventSubframe = newSubframe;
861 877
(...skipping 150 matching lines...) Expand 10 before | Expand all | Expand 10 after
1012 DataTransfer* dataTransfer) { 1028 DataTransfer* dataTransfer) {
1013 WebInputEventResult eventResult = WebInputEventResult::NotHandled; 1029 WebInputEventResult eventResult = WebInputEventResult::NotHandled;
1014 1030
1015 if (!m_frame->view()) 1031 if (!m_frame->view())
1016 return eventResult; 1032 return eventResult;
1017 1033
1018 HitTestRequest request(HitTestRequest::ReadOnly); 1034 HitTestRequest request(HitTestRequest::ReadOnly);
1019 MouseEventWithHitTestResults mev = 1035 MouseEventWithHitTestResults mev =
1020 EventHandlingUtil::performMouseEventHitTest(m_frame, request, event); 1036 EventHandlingUtil::performMouseEventHitTest(m_frame, request, event);
1021 1037
1022 // Drag events should never go to text nodes (following IE, and proper mouseov er/out dispatch) 1038 // Drag events should never go to text nodes (following IE, and proper
1039 // mouseover/out dispatch)
1023 Node* newTarget = mev.innerNode(); 1040 Node* newTarget = mev.innerNode();
1024 if (newTarget && newTarget->isTextNode()) 1041 if (newTarget && newTarget->isTextNode())
1025 newTarget = FlatTreeTraversal::parent(*newTarget); 1042 newTarget = FlatTreeTraversal::parent(*newTarget);
1026 1043
1027 if (AutoscrollController* controller = 1044 if (AutoscrollController* controller =
1028 m_scrollManager->autoscrollController()) 1045 m_scrollManager->autoscrollController())
1029 controller->updateDragAndDrop(newTarget, event.position(), 1046 controller->updateDragAndDrop(newTarget, event.position(),
1030 event.timestamp()); 1047 event.timestamp());
1031 1048
1032 if (m_dragTarget != newTarget) { 1049 if (m_dragTarget != newTarget) {
1033 // FIXME: this ordering was explicitly chosen to match WinIE. However, 1050 // FIXME: this ordering was explicitly chosen to match WinIE. However,
1034 // it is sometimes incorrect when dragging within subframes, as seen with 1051 // it is sometimes incorrect when dragging within subframes, as seen with
1035 // LayoutTests/fast/events/drag-in-frames.html. 1052 // LayoutTests/fast/events/drag-in-frames.html.
1036 // 1053 //
1037 // Moreover, this ordering conforms to section 7.9.4 of the HTML 5 spec. <ht tp://dev.w3.org/html5/spec/Overview.html#drag-and-drop-processing-model>. 1054 // Moreover, this ordering conforms to section 7.9.4 of the HTML 5 spec.
1055 // <http://dev.w3.org/html5/spec/Overview.html#drag-and-drop-processing-mode l>.
1038 LocalFrame* targetFrame; 1056 LocalFrame* targetFrame;
1039 if (targetIsFrame(newTarget, targetFrame)) { 1057 if (targetIsFrame(newTarget, targetFrame)) {
1040 if (targetFrame) 1058 if (targetFrame)
1041 eventResult = 1059 eventResult =
1042 targetFrame->eventHandler().updateDragAndDrop(event, dataTransfer); 1060 targetFrame->eventHandler().updateDragAndDrop(event, dataTransfer);
1043 } else if (newTarget) { 1061 } else if (newTarget) {
1044 // As per section 7.9.4 of the HTML 5 spec., we must always fire a drag ev ent before firing a dragenter, dragleave, or dragover event. 1062 // As per section 7.9.4 of the HTML 5 spec., we must always fire a drag
1063 // event before firing a dragenter, dragleave, or dragover event.
1045 if (m_mouseEventManager->dragState().m_dragSrc) { 1064 if (m_mouseEventManager->dragState().m_dragSrc) {
1046 // for now we don't care if event handler cancels default behavior, sinc e there is none 1065 // For now we don't care if event handler cancels default behavior,
1066 // since there is none.
1047 m_mouseEventManager->dispatchDragSrcEvent(EventTypeNames::drag, event); 1067 m_mouseEventManager->dispatchDragSrcEvent(EventTypeNames::drag, event);
1048 } 1068 }
1049 eventResult = m_mouseEventManager->dispatchDragEvent( 1069 eventResult = m_mouseEventManager->dispatchDragEvent(
1050 EventTypeNames::dragenter, newTarget, event, dataTransfer); 1070 EventTypeNames::dragenter, newTarget, event, dataTransfer);
1051 if (eventResult == WebInputEventResult::NotHandled && 1071 if (eventResult == WebInputEventResult::NotHandled &&
1052 findDropZone(newTarget, dataTransfer)) 1072 findDropZone(newTarget, dataTransfer))
1053 eventResult = WebInputEventResult::HandledSystem; 1073 eventResult = WebInputEventResult::HandledSystem;
1054 } 1074 }
1055 1075
1056 if (targetIsFrame(m_dragTarget.get(), targetFrame)) { 1076 if (targetIsFrame(m_dragTarget.get(), targetFrame)) {
1057 if (targetFrame) 1077 if (targetFrame)
1058 eventResult = 1078 eventResult =
1059 targetFrame->eventHandler().updateDragAndDrop(event, dataTransfer); 1079 targetFrame->eventHandler().updateDragAndDrop(event, dataTransfer);
1060 } else if (m_dragTarget) { 1080 } else if (m_dragTarget) {
1061 m_mouseEventManager->dispatchDragEvent( 1081 m_mouseEventManager->dispatchDragEvent(
1062 EventTypeNames::dragleave, m_dragTarget.get(), event, dataTransfer); 1082 EventTypeNames::dragleave, m_dragTarget.get(), event, dataTransfer);
1063 } 1083 }
1064 1084
1065 if (newTarget) { 1085 if (newTarget) {
1066 // We do not explicitly call m_mouseEventManager->dispatchDragEvent here b ecause it could ultimately result in the appearance that 1086 // We do not explicitly call m_mouseEventManager->dispatchDragEvent here
1067 // two dragover events fired. So, we mark that we should only fire a drago ver event on the next call to this function. 1087 // because it could ultimately result in the appearance that two dragover
1088 // events fired. So, we mark that we should only fire a dragover event on
1089 // the next call to this function.
1068 m_shouldOnlyFireDragOverEvent = true; 1090 m_shouldOnlyFireDragOverEvent = true;
1069 } 1091 }
1070 } else { 1092 } else {
1071 LocalFrame* targetFrame; 1093 LocalFrame* targetFrame;
1072 if (targetIsFrame(newTarget, targetFrame)) { 1094 if (targetIsFrame(newTarget, targetFrame)) {
1073 if (targetFrame) 1095 if (targetFrame)
1074 eventResult = 1096 eventResult =
1075 targetFrame->eventHandler().updateDragAndDrop(event, dataTransfer); 1097 targetFrame->eventHandler().updateDragAndDrop(event, dataTransfer);
1076 } else if (newTarget) { 1098 } else if (newTarget) {
1077 // Note, when dealing with sub-frames, we may need to fire only a dragover event as a drag event may have been fired earlier. 1099 // Note, when dealing with sub-frames, we may need to fire only a dragover
1100 // event as a drag event may have been fired earlier.
1078 if (!m_shouldOnlyFireDragOverEvent && 1101 if (!m_shouldOnlyFireDragOverEvent &&
1079 m_mouseEventManager->dragState().m_dragSrc) { 1102 m_mouseEventManager->dragState().m_dragSrc) {
1080 // for now we don't care if event handler cancels default behavior, sinc e there is none 1103 // For now we don't care if event handler cancels default behavior,
1104 // since there is none.
1081 m_mouseEventManager->dispatchDragSrcEvent(EventTypeNames::drag, event); 1105 m_mouseEventManager->dispatchDragSrcEvent(EventTypeNames::drag, event);
1082 } 1106 }
1083 eventResult = m_mouseEventManager->dispatchDragEvent( 1107 eventResult = m_mouseEventManager->dispatchDragEvent(
1084 EventTypeNames::dragover, newTarget, event, dataTransfer); 1108 EventTypeNames::dragover, newTarget, event, dataTransfer);
1085 if (eventResult == WebInputEventResult::NotHandled && 1109 if (eventResult == WebInputEventResult::NotHandled &&
1086 findDropZone(newTarget, dataTransfer)) 1110 findDropZone(newTarget, dataTransfer))
1087 eventResult = WebInputEventResult::HandledSystem; 1111 eventResult = WebInputEventResult::HandledSystem;
1088 m_shouldOnlyFireDragOverEvent = false; 1112 m_shouldOnlyFireDragOverEvent = false;
1089 } 1113 }
1090 } 1114 }
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
1143 // If we're capturing, we always go right to that node. 1167 // If we're capturing, we always go right to that node.
1144 EventTarget* mousePointerCapturingNode = 1168 EventTarget* mousePointerCapturingNode =
1145 m_pointerEventManager->getMouseCapturingNode(); 1169 m_pointerEventManager->getMouseCapturingNode();
1146 if (mousePointerCapturingNode && 1170 if (mousePointerCapturingNode &&
1147 !RuntimeEnabledFeatures::pointerEventV1SpecCapturingEnabled()) { 1171 !RuntimeEnabledFeatures::pointerEventV1SpecCapturingEnabled()) {
1148 newNodeUnderMouse = mousePointerCapturingNode->toNode(); 1172 newNodeUnderMouse = mousePointerCapturingNode->toNode();
1149 DCHECK(newNodeUnderMouse); 1173 DCHECK(newNodeUnderMouse);
1150 } else if (m_capturingMouseEventsNode) { 1174 } else if (m_capturingMouseEventsNode) {
1151 newNodeUnderMouse = m_capturingMouseEventsNode.get(); 1175 newNodeUnderMouse = m_capturingMouseEventsNode.get();
1152 } else { 1176 } else {
1153 // If the target node is a text node, dispatch on the parent node - rdar://4 196646 1177 // If the target node is a text node, dispatch on the parent node -
1178 // rdar://4196646
1154 if (newNodeUnderMouse && newNodeUnderMouse->isTextNode()) 1179 if (newNodeUnderMouse && newNodeUnderMouse->isTextNode())
1155 newNodeUnderMouse = FlatTreeTraversal::parent(*newNodeUnderMouse); 1180 newNodeUnderMouse = FlatTreeTraversal::parent(*newNodeUnderMouse);
1156 } 1181 }
1157 return newNodeUnderMouse; 1182 return newNodeUnderMouse;
1158 } 1183 }
1159 1184
1160 bool EventHandler::isPointerEventActive(int pointerId) { 1185 bool EventHandler::isPointerEventActive(int pointerId) {
1161 return m_pointerEventManager->isActive(pointerId); 1186 return m_pointerEventManager->isActive(pointerId);
1162 } 1187 }
1163 1188
1164 void EventHandler::setPointerCapture(int pointerId, EventTarget* target) { 1189 void EventHandler::setPointerCapture(int pointerId, EventTarget* target) {
1165 // TODO(crbug.com/591387): This functionality should be per page not per frame . 1190 // TODO(crbug.com/591387): This functionality should be per page not per
1191 // frame.
1166 m_pointerEventManager->setPointerCapture(pointerId, target); 1192 m_pointerEventManager->setPointerCapture(pointerId, target);
1167 } 1193 }
1168 1194
1169 void EventHandler::releasePointerCapture(int pointerId, EventTarget* target) { 1195 void EventHandler::releasePointerCapture(int pointerId, EventTarget* target) {
1170 m_pointerEventManager->releasePointerCapture(pointerId, target); 1196 m_pointerEventManager->releasePointerCapture(pointerId, target);
1171 } 1197 }
1172 1198
1173 bool EventHandler::hasPointerCapture(int pointerId, 1199 bool EventHandler::hasPointerCapture(int pointerId,
1174 const EventTarget* target) const { 1200 const EventTarget* target) const {
1175 return m_pointerEventManager->hasPointerCapture(pointerId, target); 1201 return m_pointerEventManager->hasPointerCapture(pointerId, target);
(...skipping 19 matching lines...) Expand all
1195 const auto& eventResult = m_pointerEventManager->sendMousePointerEvent( 1221 const auto& eventResult = m_pointerEventManager->sendMousePointerEvent(
1196 updateMouseEventTargetNode(targetNode), mouseEventType, mouseEvent); 1222 updateMouseEventTargetNode(targetNode), mouseEventType, mouseEvent);
1197 return eventResult; 1223 return eventResult;
1198 } 1224 }
1199 1225
1200 WebInputEventResult EventHandler::handleWheelEvent( 1226 WebInputEventResult EventHandler::handleWheelEvent(
1201 const PlatformWheelEvent& event) { 1227 const PlatformWheelEvent& event) {
1202 #if OS(MACOSX) 1228 #if OS(MACOSX)
1203 // Filter Mac OS specific phases, usually with a zero-delta. 1229 // Filter Mac OS specific phases, usually with a zero-delta.
1204 // https://crbug.com/553732 1230 // https://crbug.com/553732
1205 // TODO(chongz): EventSender sends events with |PlatformWheelEventPhaseNone|, but it shouldn't. 1231 // TODO(chongz): EventSender sends events with |PlatformWheelEventPhaseNone|,
1232 // but it shouldn't.
1206 const int kPlatformWheelEventPhaseNoEventMask = 1233 const int kPlatformWheelEventPhaseNoEventMask =
1207 PlatformWheelEventPhaseEnded | PlatformWheelEventPhaseCancelled | 1234 PlatformWheelEventPhaseEnded | PlatformWheelEventPhaseCancelled |
1208 PlatformWheelEventPhaseMayBegin; 1235 PlatformWheelEventPhaseMayBegin;
1209 if ((event.phase() & kPlatformWheelEventPhaseNoEventMask) || 1236 if ((event.phase() & kPlatformWheelEventPhaseNoEventMask) ||
1210 (event.momentumPhase() & kPlatformWheelEventPhaseNoEventMask)) 1237 (event.momentumPhase() & kPlatformWheelEventPhaseNoEventMask))
1211 return WebInputEventResult::NotHandled; 1238 return WebInputEventResult::NotHandled;
1212 #endif 1239 #endif
1213 Document* doc = m_frame->document(); 1240 Document* doc = m_frame->document();
1214 1241
1215 if (doc->layoutViewItem().isNull()) 1242 if (doc->layoutViewItem().isNull())
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
1252 } 1279 }
1253 1280
1254 return WebInputEventResult::NotHandled; 1281 return WebInputEventResult::NotHandled;
1255 } 1282 }
1256 1283
1257 WebInputEventResult EventHandler::handleGestureEvent( 1284 WebInputEventResult EventHandler::handleGestureEvent(
1258 const PlatformGestureEvent& gestureEvent) { 1285 const PlatformGestureEvent& gestureEvent) {
1259 // Propagation to inner frames is handled below this function. 1286 // Propagation to inner frames is handled below this function.
1260 ASSERT(m_frame == m_frame->localFrameRoot()); 1287 ASSERT(m_frame == m_frame->localFrameRoot());
1261 1288
1262 // Scrolling-related gesture events invoke EventHandler recursively for each f rame down 1289 // Scrolling-related gesture events invoke EventHandler recursively for each
1263 // the chain, doing a single-frame hit-test per frame. This matches handleWhee lEvent. 1290 // frame down the chain, doing a single-frame hit-test per frame. This matches
1291 // handleWheelEvent.
1264 // FIXME: Add a test that traverses this path, e.g. for devtools overlay. 1292 // FIXME: Add a test that traverses this path, e.g. for devtools overlay.
1265 if (gestureEvent.isScrollEvent()) 1293 if (gestureEvent.isScrollEvent())
1266 return handleGestureScrollEvent(gestureEvent); 1294 return handleGestureScrollEvent(gestureEvent);
1267 1295
1268 // Hit test across all frames and do touch adjustment as necessary for the eve nt type. 1296 // Hit test across all frames and do touch adjustment as necessary for the
1297 // event type.
1269 GestureEventWithHitTestResults targetedEvent = 1298 GestureEventWithHitTestResults targetedEvent =
1270 targetGestureEvent(gestureEvent); 1299 targetGestureEvent(gestureEvent);
1271 1300
1272 return handleGestureEvent(targetedEvent); 1301 return handleGestureEvent(targetedEvent);
1273 } 1302 }
1274 1303
1275 WebInputEventResult EventHandler::handleGestureEvent( 1304 WebInputEventResult EventHandler::handleGestureEvent(
1276 const GestureEventWithHitTestResults& targetedEvent) { 1305 const GestureEventWithHitTestResults& targetedEvent) {
1277 TRACE_EVENT0("input", "EventHandler::handleGestureEvent"); 1306 TRACE_EVENT0("input", "EventHandler::handleGestureEvent");
1278 1307
1279 // Propagation to inner frames is handled below this function. 1308 // Propagation to inner frames is handled below this function.
1280 ASSERT(m_frame == m_frame->localFrameRoot()); 1309 ASSERT(m_frame == m_frame->localFrameRoot());
1281 1310
1282 // Non-scrolling related gesture events do a single cross-frame hit-test and j ump 1311 // Non-scrolling related gesture events do a single cross-frame hit-test and
1283 // directly to the inner most frame. This matches handleMousePressEvent etc. 1312 // jump directly to the inner most frame. This matches handleMousePressEvent
1313 // etc.
1284 ASSERT(!targetedEvent.event().isScrollEvent()); 1314 ASSERT(!targetedEvent.event().isScrollEvent());
1285 1315
1286 // update mouseout/leave/over/enter events before jumping directly to the inne r most frame 1316 // Update mouseout/leave/over/enter events before jumping directly to the
1317 // inner most frame.
1287 if (targetedEvent.event().type() == PlatformEvent::GestureTap) 1318 if (targetedEvent.event().type() == PlatformEvent::GestureTap)
1288 updateGestureTargetNodeForMouseEvent(targetedEvent); 1319 updateGestureTargetNodeForMouseEvent(targetedEvent);
1289 1320
1290 // Route to the correct frame. 1321 // Route to the correct frame.
1291 if (LocalFrame* innerFrame = targetedEvent.hitTestResult().innerNodeFrame()) 1322 if (LocalFrame* innerFrame = targetedEvent.hitTestResult().innerNodeFrame())
1292 return innerFrame->eventHandler().handleGestureEventInFrame(targetedEvent); 1323 return innerFrame->eventHandler().handleGestureEventInFrame(targetedEvent);
1293 1324
1294 // No hit test result, handle in root instance. Perhaps we should just return false instead? 1325 // No hit test result, handle in root instance. Perhaps we should just return
1326 // false instead?
1295 return m_gestureManager->handleGestureEventInFrame(targetedEvent); 1327 return m_gestureManager->handleGestureEventInFrame(targetedEvent);
1296 } 1328 }
1297 1329
1298 WebInputEventResult EventHandler::handleGestureEventInFrame( 1330 WebInputEventResult EventHandler::handleGestureEventInFrame(
1299 const GestureEventWithHitTestResults& targetedEvent) { 1331 const GestureEventWithHitTestResults& targetedEvent) {
1300 return m_gestureManager->handleGestureEventInFrame(targetedEvent); 1332 return m_gestureManager->handleGestureEventInFrame(targetedEvent);
1301 } 1333 }
1302 1334
1303 WebInputEventResult EventHandler::handleGestureScrollEvent( 1335 WebInputEventResult EventHandler::handleGestureScrollEvent(
1304 const PlatformGestureEvent& gestureEvent) { 1336 const PlatformGestureEvent& gestureEvent) {
(...skipping 24 matching lines...) Expand all
1329 1361
1330 bool EventHandler::bestClickableNodeForHitTestResult( 1362 bool EventHandler::bestClickableNodeForHitTestResult(
1331 const HitTestResult& result, 1363 const HitTestResult& result,
1332 IntPoint& targetPoint, 1364 IntPoint& targetPoint,
1333 Node*& targetNode) { 1365 Node*& targetNode) {
1334 // FIXME: Unify this with the other best* functions which are very similar. 1366 // FIXME: Unify this with the other best* functions which are very similar.
1335 1367
1336 TRACE_EVENT0("input", "EventHandler::bestClickableNodeForHitTestResult"); 1368 TRACE_EVENT0("input", "EventHandler::bestClickableNodeForHitTestResult");
1337 ASSERT(result.isRectBasedTest()); 1369 ASSERT(result.isRectBasedTest());
1338 1370
1339 // If the touch is over a scrollbar, don't adjust the touch point since touch adjustment only takes into account 1371 // If the touch is over a scrollbar, don't adjust the touch point since touch
1340 // DOM nodes so a touch over a scrollbar will be adjusted towards nearby nodes . This leads to things like textarea 1372 // adjustment only takes into account DOM nodes so a touch over a scrollbar
1373 // will be adjusted towards nearby nodes. This leads to things like textarea
1341 // scrollbars being untouchable. 1374 // scrollbars being untouchable.
1342 if (result.scrollbar()) { 1375 if (result.scrollbar()) {
1343 targetNode = 0; 1376 targetNode = 0;
1344 return false; 1377 return false;
1345 } 1378 }
1346 1379
1347 IntPoint touchCenter = 1380 IntPoint touchCenter =
1348 m_frame->view()->contentsToRootFrame(result.roundedPointInMainFrame()); 1381 m_frame->view()->contentsToRootFrame(result.roundedPointInMainFrame());
1349 IntRect touchRect = m_frame->view()->contentsToRootFrame( 1382 IntRect touchRect = m_frame->view()->contentsToRootFrame(
1350 result.hitTestLocation().boundingBox()); 1383 result.hitTestLocation().boundingBox());
1351 1384
1352 HeapVector<Member<Node>, 11> nodes; 1385 HeapVector<Member<Node>, 11> nodes;
1353 copyToVector(result.listBasedTestResult(), nodes); 1386 copyToVector(result.listBasedTestResult(), nodes);
1354 1387
1355 // FIXME: the explicit Vector conversion copies into a temporary and is wastef ul. 1388 // FIXME: the explicit Vector conversion copies into a temporary and is
1389 // wasteful.
1356 return findBestClickableCandidate(targetNode, targetPoint, touchCenter, 1390 return findBestClickableCandidate(targetNode, targetPoint, touchCenter,
1357 touchRect, HeapVector<Member<Node>>(nodes)); 1391 touchRect, HeapVector<Member<Node>>(nodes));
1358 } 1392 }
1359 1393
1360 bool EventHandler::bestContextMenuNodeForHitTestResult( 1394 bool EventHandler::bestContextMenuNodeForHitTestResult(
1361 const HitTestResult& result, 1395 const HitTestResult& result,
1362 IntPoint& targetPoint, 1396 IntPoint& targetPoint,
1363 Node*& targetNode) { 1397 Node*& targetNode) {
1364 ASSERT(result.isRectBasedTest()); 1398 ASSERT(result.isRectBasedTest());
1365 IntPoint touchCenter = 1399 IntPoint touchCenter =
1366 m_frame->view()->contentsToRootFrame(result.roundedPointInMainFrame()); 1400 m_frame->view()->contentsToRootFrame(result.roundedPointInMainFrame());
1367 IntRect touchRect = m_frame->view()->contentsToRootFrame( 1401 IntRect touchRect = m_frame->view()->contentsToRootFrame(
1368 result.hitTestLocation().boundingBox()); 1402 result.hitTestLocation().boundingBox());
1369 HeapVector<Member<Node>, 11> nodes; 1403 HeapVector<Member<Node>, 11> nodes;
1370 copyToVector(result.listBasedTestResult(), nodes); 1404 copyToVector(result.listBasedTestResult(), nodes);
1371 1405
1372 // FIXME: the explicit Vector conversion copies into a temporary and is wastef ul. 1406 // FIXME: the explicit Vector conversion copies into a temporary and is
1407 // wasteful.
1373 return findBestContextMenuCandidate(targetNode, targetPoint, touchCenter, 1408 return findBestContextMenuCandidate(targetNode, targetPoint, touchCenter,
1374 touchRect, 1409 touchRect,
1375 HeapVector<Member<Node>>(nodes)); 1410 HeapVector<Member<Node>>(nodes));
1376 } 1411 }
1377 1412
1378 bool EventHandler::bestZoomableAreaForTouchPoint(const IntPoint& touchCenter, 1413 bool EventHandler::bestZoomableAreaForTouchPoint(const IntPoint& touchCenter,
1379 const IntSize& touchRadius, 1414 const IntSize& touchRadius,
1380 IntRect& targetArea, 1415 IntRect& targetArea,
1381 Node*& targetNode) { 1416 Node*& targetNode) {
1382 if (touchRadius.isEmpty()) 1417 if (touchRadius.isEmpty())
1383 return false; 1418 return false;
1384 1419
1385 IntPoint hitTestPoint = m_frame->view()->rootFrameToContents(touchCenter); 1420 IntPoint hitTestPoint = m_frame->view()->rootFrameToContents(touchCenter);
1386 1421
1387 HitTestRequest::HitTestRequestType hitType = HitTestRequest::ReadOnly | 1422 HitTestRequest::HitTestRequestType hitType = HitTestRequest::ReadOnly |
1388 HitTestRequest::Active | 1423 HitTestRequest::Active |
1389 HitTestRequest::ListBased; 1424 HitTestRequest::ListBased;
1390 HitTestResult result = 1425 HitTestResult result =
1391 hitTestResultAtPoint(hitTestPoint, hitType, LayoutSize(touchRadius)); 1426 hitTestResultAtPoint(hitTestPoint, hitType, LayoutSize(touchRadius));
1392 1427
1393 IntRect touchRect(touchCenter - touchRadius, touchRadius + touchRadius); 1428 IntRect touchRect(touchCenter - touchRadius, touchRadius + touchRadius);
1394 HeapVector<Member<Node>, 11> nodes; 1429 HeapVector<Member<Node>, 11> nodes;
1395 copyToVector(result.listBasedTestResult(), nodes); 1430 copyToVector(result.listBasedTestResult(), nodes);
1396 1431
1397 // FIXME: the explicit Vector conversion copies into a temporary and is wastef ul. 1432 // FIXME: the explicit Vector conversion copies into a temporary and is
1433 // wasteful.
1398 return findBestZoomableArea(targetNode, targetArea, touchCenter, touchRect, 1434 return findBestZoomableArea(targetNode, targetArea, touchCenter, touchRect,
1399 HeapVector<Member<Node>>(nodes)); 1435 HeapVector<Member<Node>>(nodes));
1400 } 1436 }
1401 1437
1402 // Update the hover and active state across all frames for this gesture. 1438 // Update the hover and active state across all frames for this gesture.
1403 // This logic is different than the mouse case because mice send MouseLeave even ts to frames as they're exited. 1439 // This logic is different than the mouse case because mice send MouseLeave
1404 // With gestures, a single event conceptually both 'leaves' whatever frame curre ntly had hover and enters a new frame 1440 // events to frames as they're exited. With gestures, a single event
1441 // conceptually both 'leaves' whatever frame currently had hover and enters a
1442 // new frame
1405 void EventHandler::updateGestureHoverActiveState(const HitTestRequest& request, 1443 void EventHandler::updateGestureHoverActiveState(const HitTestRequest& request,
1406 Element* innerElement) { 1444 Element* innerElement) {
1407 ASSERT(m_frame == m_frame->localFrameRoot()); 1445 ASSERT(m_frame == m_frame->localFrameRoot());
1408 1446
1409 HeapVector<Member<LocalFrame>> newHoverFrameChain; 1447 HeapVector<Member<LocalFrame>> newHoverFrameChain;
1410 LocalFrame* newHoverFrameInDocument = 1448 LocalFrame* newHoverFrameInDocument =
1411 innerElement ? innerElement->document().frame() : nullptr; 1449 innerElement ? innerElement->document().frame() : nullptr;
1412 // Insert the ancestors of the frame having the new hovered node to the frame chain 1450 // Insert the ancestors of the frame having the new hovered node to the frame
1413 // The frame chain doesn't include the main frame to avoid the redundant work that cleans the hover state. 1451 // chain The frame chain doesn't include the main frame to avoid the redundant
1414 // Because the hover state for the main frame is updated by calling Document:: updateHoverActiveState 1452 // work that cleans the hover state. Because the hover state for the main
1453 // frame is updated by calling Document::updateHoverActiveState
1415 while (newHoverFrameInDocument && newHoverFrameInDocument != m_frame) { 1454 while (newHoverFrameInDocument && newHoverFrameInDocument != m_frame) {
1416 newHoverFrameChain.append(newHoverFrameInDocument); 1455 newHoverFrameChain.append(newHoverFrameInDocument);
1417 Frame* parentFrame = newHoverFrameInDocument->tree().parent(); 1456 Frame* parentFrame = newHoverFrameInDocument->tree().parent();
1418 newHoverFrameInDocument = parentFrame && parentFrame->isLocalFrame() 1457 newHoverFrameInDocument = parentFrame && parentFrame->isLocalFrame()
1419 ? toLocalFrame(parentFrame) 1458 ? toLocalFrame(parentFrame)
1420 : nullptr; 1459 : nullptr;
1421 } 1460 }
1422 1461
1423 Node* oldHoverNodeInCurDoc = m_frame->document()->hoverNode(); 1462 Node* oldHoverNodeInCurDoc = m_frame->document()->hoverNode();
1424 Node* newInnermostHoverNode = innerElement; 1463 Node* newInnermostHoverNode = innerElement;
1425 1464
1426 if (newInnermostHoverNode != oldHoverNodeInCurDoc) { 1465 if (newInnermostHoverNode != oldHoverNodeInCurDoc) {
1427 size_t indexFrameChain = newHoverFrameChain.size(); 1466 size_t indexFrameChain = newHoverFrameChain.size();
1428 1467
1429 // Clear the hover state on any frames which are no longer in the frame chai n of the hovered elemen 1468 // Clear the hover state on any frames which are no longer in the frame
1469 // chain of the hovered element.
1430 while (oldHoverNodeInCurDoc && 1470 while (oldHoverNodeInCurDoc &&
1431 oldHoverNodeInCurDoc->isFrameOwnerElement()) { 1471 oldHoverNodeInCurDoc->isFrameOwnerElement()) {
1432 LocalFrame* newHoverFrame = nullptr; 1472 LocalFrame* newHoverFrame = nullptr;
1433 // If we can't get the frame from the new hover frame chain, 1473 // If we can't get the frame from the new hover frame chain,
1434 // the newHoverFrame will be null and the old hover state will be cleared. 1474 // the newHoverFrame will be null and the old hover state will be cleared.
1435 if (indexFrameChain > 0) 1475 if (indexFrameChain > 0)
1436 newHoverFrame = newHoverFrameChain[--indexFrameChain]; 1476 newHoverFrame = newHoverFrameChain[--indexFrameChain];
1437 1477
1438 HTMLFrameOwnerElement* owner = 1478 HTMLFrameOwnerElement* owner =
1439 toHTMLFrameOwnerElement(oldHoverNodeInCurDoc); 1479 toHTMLFrameOwnerElement(oldHoverNodeInCurDoc);
1440 if (!owner->contentFrame() || !owner->contentFrame()->isLocalFrame()) 1480 if (!owner->contentFrame() || !owner->contentFrame()->isLocalFrame())
1441 break; 1481 break;
1442 1482
1443 LocalFrame* oldHoverFrame = toLocalFrame(owner->contentFrame()); 1483 LocalFrame* oldHoverFrame = toLocalFrame(owner->contentFrame());
1444 Document* doc = oldHoverFrame->document(); 1484 Document* doc = oldHoverFrame->document();
1445 if (!doc) 1485 if (!doc)
1446 break; 1486 break;
1447 1487
1448 oldHoverNodeInCurDoc = doc->hoverNode(); 1488 oldHoverNodeInCurDoc = doc->hoverNode();
1449 // If the old hovered frame is different from the new hovered frame. 1489 // If the old hovered frame is different from the new hovered frame.
1450 // we should clear the old hovered node from the old hovered frame. 1490 // we should clear the old hovered node from the old hovered frame.
1451 if (newHoverFrame != oldHoverFrame) 1491 if (newHoverFrame != oldHoverFrame)
1452 doc->updateHoverActiveState(request, nullptr); 1492 doc->updateHoverActiveState(request, nullptr);
1453 } 1493 }
1454 } 1494 }
1455 1495
1456 // Recursively set the new active/hover states on every frame in the chain of innerElement. 1496 // Recursively set the new active/hover states on every frame in the chain of
1497 // innerElement.
1457 m_frame->document()->updateHoverActiveState(request, innerElement); 1498 m_frame->document()->updateHoverActiveState(request, innerElement);
1458 } 1499 }
1459 1500
1460 // Update the mouseover/mouseenter/mouseout/mouseleave events across all frames for this gesture, 1501 // Update the mouseover/mouseenter/mouseout/mouseleave events across all frames
1461 // before passing the targeted gesture event directly to a hit frame. 1502 // for this gesture, before passing the targeted gesture event directly to a hit
1503 // frame.
1462 void EventHandler::updateGestureTargetNodeForMouseEvent( 1504 void EventHandler::updateGestureTargetNodeForMouseEvent(
1463 const GestureEventWithHitTestResults& targetedEvent) { 1505 const GestureEventWithHitTestResults& targetedEvent) {
1464 ASSERT(m_frame == m_frame->localFrameRoot()); 1506 ASSERT(m_frame == m_frame->localFrameRoot());
1465 1507
1466 // Behaviour of this function is as follows: 1508 // Behaviour of this function is as follows:
1467 // - Create the chain of all entered frames. 1509 // - Create the chain of all entered frames.
1468 // - Compare the last frame chain under the gesture to newly entered frame cha in from the main frame one by one. 1510 // - Compare the last frame chain under the gesture to newly entered frame
1469 // - If the last frame doesn't match with the entered frame, then create the c hain of exited frames from the last frame chain. 1511 // chain from the main frame one by one.
1470 // - Dispatch mouseout/mouseleave events of the exited frames from the inside out. 1512 // - If the last frame doesn't match with the entered frame, then create the
1471 // - Dispatch mouseover/mouseenter events of the entered frames into the insid e. 1513 // chain of exited frames from the last frame chain.
1514 // - Dispatch mouseout/mouseleave events of the exited frames from the inside
1515 // out.
1516 // - Dispatch mouseover/mouseenter events of the entered frames into the
1517 // inside.
1472 1518
1473 // Insert the ancestors of the frame having the new target node to the entered frame chain 1519 // Insert the ancestors of the frame having the new target node to the entered
1520 // frame chain.
1474 HeapVector<Member<LocalFrame>> enteredFrameChain; 1521 HeapVector<Member<LocalFrame>> enteredFrameChain;
1475 LocalFrame* enteredFrameInDocument = 1522 LocalFrame* enteredFrameInDocument =
1476 targetedEvent.hitTestResult().innerNodeFrame(); 1523 targetedEvent.hitTestResult().innerNodeFrame();
1477 while (enteredFrameInDocument) { 1524 while (enteredFrameInDocument) {
1478 enteredFrameChain.append(enteredFrameInDocument); 1525 enteredFrameChain.append(enteredFrameInDocument);
1479 Frame* parentFrame = enteredFrameInDocument->tree().parent(); 1526 Frame* parentFrame = enteredFrameInDocument->tree().parent();
1480 enteredFrameInDocument = parentFrame && parentFrame->isLocalFrame() 1527 enteredFrameInDocument = parentFrame && parentFrame->isLocalFrame()
1481 ? toLocalFrame(parentFrame) 1528 ? toLocalFrame(parentFrame)
1482 : nullptr; 1529 : nullptr;
1483 } 1530 }
1484 1531
1485 size_t indexEnteredFrameChain = enteredFrameChain.size(); 1532 size_t indexEnteredFrameChain = enteredFrameChain.size();
1486 LocalFrame* exitedFrameInDocument = m_frame; 1533 LocalFrame* exitedFrameInDocument = m_frame;
1487 HeapVector<Member<LocalFrame>> exitedFrameChain; 1534 HeapVector<Member<LocalFrame>> exitedFrameChain;
1488 // Insert the frame from the disagreement between last frames and entered fram es 1535 // Insert the frame from the disagreement between last frames and entered
1536 // frames.
1489 while (exitedFrameInDocument) { 1537 while (exitedFrameInDocument) {
1490 Node* lastNodeUnderTap = exitedFrameInDocument->eventHandler() 1538 Node* lastNodeUnderTap = exitedFrameInDocument->eventHandler()
1491 .m_mouseEventManager->getNodeUnderMouse(); 1539 .m_mouseEventManager->getNodeUnderMouse();
1492 if (!lastNodeUnderTap) 1540 if (!lastNodeUnderTap)
1493 break; 1541 break;
1494 1542
1495 LocalFrame* nextExitedFrameInDocument = nullptr; 1543 LocalFrame* nextExitedFrameInDocument = nullptr;
1496 if (lastNodeUnderTap->isFrameOwnerElement()) { 1544 if (lastNodeUnderTap->isFrameOwnerElement()) {
1497 HTMLFrameOwnerElement* owner = toHTMLFrameOwnerElement(lastNodeUnderTap); 1545 HTMLFrameOwnerElement* owner = toHTMLFrameOwnerElement(lastNodeUnderTap);
1498 if (owner->contentFrame() && owner->contentFrame()->isLocalFrame()) 1546 if (owner->contentFrame() && owner->contentFrame()->isLocalFrame())
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after
1586 m_activeIntervalTimer.startOneShot(minimumActiveInterval - activeInterval, 1634 m_activeIntervalTimer.startOneShot(minimumActiveInterval - activeInterval,
1587 BLINK_FROM_HERE); 1635 BLINK_FROM_HERE);
1588 } 1636 }
1589 1637
1590 return eventWithHitTestResults; 1638 return eventWithHitTestResults;
1591 } 1639 }
1592 1640
1593 GestureEventWithHitTestResults EventHandler::hitTestResultForGestureEvent( 1641 GestureEventWithHitTestResults EventHandler::hitTestResultForGestureEvent(
1594 const PlatformGestureEvent& gestureEvent, 1642 const PlatformGestureEvent& gestureEvent,
1595 HitTestRequest::HitTestRequestType hitType) { 1643 HitTestRequest::HitTestRequestType hitType) {
1596 // Perform the rect-based hit-test (or point-based if adjustment is disabled). Note that 1644 // Perform the rect-based hit-test (or point-based if adjustment is disabled).
1597 // we don't yet apply hover/active state here because we need to resolve touch adjustment 1645 // Note that we don't yet apply hover/active state here because we need to
1598 // first so that we apply hover/active it to the final adjusted node. 1646 // resolve touch adjustment first so that we apply hover/active it to the
1647 // final adjusted node.
1599 IntPoint hitTestPoint = 1648 IntPoint hitTestPoint =
1600 m_frame->view()->rootFrameToContents(gestureEvent.position()); 1649 m_frame->view()->rootFrameToContents(gestureEvent.position());
1601 LayoutSize padding; 1650 LayoutSize padding;
1602 if (shouldApplyTouchAdjustment(gestureEvent)) { 1651 if (shouldApplyTouchAdjustment(gestureEvent)) {
1603 padding = LayoutSize(gestureEvent.area()); 1652 padding = LayoutSize(gestureEvent.area());
1604 if (!padding.isEmpty()) { 1653 if (!padding.isEmpty()) {
1605 padding.scale(1.f / 2); 1654 padding.scale(1.f / 2);
1606 hitType |= HitTestRequest::ListBased; 1655 hitType |= HitTestRequest::ListBased;
1607 } 1656 }
1608 } 1657 }
1609 HitTestResult hitTestResult = hitTestResultAtPoint( 1658 HitTestResult hitTestResult = hitTestResultAtPoint(
1610 hitTestPoint, hitType | HitTestRequest::ReadOnly, padding); 1659 hitTestPoint, hitType | HitTestRequest::ReadOnly, padding);
1611 1660
1612 // Adjust the location of the gesture to the most likely nearby node, as appro priate for the 1661 // Adjust the location of the gesture to the most likely nearby node, as
1613 // type of event. 1662 // appropriate for the type of event.
1614 PlatformGestureEvent adjustedEvent = gestureEvent; 1663 PlatformGestureEvent adjustedEvent = gestureEvent;
1615 applyTouchAdjustment(&adjustedEvent, &hitTestResult); 1664 applyTouchAdjustment(&adjustedEvent, &hitTestResult);
1616 1665
1617 // Do a new hit-test at the (adjusted) gesture co-ordinates. This is necessary because 1666 // Do a new hit-test at the (adjusted) gesture co-ordinates. This is necessary
1618 // rect-based hit testing and touch adjustment sometimes return a different no de than 1667 // because rect-based hit testing and touch adjustment sometimes return a
1619 // what a point-based hit test would return for the same point. 1668 // different node than what a point-based hit test would return for the same
1620 // FIXME: Fix touch adjustment to avoid the need for a redundant hit test. htt p://crbug.com/398914 1669 // point.
1670 // FIXME: Fix touch adjustment to avoid the need for a redundant hit test.
1671 // http://crbug.com/398914
1621 if (shouldApplyTouchAdjustment(gestureEvent)) { 1672 if (shouldApplyTouchAdjustment(gestureEvent)) {
1622 LocalFrame* hitFrame = hitTestResult.innerNodeFrame(); 1673 LocalFrame* hitFrame = hitTestResult.innerNodeFrame();
1623 if (!hitFrame) 1674 if (!hitFrame)
1624 hitFrame = m_frame; 1675 hitFrame = m_frame;
1625 hitTestResult = EventHandlingUtil::hitTestResultInFrame( 1676 hitTestResult = EventHandlingUtil::hitTestResultInFrame(
1626 hitFrame, 1677 hitFrame,
1627 hitFrame->view()->rootFrameToContents(adjustedEvent.position()), 1678 hitFrame->view()->rootFrameToContents(adjustedEvent.position()),
1628 (hitType | HitTestRequest::ReadOnly) & ~HitTestRequest::ListBased); 1679 (hitType | HitTestRequest::ReadOnly) & ~HitTestRequest::ListBased);
1629 } 1680 }
1630 1681
1631 // If we did a rect-based hit test it must be resolved to the best single node by now to 1682 // If we did a rect-based hit test it must be resolved to the best single node
1632 // ensure consumers don't accidentally use one of the other candidates. 1683 // by now to ensure consumers don't accidentally use one of the other
1684 // candidates.
1633 ASSERT(!hitTestResult.isRectBasedTest()); 1685 ASSERT(!hitTestResult.isRectBasedTest());
1634 1686
1635 return GestureEventWithHitTestResults(adjustedEvent, hitTestResult); 1687 return GestureEventWithHitTestResults(adjustedEvent, hitTestResult);
1636 } 1688 }
1637 1689
1638 void EventHandler::applyTouchAdjustment(PlatformGestureEvent* gestureEvent, 1690 void EventHandler::applyTouchAdjustment(PlatformGestureEvent* gestureEvent,
1639 HitTestResult* hitTestResult) { 1691 HitTestResult* hitTestResult) {
1640 if (!shouldApplyTouchAdjustment(*gestureEvent)) 1692 if (!shouldApplyTouchAdjustment(*gestureEvent))
1641 return; 1693 return;
1642 1694
(...skipping 11 matching lines...) Expand all
1654 case PlatformEvent::GestureLongPress: 1706 case PlatformEvent::GestureLongPress:
1655 case PlatformEvent::GestureLongTap: 1707 case PlatformEvent::GestureLongTap:
1656 case PlatformEvent::GestureTwoFingerTap: 1708 case PlatformEvent::GestureTwoFingerTap:
1657 adjusted = bestContextMenuNodeForHitTestResult( 1709 adjusted = bestContextMenuNodeForHitTestResult(
1658 *hitTestResult, adjustedPoint, adjustedNode); 1710 *hitTestResult, adjustedPoint, adjustedNode);
1659 break; 1711 break;
1660 default: 1712 default:
1661 ASSERT_NOT_REACHED(); 1713 ASSERT_NOT_REACHED();
1662 } 1714 }
1663 1715
1664 // Update the hit-test result to be a point-based result instead of a rect-bas ed result. 1716 // Update the hit-test result to be a point-based result instead of a
1665 // FIXME: We should do this even when no candidate matches the node filter. cr bug.com/398914 1717 // rect-based result.
1718 // FIXME: We should do this even when no candidate matches the node filter.
1719 // crbug.com/398914
1666 if (adjusted) { 1720 if (adjusted) {
1667 hitTestResult->resolveRectBasedTest( 1721 hitTestResult->resolveRectBasedTest(
1668 adjustedNode, m_frame->view()->rootFrameToContents(adjustedPoint)); 1722 adjustedNode, m_frame->view()->rootFrameToContents(adjustedPoint));
1669 gestureEvent->applyTouchAdjustment(adjustedPoint); 1723 gestureEvent->applyTouchAdjustment(adjustedPoint);
1670 } 1724 }
1671 } 1725 }
1672 1726
1673 WebInputEventResult EventHandler::sendContextMenuEvent( 1727 WebInputEventResult EventHandler::sendContextMenuEvent(
1674 const PlatformMouseEvent& event, 1728 const PlatformMouseEvent& event,
1675 Node* overrideTargetNode) { 1729 Node* overrideTargetNode) {
1676 FrameView* v = m_frame->view(); 1730 FrameView* v = m_frame->view();
1677 if (!v) 1731 if (!v)
1678 return WebInputEventResult::NotHandled; 1732 return WebInputEventResult::NotHandled;
1679 1733
1680 // Clear mouse press state to avoid initiating a drag while context menu is up . 1734 // Clear mouse press state to avoid initiating a drag while context menu is
1735 // up.
1681 m_mouseEventManager->setMousePressed(false); 1736 m_mouseEventManager->setMousePressed(false);
1682 LayoutPoint positionInContents = v->rootFrameToContents(event.position()); 1737 LayoutPoint positionInContents = v->rootFrameToContents(event.position());
1683 HitTestRequest request(HitTestRequest::Active); 1738 HitTestRequest request(HitTestRequest::Active);
1684 MouseEventWithHitTestResults mev = 1739 MouseEventWithHitTestResults mev =
1685 m_frame->document()->performMouseEventHitTest(request, positionInContents, 1740 m_frame->document()->performMouseEventHitTest(request, positionInContents,
1686 event); 1741 event);
1687 // Since |Document::performMouseEventHitTest()| modifies layout tree for setti ng 1742 // Since |Document::performMouseEventHitTest()| modifies layout tree for
1688 // hover element, we need to update layout tree for requirement of 1743 // setting hover element, we need to update layout tree for requirement of
1689 // |SelectionController::sendContextMenuEvent()|. 1744 // |SelectionController::sendContextMenuEvent()|.
1690 m_frame->document()->updateStyleAndLayoutIgnorePendingStylesheets(); 1745 m_frame->document()->updateStyleAndLayoutIgnorePendingStylesheets();
1691 1746
1692 selectionController().sendContextMenuEvent(mev, positionInContents); 1747 selectionController().sendContextMenuEvent(mev, positionInContents);
1693 1748
1694 Node* targetNode = overrideTargetNode ? overrideTargetNode : mev.innerNode(); 1749 Node* targetNode = overrideTargetNode ? overrideTargetNode : mev.innerNode();
1695 return m_mouseEventManager->dispatchMouseEvent( 1750 return m_mouseEventManager->dispatchMouseEvent(
1696 updateMouseEventTargetNode(targetNode), EventTypeNames::contextmenu, 1751 updateMouseEventTargetNode(targetNode), EventTypeNames::contextmenu,
1697 event, 0); 1752 event, 0);
1698 } 1753 }
(...skipping 26 matching lines...) Expand all
1725 if (!overrideTargetElement && start.anchorNode() && 1780 if (!overrideTargetElement && start.anchorNode() &&
1726 (selection.rootEditableElement() || selection.isRange())) { 1781 (selection.rootEditableElement() || selection.isRange())) {
1727 // TODO(xiaochengh): The use of updateStyleAndLayoutIgnorePendingStylesheets 1782 // TODO(xiaochengh): The use of updateStyleAndLayoutIgnorePendingStylesheets
1728 // needs to be audited. See http://crbug.com/590369 for more details. 1783 // needs to be audited. See http://crbug.com/590369 for more details.
1729 doc->updateStyleAndLayoutIgnorePendingStylesheets(); 1784 doc->updateStyleAndLayoutIgnorePendingStylesheets();
1730 1785
1731 IntRect firstRect = m_frame->editor().firstRectForRange( 1786 IntRect firstRect = m_frame->editor().firstRectForRange(
1732 selection.selection().toNormalizedEphemeralRange()); 1787 selection.selection().toNormalizedEphemeralRange());
1733 1788
1734 int x = rightAligned ? firstRect.maxX() : firstRect.x(); 1789 int x = rightAligned ? firstRect.maxX() : firstRect.x();
1735 // In a multiline edit, firstRect.maxY() would endup on the next line, so -1 . 1790 // In a multiline edit, firstRect.maxY() would end up on the next line, so
1791 // -1.
1736 int y = firstRect.maxY() ? firstRect.maxY() - 1 : 0; 1792 int y = firstRect.maxY() ? firstRect.maxY() - 1 : 0;
1737 locationInRootFrame = view->contentsToRootFrame(IntPoint(x, y)); 1793 locationInRootFrame = view->contentsToRootFrame(IntPoint(x, y));
1738 } else if (focusedElement) { 1794 } else if (focusedElement) {
1739 IntRect clippedRect = focusedElement->boundsInViewport(); 1795 IntRect clippedRect = focusedElement->boundsInViewport();
1740 locationInRootFrame = 1796 locationInRootFrame =
1741 visualViewport.viewportToRootFrame(clippedRect.center()); 1797 visualViewport.viewportToRootFrame(clippedRect.center());
1742 } else { 1798 } else {
1743 locationInRootFrame = IntPoint( 1799 locationInRootFrame = IntPoint(
1744 rightAligned ? visualViewport.visibleRect().maxX() - kContextMenuMargin 1800 rightAligned ? visualViewport.visibleRect().maxX() - kContextMenuMargin
1745 : visualViewport.location().x() + kContextMenuMargin, 1801 : visualViewport.location().x() + kContextMenuMargin,
(...skipping 13 matching lines...) Expand all
1759 overrideTargetElement ? overrideTargetElement : doc->focusedElement(); 1815 overrideTargetElement ? overrideTargetElement : doc->focusedElement();
1760 if (!targetNode) 1816 if (!targetNode)
1761 targetNode = doc; 1817 targetNode = doc;
1762 1818
1763 // Use the focused node as the target for hover and active. 1819 // Use the focused node as the target for hover and active.
1764 HitTestRequest request(HitTestRequest::Active); 1820 HitTestRequest request(HitTestRequest::Active);
1765 HitTestResult result(request, locationInRootFrame); 1821 HitTestResult result(request, locationInRootFrame);
1766 result.setInnerNode(targetNode); 1822 result.setInnerNode(targetNode);
1767 doc->updateHoverActiveState(request, result.innerElement()); 1823 doc->updateHoverActiveState(request, result.innerElement());
1768 1824
1769 // The contextmenu event is a mouse event even when invoked using the keyboard . 1825 // The contextmenu event is a mouse event even when invoked using the
1770 // This is required for web compatibility. 1826 // keyboard. This is required for web compatibility.
1771 PlatformEvent::EventType eventType = PlatformEvent::MousePressed; 1827 PlatformEvent::EventType eventType = PlatformEvent::MousePressed;
1772 if (m_frame->settings() && m_frame->settings()->showContextMenuOnMouseUp()) 1828 if (m_frame->settings() && m_frame->settings()->showContextMenuOnMouseUp())
1773 eventType = PlatformEvent::MouseReleased; 1829 eventType = PlatformEvent::MouseReleased;
1774 1830
1775 PlatformMouseEvent mouseEvent( 1831 PlatformMouseEvent mouseEvent(
1776 locationInRootFrame, globalPosition, 1832 locationInRootFrame, globalPosition,
1777 WebPointerProperties::Button::NoButton, eventType, /* clickCount */ 0, 1833 WebPointerProperties::Button::NoButton, eventType, /* clickCount */ 0,
1778 PlatformEvent::NoModifiers, PlatformMouseEvent::RealOrIndistinguishable, 1834 PlatformEvent::NoModifiers, PlatformMouseEvent::RealOrIndistinguishable,
1779 WTF::monotonicallyIncreasingTime(), 1835 WTF::monotonicallyIncreasingTime(),
1780 WebPointerProperties::PointerType::Mouse); 1836 WebPointerProperties::PointerType::Mouse);
1781 1837
1782 return sendContextMenuEvent(mouseEvent, overrideTargetElement); 1838 return sendContextMenuEvent(mouseEvent, overrideTargetElement);
1783 } 1839 }
1784 1840
1785 void EventHandler::scheduleHoverStateUpdate() { 1841 void EventHandler::scheduleHoverStateUpdate() {
1786 if (!m_hoverTimer.isActive()) 1842 if (!m_hoverTimer.isActive())
1787 m_hoverTimer.startOneShot(0, BLINK_FROM_HERE); 1843 m_hoverTimer.startOneShot(0, BLINK_FROM_HERE);
1788 } 1844 }
1789 1845
1790 void EventHandler::scheduleCursorUpdate() { 1846 void EventHandler::scheduleCursorUpdate() {
1791 // We only want one timer for the page, rather than each frame having it's own timer 1847 // We only want one timer for the page, rather than each frame having it's own
1792 // competing which eachother (since there's only one mouse cursor). 1848 // timer competing which eachother (since there's only one mouse cursor).
1793 ASSERT(m_frame == m_frame->localFrameRoot()); 1849 ASSERT(m_frame == m_frame->localFrameRoot());
1794 1850
1795 if (!m_cursorUpdateTimer.isActive()) 1851 if (!m_cursorUpdateTimer.isActive())
1796 m_cursorUpdateTimer.startOneShot(cursorUpdateInterval, BLINK_FROM_HERE); 1852 m_cursorUpdateTimer.startOneShot(cursorUpdateInterval, BLINK_FROM_HERE);
1797 } 1853 }
1798 1854
1799 bool EventHandler::cursorUpdatePending() { 1855 bool EventHandler::cursorUpdatePending() {
1800 return m_cursorUpdateTimer.isActive(); 1856 return m_cursorUpdateTimer.isActive();
1801 } 1857 }
1802 1858
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
1845 // m_lastDeferredTapElement.get() == m_frame->document()->activeElement() 1901 // m_lastDeferredTapElement.get() == m_frame->document()->activeElement()
1846 HitTestRequest request(HitTestRequest::TouchEvent | 1902 HitTestRequest request(HitTestRequest::TouchEvent |
1847 HitTestRequest::Release); 1903 HitTestRequest::Release);
1848 m_frame->document()->updateHoverActiveState(request, 1904 m_frame->document()->updateHoverActiveState(request,
1849 m_lastDeferredTapElement.get()); 1905 m_lastDeferredTapElement.get());
1850 } 1906 }
1851 m_lastDeferredTapElement = nullptr; 1907 m_lastDeferredTapElement = nullptr;
1852 } 1908 }
1853 1909
1854 void EventHandler::notifyElementActivated() { 1910 void EventHandler::notifyElementActivated() {
1855 // Since another element has been set to active, stop current timer and clear reference. 1911 // Since another element has been set to active, stop current timer and clear
1912 // reference.
1856 if (m_activeIntervalTimer.isActive()) 1913 if (m_activeIntervalTimer.isActive())
1857 m_activeIntervalTimer.stop(); 1914 m_activeIntervalTimer.stop();
1858 m_lastDeferredTapElement = nullptr; 1915 m_lastDeferredTapElement = nullptr;
1859 } 1916 }
1860 1917
1861 bool EventHandler::handleAccessKey(const WebKeyboardEvent& evt) { 1918 bool EventHandler::handleAccessKey(const WebKeyboardEvent& evt) {
1862 return m_keyboardEventManager->handleAccessKey(evt); 1919 return m_keyboardEventManager->handleAccessKey(evt);
1863 } 1920 }
1864 1921
1865 WebInputEventResult EventHandler::keyEvent( 1922 WebInputEventResult EventHandler::keyEvent(
1866 const WebKeyboardEvent& initialKeyEvent) { 1923 const WebKeyboardEvent& initialKeyEvent) {
1867 return m_keyboardEventManager->keyEvent(initialKeyEvent); 1924 return m_keyboardEventManager->keyEvent(initialKeyEvent);
1868 } 1925 }
1869 1926
1870 void EventHandler::defaultKeyboardEventHandler(KeyboardEvent* event) { 1927 void EventHandler::defaultKeyboardEventHandler(KeyboardEvent* event) {
1871 m_keyboardEventManager->defaultKeyboardEventHandler( 1928 m_keyboardEventManager->defaultKeyboardEventHandler(
1872 event, m_mouseEventManager->mousePressNode()); 1929 event, m_mouseEventManager->mousePressNode());
1873 } 1930 }
1874 1931
1875 void EventHandler::dragSourceEndedAt(const PlatformMouseEvent& event, 1932 void EventHandler::dragSourceEndedAt(const PlatformMouseEvent& event,
1876 DragOperation operation) { 1933 DragOperation operation) {
1877 m_mouseEventManager->dragSourceEndedAt(event, operation); 1934 m_mouseEventManager->dragSourceEndedAt(event, operation);
1878 } 1935 }
1879 1936
1880 void EventHandler::updateDragStateAfterEditDragIfNeeded( 1937 void EventHandler::updateDragStateAfterEditDragIfNeeded(
1881 Element* rootEditableElement) { 1938 Element* rootEditableElement) {
1882 // If inserting the dragged contents removed the drag source, we still want to fire dragend at the root editble element. 1939 // If inserting the dragged contents removed the drag source, we still want to
1940 // fire dragend at the root editble element.
1883 if (m_mouseEventManager->dragState().m_dragSrc && 1941 if (m_mouseEventManager->dragState().m_dragSrc &&
1884 !m_mouseEventManager->dragState().m_dragSrc->isConnected()) 1942 !m_mouseEventManager->dragState().m_dragSrc->isConnected())
1885 m_mouseEventManager->dragState().m_dragSrc = rootEditableElement; 1943 m_mouseEventManager->dragState().m_dragSrc = rootEditableElement;
1886 } 1944 }
1887 1945
1888 bool EventHandler::handleTextInputEvent(const String& text, 1946 bool EventHandler::handleTextInputEvent(const String& text,
1889 Event* underlyingEvent, 1947 Event* underlyingEvent,
1890 TextEventInputType inputType) { 1948 TextEventInputType inputType) {
1891 // Platforms should differentiate real commands like selectAll from text input in disguise (like insertNewline), 1949 // Platforms should differentiate real commands like selectAll from text input
1892 // and avoid dispatching text input events from keydown default handlers. 1950 // in disguise (like insertNewline), and avoid dispatching text input events
1951 // from keydown default handlers.
1893 ASSERT(!underlyingEvent || !underlyingEvent->isKeyboardEvent() || 1952 ASSERT(!underlyingEvent || !underlyingEvent->isKeyboardEvent() ||
1894 toKeyboardEvent(underlyingEvent)->type() == EventTypeNames::keypress); 1953 toKeyboardEvent(underlyingEvent)->type() == EventTypeNames::keypress);
1895 1954
1896 if (!m_frame) 1955 if (!m_frame)
1897 return false; 1956 return false;
1898 1957
1899 EventTarget* target; 1958 EventTarget* target;
1900 if (underlyingEvent) 1959 if (underlyingEvent)
1901 target = underlyingEvent->target(); 1960 target = underlyingEvent->target();
1902 else 1961 else
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after
1983 WebInputEventResult EventHandler::passMouseReleaseEventToSubframe( 2042 WebInputEventResult EventHandler::passMouseReleaseEventToSubframe(
1984 MouseEventWithHitTestResults& mev, 2043 MouseEventWithHitTestResults& mev,
1985 LocalFrame* subframe) { 2044 LocalFrame* subframe) {
1986 WebInputEventResult result = 2045 WebInputEventResult result =
1987 subframe->eventHandler().handleMouseReleaseEvent(mev.event()); 2046 subframe->eventHandler().handleMouseReleaseEvent(mev.event());
1988 if (result != WebInputEventResult::NotHandled) 2047 if (result != WebInputEventResult::NotHandled)
1989 return result; 2048 return result;
1990 return WebInputEventResult::HandledSystem; 2049 return WebInputEventResult::HandledSystem;
1991 } 2050 }
1992 2051
1993
1994 FrameHost* EventHandler::frameHost() const { 2052 FrameHost* EventHandler::frameHost() const {
1995 if (!m_frame->page()) 2053 if (!m_frame->page())
1996 return nullptr; 2054 return nullptr;
1997 2055
1998 return &m_frame->page()->frameHost(); 2056 return &m_frame->page()->frameHost();
1999 } 2057 }
2000 2058
2001 } // namespace blink 2059 } // namespace blink
OLDNEW
« no previous file with comments | « third_party/WebKit/Source/core/input/EventHandler.h ('k') | third_party/WebKit/Source/core/input/GestureManager.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698