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 229 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
526 | 531 |
527 cc::ScrollStateData scroll_state_update_data; | 532 cc::ScrollStateData scroll_state_update_data; |
528 scroll_state_update_data.delta_x = scroll_delta.x(); | 533 scroll_state_update_data.delta_x = scroll_delta.x(); |
529 scroll_state_update_data.delta_y = scroll_delta.y(); | 534 scroll_state_update_data.delta_y = scroll_delta.y(); |
530 scroll_state_update_data.position_x = wheel_event.x; | 535 scroll_state_update_data.position_x = wheel_event.x; |
531 scroll_state_update_data.position_y = wheel_event.y; | 536 scroll_state_update_data.position_y = wheel_event.y; |
532 cc::ScrollState scroll_state_update(scroll_state_update_data); | 537 cc::ScrollState scroll_state_update(scroll_state_update_data); |
533 | 538 |
534 scroll_result = input_handler_->ScrollBy(&scroll_state_update); | 539 scroll_result = input_handler_->ScrollBy(&scroll_state_update); |
535 HandleOverscroll(gfx::Point(wheel_event.x, wheel_event.y), | 540 HandleOverscroll(gfx::Point(wheel_event.x, wheel_event.y), |
536 scroll_result); | 541 scroll_result, false); |
537 | 542 |
538 cc::ScrollStateData scroll_state_end_data; | 543 cc::ScrollStateData scroll_state_end_data; |
539 scroll_state_end_data.is_ending = true; | 544 scroll_state_end_data.is_ending = true; |
540 cc::ScrollState scroll_state_end(scroll_state_end_data); | 545 cc::ScrollState scroll_state_end(scroll_state_end_data); |
541 input_handler_->ScrollEnd(&scroll_state_end); | 546 input_handler_->ScrollEnd(&scroll_state_end); |
542 | 547 |
543 result = scroll_result.did_scroll ? DID_HANDLE : DROP_EVENT; | 548 result = scroll_result.did_scroll ? DID_HANDLE : DROP_EVENT; |
544 break; | 549 break; |
545 } | 550 } |
546 case cc::InputHandler::SCROLL_IGNORED: | 551 case cc::InputHandler::SCROLL_IGNORED: |
(...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
644 case cc::InputHandler::SCROLL_ON_IMPL_THREAD: | 649 case cc::InputHandler::SCROLL_ON_IMPL_THREAD: |
645 return DID_HANDLE; | 650 return DID_HANDLE; |
646 case cc::InputHandler::SCROLL_IGNORED: | 651 case cc::InputHandler::SCROLL_IGNORED: |
647 return DROP_EVENT; | 652 return DROP_EVENT; |
648 default: | 653 default: |
649 return DID_NOT_HANDLE; | 654 return DID_NOT_HANDLE; |
650 } | 655 } |
651 } | 656 } |
652 cc::InputHandlerScrollResult scroll_result = | 657 cc::InputHandlerScrollResult scroll_result = |
653 input_handler_->ScrollBy(&scroll_state); | 658 input_handler_->ScrollBy(&scroll_state); |
654 HandleOverscroll(scroll_point, scroll_result); | 659 HandleOverscroll(scroll_point, scroll_result, true); |
655 | 660 |
656 if (scroll_elasticity_controller_) | 661 if (scroll_elasticity_controller_) |
657 HandleScrollElasticityOverscroll(gesture_event, scroll_result); | 662 HandleScrollElasticityOverscroll(gesture_event, scroll_result); |
658 | 663 |
659 return scroll_result.did_scroll ? DID_HANDLE : DROP_EVENT; | 664 return scroll_result.did_scroll ? DID_HANDLE : DROP_EVENT; |
660 } | 665 } |
661 | 666 |
662 InputHandlerProxy::EventDisposition InputHandlerProxy::HandleGestureScrollEnd( | 667 InputHandlerProxy::EventDisposition InputHandlerProxy::HandleGestureScrollEnd( |
663 const WebGestureEvent& gesture_event) { | 668 const WebGestureEvent& gesture_event) { |
664 #ifndef NDEBUG | 669 #ifndef NDEBUG |
(...skipping 444 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1109 void InputHandlerProxy::SynchronouslyZoomBy(float magnify_delta, | 1114 void InputHandlerProxy::SynchronouslyZoomBy(float magnify_delta, |
1110 const gfx::Point& anchor) { | 1115 const gfx::Point& anchor) { |
1111 DCHECK(synchronous_input_handler_); | 1116 DCHECK(synchronous_input_handler_); |
1112 input_handler_->PinchGestureBegin(); | 1117 input_handler_->PinchGestureBegin(); |
1113 input_handler_->PinchGestureUpdate(magnify_delta, anchor); | 1118 input_handler_->PinchGestureUpdate(magnify_delta, anchor); |
1114 input_handler_->PinchGestureEnd(); | 1119 input_handler_->PinchGestureEnd(); |
1115 } | 1120 } |
1116 | 1121 |
1117 void InputHandlerProxy::HandleOverscroll( | 1122 void InputHandlerProxy::HandleOverscroll( |
1118 const gfx::Point& causal_event_viewport_point, | 1123 const gfx::Point& causal_event_viewport_point, |
1119 const cc::InputHandlerScrollResult& scroll_result) { | 1124 const cc::InputHandlerScrollResult& scroll_result, |
| 1125 bool bundle_overscroll_params_with_ack) { |
1120 DCHECK(client_); | 1126 DCHECK(client_); |
1121 if (!scroll_result.did_overscroll_root) | 1127 if (!scroll_result.did_overscroll_root) |
1122 return; | 1128 return; |
1123 | 1129 |
1124 TRACE_EVENT2("input", | 1130 TRACE_EVENT2("input", |
1125 "InputHandlerProxy::DidOverscroll", | 1131 "InputHandlerProxy::DidOverscroll", |
1126 "dx", | 1132 "dx", |
1127 scroll_result.unused_scroll_delta.x(), | 1133 scroll_result.unused_scroll_delta.x(), |
1128 "dy", | 1134 "dy", |
1129 scroll_result.unused_scroll_delta.y()); | 1135 scroll_result.unused_scroll_delta.y()); |
1130 | 1136 |
1131 if (fling_curve_) { | 1137 if (fling_curve_) { |
1132 static const int kFlingOverscrollThreshold = 1; | 1138 static const int kFlingOverscrollThreshold = 1; |
1133 disallow_horizontal_fling_scroll_ |= | 1139 disallow_horizontal_fling_scroll_ |= |
1134 std::abs(scroll_result.accumulated_root_overscroll.x()) >= | 1140 std::abs(scroll_result.accumulated_root_overscroll.x()) >= |
1135 kFlingOverscrollThreshold; | 1141 kFlingOverscrollThreshold; |
1136 disallow_vertical_fling_scroll_ |= | 1142 disallow_vertical_fling_scroll_ |= |
1137 std::abs(scroll_result.accumulated_root_overscroll.y()) >= | 1143 std::abs(scroll_result.accumulated_root_overscroll.y()) >= |
1138 kFlingOverscrollThreshold; | 1144 kFlingOverscrollThreshold; |
1139 } | 1145 } |
1140 | 1146 |
| 1147 if (bundle_overscroll_params_with_ack) { |
| 1148 // Bundle overscroll message with triggering event response, saving an IPC. |
| 1149 current_overscroll_params_.reset(new DidOverscrollParams()); |
| 1150 current_overscroll_params_->accumulated_overscroll = |
| 1151 scroll_result.accumulated_root_overscroll; |
| 1152 current_overscroll_params_->latest_overscroll_delta = |
| 1153 scroll_result.unused_scroll_delta; |
| 1154 current_overscroll_params_->current_fling_velocity = |
| 1155 ToClientScrollIncrement(current_fling_velocity_); |
| 1156 current_overscroll_params_->causal_event_viewport_point = |
| 1157 gfx::PointF(causal_event_viewport_point); |
| 1158 return; |
| 1159 } |
| 1160 |
1141 client_->DidOverscroll(scroll_result.accumulated_root_overscroll, | 1161 client_->DidOverscroll(scroll_result.accumulated_root_overscroll, |
1142 scroll_result.unused_scroll_delta, | 1162 scroll_result.unused_scroll_delta, |
1143 ToClientScrollIncrement(current_fling_velocity_), | 1163 ToClientScrollIncrement(current_fling_velocity_), |
1144 gfx::PointF(causal_event_viewport_point)); | 1164 gfx::PointF(causal_event_viewport_point)); |
1145 } | 1165 } |
1146 | 1166 |
1147 bool InputHandlerProxy::CancelCurrentFling() { | 1167 bool InputHandlerProxy::CancelCurrentFling() { |
1148 if (CancelCurrentFlingWithoutNotifyingClient()) { | 1168 if (CancelCurrentFlingWithoutNotifyingClient()) { |
1149 client_->DidStopFlinging(); | 1169 client_->DidStopFlinging(); |
1150 return true; | 1170 return true; |
(...skipping 152 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1303 clipped_increment = ToClientScrollIncrement(clipped_increment); | 1323 clipped_increment = ToClientScrollIncrement(clipped_increment); |
1304 cc::ScrollStateData scroll_state_data; | 1324 cc::ScrollStateData scroll_state_data; |
1305 scroll_state_data.delta_x = clipped_increment.width; | 1325 scroll_state_data.delta_x = clipped_increment.width; |
1306 scroll_state_data.delta_y = clipped_increment.height; | 1326 scroll_state_data.delta_y = clipped_increment.height; |
1307 scroll_state_data.velocity_x = clipped_velocity.width; | 1327 scroll_state_data.velocity_x = clipped_velocity.width; |
1308 scroll_state_data.velocity_y = clipped_velocity.height; | 1328 scroll_state_data.velocity_y = clipped_velocity.height; |
1309 scroll_state_data.is_in_inertial_phase = true; | 1329 scroll_state_data.is_in_inertial_phase = true; |
1310 cc::ScrollState scroll_state(scroll_state_data); | 1330 cc::ScrollState scroll_state(scroll_state_data); |
1311 cc::InputHandlerScrollResult scroll_result = | 1331 cc::InputHandlerScrollResult scroll_result = |
1312 input_handler_->ScrollBy(&scroll_state); | 1332 input_handler_->ScrollBy(&scroll_state); |
1313 HandleOverscroll(fling_parameters_.point, scroll_result); | 1333 HandleOverscroll(fling_parameters_.point, scroll_result, false); |
1314 did_scroll = scroll_result.did_scroll; | 1334 did_scroll = scroll_result.did_scroll; |
1315 } break; | 1335 } break; |
1316 case blink::WebGestureDeviceUninitialized: | 1336 case blink::WebGestureDeviceUninitialized: |
1317 NOTREACHED(); | 1337 NOTREACHED(); |
1318 return false; | 1338 return false; |
1319 } | 1339 } |
1320 | 1340 |
1321 if (did_scroll) { | 1341 if (did_scroll) { |
1322 fling_parameters_.cumulativeScroll.width += clipped_increment.width; | 1342 fling_parameters_.cumulativeScroll.width += clipped_increment.width; |
1323 fling_parameters_.cumulativeScroll.height += clipped_increment.height; | 1343 fling_parameters_.cumulativeScroll.height += clipped_increment.height; |
(...skipping 18 matching lines...) Expand all Loading... |
1342 // is made asynchronously, to minimize divergence between main thread and | 1362 // is made asynchronously, to minimize divergence between main thread and |
1343 // impl thread event handling paths. | 1363 // impl thread event handling paths. |
1344 base::ThreadTaskRunnerHandle::Get()->PostTask( | 1364 base::ThreadTaskRunnerHandle::Get()->PostTask( |
1345 FROM_HERE, | 1365 FROM_HERE, |
1346 base::Bind(&InputScrollElasticityController::ObserveGestureEventAndResult, | 1366 base::Bind(&InputScrollElasticityController::ObserveGestureEventAndResult, |
1347 scroll_elasticity_controller_->GetWeakPtr(), gesture_event, | 1367 scroll_elasticity_controller_->GetWeakPtr(), gesture_event, |
1348 scroll_result)); | 1368 scroll_result)); |
1349 } | 1369 } |
1350 | 1370 |
1351 } // namespace ui | 1371 } // namespace ui |
OLD | NEW |