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

Side by Side Diff: Source/core/page/EventHandler.cpp

Issue 46353003: Switch AutoscrollController to use animation system instead of timer (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@gclient
Patch Set: addresses review feedback Created 7 years, 1 month 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
« no previous file with comments | « Source/core/page/EventHandler.h ('k') | Source/core/page/FocusController.cpp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc. All rights reserv ed. 2 * Copyright (C) 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc. All rights reserv ed.
3 * Copyright (C) 2006 Alexey Proskuryakov (ap@webkit.org) 3 * Copyright (C) 2006 Alexey Proskuryakov (ap@webkit.org)
4 * Copyright (C) 2012 Digia Plc. and/or its subsidiary(-ies) 4 * Copyright (C) 2012 Digia Plc. and/or its subsidiary(-ies)
5 * 5 *
6 * Redistribution and use in source and binary forms, with or without 6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions 7 * modification, are permitted provided that the following conditions
8 * are met: 8 * are met:
9 * 1. Redistributions of source code must retain the above copyright 9 * 1. Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer. 10 * notice, this list of conditions and the following disclaimer.
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
50 #include "core/events/ThreadLocalEventNames.h" 50 #include "core/events/ThreadLocalEventNames.h"
51 #include "core/events/TouchEvent.h" 51 #include "core/events/TouchEvent.h"
52 #include "core/events/WheelEvent.h" 52 #include "core/events/WheelEvent.h"
53 #include "core/fetch/ImageResource.h" 53 #include "core/fetch/ImageResource.h"
54 #include "core/html/HTMLDialogElement.h" 54 #include "core/html/HTMLDialogElement.h"
55 #include "core/html/HTMLFrameElementBase.h" 55 #include "core/html/HTMLFrameElementBase.h"
56 #include "core/html/HTMLFrameSetElement.h" 56 #include "core/html/HTMLFrameSetElement.h"
57 #include "core/html/HTMLInputElement.h" 57 #include "core/html/HTMLInputElement.h"
58 #include "core/loader/FrameLoader.h" 58 #include "core/loader/FrameLoader.h"
59 #include "core/loader/FrameLoaderClient.h" 59 #include "core/loader/FrameLoaderClient.h"
60 #include "core/page/AutoscrollController.h"
60 #include "core/page/BackForwardClient.h" 61 #include "core/page/BackForwardClient.h"
61 #include "core/page/Chrome.h" 62 #include "core/page/Chrome.h"
62 #include "core/page/DragController.h" 63 #include "core/page/DragController.h"
63 #include "core/page/DragState.h" 64 #include "core/page/DragState.h"
64 #include "core/page/EditorClient.h" 65 #include "core/page/EditorClient.h"
65 #include "core/page/FocusController.h" 66 #include "core/page/FocusController.h"
66 #include "core/frame/Frame.h" 67 #include "core/frame/Frame.h"
67 #include "core/page/FrameTree.h" 68 #include "core/page/FrameTree.h"
68 #include "core/frame/FrameView.h" 69 #include "core/frame/FrameView.h"
69 #include "core/page/MouseEventWithHitTestResults.h" 70 #include "core/page/MouseEventWithHitTestResults.h"
(...skipping 625 matching lines...) Expand 10 before | Expand all | Expand 10 after
695 return false; 696 return false;
696 697
697 renderer = parent->renderer(); 698 renderer = parent->renderer();
698 if (!renderer || !renderer->isListBox()) 699 if (!renderer || !renderer->isListBox())
699 return false; 700 return false;
700 } 701 }
701 702
702 m_mouseDownMayStartDrag = false; 703 m_mouseDownMayStartDrag = false;
703 704
704 if (m_mouseDownMayStartAutoscroll && !panScrollInProgress()) { 705 if (m_mouseDownMayStartAutoscroll && !panScrollInProgress()) {
705 if (Page* page = m_frame->page()) { 706 if (AutoscrollController* controller = autoscrollController()) {
706 page->startAutoscrollForSelection(renderer); 707 controller->startAutoscrollForSelection(renderer);
707 m_mouseDownMayStartAutoscroll = false; 708 m_mouseDownMayStartAutoscroll = false;
708 } 709 }
709 } 710 }
710 711
711 if (m_selectionInitiationState != ExtendedSelection) { 712 if (m_selectionInitiationState != ExtendedSelection) {
712 HitTestRequest request(HitTestRequest::ReadOnly | HitTestRequest::Active | HitTestRequest::DisallowShadowContent); 713 HitTestRequest request(HitTestRequest::ReadOnly | HitTestRequest::Active | HitTestRequest::DisallowShadowContent);
713 HitTestResult result(m_mouseDownPos); 714 HitTestResult result(m_mouseDownPos);
714 m_frame->document()->renderView()->hitTest(request, result); 715 m_frame->document()->renderView()->hitTest(request, result);
715 716
716 updateSelectionForMouseDrag(result); 717 updateSelectionForMouseDrag(result);
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after
793 794
794 if (m_frame->selection().granularity() != CharacterGranularity) 795 if (m_frame->selection().granularity() != CharacterGranularity)
795 newSelection.expandUsingGranularity(m_frame->selection().granularity()); 796 newSelection.expandUsingGranularity(m_frame->selection().granularity());
796 797
797 m_frame->selection().setNonDirectionalSelectionIfNeeded(newSelection, m_fram e->selection().granularity(), 798 m_frame->selection().setNonDirectionalSelectionIfNeeded(newSelection, m_fram e->selection().granularity(),
798 FrameSelection::AdjustEndpointsAtBidiBoundary); 799 FrameSelection::AdjustEndpointsAtBidiBoundary);
799 } 800 }
800 801
801 bool EventHandler::handleMouseReleaseEvent(const MouseEventWithHitTestResults& e vent) 802 bool EventHandler::handleMouseReleaseEvent(const MouseEventWithHitTestResults& e vent)
802 { 803 {
803 Page* page = m_frame->page(); 804 AutoscrollController* controller = autoscrollController();
804 if (page && page->autoscrollInProgress()) 805 if (controller && controller->autoscrollInProgress())
805 stopAutoscrollTimer(); 806 stopAutoscroll();
806 807
807 // Used to prevent mouseMoveEvent from initiating a drag before 808 // Used to prevent mouseMoveEvent from initiating a drag before
808 // the mouse is pressed again. 809 // the mouse is pressed again.
809 m_mousePressed = false; 810 m_mousePressed = false;
810 m_capturesDragging = false; 811 m_capturesDragging = false;
811 m_mouseDownMayStartDrag = false; 812 m_mouseDownMayStartDrag = false;
812 m_mouseDownMayStartSelect = false; 813 m_mouseDownMayStartSelect = false;
813 m_mouseDownMayStartAutoscroll = false; 814 m_mouseDownMayStartAutoscroll = false;
814 m_mouseDownWasInSubframe = false; 815 m_mouseDownWasInSubframe = false;
815 816
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
847 848
848 return handled; 849 return handled;
849 } 850 }
850 851
851 #if OS(WIN) 852 #if OS(WIN)
852 853
853 void EventHandler::startPanScrolling(RenderObject* renderer) 854 void EventHandler::startPanScrolling(RenderObject* renderer)
854 { 855 {
855 if (!renderer->isBox()) 856 if (!renderer->isBox())
856 return; 857 return;
857 Page* page = m_frame->page(); 858 AutoscrollController* controller = autoscrollController();
858 if (!page) 859 if (!controller)
859 return; 860 return;
860 page->startPanScrolling(toRenderBox(renderer), lastKnownMousePosition()); 861 controller->startPanScrolling(toRenderBox(renderer), lastKnownMousePosition( ));
861 invalidateClick(); 862 invalidateClick();
862 } 863 }
863 864
864 #endif // OS(WIN) 865 #endif // OS(WIN)
865 866
867 AutoscrollController* EventHandler::autoscrollController() const
868 {
869 if (Page* page = m_frame->page())
870 return &page->autoscrollController();
871 return 0;
872 }
873
866 bool EventHandler::panScrollInProgress() const 874 bool EventHandler::panScrollInProgress() const
867 { 875 {
868 Page* page = m_frame->page(); 876 return autoscrollController() && autoscrollController()->panScrollInProgress ();
869 return page && page->panScrollInProgress();
870 } 877 }
871 878
872 HitTestResult EventHandler::hitTestResultAtPoint(const LayoutPoint& point, HitTe stRequest::HitTestRequestType hitType, const LayoutSize& padding) 879 HitTestResult EventHandler::hitTestResultAtPoint(const LayoutPoint& point, HitTe stRequest::HitTestRequestType hitType, const LayoutSize& padding)
873 { 880 {
874 // We always send hitTestResultAtPoint to the main frame if we have one, 881 // We always send hitTestResultAtPoint to the main frame if we have one,
875 // otherwise we might hit areas that are obscured by higher frames. 882 // otherwise we might hit areas that are obscured by higher frames.
876 if (Page* page = m_frame->page()) { 883 if (Page* page = m_frame->page()) {
877 Frame* mainFrame = page->mainFrame(); 884 Frame* mainFrame = page->mainFrame();
878 if (m_frame != mainFrame) { 885 if (m_frame != mainFrame) {
879 FrameView* frameView = m_frame->view(); 886 FrameView* frameView = m_frame->view();
(...skipping 21 matching lines...) Expand all
901 m_frame->contentRenderer()->hitTest(request, result); 908 m_frame->contentRenderer()->hitTest(request, result);
902 if (!request.readOnly()) 909 if (!request.readOnly())
903 m_frame->document()->updateHoverActiveState(request, result.innerElement ()); 910 m_frame->document()->updateHoverActiveState(request, result.innerElement ());
904 911
905 if (request.disallowsShadowContent()) 912 if (request.disallowsShadowContent())
906 result.setToNodesInDocumentTreeScope(); 913 result.setToNodesInDocumentTreeScope();
907 914
908 return result; 915 return result;
909 } 916 }
910 917
911 void EventHandler::stopAutoscrollTimer() 918 void EventHandler::stopAutoscroll()
912 { 919 {
913 Page* page = m_frame->page(); 920 if (AutoscrollController* controller = autoscrollController())
914 if (!page) 921 controller->stopAutoscroll();
915 return;
916 page->stopAutoscrollTimer();
917 } 922 }
918 923
919 Node* EventHandler::mousePressNode() const 924 Node* EventHandler::mousePressNode() const
920 { 925 {
921 return m_mousePressNode.get(); 926 return m_mousePressNode.get();
922 } 927 }
923 928
924 bool EventHandler::scrollOverflow(ScrollDirection direction, ScrollGranularity g ranularity, Node* startingNode) 929 bool EventHandler::scrollOverflow(ScrollDirection direction, ScrollGranularity g ranularity, Node* startingNode)
925 { 930 {
926 Node* node = startingNode; 931 Node* node = startingNode;
(...skipping 420 matching lines...) Expand 10 before | Expand all | Expand 10 after
1347 m_capturesDragging = subframe->eventHandler().capturesDragging(); 1352 m_capturesDragging = subframe->eventHandler().capturesDragging();
1348 if (m_mousePressed && m_capturesDragging) { 1353 if (m_mousePressed && m_capturesDragging) {
1349 m_capturingMouseEventsNode = mev.targetNode(); 1354 m_capturingMouseEventsNode = mev.targetNode();
1350 m_eventHandlerWillResetCapturingMouseEventsNode = true; 1355 m_eventHandlerWillResetCapturingMouseEventsNode = true;
1351 } 1356 }
1352 invalidateClick(); 1357 invalidateClick();
1353 return true; 1358 return true;
1354 } 1359 }
1355 1360
1356 #if OS(WIN) 1361 #if OS(WIN)
1357 // We store whether pan scrolling is in progress before calling stopAutoscro llTimer() 1362 // We store whether pan scrolling is in progress before calling stopAutoscro ll()
1358 // because it will set m_autoscrollType to NoAutoscroll on return. 1363 // because it will set m_autoscrollType to NoAutoscroll on return.
1359 bool isPanScrollInProgress = panScrollInProgress(); 1364 bool isPanScrollInProgress = panScrollInProgress();
1360 stopAutoscrollTimer(); 1365 stopAutoscroll();
1361 if (isPanScrollInProgress) { 1366 if (isPanScrollInProgress) {
1362 // We invalidate the click when exiting pan scrolling so that we don't i nadvertently navigate 1367 // We invalidate the click when exiting pan scrolling so that we don't i nadvertently navigate
1363 // away from the current page (e.g. the click was on a hyperlink). See < rdar://problem/6095023>. 1368 // away from the current page (e.g. the click was on a hyperlink). See < rdar://problem/6095023>.
1364 invalidateClick(); 1369 invalidateClick();
1365 return true; 1370 return true;
1366 } 1371 }
1367 #endif 1372 #endif
1368 1373
1369 m_clickCount = mouseEvent.clickCount(); 1374 m_clickCount = mouseEvent.clickCount();
1370 m_clickNode = mev.targetNode(); 1375 m_clickNode = mev.targetNode();
(...skipping 274 matching lines...) Expand 10 before | Expand all | Expand 10 after
1645 1650
1646 OwnPtr<UserGestureIndicator> gestureIndicator; 1651 OwnPtr<UserGestureIndicator> gestureIndicator;
1647 1652
1648 if (m_frame->tree().top()->eventHandler().m_lastMouseDownUserGestureToken) 1653 if (m_frame->tree().top()->eventHandler().m_lastMouseDownUserGestureToken)
1649 gestureIndicator = adoptPtr(new UserGestureIndicator(m_frame->tree().top ()->eventHandler().m_lastMouseDownUserGestureToken.release())); 1654 gestureIndicator = adoptPtr(new UserGestureIndicator(m_frame->tree().top ()->eventHandler().m_lastMouseDownUserGestureToken.release()));
1650 else 1655 else
1651 gestureIndicator = adoptPtr(new UserGestureIndicator(DefinitelyProcessin gUserGesture)); 1656 gestureIndicator = adoptPtr(new UserGestureIndicator(DefinitelyProcessin gUserGesture));
1652 1657
1653 #if OS(WIN) 1658 #if OS(WIN)
1654 if (Page* page = m_frame->page()) 1659 if (Page* page = m_frame->page())
1655 page->handleMouseReleaseForPanScrolling(m_frame, mouseEvent); 1660 page->autoscrollController().handleMouseReleaseForPanScrolling(m_frame, mouseEvent);
1656 #endif 1661 #endif
1657 1662
1658 m_mousePressed = false; 1663 m_mousePressed = false;
1659 setLastKnownMousePosition(mouseEvent); 1664 setLastKnownMousePosition(mouseEvent);
1660 1665
1661 if (m_svgPan) { 1666 if (m_svgPan) {
1662 m_svgPan = false; 1667 m_svgPan = false;
1663 toSVGDocument(m_frame->document())->updatePan(m_frame->view()->windowToC ontents(m_lastKnownMousePosition)); 1668 toSVGDocument(m_frame->document())->updatePan(m_frame->view()->windowToC ontents(m_lastKnownMousePosition));
1664 return true; 1669 return true;
1665 } 1670 }
(...skipping 150 matching lines...) Expand 10 before | Expand all | Expand 10 after
1816 return false; 1821 return false;
1817 1822
1818 HitTestRequest request(HitTestRequest::ReadOnly | HitTestRequest::DisallowSh adowContent); 1823 HitTestRequest request(HitTestRequest::ReadOnly | HitTestRequest::DisallowSh adowContent);
1819 MouseEventWithHitTestResults mev = prepareMouseEvent(request, event); 1824 MouseEventWithHitTestResults mev = prepareMouseEvent(request, event);
1820 1825
1821 // Drag events should never go to text nodes (following IE, and proper mouse over/out dispatch) 1826 // Drag events should never go to text nodes (following IE, and proper mouse over/out dispatch)
1822 RefPtr<Node> newTarget = mev.targetNode(); 1827 RefPtr<Node> newTarget = mev.targetNode();
1823 if (newTarget && newTarget->isTextNode()) 1828 if (newTarget && newTarget->isTextNode())
1824 newTarget = EventPath::parent(newTarget.get()); 1829 newTarget = EventPath::parent(newTarget.get());
1825 1830
1826 if (Page* page = m_frame->page()) 1831 if (AutoscrollController* controller = autoscrollController())
1827 page->updateDragAndDrop(newTarget.get(), event.position(), event.timesta mp()); 1832 controller->updateDragAndDrop(newTarget.get(), event.position(), event.t imestamp());
1828 1833
1829 if (m_dragTarget != newTarget) { 1834 if (m_dragTarget != newTarget) {
1830 // FIXME: this ordering was explicitly chosen to match WinIE. However, 1835 // FIXME: this ordering was explicitly chosen to match WinIE. However,
1831 // it is sometimes incorrect when dragging within subframes, as seen wit h 1836 // it is sometimes incorrect when dragging within subframes, as seen wit h
1832 // LayoutTests/fast/events/drag-in-frames.html. 1837 // LayoutTests/fast/events/drag-in-frames.html.
1833 // 1838 //
1834 // Moreover, this ordering conforms to section 7.9.4 of the HTML 5 spec. <http://dev.w3.org/html5/spec/Overview.html#drag-and-drop-processing-model>. 1839 // Moreover, this ordering conforms to section 7.9.4 of the HTML 5 spec. <http://dev.w3.org/html5/spec/Overview.html#drag-and-drop-processing-model>.
1835 Frame* targetFrame; 1840 Frame* targetFrame;
1836 if (targetIsFrame(newTarget.get(), targetFrame)) { 1841 if (targetIsFrame(newTarget.get(), targetFrame)) {
1837 if (targetFrame) 1842 if (targetFrame)
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after
1902 if (targetFrame) 1907 if (targetFrame)
1903 preventedDefault = targetFrame->eventHandler().performDragAndDrop(ev ent, clipboard); 1908 preventedDefault = targetFrame->eventHandler().performDragAndDrop(ev ent, clipboard);
1904 } else if (m_dragTarget.get()) 1909 } else if (m_dragTarget.get())
1905 preventedDefault = dispatchDragEvent(EventTypeNames::drop, m_dragTarget. get(), event, clipboard); 1910 preventedDefault = dispatchDragEvent(EventTypeNames::drop, m_dragTarget. get(), event, clipboard);
1906 clearDragState(); 1911 clearDragState();
1907 return preventedDefault; 1912 return preventedDefault;
1908 } 1913 }
1909 1914
1910 void EventHandler::clearDragState() 1915 void EventHandler::clearDragState()
1911 { 1916 {
1912 stopAutoscrollTimer(); 1917 stopAutoscroll();
1913 m_dragTarget = 0; 1918 m_dragTarget = 0;
1914 m_capturingMouseEventsNode = 0; 1919 m_capturingMouseEventsNode = 0;
1915 m_shouldOnlyFireDragOverEvent = false; 1920 m_shouldOnlyFireDragOverEvent = false;
1916 } 1921 }
1917 1922
1918 void EventHandler::setCapturingMouseEventsNode(PassRefPtr<Node> n) 1923 void EventHandler::setCapturingMouseEventsNode(PassRefPtr<Node> n)
1919 { 1924 {
1920 m_capturingMouseEventsNode = n; 1925 m_capturingMouseEventsNode = n;
1921 m_eventHandlerWillResetCapturingMouseEventsNode = false; 1926 m_eventHandlerWillResetCapturingMouseEventsNode = false;
1922 } 1927 }
(...skipping 1088 matching lines...) Expand 10 before | Expand all | Expand 10 after
3011 return false; 3016 return false;
3012 } 3017 }
3013 3018
3014 if (initialKeyEvent.windowsVirtualKeyCode() == VK_CAPITAL) 3019 if (initialKeyEvent.windowsVirtualKeyCode() == VK_CAPITAL)
3015 capsLockStateMayHaveChanged(); 3020 capsLockStateMayHaveChanged();
3016 3021
3017 #if OS(WIN) 3022 #if OS(WIN)
3018 if (panScrollInProgress()) { 3023 if (panScrollInProgress()) {
3019 // If a key is pressed while the panScroll is in progress then we want t o stop 3024 // If a key is pressed while the panScroll is in progress then we want t o stop
3020 if (initialKeyEvent.type() == PlatformEvent::KeyDown || initialKeyEvent. type() == PlatformEvent::RawKeyDown) 3025 if (initialKeyEvent.type() == PlatformEvent::KeyDown || initialKeyEvent. type() == PlatformEvent::RawKeyDown)
3021 stopAutoscrollTimer(); 3026 stopAutoscroll();
3022 3027
3023 // If we were in panscroll mode, we swallow the key event 3028 // If we were in panscroll mode, we swallow the key event
3024 return true; 3029 return true;
3025 } 3030 }
3026 #endif 3031 #endif
3027 3032
3028 // Check for cases where we are too early for events -- possible unmatched k ey up 3033 // Check for cases where we are too early for events -- possible unmatched k ey up
3029 // from pressing return in the location bar. 3034 // from pressing return in the location bar.
3030 RefPtr<Node> node = eventTargetNodeForDocument(m_frame->document()); 3035 RefPtr<Node> node = eventTargetNodeForDocument(m_frame->document());
3031 if (!node) 3036 if (!node)
(...skipping 838 matching lines...) Expand 10 before | Expand all | Expand 10 after
3870 unsigned EventHandler::accessKeyModifiers() 3875 unsigned EventHandler::accessKeyModifiers()
3871 { 3876 {
3872 #if OS(MACOSX) 3877 #if OS(MACOSX)
3873 return PlatformEvent::CtrlKey | PlatformEvent::AltKey; 3878 return PlatformEvent::CtrlKey | PlatformEvent::AltKey;
3874 #else 3879 #else
3875 return PlatformEvent::AltKey; 3880 return PlatformEvent::AltKey;
3876 #endif 3881 #endif
3877 } 3882 }
3878 3883
3879 } // namespace WebCore 3884 } // namespace WebCore
OLDNEW
« no previous file with comments | « Source/core/page/EventHandler.h ('k') | Source/core/page/FocusController.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698