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 |