| 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 "ui/events/blink/input_handler_proxy.h" | 5 #include "ui/events/blink/input_handler_proxy.h" |
| 6 | 6 |
| 7 #include <stddef.h> | 7 #include <stddef.h> |
| 8 | 8 |
| 9 #include <algorithm> | 9 #include <algorithm> |
| 10 | 10 |
| (...skipping 203 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 214 #ifndef NDEBUG | 214 #ifndef NDEBUG |
| 215 expect_scroll_update_end_(false), | 215 expect_scroll_update_end_(false), |
| 216 #endif | 216 #endif |
| 217 gesture_scroll_on_impl_thread_(false), | 217 gesture_scroll_on_impl_thread_(false), |
| 218 gesture_pinch_on_impl_thread_(false), | 218 gesture_pinch_on_impl_thread_(false), |
| 219 fling_may_be_active_on_main_thread_(false), | 219 fling_may_be_active_on_main_thread_(false), |
| 220 disallow_horizontal_fling_scroll_(false), | 220 disallow_horizontal_fling_scroll_(false), |
| 221 disallow_vertical_fling_scroll_(false), | 221 disallow_vertical_fling_scroll_(false), |
| 222 has_fling_animation_started_(false), | 222 has_fling_animation_started_(false), |
| 223 smooth_scroll_enabled_(false), | 223 smooth_scroll_enabled_(false), |
| 224 uma_latency_reporting_enabled_(base::TimeTicks::IsHighResolution()) { | 224 uma_latency_reporting_enabled_(base::TimeTicks::IsHighResolution()), |
| 225 scroll_on_mouse_wheel_(false) { |
| 225 DCHECK(client); | 226 DCHECK(client); |
| 226 input_handler_->BindToClient(this); | 227 input_handler_->BindToClient(this); |
| 227 cc::ScrollElasticityHelper* scroll_elasticity_helper = | 228 cc::ScrollElasticityHelper* scroll_elasticity_helper = |
| 228 input_handler_->CreateScrollElasticityHelper(); | 229 input_handler_->CreateScrollElasticityHelper(); |
| 229 if (scroll_elasticity_helper) { | 230 if (scroll_elasticity_helper) { |
| 230 scroll_elasticity_controller_.reset( | 231 scroll_elasticity_controller_.reset( |
| 231 new InputScrollElasticityController(scroll_elasticity_helper)); | 232 new InputScrollElasticityController(scroll_elasticity_helper)); |
| 232 } | 233 } |
| 233 } | 234 } |
| 234 | 235 |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 281 static_cast<const WebGestureEvent&>(event)); | 282 static_cast<const WebGestureEvent&>(event)); |
| 282 | 283 |
| 283 case WebInputEvent::GestureScrollEnd: | 284 case WebInputEvent::GestureScrollEnd: |
| 284 return HandleGestureScrollEnd(static_cast<const WebGestureEvent&>(event)); | 285 return HandleGestureScrollEnd(static_cast<const WebGestureEvent&>(event)); |
| 285 | 286 |
| 286 case WebInputEvent::GesturePinchBegin: { | 287 case WebInputEvent::GesturePinchBegin: { |
| 287 DCHECK(!gesture_pinch_on_impl_thread_); | 288 DCHECK(!gesture_pinch_on_impl_thread_); |
| 288 const WebGestureEvent& gesture_event = | 289 const WebGestureEvent& gesture_event = |
| 289 static_cast<const WebGestureEvent&>(event); | 290 static_cast<const WebGestureEvent&>(event); |
| 290 if (gesture_event.sourceDevice == blink::WebGestureDeviceTouchpad && | 291 if (gesture_event.sourceDevice == blink::WebGestureDeviceTouchpad && |
| 291 input_handler_->HaveWheelEventHandlersAt( | 292 input_handler_->EffectiveWheelEventListenerPropertiesAt( |
| 292 gfx::Point(gesture_event.x, gesture_event.y))) { | 293 gfx::Point(gesture_event.x, gesture_event.y)) != |
| 294 cc::EventListenerProperties::kNone) { |
| 293 return DID_NOT_HANDLE; | 295 return DID_NOT_HANDLE; |
| 294 } else { | 296 } else { |
| 295 input_handler_->PinchGestureBegin(); | 297 input_handler_->PinchGestureBegin(); |
| 296 gesture_pinch_on_impl_thread_ = true; | 298 gesture_pinch_on_impl_thread_ = true; |
| 297 return DID_HANDLE; | 299 return DID_HANDLE; |
| 298 } | 300 } |
| 299 } | 301 } |
| 300 | 302 |
| 301 case WebInputEvent::GesturePinchEnd: | 303 case WebInputEvent::GesturePinchEnd: |
| 302 if (gesture_pinch_on_impl_thread_) { | 304 if (gesture_pinch_on_impl_thread_) { |
| (...skipping 26 matching lines...) Expand all Loading... |
| 329 case WebInputEvent::GestureFlingCancel: | 331 case WebInputEvent::GestureFlingCancel: |
| 330 if (CancelCurrentFling()) | 332 if (CancelCurrentFling()) |
| 331 return DID_HANDLE; | 333 return DID_HANDLE; |
| 332 else if (!fling_may_be_active_on_main_thread_) | 334 else if (!fling_may_be_active_on_main_thread_) |
| 333 return DROP_EVENT; | 335 return DROP_EVENT; |
| 334 return DID_NOT_HANDLE; | 336 return DID_NOT_HANDLE; |
| 335 | 337 |
| 336 case WebInputEvent::TouchStart: | 338 case WebInputEvent::TouchStart: |
| 337 return HandleTouchStart(static_cast<const WebTouchEvent&>(event)); | 339 return HandleTouchStart(static_cast<const WebTouchEvent&>(event)); |
| 338 | 340 |
| 341 case WebInputEvent::TouchMove: |
| 342 return HandleTouchMove(static_cast<const WebTouchEvent&>(event)); |
| 343 |
| 339 case WebInputEvent::MouseMove: { | 344 case WebInputEvent::MouseMove: { |
| 340 const WebMouseEvent& mouse_event = | 345 const WebMouseEvent& mouse_event = |
| 341 static_cast<const WebMouseEvent&>(event); | 346 static_cast<const WebMouseEvent&>(event); |
| 342 // TODO(tony): Ignore when mouse buttons are down? | 347 // TODO(tony): Ignore when mouse buttons are down? |
| 343 // TODO(davemoore): This should never happen, but bug #326635 showed some | 348 // TODO(davemoore): This should never happen, but bug #326635 showed some |
| 344 // surprising crashes. | 349 // surprising crashes. |
| 345 CHECK(input_handler_); | 350 CHECK(input_handler_); |
| 346 input_handler_->MouseMoveAt(gfx::Point(mouse_event.x, mouse_event.y)); | 351 input_handler_->MouseMoveAt(gfx::Point(mouse_event.x, mouse_event.y)); |
| 347 return DID_NOT_HANDLE; | 352 return DID_NOT_HANDLE; |
| 348 } | 353 } |
| (...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 412 #if defined(OS_MACOSX) | 417 #if defined(OS_MACOSX) |
| 413 // Mac does not smooth scroll wheel events (crbug.com/574283). | 418 // Mac does not smooth scroll wheel events (crbug.com/574283). |
| 414 return false; | 419 return false; |
| 415 #else | 420 #else |
| 416 return smooth_scroll_enabled_ && !event.hasPreciseScrollingDeltas; | 421 return smooth_scroll_enabled_ && !event.hasPreciseScrollingDeltas; |
| 417 #endif | 422 #endif |
| 418 } | 423 } |
| 419 | 424 |
| 420 InputHandlerProxy::EventDisposition InputHandlerProxy::HandleMouseWheel( | 425 InputHandlerProxy::EventDisposition InputHandlerProxy::HandleMouseWheel( |
| 421 const WebMouseWheelEvent& wheel_event) { | 426 const WebMouseWheelEvent& wheel_event) { |
| 427 if (!scroll_on_mouse_wheel_) { |
| 428 if (input_handler_->EffectiveWheelEventListenerPropertiesAt( |
| 429 gfx::Point(wheel_event.x, wheel_event.y)) == |
| 430 cc::EventListenerProperties::kPassive) { |
| 431 return NON_BLOCKING; |
| 432 } |
| 433 return DID_NOT_HANDLE; |
| 434 } |
| 435 |
| 422 InputHandlerProxy::EventDisposition result = DID_NOT_HANDLE; | 436 InputHandlerProxy::EventDisposition result = DID_NOT_HANDLE; |
| 423 cc::InputHandlerScrollResult scroll_result; | 437 cc::InputHandlerScrollResult scroll_result; |
| 424 | 438 |
| 425 // TODO(ccameron): The rail information should be pushed down into | 439 // TODO(ccameron): The rail information should be pushed down into |
| 426 // InputHandler. | 440 // InputHandler. |
| 427 gfx::Vector2dF scroll_delta( | 441 gfx::Vector2dF scroll_delta( |
| 428 wheel_event.railsMode != WebInputEvent::RailsModeVertical | 442 wheel_event.railsMode != WebInputEvent::RailsModeVertical |
| 429 ? -wheel_event.deltaX | 443 ? -wheel_event.deltaX |
| 430 : 0, | 444 : 0, |
| 431 wheel_event.railsMode != WebInputEvent::RailsModeHorizontal | 445 wheel_event.railsMode != WebInputEvent::RailsModeHorizontal |
| (...skipping 281 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 713 return DID_NOT_HANDLE; | 727 return DID_NOT_HANDLE; |
| 714 } | 728 } |
| 715 return DROP_EVENT; | 729 return DROP_EVENT; |
| 716 } | 730 } |
| 717 } | 731 } |
| 718 return DID_NOT_HANDLE; | 732 return DID_NOT_HANDLE; |
| 719 } | 733 } |
| 720 | 734 |
| 721 InputHandlerProxy::EventDisposition InputHandlerProxy::HandleTouchStart( | 735 InputHandlerProxy::EventDisposition InputHandlerProxy::HandleTouchStart( |
| 722 const blink::WebTouchEvent& touch_event) { | 736 const blink::WebTouchEvent& touch_event) { |
| 723 for (size_t i = 0; i < touch_event.touchesLength; ++i) { | 737 uint32_t properties = cc::EventListenerProperties::kNone; |
| 738 for (size_t i = 0; i < touch_event.touchesLength && |
| 739 properties != cc::EventListenerProperties::kMax; |
| 740 ++i) { |
| 724 if (touch_event.touches[i].state != WebTouchPoint::StatePressed) | 741 if (touch_event.touches[i].state != WebTouchPoint::StatePressed) |
| 725 continue; | 742 continue; |
| 726 if (input_handler_->DoTouchEventsBlockScrollAt( | 743 |
| 727 gfx::Point(touch_event.touches[i].position.x, | 744 properties |= input_handler_->EffectiveTouchEventListenerPropertiesAt( |
| 728 touch_event.touches[i].position.y))) { | 745 gfx::Point(touch_event.touches[i].position.x, |
| 729 // TODO(rbyers): We should consider still sending the touch events to | 746 touch_event.touches[i].position.y)); |
| 730 // main asynchronously (crbug.com/455539). | |
| 731 return DID_NOT_HANDLE; | |
| 732 } | |
| 733 } | 747 } |
| 734 return DROP_EVENT; | 748 |
| 749 if (properties == cc::EventListenerProperties::kPassive) { |
| 750 return NON_BLOCKING; |
| 751 } |
| 752 return DID_NOT_HANDLE; |
| 753 } |
| 754 |
| 755 InputHandlerProxy::EventDisposition InputHandlerProxy::HandleTouchMove( |
| 756 const blink::WebTouchEvent& touch_event) { |
| 757 uint32_t properties = cc::EventListenerProperties::kNone; |
| 758 for (size_t i = 0; i < touch_event.touchesLength && |
| 759 properties != cc::EventListenerProperties::kMax; |
| 760 ++i) { |
| 761 properties |= input_handler_->EffectiveTouchEventListenerPropertiesAt( |
| 762 gfx::Point(touch_event.touches[i].position.x, |
| 763 touch_event.touches[i].position.y)); |
| 764 } |
| 765 |
| 766 if (properties == cc::EventListenerProperties::kPassive) { |
| 767 return NON_BLOCKING; |
| 768 } |
| 769 return DID_NOT_HANDLE; |
| 735 } | 770 } |
| 736 | 771 |
| 737 bool InputHandlerProxy::FilterInputEventForFlingBoosting( | 772 bool InputHandlerProxy::FilterInputEventForFlingBoosting( |
| 738 const WebInputEvent& event) { | 773 const WebInputEvent& event) { |
| 739 if (!WebInputEvent::isGestureEventType(event.type)) | 774 if (!WebInputEvent::isGestureEventType(event.type)) |
| 740 return false; | 775 return false; |
| 741 | 776 |
| 742 if (!fling_curve_) { | 777 if (!fling_curve_) { |
| 743 DCHECK(!deferred_fling_cancel_time_seconds_); | 778 DCHECK(!deferred_fling_cancel_time_seconds_); |
| 744 return false; | 779 return false; |
| (...skipping 341 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1086 synthetic_wheel.globalY = fling_parameters_.globalPoint.y; | 1121 synthetic_wheel.globalY = fling_parameters_.globalPoint.y; |
| 1087 synthetic_wheel.modifiers = fling_parameters_.modifiers; | 1122 synthetic_wheel.modifiers = fling_parameters_.modifiers; |
| 1088 | 1123 |
| 1089 InputHandlerProxy::EventDisposition disposition = | 1124 InputHandlerProxy::EventDisposition disposition = |
| 1090 HandleInputEvent(synthetic_wheel); | 1125 HandleInputEvent(synthetic_wheel); |
| 1091 switch (disposition) { | 1126 switch (disposition) { |
| 1092 case DID_HANDLE: | 1127 case DID_HANDLE: |
| 1093 return true; | 1128 return true; |
| 1094 case DROP_EVENT: | 1129 case DROP_EVENT: |
| 1095 break; | 1130 break; |
| 1131 case NON_BLOCKING: |
| 1132 // TODO(dtapuska): Process the fling on the compositor thread |
| 1133 // but post the events to the main thread; for now just pass it to the |
| 1134 // main thread. |
| 1096 case DID_NOT_HANDLE: | 1135 case DID_NOT_HANDLE: |
| 1097 TRACE_EVENT_INSTANT0("input", | 1136 TRACE_EVENT_INSTANT0("input", |
| 1098 "InputHandlerProxy::scrollBy::AbortFling", | 1137 "InputHandlerProxy::scrollBy::AbortFling", |
| 1099 TRACE_EVENT_SCOPE_THREAD); | 1138 TRACE_EVENT_SCOPE_THREAD); |
| 1100 // If we got a DID_NOT_HANDLE, that means we need to deliver wheels on the | 1139 // If we got a DID_NOT_HANDLE, that means we need to deliver wheels on the |
| 1101 // main thread. In this case we need to schedule a commit and transfer the | 1140 // main thread. In this case we need to schedule a commit and transfer the |
| 1102 // fling curve over to the main thread and run the rest of the wheels from | 1141 // fling curve over to the main thread and run the rest of the wheels from |
| 1103 // there. This can happen when flinging a page that contains a scrollable | 1142 // there. This can happen when flinging a page that contains a scrollable |
| 1104 // subarea that we can't scroll on the thread if the fling starts outside | 1143 // subarea that we can't scroll on the thread if the fling starts outside |
| 1105 // the subarea but then is flung "under" the pointer. | 1144 // the subarea but then is flung "under" the pointer. |
| (...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1170 // trigger a scroll, e.g., with a trivial time delta between fling updates. | 1209 // trigger a scroll, e.g., with a trivial time delta between fling updates. |
| 1171 // Return true in this case to prevent early fling termination. | 1210 // Return true in this case to prevent early fling termination. |
| 1172 if (std::abs(clipped_increment.width) < kScrollEpsilon && | 1211 if (std::abs(clipped_increment.width) < kScrollEpsilon && |
| 1173 std::abs(clipped_increment.height) < kScrollEpsilon) | 1212 std::abs(clipped_increment.height) < kScrollEpsilon) |
| 1174 return true; | 1213 return true; |
| 1175 | 1214 |
| 1176 return did_scroll; | 1215 return did_scroll; |
| 1177 } | 1216 } |
| 1178 | 1217 |
| 1179 } // namespace ui | 1218 } // namespace ui |
| OLD | NEW |