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

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: creis's review, rebase 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
« no previous file with comments | « ui/events/blink/input_handler_proxy.h ('k') | ui/events/blink/input_handler_proxy_client.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 229 matching lines...) Expand 10 before | Expand all | Expand 10 after
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
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
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
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
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
OLDNEW
« no previous file with comments | « ui/events/blink/input_handler_proxy.h ('k') | ui/events/blink/input_handler_proxy_client.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698