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

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: Rename NeedsMainFrame to SetNeedsMainFrame and move it to the render_widget 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 }
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
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
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
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 &current_overscroll_params_, send_ack ? &overscroll_params : NULL); 224 &current_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
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
OLDNEW
« no previous file with comments | « content/renderer/input/input_event_filter.h ('k') | content/renderer/input/input_event_filter_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698