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 } |
78 | 82 |
79 void InputEventFilter::RegisterRoutingID(int routing_id) { | 83 void InputEventFilter::RegisterRoutingID(int routing_id) { |
80 base::AutoLock locked(routes_lock_); | 84 base::AutoLock locked(routes_lock_); |
81 routes_.insert(routing_id); | 85 routes_.insert(routing_id); |
82 route_queues_[routing_id] = new MainThreadEventQueue( | 86 route_queues_[routing_id] = new MainThreadEventQueue( |
tdresser
2016/08/24 13:42:59
Should we move reading the flag into the MTEQ? It
dtapuska
2016/08/24 17:10:06
I guess. I did it this way as it made TEST_P easie
| |
83 routing_id, this, main_task_runner_, renderer_scheduler_); | 87 routing_id, this, main_task_runner_, renderer_scheduler_, |
88 base::FeatureList::IsEnabled(features::kRafAlignedInputEvents)); | |
84 } | 89 } |
85 | 90 |
86 void InputEventFilter::UnregisterRoutingID(int routing_id) { | 91 void InputEventFilter::UnregisterRoutingID(int routing_id) { |
87 base::AutoLock locked(routes_lock_); | 92 base::AutoLock locked(routes_lock_); |
88 routes_.erase(routing_id); | 93 routes_.erase(routing_id); |
89 route_queues_.erase(routing_id); | 94 route_queues_.erase(routing_id); |
90 } | 95 } |
91 | 96 |
92 void InputEventFilter::DidOverscroll(int routing_id, | 97 void InputEventFilter::DidOverscroll(int routing_id, |
93 const DidOverscrollParams& params) { | 98 const DidOverscrollParams& params) { |
(...skipping 24 matching lines...) Expand all Loading... | |
118 base::AutoLock locked(routes_lock_); | 123 base::AutoLock locked(routes_lock_); |
119 RouteQueueMap::iterator iter = route_queues_.find(routing_id); | 124 RouteQueueMap::iterator iter = route_queues_.find(routing_id); |
120 if (iter == route_queues_.end() || !iter->second) | 125 if (iter == route_queues_.end() || !iter->second) |
121 return; | 126 return; |
122 queue = iter->second; | 127 queue = iter->second; |
123 } | 128 } |
124 | 129 |
125 queue->EventHandled(type, ack_result); | 130 queue->EventHandled(type, ack_result); |
126 } | 131 } |
127 | 132 |
133 void InputEventFilter::ProcessRafAlignedInput(int routing_id) { | |
134 DCHECK(main_task_runner_->BelongsToCurrentThread()); | |
135 scoped_refptr<MainThreadEventQueue> queue; | |
136 { | |
137 base::AutoLock locked(routes_lock_); | |
138 RouteQueueMap::iterator iter = route_queues_.find(routing_id); | |
139 if (iter == route_queues_.end() || !iter->second) | |
140 return; | |
141 queue = iter->second; | |
142 } | |
143 | |
144 queue->DispatchRafAlignedInput(); | |
145 } | |
146 | |
128 void InputEventFilter::OnFilterAdded(IPC::Sender* sender) { | 147 void InputEventFilter::OnFilterAdded(IPC::Sender* sender) { |
129 io_task_runner_ = base::ThreadTaskRunnerHandle::Get(); | 148 io_task_runner_ = base::ThreadTaskRunnerHandle::Get(); |
130 sender_ = sender; | 149 sender_ = sender; |
131 } | 150 } |
132 | 151 |
133 void InputEventFilter::OnFilterRemoved() { | 152 void InputEventFilter::OnFilterRemoved() { |
134 sender_ = NULL; | 153 sender_ = NULL; |
135 } | 154 } |
136 | 155 |
137 void InputEventFilter::OnChannelClosing() { | 156 void InputEventFilter::OnChannelClosing() { |
(...skipping 25 matching lines...) Expand all Loading... | |
163 FROM_HERE, | 182 FROM_HERE, |
164 base::Bind(&InputEventFilter::ForwardToHandler, this, message)); | 183 base::Bind(&InputEventFilter::ForwardToHandler, this, message)); |
165 return true; | 184 return true; |
166 } | 185 } |
167 | 186 |
168 InputEventFilter::~InputEventFilter() { | 187 InputEventFilter::~InputEventFilter() { |
169 DCHECK(!current_overscroll_params_); | 188 DCHECK(!current_overscroll_params_); |
170 } | 189 } |
171 | 190 |
172 void InputEventFilter::ForwardToHandler(const IPC::Message& message) { | 191 void InputEventFilter::ForwardToHandler(const IPC::Message& message) { |
173 DCHECK(!handler_.is_null()); | 192 DCHECK(input_handler_manager_); |
174 DCHECK(target_task_runner_->BelongsToCurrentThread()); | 193 DCHECK(target_task_runner_->BelongsToCurrentThread()); |
175 TRACE_EVENT1("input", "InputEventFilter::ForwardToHandler", | 194 TRACE_EVENT1("input", "InputEventFilter::ForwardToHandler", |
176 "message_type", GetInputMessageTypeName(message)); | 195 "message_type", GetInputMessageTypeName(message)); |
177 | 196 |
178 if (message.type() != InputMsg_HandleInputEvent::ID) { | 197 if (message.type() != InputMsg_HandleInputEvent::ID) { |
179 TRACE_EVENT_INSTANT0( | 198 TRACE_EVENT_INSTANT0( |
180 "input", | 199 "input", |
181 "InputEventFilter::ForwardToHandler::ForwardToMainListener", | 200 "InputEventFilter::ForwardToHandler::ForwardToMainListener", |
182 TRACE_EVENT_SCOPE_THREAD); | 201 TRACE_EVENT_SCOPE_THREAD); |
183 main_task_runner_->PostTask(FROM_HERE, base::Bind(main_listener_, message)); | 202 main_task_runner_->PostTask(FROM_HERE, base::Bind(main_listener_, message)); |
(...skipping 14 matching lines...) Expand all Loading... | |
198 | 217 |
199 bool send_ack = dispatch_type == DISPATCH_TYPE_BLOCKING; | 218 bool send_ack = dispatch_type == DISPATCH_TYPE_BLOCKING; |
200 | 219 |
201 // Intercept |DidOverscroll| notifications, bundling any triggered overscroll | 220 // Intercept |DidOverscroll| notifications, bundling any triggered overscroll |
202 // response with the input event ack. | 221 // response with the input event ack. |
203 std::unique_ptr<DidOverscrollParams> overscroll_params; | 222 std::unique_ptr<DidOverscrollParams> overscroll_params; |
204 base::AutoReset<std::unique_ptr<DidOverscrollParams>*> | 223 base::AutoReset<std::unique_ptr<DidOverscrollParams>*> |
205 auto_reset_current_overscroll_params( | 224 auto_reset_current_overscroll_params( |
206 ¤t_overscroll_params_, send_ack ? &overscroll_params : NULL); | 225 ¤t_overscroll_params_, send_ack ? &overscroll_params : NULL); |
207 | 226 |
208 InputEventAckState ack_state = | 227 InputEventAckState ack_state = input_handler_manager_->HandleInputEvent( |
209 handler_.Run(routing_id, event.get(), &latency_info); | 228 routing_id, event.get(), &latency_info); |
210 | 229 |
211 uint32_t unique_touch_event_id = | 230 uint32_t unique_touch_event_id = |
212 ui::WebInputEventTraits::GetUniqueTouchEventId(*event); | 231 ui::WebInputEventTraits::GetUniqueTouchEventId(*event); |
213 WebInputEvent::Type type = event->type; | 232 WebInputEvent::Type type = event->type; |
214 | 233 |
215 if (ack_state == INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING || | 234 if (ack_state == INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING || |
216 ack_state == INPUT_EVENT_ACK_STATE_NOT_CONSUMED) { | 235 ack_state == INPUT_EVENT_ACK_STATE_NOT_CONSUMED) { |
217 DCHECK(!overscroll_params); | 236 DCHECK(!overscroll_params); |
218 RouteQueueMap::iterator iter = route_queues_.find(routing_id); | 237 RouteQueueMap::iterator iter = route_queues_.find(routing_id); |
219 if (iter != route_queues_.end()) { | 238 if (iter != route_queues_.end()) { |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
262 | 281 |
263 void InputEventFilter::SendInputEventAck(int routing_id, | 282 void InputEventFilter::SendInputEventAck(int routing_id, |
264 blink::WebInputEvent::Type type, | 283 blink::WebInputEvent::Type type, |
265 InputEventAckState ack_result, | 284 InputEventAckState ack_result, |
266 uint32_t touch_event_id) { | 285 uint32_t touch_event_id) { |
267 InputEventAck ack(type, ack_result, touch_event_id); | 286 InputEventAck ack(type, ack_result, touch_event_id); |
268 SendMessage(std::unique_ptr<IPC::Message>( | 287 SendMessage(std::unique_ptr<IPC::Message>( |
269 new InputHostMsg_HandleInputEvent_ACK(routing_id, ack))); | 288 new InputHostMsg_HandleInputEvent_ACK(routing_id, ack))); |
270 } | 289 } |
271 | 290 |
291 void InputEventFilter::NeedsMainFrame(int routing_id) { | |
292 input_handler_manager_->NeedsMainFrame(routing_id); | |
293 } | |
294 | |
272 } // namespace content | 295 } // namespace content |
OLD | NEW |