Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 /* | 1 /* |
| 2 * Copyright (C) 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc. All rights | 2 * Copyright (C) 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc. All rights |
| 3 * reserved. | 3 * reserved. |
| 4 * Copyright (C) 2006 Alexey Proskuryakov (ap@webkit.org) | 4 * Copyright (C) 2006 Alexey Proskuryakov (ap@webkit.org) |
| 5 * Copyright (C) 2012 Digia Plc. and/or its subsidiary(-ies) | 5 * Copyright (C) 2012 Digia Plc. and/or its subsidiary(-ies) |
| 6 * | 6 * |
| 7 * Redistribution and use in source and binary forms, with or without | 7 * Redistribution and use in source and binary forms, with or without |
| 8 * modification, are permitted provided that the following conditions | 8 * modification, are permitted provided that the following conditions |
| 9 * are met: | 9 * are met: |
| 10 * 1. Redistributions of source code must retain the above copyright | 10 * 1. Redistributions of source code must retain the above copyright |
| (...skipping 550 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 561 } | 561 } |
| 562 | 562 |
| 563 if ((editable || | 563 if ((editable || |
| 564 (layoutObject && layoutObject->isText() && node->canStartSelection())) && | 564 (layoutObject && layoutObject->isText() && node->canStartSelection())) && |
| 565 !inResizer && !result.scrollbar()) | 565 !inResizer && !result.scrollbar()) |
| 566 return iBeam; | 566 return iBeam; |
| 567 return pointerCursor(); | 567 return pointerCursor(); |
| 568 } | 568 } |
| 569 | 569 |
| 570 WebInputEventResult EventHandler::handleMousePressEvent( | 570 WebInputEventResult EventHandler::handleMousePressEvent( |
| 571 const PlatformMouseEvent& mouseEvent) { | 571 const WebMouseEvent& mouseEvent) { |
| 572 TRACE_EVENT0("blink", "EventHandler::handleMousePressEvent"); | 572 TRACE_EVENT0("blink", "EventHandler::handleMousePressEvent"); |
| 573 | 573 |
| 574 // For 4th/5th button in the mouse since Chrome does not yet send | 574 // For 4th/5th button in the mouse since Chrome does not yet send |
| 575 // button value to Blink but in some cases it does send the event. | 575 // button value to Blink but in some cases it does send the event. |
| 576 // This check is needed to suppress such an event (crbug.com/574959) | 576 // This check is needed to suppress such an event (crbug.com/574959) |
| 577 if (mouseEvent.pointerProperties().button == | 577 if (mouseEvent.button == WebPointerProperties::Button::NoButton) |
| 578 WebPointerProperties::Button::NoButton) | |
| 579 return WebInputEventResult::HandledSuppressed; | 578 return WebInputEventResult::HandledSuppressed; |
| 580 | 579 |
| 581 if (m_eventHandlerWillResetCapturingMouseEventsNode) | 580 if (m_eventHandlerWillResetCapturingMouseEventsNode) |
| 582 m_capturingMouseEventsNode = nullptr; | 581 m_capturingMouseEventsNode = nullptr; |
| 583 m_mouseEventManager->handleMousePressEventUpdateStates(mouseEvent); | 582 m_mouseEventManager->handleMousePressEventUpdateStates(mouseEvent); |
| 584 selectionController().setMouseDownMayStartSelect(false); | 583 selectionController().setMouseDownMayStartSelect(false); |
| 585 if (!m_frame->view()) | 584 if (!m_frame->view()) |
| 586 return WebInputEventResult::NotHandled; | 585 return WebInputEventResult::NotHandled; |
| 587 | 586 |
| 588 HitTestRequest request(HitTestRequest::Active); | 587 HitTestRequest request(HitTestRequest::Active); |
| 589 // Save the document point we generate in case the window coordinate is | 588 // Save the document point we generate in case the window coordinate is |
| 590 // invalidated by what happens when we dispatch the event. | 589 // invalidated by what happens when we dispatch the event. |
| 591 LayoutPoint documentPoint = | 590 LayoutPoint documentPoint = m_frame->view()->rootFrameToContents( |
| 592 m_frame->view()->rootFrameToContents(mouseEvent.position()); | 591 flooredIntPoint(mouseEvent.positionInRootFrame())); |
| 593 MouseEventWithHitTestResults mev = | 592 MouseEventWithHitTestResults mev = |
| 594 m_frame->document()->performMouseEventHitTest(request, documentPoint, | 593 m_frame->document()->performMouseEventHitTest(request, documentPoint, |
| 595 mouseEvent); | 594 mouseEvent); |
| 596 | 595 |
| 597 if (!mev.innerNode()) { | 596 if (!mev.innerNode()) { |
| 598 m_mouseEventManager->invalidateClick(); | 597 m_mouseEventManager->invalidateClick(); |
| 599 return WebInputEventResult::NotHandled; | 598 return WebInputEventResult::NotHandled; |
| 600 } | 599 } |
| 601 | 600 |
| 602 m_mouseEventManager->setMousePressNode(mev.innerNode()); | 601 m_mouseEventManager->setMousePressNode(mev.innerNode()); |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 635 m_scrollManager->stopAutoscroll(); | 634 m_scrollManager->stopAutoscroll(); |
| 636 if (isMiddleClickAutoscrollInProgress) { | 635 if (isMiddleClickAutoscrollInProgress) { |
| 637 // We invalidate the click when exiting middle click auto scroll so that | 636 // We invalidate the click when exiting middle click auto scroll so that |
| 638 // we don't inadvertently navigate away from the current page (e.g. the | 637 // we don't inadvertently navigate away from the current page (e.g. the |
| 639 // click was on a hyperlink). See <rdar://problem/6095023>. | 638 // click was on a hyperlink). See <rdar://problem/6095023>. |
| 640 m_mouseEventManager->invalidateClick(); | 639 m_mouseEventManager->invalidateClick(); |
| 641 return WebInputEventResult::HandledSuppressed; | 640 return WebInputEventResult::HandledSuppressed; |
| 642 } | 641 } |
| 643 } | 642 } |
| 644 | 643 |
| 645 m_mouseEventManager->setClickCount(mouseEvent.clickCount()); | 644 m_mouseEventManager->setClickCount(mouseEvent.clickCount); |
| 646 m_mouseEventManager->setClickNode( | 645 m_mouseEventManager->setClickNode( |
| 647 mev.innerNode()->isTextNode() | 646 mev.innerNode()->isTextNode() |
| 648 ? FlatTreeTraversal::parent(*mev.innerNode()) | 647 ? FlatTreeTraversal::parent(*mev.innerNode()) |
| 649 : mev.innerNode()); | 648 : mev.innerNode()); |
| 650 | 649 |
| 651 if (!mouseEvent.fromTouch()) | 650 if (!mouseEvent.fromTouch()) |
| 652 m_frame->selection().setCaretBlinkingSuspended(true); | 651 m_frame->selection().setCaretBlinkingSuspended(true); |
| 653 | 652 |
| 654 WebInputEventResult eventResult = updatePointerTargetAndDispatchEvents( | 653 WebInputEventResult eventResult = updatePointerTargetAndDispatchEvents( |
| 655 EventTypeNames::mousedown, mev.innerNode(), mev.event(), | 654 EventTypeNames::mousedown, mev.innerNode(), mev.canvasRegionId(), |
| 656 Vector<PlatformMouseEvent>()); | 655 mev.event(), Vector<WebMouseEvent>()); |
| 657 | 656 |
| 658 if (eventResult == WebInputEventResult::NotHandled && m_frame->view()) { | 657 if (eventResult == WebInputEventResult::NotHandled && m_frame->view()) { |
| 659 FrameView* view = m_frame->view(); | 658 FrameView* view = m_frame->view(); |
| 660 PaintLayer* layer = mev.innerNode()->layoutObject() | 659 PaintLayer* layer = mev.innerNode()->layoutObject() |
| 661 ? mev.innerNode()->layoutObject()->enclosingLayer() | 660 ? mev.innerNode()->layoutObject()->enclosingLayer() |
| 662 : nullptr; | 661 : nullptr; |
| 663 IntPoint p = view->rootFrameToContents(mouseEvent.position()); | 662 IntPoint p = view->rootFrameToContents( |
| 663 flooredIntPoint(mouseEvent.positionInRootFrame())); | |
| 664 if (layer && layer->getScrollableArea() && | 664 if (layer && layer->getScrollableArea() && |
| 665 layer->getScrollableArea()->isPointInResizeControl(p, | 665 layer->getScrollableArea()->isPointInResizeControl(p, |
| 666 ResizerForPointer)) { | 666 ResizerForPointer)) { |
| 667 m_scrollManager->setResizeScrollableArea(layer, p); | 667 m_scrollManager->setResizeScrollableArea(layer, p); |
| 668 return WebInputEventResult::HandledSystem; | 668 return WebInputEventResult::HandledSystem; |
| 669 } | 669 } |
| 670 } | 670 } |
| 671 | 671 |
| 672 // m_selectionInitiationState is initialized after dispatching mousedown | 672 // m_selectionInitiationState is initialized after dispatching mousedown |
| 673 // event in order not to keep the selection by DOM APIs because we can't | 673 // event in order not to keep the selection by DOM APIs because we can't |
| 674 // give the user the chance to handle the selection by user action like | 674 // give the user the chance to handle the selection by user action like |
| 675 // dragging if we keep the selection in case of mousedown. FireFox also has | 675 // dragging if we keep the selection in case of mousedown. FireFox also has |
| 676 // the same behavior and it's more compatible with other browsers. | 676 // the same behavior and it's more compatible with other browsers. |
| 677 selectionController().initializeSelectionState(); | 677 selectionController().initializeSelectionState(); |
| 678 HitTestResult hitTestResult = EventHandlingUtil::hitTestResultInFrame( | 678 HitTestResult hitTestResult = EventHandlingUtil::hitTestResultInFrame( |
| 679 m_frame, documentPoint, HitTestRequest::ReadOnly); | 679 m_frame, documentPoint, HitTestRequest::ReadOnly); |
| 680 InputDeviceCapabilities* sourceCapabilities = | 680 InputDeviceCapabilities* sourceCapabilities = |
| 681 mouseEvent.getSyntheticEventType() == PlatformMouseEvent::FromTouch | 681 mouseEvent.fromTouch() |
| 682 ? InputDeviceCapabilities::firesTouchEventsSourceCapabilities() | 682 ? InputDeviceCapabilities::firesTouchEventsSourceCapabilities() |
| 683 : InputDeviceCapabilities::doesntFireTouchEventsSourceCapabilities(); | 683 : InputDeviceCapabilities::doesntFireTouchEventsSourceCapabilities(); |
| 684 if (eventResult == WebInputEventResult::NotHandled) { | 684 if (eventResult == WebInputEventResult::NotHandled) { |
| 685 eventResult = m_mouseEventManager->handleMouseFocus(hitTestResult, | 685 eventResult = m_mouseEventManager->handleMouseFocus(hitTestResult, |
| 686 sourceCapabilities); | 686 sourceCapabilities); |
| 687 } | 687 } |
| 688 m_mouseEventManager->setCapturesDragging( | 688 m_mouseEventManager->setCapturesDragging( |
| 689 eventResult == WebInputEventResult::NotHandled || mev.scrollbar()); | 689 eventResult == WebInputEventResult::NotHandled || mev.scrollbar()); |
| 690 | 690 |
| 691 // If the hit testing originally determined the event was in a scrollbar, | 691 // If the hit testing originally determined the event was in a scrollbar, |
| (...skipping 20 matching lines...) Expand all Loading... | |
| 712 request, documentPoint, mouseEvent); | 712 request, documentPoint, mouseEvent); |
| 713 } | 713 } |
| 714 | 714 |
| 715 if (passMousePressEventToScrollbar(mev)) | 715 if (passMousePressEventToScrollbar(mev)) |
| 716 eventResult = WebInputEventResult::HandledSystem; | 716 eventResult = WebInputEventResult::HandledSystem; |
| 717 else | 717 else |
| 718 eventResult = m_mouseEventManager->handleMousePressEvent(mev); | 718 eventResult = m_mouseEventManager->handleMousePressEvent(mev); |
| 719 } | 719 } |
| 720 | 720 |
| 721 if (mev.hitTestResult().innerNode() && | 721 if (mev.hitTestResult().innerNode() && |
| 722 mouseEvent.pointerProperties().button == | 722 mouseEvent.button == WebPointerProperties::Button::Left) { |
| 723 WebPointerProperties::Button::Left) { | 723 DCHECK_EQ(WebInputEvent::MouseDown, mouseEvent.type()); |
| 724 ASSERT(mouseEvent.type() == PlatformEvent::MousePressed); | |
| 725 HitTestResult result = mev.hitTestResult(); | 724 HitTestResult result = mev.hitTestResult(); |
| 726 result.setToShadowHostIfInUserAgentShadowRoot(); | 725 result.setToShadowHostIfInUserAgentShadowRoot(); |
| 727 m_frame->chromeClient().onMouseDown(result.innerNode()); | 726 m_frame->chromeClient().onMouseDown(result.innerNode()); |
| 728 } | 727 } |
| 729 | 728 |
| 730 return eventResult; | 729 return eventResult; |
| 731 } | 730 } |
| 732 | 731 |
| 733 WebInputEventResult EventHandler::handleMouseMoveEvent( | 732 WebInputEventResult EventHandler::handleMouseMoveEvent( |
| 734 const PlatformMouseEvent& event, | 733 const WebMouseEvent& event, |
| 735 const Vector<PlatformMouseEvent>& coalescedEvents) { | 734 const Vector<WebMouseEvent>& coalescedEvents) { |
| 736 TRACE_EVENT0("blink", "EventHandler::handleMouseMoveEvent"); | 735 TRACE_EVENT0("blink", "EventHandler::handleMouseMoveEvent"); |
| 737 | 736 |
| 738 HitTestResult hoveredNode = HitTestResult(); | 737 HitTestResult hoveredNode = HitTestResult(); |
| 739 WebInputEventResult result = | 738 WebInputEventResult result = |
| 740 handleMouseMoveOrLeaveEvent(event, coalescedEvents, &hoveredNode); | 739 handleMouseMoveOrLeaveEvent(event, coalescedEvents, &hoveredNode); |
| 741 | 740 |
| 742 Page* page = m_frame->page(); | 741 Page* page = m_frame->page(); |
| 743 if (!page) | 742 if (!page) |
| 744 return result; | 743 return result; |
| 745 | 744 |
| 746 if (PaintLayer* layer = | 745 if (PaintLayer* layer = |
| 747 EventHandlingUtil::layerForNode(hoveredNode.innerNode())) { | 746 EventHandlingUtil::layerForNode(hoveredNode.innerNode())) { |
| 748 if (ScrollableArea* layerScrollableArea = | 747 if (ScrollableArea* layerScrollableArea = |
| 749 EventHandlingUtil::associatedScrollableArea(layer)) | 748 EventHandlingUtil::associatedScrollableArea(layer)) |
| 750 layerScrollableArea->mouseMovedInContentArea(); | 749 layerScrollableArea->mouseMovedInContentArea(); |
| 751 } | 750 } |
| 752 | 751 |
| 753 if (FrameView* frameView = m_frame->view()) | 752 if (FrameView* frameView = m_frame->view()) |
| 754 frameView->mouseMovedInContentArea(); | 753 frameView->mouseMovedInContentArea(); |
| 755 | 754 |
| 756 hoveredNode.setToShadowHostIfInUserAgentShadowRoot(); | 755 hoveredNode.setToShadowHostIfInUserAgentShadowRoot(); |
| 757 page->chromeClient().mouseDidMoveOverElement(*m_frame, hoveredNode); | 756 page->chromeClient().mouseDidMoveOverElement(*m_frame, hoveredNode); |
| 758 | 757 |
| 759 return result; | 758 return result; |
| 760 } | 759 } |
| 761 | 760 |
| 762 void EventHandler::handleMouseLeaveEvent(const PlatformMouseEvent& event) { | 761 void EventHandler::handleMouseLeaveEvent(const WebMouseEvent& event) { |
| 763 TRACE_EVENT0("blink", "EventHandler::handleMouseLeaveEvent"); | 762 TRACE_EVENT0("blink", "EventHandler::handleMouseLeaveEvent"); |
| 764 | 763 |
| 765 handleMouseMoveOrLeaveEvent(event, Vector<PlatformMouseEvent>(), 0, false, | 764 handleMouseMoveOrLeaveEvent(event, Vector<WebMouseEvent>(), 0, false, true); |
| 766 true); | |
| 767 } | 765 } |
| 768 | 766 |
| 769 WebInputEventResult EventHandler::handleMouseMoveOrLeaveEvent( | 767 WebInputEventResult EventHandler::handleMouseMoveOrLeaveEvent( |
| 770 const PlatformMouseEvent& mouseEvent, | 768 const WebMouseEvent& mouseEvent, |
| 771 const Vector<PlatformMouseEvent>& coalescedEvents, | 769 const Vector<WebMouseEvent>& coalescedEvents, |
| 772 HitTestResult* hoveredNode, | 770 HitTestResult* hoveredNode, |
| 773 bool onlyUpdateScrollbars, | 771 bool onlyUpdateScrollbars, |
| 774 bool forceLeave) { | 772 bool forceLeave) { |
| 775 ASSERT(m_frame); | 773 ASSERT(m_frame); |
| 776 ASSERT(m_frame->view()); | 774 ASSERT(m_frame->view()); |
| 777 | 775 |
| 778 m_mouseEventManager->setLastKnownMousePosition(mouseEvent); | 776 m_mouseEventManager->setLastKnownMousePosition(mouseEvent); |
| 779 | 777 |
| 780 m_hoverTimer.stop(); | 778 m_hoverTimer.stop(); |
| 781 m_cursorUpdateTimer.stop(); | 779 m_cursorUpdateTimer.stop(); |
| 782 | 780 |
| 783 m_mouseEventManager->cancelFakeMouseMoveEvent(); | 781 m_mouseEventManager->cancelFakeMouseMoveEvent(); |
| 784 m_mouseEventManager->handleSvgPanIfNeeded(false); | 782 m_mouseEventManager->handleSvgPanIfNeeded(false); |
| 785 | 783 |
| 786 if (m_frameSetBeingResized) { | 784 if (m_frameSetBeingResized) { |
| 787 return updatePointerTargetAndDispatchEvents(EventTypeNames::mousemove, | 785 return updatePointerTargetAndDispatchEvents( |
| 788 m_frameSetBeingResized.get(), | 786 EventTypeNames::mousemove, m_frameSetBeingResized.get(), String(), |
| 789 mouseEvent, coalescedEvents); | 787 mouseEvent, coalescedEvents); |
| 790 } | 788 } |
| 791 | 789 |
| 792 // Send events right to a scrollbar if the mouse is pressed. | 790 // Send events right to a scrollbar if the mouse is pressed. |
| 793 if (m_lastScrollbarUnderMouse && m_mouseEventManager->mousePressed()) { | 791 if (m_lastScrollbarUnderMouse && m_mouseEventManager->mousePressed()) { |
| 794 m_lastScrollbarUnderMouse->mouseMoved(mouseEvent); | 792 m_lastScrollbarUnderMouse->mouseMoved(mouseEvent); |
| 795 return WebInputEventResult::HandledSystem; | 793 return WebInputEventResult::HandledSystem; |
| 796 } | 794 } |
| 797 | 795 |
| 798 // Mouse events simulated from touch should not hit-test again. | 796 // Mouse events simulated from touch should not hit-test again. |
| 799 ASSERT(!mouseEvent.fromTouch()); | 797 ASSERT(!mouseEvent.fromTouch()); |
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 855 // event to the last subframe so that it will fire mouseouts. | 853 // event to the last subframe so that it will fire mouseouts. |
| 856 if (m_lastMouseMoveEventSubframe && | 854 if (m_lastMouseMoveEventSubframe && |
| 857 m_lastMouseMoveEventSubframe->tree().isDescendantOf(m_frame) && | 855 m_lastMouseMoveEventSubframe->tree().isDescendantOf(m_frame) && |
| 858 m_lastMouseMoveEventSubframe != newSubframe) | 856 m_lastMouseMoveEventSubframe != newSubframe) |
| 859 m_lastMouseMoveEventSubframe->eventHandler().handleMouseLeaveEvent( | 857 m_lastMouseMoveEventSubframe->eventHandler().handleMouseLeaveEvent( |
| 860 mev.event()); | 858 mev.event()); |
| 861 | 859 |
| 862 if (newSubframe) { | 860 if (newSubframe) { |
| 863 // Update over/out state before passing the event to the subframe. | 861 // Update over/out state before passing the event to the subframe. |
| 864 m_pointerEventManager->sendMouseAndPointerBoundaryEvents( | 862 m_pointerEventManager->sendMouseAndPointerBoundaryEvents( |
| 865 updateMouseEventTargetNode(mev.innerNode()), mev.event()); | 863 updateMouseEventTargetNode(mev.innerNode()), mev.canvasRegionId(), |
| 864 mev.event()); | |
| 866 | 865 |
| 867 // Event dispatch in sendMouseAndPointerBoundaryEvents may have caused the | 866 // Event dispatch in sendMouseAndPointerBoundaryEvents may have caused the |
| 868 // subframe of the target node to be detached from its FrameView, in which | 867 // subframe of the target node to be detached from its FrameView, in which |
| 869 // case the event should not be passed. | 868 // case the event should not be passed. |
| 870 if (newSubframe->view()) { | 869 if (newSubframe->view()) { |
| 871 eventResult = passMouseMoveEventToSubframe(mev, coalescedEvents, | 870 eventResult = passMouseMoveEventToSubframe(mev, coalescedEvents, |
| 872 newSubframe, hoveredNode); | 871 newSubframe, hoveredNode); |
| 873 } | 872 } |
| 874 } else { | 873 } else { |
| 875 if (scrollbar && !m_mouseEventManager->mousePressed()) { | 874 if (scrollbar && !m_mouseEventManager->mousePressed()) { |
| 876 // Handle hover effects on platforms that support visual feedback on | 875 // Handle hover effects on platforms that support visual feedback on |
| 877 // scrollbar hovering. | 876 // scrollbar hovering. |
| 878 scrollbar->mouseMoved(mev.event()); | 877 scrollbar->mouseMoved(mev.event()); |
| 879 } | 878 } |
| 880 if (FrameView* view = m_frame->view()) { | 879 if (FrameView* view = m_frame->view()) { |
| 881 OptionalCursor optionalCursor = selectCursor(mev.hitTestResult()); | 880 OptionalCursor optionalCursor = selectCursor(mev.hitTestResult()); |
| 882 if (optionalCursor.isCursorChange()) { | 881 if (optionalCursor.isCursorChange()) { |
| 883 view->setCursor(optionalCursor.cursor()); | 882 view->setCursor(optionalCursor.cursor()); |
| 884 } | 883 } |
| 885 } | 884 } |
| 886 } | 885 } |
| 887 | 886 |
| 888 m_lastMouseMoveEventSubframe = newSubframe; | 887 m_lastMouseMoveEventSubframe = newSubframe; |
| 889 | 888 |
| 890 if (eventResult != WebInputEventResult::NotHandled) | 889 if (eventResult != WebInputEventResult::NotHandled) |
| 891 return eventResult; | 890 return eventResult; |
| 892 | 891 |
| 893 eventResult = updatePointerTargetAndDispatchEvents( | 892 eventResult = updatePointerTargetAndDispatchEvents( |
| 894 EventTypeNames::mousemove, mev.innerNode(), mev.event(), coalescedEvents); | 893 EventTypeNames::mousemove, mev.innerNode(), mev.canvasRegionId(), |
| 894 mev.event(), coalescedEvents); | |
| 895 if (eventResult != WebInputEventResult::NotHandled) | 895 if (eventResult != WebInputEventResult::NotHandled) |
| 896 return eventResult; | 896 return eventResult; |
| 897 | 897 |
| 898 return m_mouseEventManager->handleMouseDraggedEvent(mev); | 898 return m_mouseEventManager->handleMouseDraggedEvent(mev); |
| 899 } | 899 } |
| 900 | 900 |
| 901 WebInputEventResult EventHandler::handleMouseReleaseEvent( | 901 WebInputEventResult EventHandler::handleMouseReleaseEvent( |
| 902 const PlatformMouseEvent& mouseEvent) { | 902 const WebMouseEvent& mouseEvent) { |
| 903 TRACE_EVENT0("blink", "EventHandler::handleMouseReleaseEvent"); | 903 TRACE_EVENT0("blink", "EventHandler::handleMouseReleaseEvent"); |
| 904 | 904 |
| 905 // For 4th/5th button in the mouse since Chrome does not yet send | 905 // For 4th/5th button in the mouse since Chrome does not yet send |
| 906 // button value to Blink but in some cases it does send the event. | 906 // button value to Blink but in some cases it does send the event. |
| 907 // This check is needed to suppress such an event (crbug.com/574959) | 907 // This check is needed to suppress such an event (crbug.com/574959) |
| 908 if (mouseEvent.pointerProperties().button == | 908 if (mouseEvent.button == WebPointerProperties::Button::NoButton) |
| 909 WebPointerProperties::Button::NoButton) | |
| 910 return WebInputEventResult::HandledSuppressed; | 909 return WebInputEventResult::HandledSuppressed; |
| 911 | 910 |
| 912 if (!mouseEvent.fromTouch()) | 911 if (!mouseEvent.fromTouch()) |
| 913 m_frame->selection().setCaretBlinkingSuspended(false); | 912 m_frame->selection().setCaretBlinkingSuspended(false); |
| 914 | 913 |
| 915 if (RuntimeEnabledFeatures::middleClickAutoscrollEnabled()) { | 914 if (RuntimeEnabledFeatures::middleClickAutoscrollEnabled()) { |
| 916 if (Page* page = m_frame->page()) | 915 if (Page* page = m_frame->page()) |
| 917 page->autoscrollController().handleMouseReleaseForMiddleClickAutoscroll( | 916 page->autoscrollController().handleMouseReleaseForMiddleClickAutoscroll( |
| 918 m_frame, mouseEvent); | 917 m_frame, mouseEvent); |
| 919 } | 918 } |
| 920 | 919 |
| 921 m_mouseEventManager->setMousePressed(false); | 920 m_mouseEventManager->setMousePressed(false); |
| 922 m_mouseEventManager->setLastKnownMousePosition(mouseEvent); | 921 m_mouseEventManager->setLastKnownMousePosition(mouseEvent); |
| 923 m_mouseEventManager->handleSvgPanIfNeeded(true); | 922 m_mouseEventManager->handleSvgPanIfNeeded(true); |
| 924 | 923 |
| 925 if (m_frameSetBeingResized) { | 924 if (m_frameSetBeingResized) { |
| 926 return m_mouseEventManager->setMousePositionAndDispatchMouseEvent( | 925 return m_mouseEventManager->setMousePositionAndDispatchMouseEvent( |
| 927 updateMouseEventTargetNode(m_frameSetBeingResized.get()), | 926 updateMouseEventTargetNode(m_frameSetBeingResized.get()), String(), |
| 928 EventTypeNames::mouseup, mouseEvent); | 927 EventTypeNames::mouseup, mouseEvent); |
| 929 } | 928 } |
| 930 | 929 |
| 931 if (m_lastScrollbarUnderMouse) { | 930 if (m_lastScrollbarUnderMouse) { |
| 932 m_mouseEventManager->invalidateClick(); | 931 m_mouseEventManager->invalidateClick(); |
| 933 m_lastScrollbarUnderMouse->mouseUp(mouseEvent); | 932 m_lastScrollbarUnderMouse->mouseUp(mouseEvent); |
| 934 return updatePointerTargetAndDispatchEvents( | 933 return updatePointerTargetAndDispatchEvents( |
| 935 EventTypeNames::mouseup, m_mouseEventManager->getNodeUnderMouse(), | 934 EventTypeNames::mouseup, m_mouseEventManager->getNodeUnderMouse(), |
| 936 mouseEvent, Vector<PlatformMouseEvent>()); | 935 String(), mouseEvent, Vector<WebMouseEvent>()); |
| 937 } | 936 } |
| 938 | 937 |
| 939 // Mouse events simulated from touch should not hit-test again. | 938 // Mouse events simulated from touch should not hit-test again. |
| 940 ASSERT(!mouseEvent.fromTouch()); | 939 ASSERT(!mouseEvent.fromTouch()); |
| 941 | 940 |
| 942 HitTestRequest::HitTestRequestType hitType = HitTestRequest::Release; | 941 HitTestRequest::HitTestRequestType hitType = HitTestRequest::Release; |
| 943 HitTestRequest request(hitType); | 942 HitTestRequest request(hitType); |
| 944 MouseEventWithHitTestResults mev = | 943 MouseEventWithHitTestResults mev = |
| 945 EventHandlingUtil::performMouseEventHitTest(m_frame, request, mouseEvent); | 944 EventHandlingUtil::performMouseEventHitTest(m_frame, request, mouseEvent); |
| 946 LocalFrame* subframe = | 945 LocalFrame* subframe = |
| (...skipping 17 matching lines...) Expand all Loading... | |
| 964 gestureIndicator = WTF::wrapUnique(new UserGestureIndicator( | 963 gestureIndicator = WTF::wrapUnique(new UserGestureIndicator( |
| 965 m_frame->localFrameRoot() | 964 m_frame->localFrameRoot() |
| 966 ->eventHandler() | 965 ->eventHandler() |
| 967 .m_lastMouseDownUserGestureToken.release())); | 966 .m_lastMouseDownUserGestureToken.release())); |
| 968 } else { | 967 } else { |
| 969 gestureIndicator = WTF::wrapUnique(new UserGestureIndicator( | 968 gestureIndicator = WTF::wrapUnique(new UserGestureIndicator( |
| 970 DocumentUserGestureToken::create(m_frame->document()))); | 969 DocumentUserGestureToken::create(m_frame->document()))); |
| 971 } | 970 } |
| 972 | 971 |
| 973 WebInputEventResult eventResult = updatePointerTargetAndDispatchEvents( | 972 WebInputEventResult eventResult = updatePointerTargetAndDispatchEvents( |
| 974 EventTypeNames::mouseup, mev.innerNode(), mev.event(), | 973 EventTypeNames::mouseup, mev.innerNode(), mev.canvasRegionId(), |
| 975 Vector<PlatformMouseEvent>()); | 974 mev.event(), Vector<WebMouseEvent>()); |
| 976 | 975 |
| 977 WebInputEventResult clickEventResult = | 976 WebInputEventResult clickEventResult = |
| 978 m_mouseEventManager->dispatchMouseClickIfNeeded(mev); | 977 m_mouseEventManager->dispatchMouseClickIfNeeded(mev); |
| 979 | 978 |
| 980 m_scrollManager->clearResizeScrollableArea(false); | 979 m_scrollManager->clearResizeScrollableArea(false); |
| 981 | 980 |
| 982 if (eventResult == WebInputEventResult::NotHandled) | 981 if (eventResult == WebInputEventResult::NotHandled) |
| 983 eventResult = m_mouseEventManager->handleMouseReleaseEvent(mev); | 982 eventResult = m_mouseEventManager->handleMouseReleaseEvent(mev); |
| 984 m_mouseEventManager->clearDragHeuristicState(); | 983 m_mouseEventManager->clearDragHeuristicState(); |
| 985 | 984 |
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1037 if (matched) { | 1036 if (matched) { |
| 1038 dataTransfer->setDropEffect( | 1037 dataTransfer->setDropEffect( |
| 1039 convertDragOperationToDropZoneOperation(dragOperation)); | 1038 convertDragOperationToDropZoneOperation(dragOperation)); |
| 1040 return true; | 1039 return true; |
| 1041 } | 1040 } |
| 1042 } | 1041 } |
| 1043 return false; | 1042 return false; |
| 1044 } | 1043 } |
| 1045 | 1044 |
| 1046 WebInputEventResult EventHandler::updateDragAndDrop( | 1045 WebInputEventResult EventHandler::updateDragAndDrop( |
| 1047 const PlatformMouseEvent& event, | 1046 const WebMouseEvent& event, |
| 1048 DataTransfer* dataTransfer) { | 1047 DataTransfer* dataTransfer) { |
| 1049 WebInputEventResult eventResult = WebInputEventResult::NotHandled; | 1048 WebInputEventResult eventResult = WebInputEventResult::NotHandled; |
| 1050 | 1049 |
| 1051 if (!m_frame->view()) | 1050 if (!m_frame->view()) |
| 1052 return eventResult; | 1051 return eventResult; |
| 1053 | 1052 |
| 1054 HitTestRequest request(HitTestRequest::ReadOnly); | 1053 HitTestRequest request(HitTestRequest::ReadOnly); |
| 1055 MouseEventWithHitTestResults mev = | 1054 MouseEventWithHitTestResults mev = |
| 1056 EventHandlingUtil::performMouseEventHitTest(m_frame, request, event); | 1055 EventHandlingUtil::performMouseEventHitTest(m_frame, request, event); |
| 1057 | 1056 |
| 1058 // Drag events should never go to text nodes (following IE, and proper | 1057 // Drag events should never go to text nodes (following IE, and proper |
| 1059 // mouseover/out dispatch) | 1058 // mouseover/out dispatch) |
| 1060 Node* newTarget = mev.innerNode(); | 1059 Node* newTarget = mev.innerNode(); |
| 1061 if (newTarget && newTarget->isTextNode()) | 1060 if (newTarget && newTarget->isTextNode()) |
| 1062 newTarget = FlatTreeTraversal::parent(*newTarget); | 1061 newTarget = FlatTreeTraversal::parent(*newTarget); |
| 1063 | 1062 |
| 1064 if (AutoscrollController* controller = | 1063 if (AutoscrollController* controller = |
| 1065 m_scrollManager->autoscrollController()) | 1064 m_scrollManager->autoscrollController()) { |
| 1066 controller->updateDragAndDrop(newTarget, event.position(), | 1065 controller->updateDragAndDrop( |
| 1067 event.timestamp()); | 1066 newTarget, flooredIntPoint(event.positionInRootFrame()), |
| 1067 TimeTicks::FromSeconds(event.timeStampSeconds())); | |
| 1068 } | |
| 1068 | 1069 |
| 1069 if (m_dragTarget != newTarget) { | 1070 if (m_dragTarget != newTarget) { |
| 1070 // FIXME: this ordering was explicitly chosen to match WinIE. However, | 1071 // FIXME: this ordering was explicitly chosen to match WinIE. However, |
| 1071 // it is sometimes incorrect when dragging within subframes, as seen with | 1072 // it is sometimes incorrect when dragging within subframes, as seen with |
| 1072 // LayoutTests/fast/events/drag-in-frames.html. | 1073 // LayoutTests/fast/events/drag-in-frames.html. |
| 1073 // | 1074 // |
| 1074 // Moreover, this ordering conforms to section 7.9.4 of the HTML 5 spec. | 1075 // Moreover, this ordering conforms to section 7.9.4 of the HTML 5 spec. |
| 1075 // <http://dev.w3.org/html5/spec/Overview.html#drag-and-drop-processing-mode l>. | 1076 // <http://dev.w3.org/html5/spec/Overview.html#drag-and-drop-processing-mode l>. |
| 1076 LocalFrame* targetFrame; | 1077 LocalFrame* targetFrame; |
| 1077 if (targetIsFrame(newTarget, targetFrame)) { | 1078 if (targetIsFrame(newTarget, targetFrame)) { |
| (...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1130 findDropZone(newTarget, dataTransfer)) | 1131 findDropZone(newTarget, dataTransfer)) |
| 1131 eventResult = WebInputEventResult::HandledSystem; | 1132 eventResult = WebInputEventResult::HandledSystem; |
| 1132 m_shouldOnlyFireDragOverEvent = false; | 1133 m_shouldOnlyFireDragOverEvent = false; |
| 1133 } | 1134 } |
| 1134 } | 1135 } |
| 1135 m_dragTarget = newTarget; | 1136 m_dragTarget = newTarget; |
| 1136 | 1137 |
| 1137 return eventResult; | 1138 return eventResult; |
| 1138 } | 1139 } |
| 1139 | 1140 |
| 1140 void EventHandler::cancelDragAndDrop(const PlatformMouseEvent& event, | 1141 void EventHandler::cancelDragAndDrop(const WebMouseEvent& event, |
| 1141 DataTransfer* dataTransfer) { | 1142 DataTransfer* dataTransfer) { |
| 1142 LocalFrame* targetFrame; | 1143 LocalFrame* targetFrame; |
| 1143 if (targetIsFrame(m_dragTarget.get(), targetFrame)) { | 1144 if (targetIsFrame(m_dragTarget.get(), targetFrame)) { |
| 1144 if (targetFrame) | 1145 if (targetFrame) |
| 1145 targetFrame->eventHandler().cancelDragAndDrop(event, dataTransfer); | 1146 targetFrame->eventHandler().cancelDragAndDrop(event, dataTransfer); |
| 1146 } else if (m_dragTarget.get()) { | 1147 } else if (m_dragTarget.get()) { |
| 1147 if (m_mouseEventManager->dragState().m_dragSrc) | 1148 if (m_mouseEventManager->dragState().m_dragSrc) |
| 1148 m_mouseEventManager->dispatchDragSrcEvent(EventTypeNames::drag, event); | 1149 m_mouseEventManager->dispatchDragSrcEvent(EventTypeNames::drag, event); |
| 1149 m_mouseEventManager->dispatchDragEvent( | 1150 m_mouseEventManager->dispatchDragEvent( |
| 1150 EventTypeNames::dragleave, m_dragTarget.get(), event, dataTransfer); | 1151 EventTypeNames::dragleave, m_dragTarget.get(), event, dataTransfer); |
| 1151 } | 1152 } |
| 1152 clearDragState(); | 1153 clearDragState(); |
| 1153 } | 1154 } |
| 1154 | 1155 |
| 1155 WebInputEventResult EventHandler::performDragAndDrop( | 1156 WebInputEventResult EventHandler::performDragAndDrop( |
| 1156 const PlatformMouseEvent& event, | 1157 const WebMouseEvent& event, |
| 1157 DataTransfer* dataTransfer) { | 1158 DataTransfer* dataTransfer) { |
| 1158 LocalFrame* targetFrame; | 1159 LocalFrame* targetFrame; |
| 1159 WebInputEventResult result = WebInputEventResult::NotHandled; | 1160 WebInputEventResult result = WebInputEventResult::NotHandled; |
| 1160 if (targetIsFrame(m_dragTarget.get(), targetFrame)) { | 1161 if (targetIsFrame(m_dragTarget.get(), targetFrame)) { |
| 1161 if (targetFrame) | 1162 if (targetFrame) |
| 1162 result = | 1163 result = |
| 1163 targetFrame->eventHandler().performDragAndDrop(event, dataTransfer); | 1164 targetFrame->eventHandler().performDragAndDrop(event, dataTransfer); |
| 1164 } else if (m_dragTarget.get()) { | 1165 } else if (m_dragTarget.get()) { |
| 1165 result = m_mouseEventManager->dispatchDragEvent( | 1166 result = m_mouseEventManager->dispatchDragEvent( |
| 1166 EventTypeNames::drop, m_dragTarget.get(), event, dataTransfer); | 1167 EventTypeNames::drop, m_dragTarget.get(), event, dataTransfer); |
| (...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1249 return m_pointerEventManager->hasProcessedPointerCapture(pointerId, target); | 1250 return m_pointerEventManager->hasProcessedPointerCapture(pointerId, target); |
| 1250 } | 1251 } |
| 1251 | 1252 |
| 1252 void EventHandler::elementRemoved(EventTarget* target) { | 1253 void EventHandler::elementRemoved(EventTarget* target) { |
| 1253 m_pointerEventManager->elementRemoved(target); | 1254 m_pointerEventManager->elementRemoved(target); |
| 1254 } | 1255 } |
| 1255 | 1256 |
| 1256 WebInputEventResult EventHandler::updatePointerTargetAndDispatchEvents( | 1257 WebInputEventResult EventHandler::updatePointerTargetAndDispatchEvents( |
| 1257 const AtomicString& mouseEventType, | 1258 const AtomicString& mouseEventType, |
| 1258 Node* targetNode, | 1259 Node* targetNode, |
| 1259 const PlatformMouseEvent& mouseEvent, | 1260 const String& canvasRegionId, |
| 1260 const Vector<PlatformMouseEvent>& coalescedEvents) { | 1261 const WebMouseEvent& mouseEvent, |
| 1262 const Vector<WebMouseEvent>& coalescedEvents) { | |
| 1261 ASSERT(mouseEventType == EventTypeNames::mousedown || | 1263 ASSERT(mouseEventType == EventTypeNames::mousedown || |
| 1262 mouseEventType == EventTypeNames::mousemove || | 1264 mouseEventType == EventTypeNames::mousemove || |
| 1263 mouseEventType == EventTypeNames::mouseup); | 1265 mouseEventType == EventTypeNames::mouseup); |
| 1264 | 1266 |
| 1265 const auto& eventResult = m_pointerEventManager->sendMousePointerEvent( | 1267 const auto& eventResult = m_pointerEventManager->sendMousePointerEvent( |
| 1266 updateMouseEventTargetNode(targetNode), mouseEventType, mouseEvent, | 1268 updateMouseEventTargetNode(targetNode), canvasRegionId, mouseEventType, |
| 1267 coalescedEvents); | 1269 mouseEvent, coalescedEvents); |
| 1268 return eventResult; | 1270 return eventResult; |
| 1269 } | 1271 } |
| 1270 | 1272 |
| 1271 WebInputEventResult EventHandler::handleWheelEvent( | 1273 WebInputEventResult EventHandler::handleWheelEvent( |
| 1272 const WebMouseWheelEvent& event) { | 1274 const WebMouseWheelEvent& event) { |
| 1273 #if OS(MACOSX) | 1275 #if OS(MACOSX) |
| 1274 // Filter Mac OS specific phases, usually with a zero-delta. | 1276 // Filter Mac OS specific phases, usually with a zero-delta. |
| 1275 // https://crbug.com/553732 | 1277 // https://crbug.com/553732 |
| 1276 // TODO(chongz): EventSender sends events with | 1278 // TODO(chongz): EventSender sends events with |
| 1277 // |WebMouseWheelEvent::PhaseNone|, | 1279 // |WebMouseWheelEvent::PhaseNone|, |
| (...skipping 332 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1610 if (exitedFrameInDocument != lastEnteredFrameInDocument) | 1612 if (exitedFrameInDocument != lastEnteredFrameInDocument) |
| 1611 exitedFrameChain.push_back(exitedFrameInDocument); | 1613 exitedFrameChain.push_back(exitedFrameInDocument); |
| 1612 else if (nextExitedFrameInDocument && indexEnteredFrameChain) | 1614 else if (nextExitedFrameInDocument && indexEnteredFrameChain) |
| 1613 --indexEnteredFrameChain; | 1615 --indexEnteredFrameChain; |
| 1614 } | 1616 } |
| 1615 exitedFrameInDocument = nextExitedFrameInDocument; | 1617 exitedFrameInDocument = nextExitedFrameInDocument; |
| 1616 } | 1618 } |
| 1617 | 1619 |
| 1618 const WebGestureEvent& gestureEvent = targetedEvent.event(); | 1620 const WebGestureEvent& gestureEvent = targetedEvent.event(); |
| 1619 unsigned modifiers = gestureEvent.modifiers(); | 1621 unsigned modifiers = gestureEvent.modifiers(); |
| 1620 PlatformMouseEvent fakeMouseMove( | 1622 WebMouseEvent fakeMouseMove( |
| 1621 gestureEvent, WebPointerProperties::Button::NoButton, | 1623 WebInputEvent::MouseMove, gestureEvent, |
| 1622 PlatformEvent::MouseMoved, | 1624 WebPointerProperties::Button::NoButton, |
| 1623 /* clickCount */ 0, static_cast<PlatformEvent::Modifiers>(modifiers), | 1625 /* clickCount */ 0, |
| 1624 PlatformMouseEvent::FromTouch, | 1626 modifiers | WebInputEvent::Modifiers::IsCompatibilityEventForTouch, |
| 1625 TimeTicks::FromSeconds(gestureEvent.timeStampSeconds()), | 1627 gestureEvent.timeStampSeconds()); |
| 1626 WebPointerProperties::PointerType::Mouse); | |
| 1627 | 1628 |
| 1628 // Update the mouseout/mouseleave event | 1629 // Update the mouseout/mouseleave event |
| 1629 size_t indexExitedFrameChain = exitedFrameChain.size(); | 1630 size_t indexExitedFrameChain = exitedFrameChain.size(); |
| 1630 while (indexExitedFrameChain) { | 1631 while (indexExitedFrameChain) { |
| 1631 LocalFrame* leaveFrame = exitedFrameChain[--indexExitedFrameChain]; | 1632 LocalFrame* leaveFrame = exitedFrameChain[--indexExitedFrameChain]; |
| 1632 leaveFrame->eventHandler().m_mouseEventManager->setNodeUnderMouse( | 1633 leaveFrame->eventHandler().m_mouseEventManager->setNodeUnderMouse( |
| 1633 updateMouseEventTargetNode(nullptr), fakeMouseMove); | 1634 updateMouseEventTargetNode(nullptr), String(), fakeMouseMove); |
| 1634 } | 1635 } |
| 1635 | 1636 |
| 1636 // update the mouseover/mouseenter event | 1637 // update the mouseover/mouseenter event |
| 1637 while (indexEnteredFrameChain) { | 1638 while (indexEnteredFrameChain) { |
| 1638 Frame* parentFrame = | 1639 Frame* parentFrame = |
| 1639 enteredFrameChain[--indexEnteredFrameChain]->tree().parent(); | 1640 enteredFrameChain[--indexEnteredFrameChain]->tree().parent(); |
| 1640 if (parentFrame && parentFrame->isLocalFrame()) | 1641 if (parentFrame && parentFrame->isLocalFrame()) { |
| 1641 toLocalFrame(parentFrame) | 1642 toLocalFrame(parentFrame) |
| 1642 ->eventHandler() | 1643 ->eventHandler() |
| 1643 .m_mouseEventManager->setNodeUnderMouse( | 1644 .m_mouseEventManager->setNodeUnderMouse( |
| 1644 updateMouseEventTargetNode(toHTMLFrameOwnerElement( | 1645 updateMouseEventTargetNode(toHTMLFrameOwnerElement( |
| 1645 enteredFrameChain[indexEnteredFrameChain]->owner())), | 1646 enteredFrameChain[indexEnteredFrameChain]->owner())), |
| 1646 fakeMouseMove); | 1647 String(), fakeMouseMove); |
| 1648 } | |
| 1647 } | 1649 } |
| 1648 } | 1650 } |
| 1649 | 1651 |
| 1650 GestureEventWithHitTestResults EventHandler::targetGestureEvent( | 1652 GestureEventWithHitTestResults EventHandler::targetGestureEvent( |
| 1651 const WebGestureEvent& gestureEvent, | 1653 const WebGestureEvent& gestureEvent, |
| 1652 bool readOnly) { | 1654 bool readOnly) { |
| 1653 TRACE_EVENT0("input", "EventHandler::targetGestureEvent"); | 1655 TRACE_EVENT0("input", "EventHandler::targetGestureEvent"); |
| 1654 | 1656 |
| 1655 ASSERT(m_frame == m_frame->localFrameRoot()); | 1657 ASSERT(m_frame == m_frame->localFrameRoot()); |
| 1656 // Scrolling events get hit tested per frame (like wheel events do). | 1658 // Scrolling events get hit tested per frame (like wheel events do). |
| (...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1775 // crbug.com/398914 | 1777 // crbug.com/398914 |
| 1776 if (adjusted) { | 1778 if (adjusted) { |
| 1777 hitTestResult->resolveRectBasedTest( | 1779 hitTestResult->resolveRectBasedTest( |
| 1778 adjustedNode, m_frame->view()->rootFrameToContents(adjustedPoint)); | 1780 adjustedNode, m_frame->view()->rootFrameToContents(adjustedPoint)); |
| 1779 gestureEvent->applyTouchAdjustment( | 1781 gestureEvent->applyTouchAdjustment( |
| 1780 WebFloatPoint(adjustedPoint.x(), adjustedPoint.y())); | 1782 WebFloatPoint(adjustedPoint.x(), adjustedPoint.y())); |
| 1781 } | 1783 } |
| 1782 } | 1784 } |
| 1783 | 1785 |
| 1784 WebInputEventResult EventHandler::sendContextMenuEvent( | 1786 WebInputEventResult EventHandler::sendContextMenuEvent( |
| 1785 const PlatformMouseEvent& event, | 1787 const WebMouseEvent& event, |
| 1786 Node* overrideTargetNode) { | 1788 Node* overrideTargetNode) { |
| 1787 FrameView* v = m_frame->view(); | 1789 FrameView* v = m_frame->view(); |
| 1788 if (!v) | 1790 if (!v) |
| 1789 return WebInputEventResult::NotHandled; | 1791 return WebInputEventResult::NotHandled; |
| 1790 | 1792 |
| 1791 // Clear mouse press state to avoid initiating a drag while context menu is | 1793 // Clear mouse press state to avoid initiating a drag while context menu is |
| 1792 // up. | 1794 // up. |
| 1793 m_mouseEventManager->setMousePressed(false); | 1795 m_mouseEventManager->setMousePressed(false); |
| 1794 LayoutPoint positionInContents = v->rootFrameToContents(event.position()); | 1796 LayoutPoint positionInContents = |
| 1797 v->rootFrameToContents(flooredIntPoint(event.positionInRootFrame())); | |
| 1795 HitTestRequest request(HitTestRequest::Active); | 1798 HitTestRequest request(HitTestRequest::Active); |
| 1796 MouseEventWithHitTestResults mev = | 1799 MouseEventWithHitTestResults mev = |
| 1797 m_frame->document()->performMouseEventHitTest(request, positionInContents, | 1800 m_frame->document()->performMouseEventHitTest(request, positionInContents, |
| 1798 event); | 1801 event); |
| 1799 // Since |Document::performMouseEventHitTest()| modifies layout tree for | 1802 // Since |Document::performMouseEventHitTest()| modifies layout tree for |
| 1800 // setting hover element, we need to update layout tree for requirement of | 1803 // setting hover element, we need to update layout tree for requirement of |
| 1801 // |SelectionController::sendContextMenuEvent()|. | 1804 // |SelectionController::sendContextMenuEvent()|. |
| 1802 m_frame->document()->updateStyleAndLayoutIgnorePendingStylesheets(); | 1805 m_frame->document()->updateStyleAndLayoutIgnorePendingStylesheets(); |
| 1803 | 1806 |
| 1804 selectionController().sendContextMenuEvent(mev, positionInContents); | 1807 selectionController().sendContextMenuEvent(mev, positionInContents); |
| 1805 | 1808 |
| 1806 Node* targetNode = overrideTargetNode ? overrideTargetNode : mev.innerNode(); | 1809 Node* targetNode = overrideTargetNode ? overrideTargetNode : mev.innerNode(); |
| 1807 return m_mouseEventManager->dispatchMouseEvent( | 1810 return m_mouseEventManager->dispatchMouseEvent( |
| 1808 updateMouseEventTargetNode(targetNode), EventTypeNames::contextmenu, | 1811 updateMouseEventTargetNode(targetNode), EventTypeNames::contextmenu, |
| 1809 event, 0); | 1812 event, mev.hitTestResult().canvasRegionId(), 0); |
| 1810 } | 1813 } |
| 1811 | 1814 |
| 1812 WebInputEventResult EventHandler::sendContextMenuEventForKey( | 1815 WebInputEventResult EventHandler::sendContextMenuEventForKey( |
| 1813 Element* overrideTargetElement) { | 1816 Element* overrideTargetElement) { |
| 1814 FrameView* view = m_frame->view(); | 1817 FrameView* view = m_frame->view(); |
| 1815 if (!view) | 1818 if (!view) |
| 1816 return WebInputEventResult::NotHandled; | 1819 return WebInputEventResult::NotHandled; |
| 1817 | 1820 |
| 1818 Document* doc = m_frame->document(); | 1821 Document* doc = m_frame->document(); |
| 1819 if (!doc) | 1822 if (!doc) |
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1876 | 1879 |
| 1877 // Use the focused node as the target for hover and active. | 1880 // Use the focused node as the target for hover and active. |
| 1878 HitTestRequest request(HitTestRequest::Active); | 1881 HitTestRequest request(HitTestRequest::Active); |
| 1879 HitTestResult result(request, locationInRootFrame); | 1882 HitTestResult result(request, locationInRootFrame); |
| 1880 result.setInnerNode(targetNode); | 1883 result.setInnerNode(targetNode); |
| 1881 doc->updateHoverActiveState(request, result.innerElement(), | 1884 doc->updateHoverActiveState(request, result.innerElement(), |
| 1882 result.scrollbar()); | 1885 result.scrollbar()); |
| 1883 | 1886 |
| 1884 // The contextmenu event is a mouse event even when invoked using the | 1887 // The contextmenu event is a mouse event even when invoked using the |
| 1885 // keyboard. This is required for web compatibility. | 1888 // keyboard. This is required for web compatibility. |
| 1886 PlatformEvent::EventType eventType = PlatformEvent::MousePressed; | 1889 WebInputEvent::Type eventType = WebInputEvent::MouseDown; |
| 1887 if (m_frame->settings() && m_frame->settings()->getShowContextMenuOnMouseUp()) | 1890 if (m_frame->settings() && m_frame->settings()->getShowContextMenuOnMouseUp()) |
| 1888 eventType = PlatformEvent::MouseReleased; | 1891 eventType = WebInputEvent::MouseUp; |
| 1889 | 1892 |
| 1890 PlatformMouseEvent mouseEvent( | 1893 WebMouseEvent mouseEvent( |
| 1891 locationInRootFrame, globalPosition, | 1894 eventType, |
| 1892 WebPointerProperties::Button::NoButton, eventType, /* clickCount */ 0, | 1895 WebFloatPoint(locationInRootFrame.x(), locationInRootFrame.y()), |
| 1893 PlatformEvent::NoModifiers, PlatformMouseEvent::RealOrIndistinguishable, | 1896 WebFloatPoint(globalPosition.x(), globalPosition.y()), |
| 1894 TimeTicks::Now(), WebPointerProperties::PointerType::Mouse); | 1897 WebPointerProperties::Button::NoButton, /* clickCount */ 0, |
| 1898 PlatformEvent::NoModifiers, TimeTicks::Now().InSeconds()); | |
| 1899 | |
| 1900 // TODO(dtapuska): Transition the mouseEvent to be created really in viewport | |
| 1901 // coordinates instead of root frame coordinates. | |
|
bokan
2017/01/27 16:57:17
Why? The sendContextMenuEvent expects it in root f
dtapuska
2017/01/27 21:00:00
So that it is consistent for all events. Reading t
bokan
2017/01/27 21:08:47
Right, forgot that the |position| is really in vie
| |
| 1902 mouseEvent.setFrameScale(1); | |
| 1895 | 1903 |
| 1896 return sendContextMenuEvent(mouseEvent, overrideTargetElement); | 1904 return sendContextMenuEvent(mouseEvent, overrideTargetElement); |
| 1897 } | 1905 } |
| 1898 | 1906 |
| 1899 void EventHandler::scheduleHoverStateUpdate() { | 1907 void EventHandler::scheduleHoverStateUpdate() { |
| 1900 // TODO(https://crbug.com/668758): Use a normal BeginFrame update for this. | 1908 // TODO(https://crbug.com/668758): Use a normal BeginFrame update for this. |
| 1901 if (!m_hoverTimer.isActive() && | 1909 if (!m_hoverTimer.isActive() && |
| 1902 !m_mouseEventManager->isMousePositionUnknown()) | 1910 !m_mouseEventManager->isMousePositionUnknown()) |
| 1903 m_hoverTimer.startOneShot(0, BLINK_FROM_HERE); | 1911 m_hoverTimer.startOneShot(0, BLINK_FROM_HERE); |
| 1904 } | 1912 } |
| (...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1980 WebInputEventResult EventHandler::keyEvent( | 1988 WebInputEventResult EventHandler::keyEvent( |
| 1981 const WebKeyboardEvent& initialKeyEvent) { | 1989 const WebKeyboardEvent& initialKeyEvent) { |
| 1982 return m_keyboardEventManager->keyEvent(initialKeyEvent); | 1990 return m_keyboardEventManager->keyEvent(initialKeyEvent); |
| 1983 } | 1991 } |
| 1984 | 1992 |
| 1985 void EventHandler::defaultKeyboardEventHandler(KeyboardEvent* event) { | 1993 void EventHandler::defaultKeyboardEventHandler(KeyboardEvent* event) { |
| 1986 m_keyboardEventManager->defaultKeyboardEventHandler( | 1994 m_keyboardEventManager->defaultKeyboardEventHandler( |
| 1987 event, m_mouseEventManager->mousePressNode()); | 1995 event, m_mouseEventManager->mousePressNode()); |
| 1988 } | 1996 } |
| 1989 | 1997 |
| 1990 void EventHandler::dragSourceEndedAt(const PlatformMouseEvent& event, | 1998 void EventHandler::dragSourceEndedAt(const WebMouseEvent& event, |
| 1991 DragOperation operation) { | 1999 DragOperation operation) { |
| 1992 // Asides from routing the event to the correct frame, the hit test is also an | 2000 // Asides from routing the event to the correct frame, the hit test is also an |
| 1993 // opportunity for Layer to update the :hover and :active pseudoclasses. | 2001 // opportunity for Layer to update the :hover and :active pseudoclasses. |
| 1994 HitTestRequest request(HitTestRequest::Release); | 2002 HitTestRequest request(HitTestRequest::Release); |
| 1995 MouseEventWithHitTestResults mev = | 2003 MouseEventWithHitTestResults mev = |
| 1996 EventHandlingUtil::performMouseEventHitTest(m_frame, request, event); | 2004 EventHandlingUtil::performMouseEventHitTest(m_frame, request, event); |
| 1997 | 2005 |
| 1998 LocalFrame* targetFrame; | 2006 LocalFrame* targetFrame; |
| 1999 if (targetIsFrame(mev.innerNode(), targetFrame)) { | 2007 if (targetIsFrame(mev.innerNode(), targetFrame)) { |
| 2000 if (targetFrame) { | 2008 if (targetFrame) { |
| (...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2093 selectionController().passMousePressEventToSubframe(mev); | 2101 selectionController().passMousePressEventToSubframe(mev); |
| 2094 WebInputEventResult result = | 2102 WebInputEventResult result = |
| 2095 subframe->eventHandler().handleMousePressEvent(mev.event()); | 2103 subframe->eventHandler().handleMousePressEvent(mev.event()); |
| 2096 if (result != WebInputEventResult::NotHandled) | 2104 if (result != WebInputEventResult::NotHandled) |
| 2097 return result; | 2105 return result; |
| 2098 return WebInputEventResult::HandledSystem; | 2106 return WebInputEventResult::HandledSystem; |
| 2099 } | 2107 } |
| 2100 | 2108 |
| 2101 WebInputEventResult EventHandler::passMouseMoveEventToSubframe( | 2109 WebInputEventResult EventHandler::passMouseMoveEventToSubframe( |
| 2102 MouseEventWithHitTestResults& mev, | 2110 MouseEventWithHitTestResults& mev, |
| 2103 const Vector<PlatformMouseEvent>& coalescedEvents, | 2111 const Vector<WebMouseEvent>& coalescedEvents, |
| 2104 LocalFrame* subframe, | 2112 LocalFrame* subframe, |
| 2105 HitTestResult* hoveredNode) { | 2113 HitTestResult* hoveredNode) { |
| 2106 if (m_mouseEventManager->mouseDownMayStartDrag()) | 2114 if (m_mouseEventManager->mouseDownMayStartDrag()) |
| 2107 return WebInputEventResult::NotHandled; | 2115 return WebInputEventResult::NotHandled; |
| 2108 WebInputEventResult result = | 2116 WebInputEventResult result = |
| 2109 subframe->eventHandler().handleMouseMoveOrLeaveEvent( | 2117 subframe->eventHandler().handleMouseMoveOrLeaveEvent( |
| 2110 mev.event(), coalescedEvents, hoveredNode); | 2118 mev.event(), coalescedEvents, hoveredNode); |
| 2111 if (result != WebInputEventResult::NotHandled) | 2119 if (result != WebInputEventResult::NotHandled) |
| 2112 return result; | 2120 return result; |
| 2113 return WebInputEventResult::HandledSystem; | 2121 return WebInputEventResult::HandledSystem; |
| (...skipping 10 matching lines...) Expand all Loading... | |
| 2124 } | 2132 } |
| 2125 | 2133 |
| 2126 FrameHost* EventHandler::frameHost() const { | 2134 FrameHost* EventHandler::frameHost() const { |
| 2127 if (!m_frame->page()) | 2135 if (!m_frame->page()) |
| 2128 return nullptr; | 2136 return nullptr; |
| 2129 | 2137 |
| 2130 return &m_frame->page()->frameHost(); | 2138 return &m_frame->page()->frameHost(); |
| 2131 } | 2139 } |
| 2132 | 2140 |
| 2133 } // namespace blink | 2141 } // namespace blink |
| OLD | NEW |