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

Side by Side Diff: third_party/WebKit/Source/core/page/AutoscrollController.cpp

Issue 2289213002: Implement Middle Click Autoscroll on all platforms not just Windows (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Update a test Created 4 years, 3 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) 2013 Google Inc. All rights reserved. 2 * Copyright (C) 2013 Google Inc. All rights reserved.
3 * Copyright (C) 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc. All rights reserv ed. 3 * Copyright (C) 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc. All rights reserv ed.
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 83 matching lines...) Expand 10 before | Expand all | Expand 10 after
94 if (m_pressedLayoutObject) { 94 if (m_pressedLayoutObject) {
95 m_pressedLayoutObject->stopAutoscroll(); 95 m_pressedLayoutObject->stopAutoscroll();
96 m_pressedLayoutObject = nullptr; 96 m_pressedLayoutObject = nullptr;
97 } 97 }
98 LayoutBox* scrollable = m_autoscrollLayoutObject; 98 LayoutBox* scrollable = m_autoscrollLayoutObject;
99 m_autoscrollLayoutObject = nullptr; 99 m_autoscrollLayoutObject = nullptr;
100 100
101 if (!scrollable) 101 if (!scrollable)
102 return; 102 return;
103 103
104 #if OS(WIN) 104 if (RuntimeEnabledFeatures::panScrollingEnabled() && panScrollInProgress()) {
105 if (panScrollInProgress()) {
106 if (FrameView* view = scrollable->frame()->view()) { 105 if (FrameView* view = scrollable->frame()->view()) {
107 view->setCursor(pointerCursor()); 106 view->setCursor(pointerCursor());
108 } 107 }
109 } 108 }
110 #endif
111
112 m_autoscrollType = NoAutoscroll; 109 m_autoscrollType = NoAutoscroll;
113 } 110 }
114 111
115 void AutoscrollController::stopAutoscrollIfNeeded(LayoutObject* layoutObject) 112 void AutoscrollController::stopAutoscrollIfNeeded(LayoutObject* layoutObject)
116 { 113 {
117 if (m_pressedLayoutObject == layoutObject) 114 if (m_pressedLayoutObject == layoutObject)
118 m_pressedLayoutObject = nullptr; 115 m_pressedLayoutObject = nullptr;
119 116
120 if (m_autoscrollLayoutObject != layoutObject) 117 if (m_autoscrollLayoutObject != layoutObject)
121 return; 118 return;
122 m_autoscrollLayoutObject = nullptr; 119 m_autoscrollLayoutObject = nullptr;
123 m_autoscrollType = NoAutoscroll; 120 m_autoscrollType = NoAutoscroll;
124 } 121 }
125 122
126 void AutoscrollController::updateAutoscrollLayoutObject() 123 void AutoscrollController::updateAutoscrollLayoutObject()
127 { 124 {
128 if (!m_autoscrollLayoutObject) 125 if (!m_autoscrollLayoutObject)
129 return; 126 return;
130 127
131 LayoutObject* layoutObject = m_autoscrollLayoutObject; 128 LayoutObject* layoutObject = m_autoscrollLayoutObject;
132 129
133 #if OS(WIN) 130 if (RuntimeEnabledFeatures::panScrollingEnabled()) {
134 HitTestResult hitTest = layoutObject->frame()->eventHandler().hitTestResultA tPoint(m_panScrollStartPos, HitTestRequest::ReadOnly | HitTestRequest::Active); 131 HitTestResult hitTest = layoutObject->frame()->eventHandler().hitTestRes ultAtPoint(m_panScrollStartPos, HitTestRequest::ReadOnly | HitTestRequest::Activ e);
135 132
136 if (Node* nodeAtPoint = hitTest.innerNode()) 133 if (Node* nodeAtPoint = hitTest.innerNode())
137 layoutObject = nodeAtPoint->layoutObject(); 134 layoutObject = nodeAtPoint->layoutObject();
138 #endif 135 }
139 136
140 while (layoutObject && !(layoutObject->isBox() && toLayoutBox(layoutObject)- >canAutoscroll())) 137 while (layoutObject && !(layoutObject->isBox() && toLayoutBox(layoutObject)- >canAutoscroll()))
141 layoutObject = layoutObject->parent(); 138 layoutObject = layoutObject->parent();
142 139
143 m_autoscrollLayoutObject = layoutObject && layoutObject->isBox() ? toLayoutB ox(layoutObject) : nullptr; 140 m_autoscrollLayoutObject = layoutObject && layoutObject->isBox() ? toLayoutB ox(layoutObject) : nullptr;
144 141
145 if (m_autoscrollType != NoAutoscroll && !m_autoscrollLayoutObject) 142 if (m_autoscrollType != NoAutoscroll && !m_autoscrollLayoutObject)
146 m_autoscrollType = NoAutoscroll; 143 m_autoscrollType = NoAutoscroll;
147 } 144 }
148 145
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
180 m_autoscrollType = AutoscrollForDragAndDrop; 177 m_autoscrollType = AutoscrollForDragAndDrop;
181 m_autoscrollLayoutObject = scrollable; 178 m_autoscrollLayoutObject = scrollable;
182 m_dragAndDropAutoscrollStartTime = eventTime; 179 m_dragAndDropAutoscrollStartTime = eventTime;
183 startAutoscroll(); 180 startAutoscroll();
184 } else if (m_autoscrollLayoutObject != scrollable) { 181 } else if (m_autoscrollLayoutObject != scrollable) {
185 m_dragAndDropAutoscrollStartTime = eventTime; 182 m_dragAndDropAutoscrollStartTime = eventTime;
186 m_autoscrollLayoutObject = scrollable; 183 m_autoscrollLayoutObject = scrollable;
187 } 184 }
188 } 185 }
189 186
190 #if OS(WIN)
191 void AutoscrollController::handleMouseReleaseForPanScrolling(LocalFrame* frame, const PlatformMouseEvent& mouseEvent) 187 void AutoscrollController::handleMouseReleaseForPanScrolling(LocalFrame* frame, const PlatformMouseEvent& mouseEvent)
192 { 188 {
193 if (!frame->isMainFrame()) 189 if (!frame->isMainFrame())
194 return; 190 return;
195 switch (m_autoscrollType) { 191 switch (m_autoscrollType) {
196 case AutoscrollForPan: 192 case AutoscrollForPan:
197 if (mouseEvent.pointerProperties().button == WebPointerProperties::Butto n::Middle) 193 if (mouseEvent.pointerProperties().button == WebPointerProperties::Butto n::Middle)
198 m_autoscrollType = AutoscrollForPanCanStop; 194 m_autoscrollType = AutoscrollForPanCanStop;
199 break; 195 break;
200 case AutoscrollForPanCanStop: 196 case AutoscrollForPanCanStop:
(...skipping 17 matching lines...) Expand all
218 // We don't want to trigger the autoscroll or the panScroll if it's already active 214 // We don't want to trigger the autoscroll or the panScroll if it's already active
219 if (m_autoscrollType != NoAutoscroll) 215 if (m_autoscrollType != NoAutoscroll)
220 return; 216 return;
221 217
222 m_autoscrollType = AutoscrollForPan; 218 m_autoscrollType = AutoscrollForPan;
223 m_autoscrollLayoutObject = scrollable; 219 m_autoscrollLayoutObject = scrollable;
224 m_panScrollStartPos = lastKnownMousePosition; 220 m_panScrollStartPos = lastKnownMousePosition;
225 221
226 startAutoscroll(); 222 startAutoscroll();
227 } 223 }
228 #else
229 bool AutoscrollController::panScrollInProgress() const
230 {
231 return false;
232 }
233 #endif
234 224
235 // FIXME: This would get get better animation fidelity if it used the monotonicF rameBeginTime instead 225 // FIXME: This would get get better animation fidelity if it used the monotonicF rameBeginTime instead
236 // of WTF::currentTime(). 226 // of WTF::currentTime().
237 void AutoscrollController::animate(double) 227 void AutoscrollController::animate(double)
238 { 228 {
239 if (!m_autoscrollLayoutObject) { 229 if (!m_autoscrollLayoutObject) {
240 stopAutoscroll(); 230 stopAutoscroll();
241 return; 231 return;
242 } 232 }
243 233
244 EventHandler& eventHandler = m_autoscrollLayoutObject->frame()->eventHandler (); 234 EventHandler& eventHandler = m_autoscrollLayoutObject->frame()->eventHandler ();
245 switch (m_autoscrollType) { 235 switch (m_autoscrollType) {
246 case AutoscrollForDragAndDrop: 236 case AutoscrollForDragAndDrop:
247 if (WTF::currentTime() - m_dragAndDropAutoscrollStartTime > autoscrollDe lay) 237 if (WTF::currentTime() - m_dragAndDropAutoscrollStartTime > autoscrollDe lay)
248 m_autoscrollLayoutObject->autoscroll(m_dragAndDropAutoscrollReferenc ePosition); 238 m_autoscrollLayoutObject->autoscroll(m_dragAndDropAutoscrollReferenc ePosition);
249 break; 239 break;
250 case AutoscrollForSelection: 240 case AutoscrollForSelection:
251 if (!eventHandler.mousePressed()) { 241 if (!eventHandler.mousePressed()) {
252 stopAutoscroll(); 242 stopAutoscroll();
253 return; 243 return;
254 } 244 }
255 eventHandler.updateSelectionForMouseDrag(); 245 eventHandler.updateSelectionForMouseDrag();
256 m_autoscrollLayoutObject->autoscroll(eventHandler.lastKnownMousePosition ()); 246 m_autoscrollLayoutObject->autoscroll(eventHandler.lastKnownMousePosition ());
257 break; 247 break;
258 case NoAutoscroll: 248 case NoAutoscroll:
259 break; 249 break;
260 #if OS(WIN)
261 case AutoscrollForPanCanStop: 250 case AutoscrollForPanCanStop:
262 case AutoscrollForPan: 251 case AutoscrollForPan:
263 if (!panScrollInProgress()) { 252 if (!panScrollInProgress()) {
264 stopAutoscroll(); 253 stopAutoscroll();
265 return; 254 return;
266 } 255 }
267 if (FrameView* view = m_autoscrollLayoutObject->frame()->view()) 256 if (FrameView* view = m_autoscrollLayoutObject->frame()->view())
268 updatePanScrollState(view, eventHandler.lastKnownMousePosition()); 257 updatePanScrollState(view, eventHandler.lastKnownMousePosition());
269 m_autoscrollLayoutObject->panScroll(m_panScrollStartPos); 258 m_autoscrollLayoutObject->panScroll(m_panScrollStartPos);
270 break; 259 break;
271 #endif
272 } 260 }
273 if (m_autoscrollType != NoAutoscroll && m_autoscrollLayoutObject) 261 if (m_autoscrollType != NoAutoscroll && m_autoscrollLayoutObject)
274 m_page->chromeClient().scheduleAnimation(m_autoscrollLayoutObject->frame ()->view()); 262 m_page->chromeClient().scheduleAnimation(m_autoscrollLayoutObject->frame ()->view());
275 } 263 }
276 264
277 void AutoscrollController::startAutoscroll() 265 void AutoscrollController::startAutoscroll()
278 { 266 {
279 m_page->chromeClient().scheduleAnimation(m_autoscrollLayoutObject->frame()-> view()); 267 m_page->chromeClient().scheduleAnimation(m_autoscrollLayoutObject->frame()-> view());
280 } 268 }
281 269
282 #if OS(WIN)
283 void AutoscrollController::updatePanScrollState(FrameView* view, const IntPoint& lastKnownMousePosition) 270 void AutoscrollController::updatePanScrollState(FrameView* view, const IntPoint& lastKnownMousePosition)
284 { 271 {
285 // At the original click location we draw a 4 arrowed icon. Over this icon t here won't be any scroll 272 // At the original click location we draw a 4 arrowed icon. Over this icon t here won't be any scroll
286 // So we don't want to change the cursor over this area 273 // So we don't want to change the cursor over this area
287 bool east = m_panScrollStartPos.x() < (lastKnownMousePosition.x() - noPanScr ollRadius); 274 bool east = m_panScrollStartPos.x() < (lastKnownMousePosition.x() - noPanScr ollRadius);
288 bool west = m_panScrollStartPos.x() > (lastKnownMousePosition.x() + noPanScr ollRadius); 275 bool west = m_panScrollStartPos.x() > (lastKnownMousePosition.x() + noPanScr ollRadius);
289 bool north = m_panScrollStartPos.y() > (lastKnownMousePosition.y() + noPanSc rollRadius); 276 bool north = m_panScrollStartPos.y() > (lastKnownMousePosition.y() + noPanSc rollRadius);
290 bool south = m_panScrollStartPos.y() < (lastKnownMousePosition.y() - noPanSc rollRadius); 277 bool south = m_panScrollStartPos.y() < (lastKnownMousePosition.y() - noPanSc rollRadius);
291 278
292 if (m_autoscrollType == AutoscrollForPan && (east || west || north || south) ) 279 if (m_autoscrollType == AutoscrollForPan && (east || west || north || south) )
(...skipping 14 matching lines...) Expand all
307 else 294 else
308 view->setCursor(southPanningCursor()); 295 view->setCursor(southPanningCursor());
309 } else if (east) { 296 } else if (east) {
310 view->setCursor(eastPanningCursor()); 297 view->setCursor(eastPanningCursor());
311 } else if (west) { 298 } else if (west) {
312 view->setCursor(westPanningCursor()); 299 view->setCursor(westPanningCursor());
313 } else { 300 } else {
314 view->setCursor(middlePanningCursor()); 301 view->setCursor(middlePanningCursor());
315 } 302 }
316 } 303 }
317 #endif
318 304
319 } // namespace blink 305 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698