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 "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 Loading... |
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 Loading... |
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 |
OLD | NEW |