Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(27)

Side by Side Diff: content/renderer/input/input_event_filter.cc

Issue 2166703003: Implement Main Thread RAF Aligned Input (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master_main_thread_queue
Patch Set: Clean prototype up Created 4 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
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
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 &current_overscroll_params_, send_ack ? &overscroll_params : NULL); 225 &current_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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698