Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(695)

Side by Side Diff: ui/events/blink/input_handler_proxy.cc

Issue 2265393002: Refactor compositor event handling path to be callback-based (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: tdresser's review Created 4 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698