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" |
11 #include "base/bind.h" | 11 #include "base/bind.h" |
12 #include "base/location.h" | 12 #include "base/location.h" |
13 #include "base/memory/ptr_util.h" | 13 #include "base/memory/ptr_util.h" |
14 #include "base/single_thread_task_runner.h" | 14 #include "base/single_thread_task_runner.h" |
15 #include "base/threading/thread_task_runner_handle.h" | 15 #include "base/threading/thread_task_runner_handle.h" |
16 #include "base/trace_event/trace_event.h" | 16 #include "base/trace_event/trace_event.h" |
17 #include "content/common/input_messages.h" | 17 #include "content/common/input_messages.h" |
18 #include "content/common/view_messages.h" | 18 #include "content/common/view_messages.h" |
| 19 #include "content/public/common/content_features.h" |
19 #include "content/public/common/content_switches.h" | 20 #include "content/public/common/content_switches.h" |
| 21 #include "content/renderer/input/input_handler_manager.h" |
20 #include "content/renderer/render_thread_impl.h" | 22 #include "content/renderer/render_thread_impl.h" |
21 #include "ipc/ipc_listener.h" | 23 #include "ipc/ipc_listener.h" |
22 #include "ipc/ipc_sender.h" | 24 #include "ipc/ipc_sender.h" |
23 #include "ui/events/blink/did_overscroll_params.h" | 25 #include "ui/events/blink/did_overscroll_params.h" |
24 #include "ui/events/blink/web_input_event_traits.h" | 26 #include "ui/events/blink/web_input_event_traits.h" |
25 #include "ui/gfx/geometry/vector2d_f.h" | 27 #include "ui/gfx/geometry/vector2d_f.h" |
26 | 28 |
27 using blink::WebInputEvent; | 29 using blink::WebInputEvent; |
28 using ui::DidOverscrollParams; | 30 using ui::DidOverscrollParams; |
29 | 31 |
(...skipping 16 matching lines...) Expand all Loading... |
46 namespace content { | 48 namespace content { |
47 | 49 |
48 InputEventFilter::InputEventFilter( | 50 InputEventFilter::InputEventFilter( |
49 const base::Callback<void(const IPC::Message&)>& main_listener, | 51 const base::Callback<void(const IPC::Message&)>& main_listener, |
50 const scoped_refptr<base::SingleThreadTaskRunner>& main_task_runner, | 52 const scoped_refptr<base::SingleThreadTaskRunner>& main_task_runner, |
51 const scoped_refptr<base::SingleThreadTaskRunner>& target_task_runner) | 53 const scoped_refptr<base::SingleThreadTaskRunner>& target_task_runner) |
52 : main_task_runner_(main_task_runner), | 54 : main_task_runner_(main_task_runner), |
53 main_listener_(main_listener), | 55 main_listener_(main_listener), |
54 sender_(NULL), | 56 sender_(NULL), |
55 target_task_runner_(target_task_runner), | 57 target_task_runner_(target_task_runner), |
| 58 input_handler_manager_(NULL), |
56 current_overscroll_params_(NULL), | 59 current_overscroll_params_(NULL), |
57 renderer_scheduler_(NULL) { | 60 renderer_scheduler_(NULL) { |
58 DCHECK(target_task_runner_.get()); | 61 DCHECK(target_task_runner_.get()); |
59 DCHECK(main_task_runner_->BelongsToCurrentThread()); | 62 DCHECK(main_task_runner_->BelongsToCurrentThread()); |
60 RenderThreadImpl* render_thread_impl = RenderThreadImpl::current(); | 63 RenderThreadImpl* render_thread_impl = RenderThreadImpl::current(); |
61 renderer_scheduler_ = | 64 renderer_scheduler_ = |
62 render_thread_impl ? render_thread_impl->GetRendererScheduler() : nullptr; | 65 render_thread_impl ? render_thread_impl->GetRendererScheduler() : nullptr; |
63 } | 66 } |
64 | 67 |
65 void InputEventFilter::SetBoundHandler(const Handler& handler) { | 68 void InputEventFilter::SetInputHandlerManager( |
| 69 InputHandlerManager* input_handler_manager) { |
66 DCHECK(main_task_runner_->BelongsToCurrentThread()); | 70 DCHECK(main_task_runner_->BelongsToCurrentThread()); |
67 handler_ = handler; | 71 input_handler_manager_ = input_handler_manager; |
68 } | 72 } |
69 | 73 |
70 void InputEventFilter::SetIsFlingingInMainThreadEventQueue(int routing_id, | 74 void InputEventFilter::SetIsFlingingInMainThreadEventQueue(int routing_id, |
71 bool is_flinging) { | 75 bool is_flinging) { |
72 RouteQueueMap::iterator iter = route_queues_.find(routing_id); | 76 RouteQueueMap::iterator iter = route_queues_.find(routing_id); |
73 if (iter == route_queues_.end() || !iter->second) | 77 if (iter == route_queues_.end() || !iter->second) |
74 return; | 78 return; |
75 | 79 |
76 iter->second->set_is_flinging(is_flinging); | 80 iter->second->set_is_flinging(is_flinging); |
77 } | 81 } |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
118 base::AutoLock locked(routes_lock_); | 122 base::AutoLock locked(routes_lock_); |
119 RouteQueueMap::iterator iter = route_queues_.find(routing_id); | 123 RouteQueueMap::iterator iter = route_queues_.find(routing_id); |
120 if (iter == route_queues_.end() || !iter->second) | 124 if (iter == route_queues_.end() || !iter->second) |
121 return; | 125 return; |
122 queue = iter->second; | 126 queue = iter->second; |
123 } | 127 } |
124 | 128 |
125 queue->EventHandled(type, ack_result); | 129 queue->EventHandled(type, ack_result); |
126 } | 130 } |
127 | 131 |
| 132 void InputEventFilter::ProcessRafAlignedInput(int routing_id) { |
| 133 DCHECK(main_task_runner_->BelongsToCurrentThread()); |
| 134 scoped_refptr<MainThreadEventQueue> queue; |
| 135 { |
| 136 base::AutoLock locked(routes_lock_); |
| 137 RouteQueueMap::iterator iter = route_queues_.find(routing_id); |
| 138 if (iter == route_queues_.end() || !iter->second) |
| 139 return; |
| 140 queue = iter->second; |
| 141 } |
| 142 |
| 143 queue->DispatchRafAlignedInput(); |
| 144 } |
| 145 |
128 void InputEventFilter::OnFilterAdded(IPC::Sender* sender) { | 146 void InputEventFilter::OnFilterAdded(IPC::Sender* sender) { |
129 io_task_runner_ = base::ThreadTaskRunnerHandle::Get(); | 147 io_task_runner_ = base::ThreadTaskRunnerHandle::Get(); |
130 sender_ = sender; | 148 sender_ = sender; |
131 } | 149 } |
132 | 150 |
133 void InputEventFilter::OnFilterRemoved() { | 151 void InputEventFilter::OnFilterRemoved() { |
134 sender_ = NULL; | 152 sender_ = NULL; |
135 } | 153 } |
136 | 154 |
137 void InputEventFilter::OnChannelClosing() { | 155 void InputEventFilter::OnChannelClosing() { |
(...skipping 25 matching lines...) Expand all Loading... |
163 FROM_HERE, | 181 FROM_HERE, |
164 base::Bind(&InputEventFilter::ForwardToHandler, this, message)); | 182 base::Bind(&InputEventFilter::ForwardToHandler, this, message)); |
165 return true; | 183 return true; |
166 } | 184 } |
167 | 185 |
168 InputEventFilter::~InputEventFilter() { | 186 InputEventFilter::~InputEventFilter() { |
169 DCHECK(!current_overscroll_params_); | 187 DCHECK(!current_overscroll_params_); |
170 } | 188 } |
171 | 189 |
172 void InputEventFilter::ForwardToHandler(const IPC::Message& message) { | 190 void InputEventFilter::ForwardToHandler(const IPC::Message& message) { |
173 DCHECK(!handler_.is_null()); | 191 DCHECK(input_handler_manager_); |
174 DCHECK(target_task_runner_->BelongsToCurrentThread()); | 192 DCHECK(target_task_runner_->BelongsToCurrentThread()); |
175 TRACE_EVENT1("input", "InputEventFilter::ForwardToHandler", | 193 TRACE_EVENT1("input", "InputEventFilter::ForwardToHandler", |
176 "message_type", GetInputMessageTypeName(message)); | 194 "message_type", GetInputMessageTypeName(message)); |
177 | 195 |
178 if (message.type() != InputMsg_HandleInputEvent::ID) { | 196 if (message.type() != InputMsg_HandleInputEvent::ID) { |
179 TRACE_EVENT_INSTANT0( | 197 TRACE_EVENT_INSTANT0( |
180 "input", | 198 "input", |
181 "InputEventFilter::ForwardToHandler::ForwardToMainListener", | 199 "InputEventFilter::ForwardToHandler::ForwardToMainListener", |
182 TRACE_EVENT_SCOPE_THREAD); | 200 TRACE_EVENT_SCOPE_THREAD); |
183 main_task_runner_->PostTask(FROM_HERE, base::Bind(main_listener_, message)); | 201 main_task_runner_->PostTask(FROM_HERE, base::Bind(main_listener_, message)); |
(...skipping 14 matching lines...) Expand all Loading... |
198 | 216 |
199 bool send_ack = dispatch_type == DISPATCH_TYPE_BLOCKING; | 217 bool send_ack = dispatch_type == DISPATCH_TYPE_BLOCKING; |
200 | 218 |
201 // Intercept |DidOverscroll| notifications, bundling any triggered overscroll | 219 // Intercept |DidOverscroll| notifications, bundling any triggered overscroll |
202 // response with the input event ack. | 220 // response with the input event ack. |
203 std::unique_ptr<DidOverscrollParams> overscroll_params; | 221 std::unique_ptr<DidOverscrollParams> overscroll_params; |
204 base::AutoReset<std::unique_ptr<DidOverscrollParams>*> | 222 base::AutoReset<std::unique_ptr<DidOverscrollParams>*> |
205 auto_reset_current_overscroll_params( | 223 auto_reset_current_overscroll_params( |
206 ¤t_overscroll_params_, send_ack ? &overscroll_params : NULL); | 224 ¤t_overscroll_params_, send_ack ? &overscroll_params : NULL); |
207 | 225 |
208 InputEventAckState ack_state = | 226 InputEventAckState ack_state = input_handler_manager_->HandleInputEvent( |
209 handler_.Run(routing_id, event.get(), &latency_info); | 227 routing_id, event.get(), &latency_info); |
210 | 228 |
211 uint32_t unique_touch_event_id = | 229 uint32_t unique_touch_event_id = |
212 ui::WebInputEventTraits::GetUniqueTouchEventId(*event); | 230 ui::WebInputEventTraits::GetUniqueTouchEventId(*event); |
213 WebInputEvent::Type type = event->type; | 231 WebInputEvent::Type type = event->type; |
214 | 232 |
215 if (ack_state == INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING || | 233 if (ack_state == INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING || |
216 ack_state == INPUT_EVENT_ACK_STATE_NOT_CONSUMED) { | 234 ack_state == INPUT_EVENT_ACK_STATE_NOT_CONSUMED) { |
217 DCHECK(!overscroll_params); | 235 DCHECK(!overscroll_params); |
218 RouteQueueMap::iterator iter = route_queues_.find(routing_id); | 236 RouteQueueMap::iterator iter = route_queues_.find(routing_id); |
219 if (iter != route_queues_.end()) { | 237 if (iter != route_queues_.end()) { |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
262 | 280 |
263 void InputEventFilter::SendInputEventAck(int routing_id, | 281 void InputEventFilter::SendInputEventAck(int routing_id, |
264 blink::WebInputEvent::Type type, | 282 blink::WebInputEvent::Type type, |
265 InputEventAckState ack_result, | 283 InputEventAckState ack_result, |
266 uint32_t touch_event_id) { | 284 uint32_t touch_event_id) { |
267 InputEventAck ack(type, ack_result, touch_event_id); | 285 InputEventAck ack(type, ack_result, touch_event_id); |
268 SendMessage(std::unique_ptr<IPC::Message>( | 286 SendMessage(std::unique_ptr<IPC::Message>( |
269 new InputHostMsg_HandleInputEvent_ACK(routing_id, ack))); | 287 new InputHostMsg_HandleInputEvent_ACK(routing_id, ack))); |
270 } | 288 } |
271 | 289 |
| 290 void InputEventFilter::NeedsMainFrame(int routing_id) { |
| 291 if (target_task_runner_->BelongsToCurrentThread()) { |
| 292 input_handler_manager_->NeedsMainFrame(routing_id); |
| 293 return; |
| 294 } |
| 295 |
| 296 target_task_runner_->PostTask( |
| 297 FROM_HERE, |
| 298 base::Bind(&InputEventFilter::NeedsMainFrame, this, routing_id)); |
| 299 } |
| 300 |
272 } // namespace content | 301 } // namespace content |
OLD | NEW |