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

Side by Side Diff: content/renderer/input/input_handler_manager.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
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 "content/renderer/input/input_handler_manager.h" 5 #include "content/renderer/input/input_handler_manager.h"
6 6
7 #include <utility> 7 #include <utility>
8 8
9 #include "base/bind.h" 9 #include "base/bind.h"
10 #include "base/location.h" 10 #include "base/location.h"
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
47 } // namespace 47 } // namespace
48 48
49 InputHandlerManager::InputHandlerManager( 49 InputHandlerManager::InputHandlerManager(
50 const scoped_refptr<base::SingleThreadTaskRunner>& task_runner, 50 const scoped_refptr<base::SingleThreadTaskRunner>& task_runner,
51 InputHandlerManagerClient* client, 51 InputHandlerManagerClient* client,
52 SynchronousInputHandlerProxyClient* sync_handler_client, 52 SynchronousInputHandlerProxyClient* sync_handler_client,
53 blink::scheduler::RendererScheduler* renderer_scheduler) 53 blink::scheduler::RendererScheduler* renderer_scheduler)
54 : task_runner_(task_runner), 54 : task_runner_(task_runner),
55 client_(client), 55 client_(client),
56 synchronous_handler_proxy_client_(sync_handler_client), 56 synchronous_handler_proxy_client_(sync_handler_client),
57 renderer_scheduler_(renderer_scheduler) { 57 renderer_scheduler_(renderer_scheduler),
58 weak_ptr_factory_(this) {
58 DCHECK(client_); 59 DCHECK(client_);
59 client_->SetInputHandlerManager(this); 60 client_->SetInputHandlerManager(this);
60 } 61 }
61 62
62 InputHandlerManager::~InputHandlerManager() { 63 InputHandlerManager::~InputHandlerManager() {
63 client_->SetInputHandlerManager(nullptr); 64 client_->SetInputHandlerManager(nullptr);
64 } 65 }
65 66
66 void InputHandlerManager::AddInputHandler( 67 void InputHandlerManager::AddInputHandler(
67 int routing_id, 68 int routing_id,
(...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after
189 int routing_id, 190 int routing_id,
190 blink::WebInputEvent::Type type, 191 blink::WebInputEvent::Type type,
191 InputEventAckState ack_result) { 192 InputEventAckState ack_result) {
192 client_->NotifyInputEventHandled(routing_id, type, ack_result); 193 client_->NotifyInputEventHandled(routing_id, type, ack_result);
193 } 194 }
194 195
195 void InputHandlerManager::ProcessRafAlignedInputOnMainThread(int routing_id) { 196 void InputHandlerManager::ProcessRafAlignedInputOnMainThread(int routing_id) {
196 client_->ProcessRafAlignedInput(routing_id); 197 client_->ProcessRafAlignedInput(routing_id);
197 } 198 }
198 199
199 InputEventAckState InputHandlerManager::HandleInputEvent( 200 void InputHandlerManager::HandleInputEvent(
200 int routing_id, 201 int routing_id,
201 const WebInputEvent* input_event, 202 ui::ScopedWebInputEvent input_event,
202 ui::LatencyInfo* latency_info) { 203 const ui::LatencyInfo& latency_info,
204 const InputEventAckStateCallback& callback) {
203 DCHECK(task_runner_->BelongsToCurrentThread()); 205 DCHECK(task_runner_->BelongsToCurrentThread());
204 TRACE_EVENT1("input,benchmark,rail", "InputHandlerManager::HandleInputEvent", 206 TRACE_EVENT1("input,benchmark,rail", "InputHandlerManager::HandleInputEvent",
205 "type", WebInputEvent::GetName(input_event->type)); 207 "type", WebInputEvent::GetName(input_event->type));
206 208
207 auto it = input_handlers_.find(routing_id); 209 auto it = input_handlers_.find(routing_id);
208 if (it == input_handlers_.end()) { 210 if (it == input_handlers_.end()) {
209 TRACE_EVENT1("input,rail", "InputHandlerManager::HandleInputEvent", 211 TRACE_EVENT1("input,rail", "InputHandlerManager::HandleInputEvent",
210 "result", "NoInputHandlerFound"); 212 "result", "NoInputHandlerFound");
211 // Oops, we no longer have an interested input handler.. 213 // Oops, we no longer have an interested input handler..
212 return INPUT_EVENT_ACK_STATE_NOT_CONSUMED; 214 callback.Run(INPUT_EVENT_ACK_STATE_NOT_CONSUMED, std::move(input_event),
215 latency_info, nullptr);
216 return;
213 } 217 }
214 218
215 TRACE_EVENT1("input,rail", "InputHandlerManager::HandleInputEvent", 219 TRACE_EVENT1("input,rail", "InputHandlerManager::HandleInputEvent",
216 "result", "EventSentToInputHandlerProxy"); 220 "result", "EventSentToInputHandlerProxy");
217 InputHandlerProxy* proxy = it->second->input_handler_proxy(); 221 InputHandlerProxy* proxy = it->second->input_handler_proxy();
218 InputEventAckState input_event_ack_state = InputEventDispositionToAck( 222 proxy->HandleInputEventWithLatencyInfo(
219 proxy->HandleInputEventWithLatencyInfo(*input_event, latency_info)); 223 std::move(input_event), latency_info,
224 base::Bind(&InputHandlerManager::DidHandleInputEventAndOverscroll,
225 weak_ptr_factory_.GetWeakPtr(), callback));
226 }
227
228 void InputHandlerManager::DidHandleInputEventAndOverscroll(
229 const InputEventAckStateCallback& callback,
230 InputHandlerProxy::EventDisposition event_disposition,
231 ui::ScopedWebInputEvent input_event,
232 const ui::LatencyInfo& latency_info,
233 std::unique_ptr<ui::DidOverscrollParams> overscroll_params) {
234 InputEventAckState input_event_ack_state =
235 InputEventDispositionToAck(event_disposition);
220 switch (input_event_ack_state) { 236 switch (input_event_ack_state) {
221 case INPUT_EVENT_ACK_STATE_CONSUMED: 237 case INPUT_EVENT_ACK_STATE_CONSUMED:
222 renderer_scheduler_->DidHandleInputEventOnCompositorThread( 238 renderer_scheduler_->DidHandleInputEventOnCompositorThread(
223 *input_event, 239 *input_event,
224 RendererScheduler::InputEventState::EVENT_CONSUMED_BY_COMPOSITOR); 240 RendererScheduler::InputEventState::EVENT_CONSUMED_BY_COMPOSITOR);
225 break; 241 break;
226 case INPUT_EVENT_ACK_STATE_NOT_CONSUMED: 242 case INPUT_EVENT_ACK_STATE_NOT_CONSUMED:
227 renderer_scheduler_->DidHandleInputEventOnCompositorThread( 243 renderer_scheduler_->DidHandleInputEventOnCompositorThread(
228 *input_event, 244 *input_event,
229 RendererScheduler::InputEventState::EVENT_FORWARDED_TO_MAIN_THREAD); 245 RendererScheduler::InputEventState::EVENT_FORWARDED_TO_MAIN_THREAD);
230 break; 246 break;
231 default: 247 default:
232 break; 248 break;
233 } 249 }
234 return input_event_ack_state; 250 callback.Run(input_event_ack_state, std::move(input_event), latency_info,
251 std::move(overscroll_params));
235 } 252 }
236 253
237 void InputHandlerManager::DidOverscroll(int routing_id, 254 void InputHandlerManager::DidOverscroll(int routing_id,
238 const ui::DidOverscrollParams& params) { 255 const ui::DidOverscrollParams& params) {
239 client_->DidOverscroll(routing_id, params); 256 client_->DidOverscroll(routing_id, params);
240 } 257 }
241 258
242 void InputHandlerManager::DidStartFlinging(int routing_id) { 259 void InputHandlerManager::DidStartFlinging(int routing_id) {
243 client_->DidStartFlinging(routing_id); 260 client_->DidStartFlinging(routing_id);
244 } 261 }
245 262
246 void InputHandlerManager::DidStopFlinging(int routing_id) { 263 void InputHandlerManager::DidStopFlinging(int routing_id) {
247 client_->DidStopFlinging(routing_id); 264 client_->DidStopFlinging(routing_id);
248 } 265 }
249 266
250 void InputHandlerManager::DidAnimateForInput() { 267 void InputHandlerManager::DidAnimateForInput() {
251 renderer_scheduler_->DidAnimateForInputOnCompositorThread(); 268 renderer_scheduler_->DidAnimateForInputOnCompositorThread();
252 } 269 }
253 270
254 void InputHandlerManager::NeedsMainFrame(int routing_id) { 271 void InputHandlerManager::NeedsMainFrame(int routing_id) {
255 DCHECK(task_runner_->BelongsToCurrentThread()); 272 DCHECK(task_runner_->BelongsToCurrentThread());
256 auto it = input_handlers_.find(routing_id); 273 auto it = input_handlers_.find(routing_id);
257 if (it == input_handlers_.end()) 274 if (it == input_handlers_.end())
258 return; 275 return;
259 it->second->NeedsMainFrame(); 276 it->second->NeedsMainFrame();
260 } 277 }
261 278
262 } // namespace content 279 } // namespace content
OLDNEW
« no previous file with comments | « content/renderer/input/input_handler_manager.h ('k') | content/renderer/input/input_handler_manager_client.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698