| 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_event_filter.h" | 5 #include "content/renderer/input/input_event_filter.h" |
| 6 | 6 |
| 7 #include <tuple> | 7 #include <tuple> |
| 8 #include <utility> | 8 #include <utility> |
| 9 | 9 |
| 10 #include "base/auto_reset.h" | 10 #include "base/auto_reset.h" |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 50 namespace content { | 50 namespace content { |
| 51 | 51 |
| 52 InputEventFilter::InputEventFilter( | 52 InputEventFilter::InputEventFilter( |
| 53 const base::Callback<void(const IPC::Message&)>& main_listener, | 53 const base::Callback<void(const IPC::Message&)>& main_listener, |
| 54 const scoped_refptr<base::SingleThreadTaskRunner>& main_task_runner, | 54 const scoped_refptr<base::SingleThreadTaskRunner>& main_task_runner, |
| 55 const scoped_refptr<base::SingleThreadTaskRunner>& target_task_runner) | 55 const scoped_refptr<base::SingleThreadTaskRunner>& target_task_runner) |
| 56 : main_task_runner_(main_task_runner), | 56 : main_task_runner_(main_task_runner), |
| 57 main_listener_(main_listener), | 57 main_listener_(main_listener), |
| 58 sender_(NULL), | 58 sender_(NULL), |
| 59 target_task_runner_(target_task_runner), | 59 target_task_runner_(target_task_runner), |
| 60 input_handler_manager_(NULL), | 60 input_handler_manager_(NULL) { |
| 61 renderer_scheduler_(NULL) { | |
| 62 DCHECK(target_task_runner_.get()); | 61 DCHECK(target_task_runner_.get()); |
| 63 DCHECK(main_task_runner_->BelongsToCurrentThread()); | 62 DCHECK(main_task_runner_->BelongsToCurrentThread()); |
| 64 RenderThreadImpl* render_thread_impl = RenderThreadImpl::current(); | |
| 65 renderer_scheduler_ = | |
| 66 render_thread_impl ? render_thread_impl->GetRendererScheduler() : nullptr; | |
| 67 } | 63 } |
| 68 | 64 |
| 69 void InputEventFilter::SetInputHandlerManager( | 65 void InputEventFilter::SetInputHandlerManager( |
| 70 InputHandlerManager* input_handler_manager) { | 66 InputHandlerManager* input_handler_manager) { |
| 71 DCHECK(main_task_runner_->BelongsToCurrentThread()); | 67 DCHECK(main_task_runner_->BelongsToCurrentThread()); |
| 72 input_handler_manager_ = input_handler_manager; | 68 input_handler_manager_ = input_handler_manager; |
| 73 } | 69 } |
| 74 | 70 |
| 75 void InputEventFilter::RegisterRoutingID(int routing_id) { | 71 void InputEventFilter::RegisterRoutingID( |
| 72 int routing_id, |
| 73 const scoped_refptr<MainThreadEventQueue>& input_event_queue) { |
| 76 base::AutoLock locked(routes_lock_); | 74 base::AutoLock locked(routes_lock_); |
| 77 routes_.insert(routing_id); | 75 routes_.insert(routing_id); |
| 78 route_queues_[routing_id] = new MainThreadEventQueue( | 76 route_queues_[routing_id] = input_event_queue; |
| 79 routing_id, this, main_task_runner_, renderer_scheduler_); | |
| 80 } | 77 } |
| 81 | 78 |
| 82 void InputEventFilter::RegisterAssociatedRenderFrameRoutingID( | 79 void InputEventFilter::RegisterAssociatedRenderFrameRoutingID( |
| 83 int render_frame_routing_id, | 80 int render_frame_routing_id, |
| 84 int render_view_routing_id) { | 81 int render_view_routing_id) { |
| 85 base::AutoLock locked(routes_lock_); | 82 base::AutoLock locked(routes_lock_); |
| 86 DCHECK(routes_.find(render_view_routing_id) != routes_.end()); | 83 DCHECK(routes_.find(render_view_routing_id) != routes_.end()); |
| 87 associated_routes_[render_frame_routing_id] = render_view_routing_id; | 84 associated_routes_[render_frame_routing_id] = render_view_routing_id; |
| 88 } | 85 } |
| 89 | 86 |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 126 const ui::LatencyInfo& latency_info) { | 123 const ui::LatencyInfo& latency_info) { |
| 127 DCHECK(target_task_runner_->BelongsToCurrentThread()); | 124 DCHECK(target_task_runner_->BelongsToCurrentThread()); |
| 128 RouteQueueMap::iterator iter = route_queues_.find(routing_id); | 125 RouteQueueMap::iterator iter = route_queues_.find(routing_id); |
| 129 if (iter != route_queues_.end()) { | 126 if (iter != route_queues_.end()) { |
| 130 iter->second->HandleEvent(std::move(event), latency_info, | 127 iter->second->HandleEvent(std::move(event), latency_info, |
| 131 DISPATCH_TYPE_NON_BLOCKING, | 128 DISPATCH_TYPE_NON_BLOCKING, |
| 132 INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING); | 129 INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING); |
| 133 } | 130 } |
| 134 } | 131 } |
| 135 | 132 |
| 136 void InputEventFilter::NotifyInputEventHandled( | |
| 137 int routing_id, | |
| 138 blink::WebInputEvent::Type type, | |
| 139 blink::WebInputEventResult result, | |
| 140 InputEventAckState ack_result) { | |
| 141 DCHECK(main_task_runner_->BelongsToCurrentThread()); | |
| 142 scoped_refptr<MainThreadEventQueue> queue; | |
| 143 { | |
| 144 base::AutoLock locked(routes_lock_); | |
| 145 RouteQueueMap::iterator iter = route_queues_.find(routing_id); | |
| 146 if (iter == route_queues_.end() || !iter->second) | |
| 147 return; | |
| 148 queue = iter->second; | |
| 149 } | |
| 150 | |
| 151 queue->EventHandled(type, result, ack_result); | |
| 152 } | |
| 153 | |
| 154 void InputEventFilter::ProcessRafAlignedInput(int routing_id, | |
| 155 base::TimeTicks frame_time) { | |
| 156 DCHECK(main_task_runner_->BelongsToCurrentThread()); | |
| 157 scoped_refptr<MainThreadEventQueue> queue; | |
| 158 { | |
| 159 base::AutoLock locked(routes_lock_); | |
| 160 RouteQueueMap::iterator iter = route_queues_.find(routing_id); | |
| 161 if (iter == route_queues_.end() || !iter->second) | |
| 162 return; | |
| 163 queue = iter->second; | |
| 164 } | |
| 165 | |
| 166 queue->DispatchRafAlignedInput(frame_time); | |
| 167 } | |
| 168 | |
| 169 void InputEventFilter::OnFilterAdded(IPC::Channel* channel) { | 133 void InputEventFilter::OnFilterAdded(IPC::Channel* channel) { |
| 170 io_task_runner_ = base::ThreadTaskRunnerHandle::Get(); | 134 io_task_runner_ = base::ThreadTaskRunnerHandle::Get(); |
| 171 sender_ = channel; | 135 sender_ = channel; |
| 172 } | 136 } |
| 173 | 137 |
| 174 void InputEventFilter::OnFilterRemoved() { | 138 void InputEventFilter::OnFilterRemoved() { |
| 175 sender_ = NULL; | 139 sender_ = NULL; |
| 176 } | 140 } |
| 177 | 141 |
| 178 void InputEventFilter::OnChannelClosing() { | 142 void InputEventFilter::OnChannelClosing() { |
| (...skipping 145 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 324 | 288 |
| 325 bool success = sender_->Send(message.release()); | 289 bool success = sender_->Send(message.release()); |
| 326 if (success) | 290 if (success) |
| 327 return; | 291 return; |
| 328 static size_t s_send_failure_count_ = 0; | 292 static size_t s_send_failure_count_ = 0; |
| 329 s_send_failure_count_++; | 293 s_send_failure_count_++; |
| 330 base::debug::SetCrashKeyValue("input-event-filter-send-failure", | 294 base::debug::SetCrashKeyValue("input-event-filter-send-failure", |
| 331 base::IntToString(s_send_failure_count_)); | 295 base::IntToString(s_send_failure_count_)); |
| 332 } | 296 } |
| 333 | 297 |
| 334 void InputEventFilter::HandleEventOnMainThread( | |
| 335 int routing_id, | |
| 336 const blink::WebCoalescedInputEvent* event, | |
| 337 const ui::LatencyInfo& latency_info, | |
| 338 InputEventDispatchType dispatch_type) { | |
| 339 TRACE_EVENT_INSTANT0("input", "InputEventFilter::HandlEventOnMainThread", | |
| 340 TRACE_EVENT_SCOPE_THREAD); | |
| 341 IPC::Message new_msg = InputMsg_HandleInputEvent( | |
| 342 routing_id, &event->Event(), event->GetCoalescedEventsPointers(), | |
| 343 latency_info, dispatch_type); | |
| 344 main_listener_.Run(new_msg); | |
| 345 } | |
| 346 | |
| 347 void InputEventFilter::SendInputEventAck(int routing_id, | |
| 348 blink::WebInputEvent::Type type, | |
| 349 InputEventAckState ack_result, | |
| 350 uint32_t touch_event_id) { | |
| 351 DCHECK(main_task_runner_->BelongsToCurrentThread()); | |
| 352 InputEventAck ack(InputEventAckSource::MAIN_THREAD, type, ack_result, | |
| 353 touch_event_id); | |
| 354 SendMessage(std::unique_ptr<IPC::Message>( | |
| 355 new InputHostMsg_HandleInputEvent_ACK(routing_id, ack))); | |
| 356 } | |
| 357 | |
| 358 void InputEventFilter::NeedsMainFrame(int routing_id) { | |
| 359 if (target_task_runner_->BelongsToCurrentThread()) { | |
| 360 input_handler_manager_->NeedsMainFrame(routing_id); | |
| 361 return; | |
| 362 } | |
| 363 | |
| 364 CHECK(target_task_runner_->PostTask( | |
| 365 FROM_HERE, | |
| 366 base::Bind(&InputEventFilter::NeedsMainFrame, this, routing_id))) | |
| 367 << "PostTask failed"; | |
| 368 } | |
| 369 | |
| 370 } // namespace content | 298 } // namespace content |
| OLD | NEW |