OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "content/renderer/input/input_handler_proxy.h" | 5 #include "content/renderer/input/input_handler_proxy.h" |
6 | 6 |
7 #include "base/auto_reset.h" | 7 #include "base/auto_reset.h" |
8 #include "base/command_line.h" | 8 #include "base/command_line.h" |
9 #include "base/logging.h" | 9 #include "base/logging.h" |
10 #include "base/metrics/histogram.h" | 10 #include "base/metrics/histogram.h" |
(...skipping 150 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
161 "Event.Latency.RendererImpl.GestureFlingStart", | 161 "Event.Latency.RendererImpl.GestureFlingStart", |
162 delta.InMicroseconds(), 1, 1000000, 100); | 162 delta.InMicroseconds(), 1, 1000000, 100); |
163 break; | 163 break; |
164 default: | 164 default: |
165 NOTREACHED(); | 165 NOTREACHED(); |
166 break; | 166 break; |
167 } | 167 } |
168 } | 168 } |
169 } | 169 } |
170 | 170 |
| 171 cc::InputHandler::RailsMode ConvertRailsMode( |
| 172 blink::WebInputEvent::RailsMode rails_mode) { |
| 173 switch (rails_mode) { |
| 174 case blink::WebInputEvent::RailsModeFree: |
| 175 return cc::InputHandler::RAILS_MODE_FREE; |
| 176 case blink::WebInputEvent::RailsModeHorizontal: |
| 177 return cc::InputHandler::RAILS_MODE_HORIZONTAL; |
| 178 case blink::WebInputEvent::RailsModeVertical: |
| 179 return cc::InputHandler::RAILS_MODE_VERTICAL; |
| 180 default: |
| 181 NOTREACHED(); |
| 182 break; |
| 183 } |
| 184 return cc::InputHandler::RAILS_MODE_FREE; |
| 185 } |
| 186 |
171 } // namespace | 187 } // namespace |
172 | 188 |
173 namespace content { | 189 namespace content { |
174 | 190 |
175 InputHandlerProxy::InputHandlerProxy(cc::InputHandler* input_handler, | 191 InputHandlerProxy::InputHandlerProxy(cc::InputHandler* input_handler, |
176 InputHandlerProxyClient* client) | 192 InputHandlerProxyClient* client) |
177 : client_(client), | 193 : client_(client), |
178 input_handler_(input_handler), | 194 input_handler_(input_handler), |
179 deferred_fling_cancel_time_seconds_(0), | 195 deferred_fling_cancel_time_seconds_(0), |
180 #ifndef NDEBUG | 196 #ifndef NDEBUG |
(...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
324 break; | 340 break; |
325 } | 341 } |
326 | 342 |
327 return DID_NOT_HANDLE; | 343 return DID_NOT_HANDLE; |
328 } | 344 } |
329 | 345 |
330 InputHandlerProxy::EventDisposition InputHandlerProxy::HandleMouseWheel( | 346 InputHandlerProxy::EventDisposition InputHandlerProxy::HandleMouseWheel( |
331 const WebMouseWheelEvent& wheel_event) { | 347 const WebMouseWheelEvent& wheel_event) { |
332 InputHandlerProxy::EventDisposition result = DID_NOT_HANDLE; | 348 InputHandlerProxy::EventDisposition result = DID_NOT_HANDLE; |
333 cc::InputHandlerScrollResult scroll_result; | 349 cc::InputHandlerScrollResult scroll_result; |
334 | 350 const gfx::Vector2dF scroll_delta(-wheel_event.deltaX, -wheel_event.deltaY); |
335 // TODO(ccameron): The rail information should be pushed down into | 351 const cc::InputHandler::RailsMode rails_mode = |
336 // InputHandler. | 352 ConvertRailsMode(wheel_event.railsMode); |
337 gfx::Vector2dF scroll_delta( | |
338 wheel_event.railsMode != WebInputEvent::RailsModeVertical | |
339 ? -wheel_event.deltaX | |
340 : 0, | |
341 wheel_event.railsMode != WebInputEvent::RailsModeHorizontal | |
342 ? -wheel_event.deltaY | |
343 : 0); | |
344 | 353 |
345 if (wheel_event.scrollByPage) { | 354 if (wheel_event.scrollByPage) { |
346 // TODO(jamesr): We don't properly handle scroll by page in the compositor | 355 // TODO(jamesr): We don't properly handle scroll by page in the compositor |
347 // thread, so punt it to the main thread. http://crbug.com/236639 | 356 // thread, so punt it to the main thread. http://crbug.com/236639 |
348 result = DID_NOT_HANDLE; | 357 result = DID_NOT_HANDLE; |
349 } else if (!wheel_event.canScroll) { | 358 } else if (!wheel_event.canScroll) { |
350 // Wheel events with |canScroll| == false will not trigger scrolling, | 359 // Wheel events with |canScroll| == false will not trigger scrolling, |
351 // only event handlers. Forward to the main thread. | 360 // only event handlers. Forward to the main thread. |
352 result = DID_NOT_HANDLE; | 361 result = DID_NOT_HANDLE; |
353 } else if (smooth_scroll_enabled_) { | 362 } else if (smooth_scroll_enabled_) { |
(...skipping 13 matching lines...) Expand all Loading... |
367 } else { | 376 } else { |
368 cc::InputHandler::ScrollStatus scroll_status = input_handler_->ScrollBegin( | 377 cc::InputHandler::ScrollStatus scroll_status = input_handler_->ScrollBegin( |
369 gfx::Point(wheel_event.x, wheel_event.y), cc::InputHandler::WHEEL); | 378 gfx::Point(wheel_event.x, wheel_event.y), cc::InputHandler::WHEEL); |
370 switch (scroll_status) { | 379 switch (scroll_status) { |
371 case cc::InputHandler::SCROLL_STARTED: { | 380 case cc::InputHandler::SCROLL_STARTED: { |
372 TRACE_EVENT_INSTANT2("input", | 381 TRACE_EVENT_INSTANT2("input", |
373 "InputHandlerProxy::handle_input wheel scroll", | 382 "InputHandlerProxy::handle_input wheel scroll", |
374 TRACE_EVENT_SCOPE_THREAD, "deltaX", | 383 TRACE_EVENT_SCOPE_THREAD, "deltaX", |
375 scroll_delta.x(), "deltaY", scroll_delta.y()); | 384 scroll_delta.x(), "deltaY", scroll_delta.y()); |
376 gfx::Point scroll_point(wheel_event.x, wheel_event.y); | 385 gfx::Point scroll_point(wheel_event.x, wheel_event.y); |
377 scroll_result = input_handler_->ScrollBy(scroll_point, scroll_delta); | 386 scroll_result = |
| 387 input_handler_->ScrollBy(scroll_point, scroll_delta, rails_mode); |
378 HandleOverscroll(scroll_point, scroll_result); | 388 HandleOverscroll(scroll_point, scroll_result); |
379 input_handler_->ScrollEnd(); | 389 input_handler_->ScrollEnd(); |
380 result = scroll_result.did_scroll ? DID_HANDLE : DROP_EVENT; | 390 result = scroll_result.did_scroll ? DID_HANDLE : DROP_EVENT; |
381 break; | 391 break; |
382 } | 392 } |
383 case cc::InputHandler::SCROLL_IGNORED: | 393 case cc::InputHandler::SCROLL_IGNORED: |
384 // TODO(jamesr): This should be DROP_EVENT, but in cases where we fail | 394 // TODO(jamesr): This should be DROP_EVENT, but in cases where we fail |
385 // to properly sync scrollability it's safer to send the event to the | 395 // to properly sync scrollability it's safer to send the event to the |
386 // main thread. Change back to DROP_EVENT once we have synchronization | 396 // main thread. Change back to DROP_EVENT once we have synchronization |
387 // bugs sorted out. | 397 // bugs sorted out. |
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
452 DCHECK(expect_scroll_update_end_); | 462 DCHECK(expect_scroll_update_end_); |
453 #endif | 463 #endif |
454 | 464 |
455 if (!gesture_scroll_on_impl_thread_ && !gesture_pinch_on_impl_thread_) | 465 if (!gesture_scroll_on_impl_thread_ && !gesture_pinch_on_impl_thread_) |
456 return DID_NOT_HANDLE; | 466 return DID_NOT_HANDLE; |
457 | 467 |
458 gfx::Point scroll_point(gesture_event.x, gesture_event.y); | 468 gfx::Point scroll_point(gesture_event.x, gesture_event.y); |
459 gfx::Vector2dF scroll_delta(-gesture_event.data.scrollUpdate.deltaX, | 469 gfx::Vector2dF scroll_delta(-gesture_event.data.scrollUpdate.deltaX, |
460 -gesture_event.data.scrollUpdate.deltaY); | 470 -gesture_event.data.scrollUpdate.deltaY); |
461 cc::InputHandlerScrollResult scroll_result = input_handler_->ScrollBy( | 471 cc::InputHandlerScrollResult scroll_result = input_handler_->ScrollBy( |
462 scroll_point, scroll_delta); | 472 scroll_point, scroll_delta, cc::InputHandler::RAILS_MODE_FREE); |
463 HandleOverscroll(scroll_point, scroll_result); | 473 HandleOverscroll(scroll_point, scroll_result); |
464 return scroll_result.did_scroll ? DID_HANDLE : DROP_EVENT; | 474 return scroll_result.did_scroll ? DID_HANDLE : DROP_EVENT; |
465 } | 475 } |
466 | 476 |
467 InputHandlerProxy::EventDisposition InputHandlerProxy::HandleGestureScrollEnd( | 477 InputHandlerProxy::EventDisposition InputHandlerProxy::HandleGestureScrollEnd( |
468 const WebGestureEvent& gesture_event) { | 478 const WebGestureEvent& gesture_event) { |
469 #ifndef NDEBUG | 479 #ifndef NDEBUG |
470 DCHECK(expect_scroll_update_end_); | 480 DCHECK(expect_scroll_update_end_); |
471 expect_scroll_update_end_ = false; | 481 expect_scroll_update_end_ = false; |
472 #endif | 482 #endif |
(...skipping 455 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
928 clipped_increment.height); | 938 clipped_increment.height); |
929 | 939 |
930 bool did_scroll = false; | 940 bool did_scroll = false; |
931 | 941 |
932 switch (fling_parameters_.sourceDevice) { | 942 switch (fling_parameters_.sourceDevice) { |
933 case blink::WebGestureDeviceTouchpad: | 943 case blink::WebGestureDeviceTouchpad: |
934 did_scroll = TouchpadFlingScroll(clipped_increment); | 944 did_scroll = TouchpadFlingScroll(clipped_increment); |
935 break; | 945 break; |
936 case blink::WebGestureDeviceTouchscreen: { | 946 case blink::WebGestureDeviceTouchscreen: { |
937 clipped_increment = ToClientScrollIncrement(clipped_increment); | 947 clipped_increment = ToClientScrollIncrement(clipped_increment); |
938 cc::InputHandlerScrollResult scroll_result = input_handler_->ScrollBy( | 948 cc::InputHandlerScrollResult scroll_result = |
939 fling_parameters_.point, clipped_increment); | 949 input_handler_->ScrollBy(fling_parameters_.point, clipped_increment, |
| 950 cc::InputHandler::RAILS_MODE_FREE); |
940 HandleOverscroll(fling_parameters_.point, scroll_result); | 951 HandleOverscroll(fling_parameters_.point, scroll_result); |
941 did_scroll = scroll_result.did_scroll; | 952 did_scroll = scroll_result.did_scroll; |
942 } break; | 953 } break; |
943 } | 954 } |
944 | 955 |
945 if (did_scroll) { | 956 if (did_scroll) { |
946 fling_parameters_.cumulativeScroll.width += clipped_increment.width; | 957 fling_parameters_.cumulativeScroll.width += clipped_increment.width; |
947 fling_parameters_.cumulativeScroll.height += clipped_increment.height; | 958 fling_parameters_.cumulativeScroll.height += clipped_increment.height; |
948 } | 959 } |
949 | 960 |
950 // It's possible the provided |increment| is sufficiently small as to not | 961 // It's possible the provided |increment| is sufficiently small as to not |
951 // trigger a scroll, e.g., with a trivial time delta between fling updates. | 962 // trigger a scroll, e.g., with a trivial time delta between fling updates. |
952 // Return true in this case to prevent early fling termination. | 963 // Return true in this case to prevent early fling termination. |
953 if (std::abs(clipped_increment.width) < kScrollEpsilon && | 964 if (std::abs(clipped_increment.width) < kScrollEpsilon && |
954 std::abs(clipped_increment.height) < kScrollEpsilon) | 965 std::abs(clipped_increment.height) < kScrollEpsilon) |
955 return true; | 966 return true; |
956 | 967 |
957 return did_scroll; | 968 return did_scroll; |
958 } | 969 } |
959 | 970 |
960 } // namespace content | 971 } // namespace content |
OLD | NEW |