| 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 228 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 239 expect_scroll_update_end_(false), | 239 expect_scroll_update_end_(false), |
| 240 #endif | 240 #endif |
| 241 gesture_scroll_on_impl_thread_(false), | 241 gesture_scroll_on_impl_thread_(false), |
| 242 gesture_pinch_on_impl_thread_(false), | 242 gesture_pinch_on_impl_thread_(false), |
| 243 fling_may_be_active_on_main_thread_(false), | 243 fling_may_be_active_on_main_thread_(false), |
| 244 disallow_horizontal_fling_scroll_(false), | 244 disallow_horizontal_fling_scroll_(false), |
| 245 disallow_vertical_fling_scroll_(false), | 245 disallow_vertical_fling_scroll_(false), |
| 246 has_fling_animation_started_(false), | 246 has_fling_animation_started_(false), |
| 247 smooth_scroll_enabled_(false), | 247 smooth_scroll_enabled_(false), |
| 248 uma_latency_reporting_enabled_(base::TimeTicks::IsHighResolution()), | 248 uma_latency_reporting_enabled_(base::TimeTicks::IsHighResolution()), |
| 249 touch_start_result_(kEventDispositionUndefined) { | 249 touch_start_result_(kEventDispositionUndefined), |
| 250 current_overscroll_params_(nullptr) { |
| 250 DCHECK(client); | 251 DCHECK(client); |
| 251 input_handler_->BindToClient(this); | 252 input_handler_->BindToClient(this); |
| 252 cc::ScrollElasticityHelper* scroll_elasticity_helper = | 253 cc::ScrollElasticityHelper* scroll_elasticity_helper = |
| 253 input_handler_->CreateScrollElasticityHelper(); | 254 input_handler_->CreateScrollElasticityHelper(); |
| 254 if (scroll_elasticity_helper) { | 255 if (scroll_elasticity_helper) { |
| 255 scroll_elasticity_controller_.reset( | 256 scroll_elasticity_controller_.reset( |
| 256 new InputScrollElasticityController(scroll_elasticity_helper)); | 257 new InputScrollElasticityController(scroll_elasticity_helper)); |
| 257 } | 258 } |
| 258 } | 259 } |
| 259 | 260 |
| 260 InputHandlerProxy::~InputHandlerProxy() {} | 261 InputHandlerProxy::~InputHandlerProxy() {} |
| 261 | 262 |
| 262 void InputHandlerProxy::WillShutdown() { | 263 void InputHandlerProxy::WillShutdown() { |
| 263 scroll_elasticity_controller_.reset(); | 264 scroll_elasticity_controller_.reset(); |
| 264 input_handler_ = NULL; | 265 input_handler_ = NULL; |
| 265 client_->WillShutdown(); | 266 client_->WillShutdown(); |
| 266 } | 267 } |
| 267 | 268 |
| 268 InputHandlerProxy::EventDisposition | 269 void InputHandlerProxy::HandleInputEventWithLatencyInfo( |
| 269 InputHandlerProxy::HandleInputEventWithLatencyInfo( | 270 ScopedWebInputEvent event, |
| 270 const WebInputEvent& event, | 271 const LatencyInfo& latency_info, |
| 271 ui::LatencyInfo* latency_info) { | 272 const EventDispositionCallback& callback) { |
| 272 DCHECK(input_handler_); | 273 DCHECK(input_handler_); |
| 273 | 274 |
| 274 if (uma_latency_reporting_enabled_) | 275 if (uma_latency_reporting_enabled_) |
| 275 ReportInputEventLatencyUma(event, *latency_info); | 276 ReportInputEventLatencyUma(*event, latency_info); |
| 276 | 277 |
| 277 TRACE_EVENT_WITH_FLOW1("input,benchmark", | 278 TRACE_EVENT_WITH_FLOW1("input,benchmark", "LatencyInfo.Flow", |
| 278 "LatencyInfo.Flow", | 279 TRACE_ID_DONT_MANGLE(latency_info.trace_id()), |
| 279 TRACE_ID_DONT_MANGLE(latency_info->trace_id()), | |
| 280 TRACE_EVENT_FLAG_FLOW_IN | TRACE_EVENT_FLAG_FLOW_OUT, | 280 TRACE_EVENT_FLAG_FLOW_IN | TRACE_EVENT_FLAG_FLOW_OUT, |
| 281 "step", "HandleInputEventImpl"); | 281 "step", "HandleInputEventImpl"); |
| 282 | 282 |
| 283 ui::LatencyInfo monitored_latency_info = latency_info; |
| 283 std::unique_ptr<cc::SwapPromiseMonitor> latency_info_swap_promise_monitor = | 284 std::unique_ptr<cc::SwapPromiseMonitor> latency_info_swap_promise_monitor = |
| 284 input_handler_->CreateLatencyInfoSwapPromiseMonitor(latency_info); | 285 input_handler_->CreateLatencyInfoSwapPromiseMonitor( |
| 285 InputHandlerProxy::EventDisposition disposition = HandleInputEvent(event); | 286 &monitored_latency_info); |
| 286 return disposition; | 287 |
| 288 current_overscroll_params_.reset(); |
| 289 InputHandlerProxy::EventDisposition disposition = HandleInputEvent(*event); |
| 290 callback.Run(disposition, std::move(event), monitored_latency_info, |
| 291 std::move(current_overscroll_params_)); |
| 287 } | 292 } |
| 288 | 293 |
| 289 InputHandlerProxy::EventDisposition InputHandlerProxy::HandleInputEvent( | 294 InputHandlerProxy::EventDisposition InputHandlerProxy::HandleInputEvent( |
| 290 const WebInputEvent& event) { | 295 const WebInputEvent& event) { |
| 291 DCHECK(input_handler_); | 296 DCHECK(input_handler_); |
| 292 | 297 |
| 293 if (FilterInputEventForFlingBoosting(event)) | 298 if (FilterInputEventForFlingBoosting(event)) |
| 294 return DID_HANDLE; | 299 return DID_HANDLE; |
| 295 | 300 |
| 296 switch (event.type) { | 301 switch (event.type) { |
| (...skipping 230 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 527 | 532 |
| 528 cc::ScrollStateData scroll_state_update_data; | 533 cc::ScrollStateData scroll_state_update_data; |
| 529 scroll_state_update_data.delta_x = scroll_delta.x(); | 534 scroll_state_update_data.delta_x = scroll_delta.x(); |
| 530 scroll_state_update_data.delta_y = scroll_delta.y(); | 535 scroll_state_update_data.delta_y = scroll_delta.y(); |
| 531 scroll_state_update_data.position_x = wheel_event.x; | 536 scroll_state_update_data.position_x = wheel_event.x; |
| 532 scroll_state_update_data.position_y = wheel_event.y; | 537 scroll_state_update_data.position_y = wheel_event.y; |
| 533 cc::ScrollState scroll_state_update(scroll_state_update_data); | 538 cc::ScrollState scroll_state_update(scroll_state_update_data); |
| 534 | 539 |
| 535 scroll_result = input_handler_->ScrollBy(&scroll_state_update); | 540 scroll_result = input_handler_->ScrollBy(&scroll_state_update); |
| 536 HandleOverscroll(gfx::Point(wheel_event.x, wheel_event.y), | 541 HandleOverscroll(gfx::Point(wheel_event.x, wheel_event.y), |
| 537 scroll_result); | 542 scroll_result, false); |
| 538 | 543 |
| 539 cc::ScrollStateData scroll_state_end_data; | 544 cc::ScrollStateData scroll_state_end_data; |
| 540 scroll_state_end_data.is_ending = true; | 545 scroll_state_end_data.is_ending = true; |
| 541 cc::ScrollState scroll_state_end(scroll_state_end_data); | 546 cc::ScrollState scroll_state_end(scroll_state_end_data); |
| 542 input_handler_->ScrollEnd(&scroll_state_end); | 547 input_handler_->ScrollEnd(&scroll_state_end); |
| 543 | 548 |
| 544 result = scroll_result.did_scroll ? DID_HANDLE : DROP_EVENT; | 549 result = scroll_result.did_scroll ? DID_HANDLE : DROP_EVENT; |
| 545 break; | 550 break; |
| 546 } | 551 } |
| 547 case cc::InputHandler::SCROLL_IGNORED: | 552 case cc::InputHandler::SCROLL_IGNORED: |
| (...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 640 case cc::InputHandler::SCROLL_ON_IMPL_THREAD: | 645 case cc::InputHandler::SCROLL_ON_IMPL_THREAD: |
| 641 return DID_HANDLE; | 646 return DID_HANDLE; |
| 642 case cc::InputHandler::SCROLL_IGNORED: | 647 case cc::InputHandler::SCROLL_IGNORED: |
| 643 return DROP_EVENT; | 648 return DROP_EVENT; |
| 644 default: | 649 default: |
| 645 return DID_NOT_HANDLE; | 650 return DID_NOT_HANDLE; |
| 646 } | 651 } |
| 647 } | 652 } |
| 648 cc::InputHandlerScrollResult scroll_result = | 653 cc::InputHandlerScrollResult scroll_result = |
| 649 input_handler_->ScrollBy(&scroll_state); | 654 input_handler_->ScrollBy(&scroll_state); |
| 650 HandleOverscroll(scroll_point, scroll_result); | 655 HandleOverscroll(scroll_point, scroll_result, true); |
| 651 | 656 |
| 652 if (scroll_elasticity_controller_) | 657 if (scroll_elasticity_controller_) |
| 653 HandleScrollElasticityOverscroll(gesture_event, scroll_result); | 658 HandleScrollElasticityOverscroll(gesture_event, scroll_result); |
| 654 | 659 |
| 655 return scroll_result.did_scroll ? DID_HANDLE : DROP_EVENT; | 660 return scroll_result.did_scroll ? DID_HANDLE : DROP_EVENT; |
| 656 } | 661 } |
| 657 | 662 |
| 658 InputHandlerProxy::EventDisposition InputHandlerProxy::HandleGestureScrollEnd( | 663 InputHandlerProxy::EventDisposition InputHandlerProxy::HandleGestureScrollEnd( |
| 659 const WebGestureEvent& gesture_event) { | 664 const WebGestureEvent& gesture_event) { |
| 660 #ifndef NDEBUG | 665 #ifndef NDEBUG |
| (...skipping 444 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1105 void InputHandlerProxy::SynchronouslyZoomBy(float magnify_delta, | 1110 void InputHandlerProxy::SynchronouslyZoomBy(float magnify_delta, |
| 1106 const gfx::Point& anchor) { | 1111 const gfx::Point& anchor) { |
| 1107 DCHECK(synchronous_input_handler_); | 1112 DCHECK(synchronous_input_handler_); |
| 1108 input_handler_->PinchGestureBegin(); | 1113 input_handler_->PinchGestureBegin(); |
| 1109 input_handler_->PinchGestureUpdate(magnify_delta, anchor); | 1114 input_handler_->PinchGestureUpdate(magnify_delta, anchor); |
| 1110 input_handler_->PinchGestureEnd(); | 1115 input_handler_->PinchGestureEnd(); |
| 1111 } | 1116 } |
| 1112 | 1117 |
| 1113 void InputHandlerProxy::HandleOverscroll( | 1118 void InputHandlerProxy::HandleOverscroll( |
| 1114 const gfx::Point& causal_event_viewport_point, | 1119 const gfx::Point& causal_event_viewport_point, |
| 1115 const cc::InputHandlerScrollResult& scroll_result) { | 1120 const cc::InputHandlerScrollResult& scroll_result, |
| 1121 bool bundle_overscroll_params_with_ack) { |
| 1116 DCHECK(client_); | 1122 DCHECK(client_); |
| 1117 if (!scroll_result.did_overscroll_root) | 1123 if (!scroll_result.did_overscroll_root) |
| 1118 return; | 1124 return; |
| 1119 | 1125 |
| 1120 TRACE_EVENT2("input", | 1126 TRACE_EVENT2("input", |
| 1121 "InputHandlerProxy::DidOverscroll", | 1127 "InputHandlerProxy::DidOverscroll", |
| 1122 "dx", | 1128 "dx", |
| 1123 scroll_result.unused_scroll_delta.x(), | 1129 scroll_result.unused_scroll_delta.x(), |
| 1124 "dy", | 1130 "dy", |
| 1125 scroll_result.unused_scroll_delta.y()); | 1131 scroll_result.unused_scroll_delta.y()); |
| 1126 | 1132 |
| 1127 if (fling_curve_) { | 1133 if (fling_curve_) { |
| 1128 static const int kFlingOverscrollThreshold = 1; | 1134 static const int kFlingOverscrollThreshold = 1; |
| 1129 disallow_horizontal_fling_scroll_ |= | 1135 disallow_horizontal_fling_scroll_ |= |
| 1130 std::abs(scroll_result.accumulated_root_overscroll.x()) >= | 1136 std::abs(scroll_result.accumulated_root_overscroll.x()) >= |
| 1131 kFlingOverscrollThreshold; | 1137 kFlingOverscrollThreshold; |
| 1132 disallow_vertical_fling_scroll_ |= | 1138 disallow_vertical_fling_scroll_ |= |
| 1133 std::abs(scroll_result.accumulated_root_overscroll.y()) >= | 1139 std::abs(scroll_result.accumulated_root_overscroll.y()) >= |
| 1134 kFlingOverscrollThreshold; | 1140 kFlingOverscrollThreshold; |
| 1135 } | 1141 } |
| 1136 | 1142 |
| 1143 if (bundle_overscroll_params_with_ack) { |
| 1144 // Bundle overscroll message with triggering event response, saving an IPC. |
| 1145 current_overscroll_params_.reset(new DidOverscrollParams()); |
| 1146 current_overscroll_params_->accumulated_overscroll = |
| 1147 scroll_result.accumulated_root_overscroll; |
| 1148 current_overscroll_params_->latest_overscroll_delta = |
| 1149 scroll_result.unused_scroll_delta; |
| 1150 current_overscroll_params_->current_fling_velocity = |
| 1151 ToClientScrollIncrement(current_fling_velocity_); |
| 1152 current_overscroll_params_->causal_event_viewport_point = |
| 1153 gfx::PointF(causal_event_viewport_point); |
| 1154 return; |
| 1155 } |
| 1156 |
| 1137 client_->DidOverscroll(scroll_result.accumulated_root_overscroll, | 1157 client_->DidOverscroll(scroll_result.accumulated_root_overscroll, |
| 1138 scroll_result.unused_scroll_delta, | 1158 scroll_result.unused_scroll_delta, |
| 1139 ToClientScrollIncrement(current_fling_velocity_), | 1159 ToClientScrollIncrement(current_fling_velocity_), |
| 1140 gfx::PointF(causal_event_viewport_point)); | 1160 gfx::PointF(causal_event_viewport_point)); |
| 1141 } | 1161 } |
| 1142 | 1162 |
| 1143 bool InputHandlerProxy::CancelCurrentFling() { | 1163 bool InputHandlerProxy::CancelCurrentFling() { |
| 1144 if (CancelCurrentFlingWithoutNotifyingClient()) { | 1164 if (CancelCurrentFlingWithoutNotifyingClient()) { |
| 1145 client_->DidStopFlinging(); | 1165 client_->DidStopFlinging(); |
| 1146 return true; | 1166 return true; |
| (...skipping 152 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1299 clipped_increment = ToClientScrollIncrement(clipped_increment); | 1319 clipped_increment = ToClientScrollIncrement(clipped_increment); |
| 1300 cc::ScrollStateData scroll_state_data; | 1320 cc::ScrollStateData scroll_state_data; |
| 1301 scroll_state_data.delta_x = clipped_increment.width; | 1321 scroll_state_data.delta_x = clipped_increment.width; |
| 1302 scroll_state_data.delta_y = clipped_increment.height; | 1322 scroll_state_data.delta_y = clipped_increment.height; |
| 1303 scroll_state_data.velocity_x = clipped_velocity.width; | 1323 scroll_state_data.velocity_x = clipped_velocity.width; |
| 1304 scroll_state_data.velocity_y = clipped_velocity.height; | 1324 scroll_state_data.velocity_y = clipped_velocity.height; |
| 1305 scroll_state_data.is_in_inertial_phase = true; | 1325 scroll_state_data.is_in_inertial_phase = true; |
| 1306 cc::ScrollState scroll_state(scroll_state_data); | 1326 cc::ScrollState scroll_state(scroll_state_data); |
| 1307 cc::InputHandlerScrollResult scroll_result = | 1327 cc::InputHandlerScrollResult scroll_result = |
| 1308 input_handler_->ScrollBy(&scroll_state); | 1328 input_handler_->ScrollBy(&scroll_state); |
| 1309 HandleOverscroll(fling_parameters_.point, scroll_result); | 1329 HandleOverscroll(fling_parameters_.point, scroll_result, false); |
| 1310 did_scroll = scroll_result.did_scroll; | 1330 did_scroll = scroll_result.did_scroll; |
| 1311 } break; | 1331 } break; |
| 1312 case blink::WebGestureDeviceUninitialized: | 1332 case blink::WebGestureDeviceUninitialized: |
| 1313 NOTREACHED(); | 1333 NOTREACHED(); |
| 1314 return false; | 1334 return false; |
| 1315 } | 1335 } |
| 1316 | 1336 |
| 1317 if (did_scroll) { | 1337 if (did_scroll) { |
| 1318 fling_parameters_.cumulativeScroll.width += clipped_increment.width; | 1338 fling_parameters_.cumulativeScroll.width += clipped_increment.width; |
| 1319 fling_parameters_.cumulativeScroll.height += clipped_increment.height; | 1339 fling_parameters_.cumulativeScroll.height += clipped_increment.height; |
| (...skipping 18 matching lines...) Expand all Loading... |
| 1338 // is made asynchronously, to minimize divergence between main thread and | 1358 // is made asynchronously, to minimize divergence between main thread and |
| 1339 // impl thread event handling paths. | 1359 // impl thread event handling paths. |
| 1340 base::ThreadTaskRunnerHandle::Get()->PostTask( | 1360 base::ThreadTaskRunnerHandle::Get()->PostTask( |
| 1341 FROM_HERE, | 1361 FROM_HERE, |
| 1342 base::Bind(&InputScrollElasticityController::ObserveGestureEventAndResult, | 1362 base::Bind(&InputScrollElasticityController::ObserveGestureEventAndResult, |
| 1343 scroll_elasticity_controller_->GetWeakPtr(), gesture_event, | 1363 scroll_elasticity_controller_->GetWeakPtr(), gesture_event, |
| 1344 scroll_result)); | 1364 scroll_result)); |
| 1345 } | 1365 } |
| 1346 | 1366 |
| 1347 } // namespace ui | 1367 } // namespace ui |
| OLD | NEW |