| 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 |