| 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 |