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

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

Issue 2813683002: Allow MainThreadEventQueue to call the RenderWidget directly. (Closed)
Patch Set: Fix style nits Created 3 years, 8 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"
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
50 namespace content { 50 namespace content {
51 51
52 InputEventFilter::InputEventFilter( 52 InputEventFilter::InputEventFilter(
53 const base::Callback<void(const IPC::Message&)>& main_listener, 53 const base::Callback<void(const IPC::Message&)>& main_listener,
54 const scoped_refptr<base::SingleThreadTaskRunner>& main_task_runner, 54 const scoped_refptr<base::SingleThreadTaskRunner>& main_task_runner,
55 const scoped_refptr<base::SingleThreadTaskRunner>& target_task_runner) 55 const scoped_refptr<base::SingleThreadTaskRunner>& target_task_runner)
56 : main_task_runner_(main_task_runner), 56 : main_task_runner_(main_task_runner),
57 main_listener_(main_listener), 57 main_listener_(main_listener),
58 sender_(NULL), 58 sender_(NULL),
59 target_task_runner_(target_task_runner), 59 target_task_runner_(target_task_runner),
60 input_handler_manager_(NULL), 60 input_handler_manager_(NULL) {
61 renderer_scheduler_(NULL) {
62 DCHECK(target_task_runner_.get()); 61 DCHECK(target_task_runner_.get());
63 DCHECK(main_task_runner_->BelongsToCurrentThread()); 62 DCHECK(main_task_runner_->BelongsToCurrentThread());
64 RenderThreadImpl* render_thread_impl = RenderThreadImpl::current();
65 renderer_scheduler_ =
66 render_thread_impl ? render_thread_impl->GetRendererScheduler() : nullptr;
67 } 63 }
68 64
69 void InputEventFilter::SetInputHandlerManager( 65 void InputEventFilter::SetInputHandlerManager(
70 InputHandlerManager* input_handler_manager) { 66 InputHandlerManager* input_handler_manager) {
71 DCHECK(main_task_runner_->BelongsToCurrentThread()); 67 DCHECK(main_task_runner_->BelongsToCurrentThread());
72 input_handler_manager_ = input_handler_manager; 68 input_handler_manager_ = input_handler_manager;
73 } 69 }
74 70
75 void InputEventFilter::RegisterRoutingID(int routing_id) { 71 void InputEventFilter::RegisterRoutingID(
72 int routing_id,
73 const scoped_refptr<MainThreadEventQueue>& input_event_queue) {
76 base::AutoLock locked(routes_lock_); 74 base::AutoLock locked(routes_lock_);
77 routes_.insert(routing_id); 75 routes_.insert(routing_id);
78 route_queues_[routing_id] = new MainThreadEventQueue( 76 route_queues_[routing_id] = input_event_queue;
79 routing_id, this, main_task_runner_, renderer_scheduler_);
80 } 77 }
81 78
82 void InputEventFilter::RegisterAssociatedRenderFrameRoutingID( 79 void InputEventFilter::RegisterAssociatedRenderFrameRoutingID(
83 int render_frame_routing_id, 80 int render_frame_routing_id,
84 int render_view_routing_id) { 81 int render_view_routing_id) {
85 base::AutoLock locked(routes_lock_); 82 base::AutoLock locked(routes_lock_);
86 DCHECK(routes_.find(render_view_routing_id) != routes_.end()); 83 DCHECK(routes_.find(render_view_routing_id) != routes_.end());
87 associated_routes_[render_frame_routing_id] = render_view_routing_id; 84 associated_routes_[render_frame_routing_id] = render_view_routing_id;
88 } 85 }
89 86
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
126 const ui::LatencyInfo& latency_info) { 123 const ui::LatencyInfo& latency_info) {
127 DCHECK(target_task_runner_->BelongsToCurrentThread()); 124 DCHECK(target_task_runner_->BelongsToCurrentThread());
128 RouteQueueMap::iterator iter = route_queues_.find(routing_id); 125 RouteQueueMap::iterator iter = route_queues_.find(routing_id);
129 if (iter != route_queues_.end()) { 126 if (iter != route_queues_.end()) {
130 iter->second->HandleEvent(std::move(event), latency_info, 127 iter->second->HandleEvent(std::move(event), latency_info,
131 DISPATCH_TYPE_NON_BLOCKING, 128 DISPATCH_TYPE_NON_BLOCKING,
132 INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING); 129 INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING);
133 } 130 }
134 } 131 }
135 132
136 void InputEventFilter::NotifyInputEventHandled(
137 int routing_id,
138 blink::WebInputEvent::Type type,
139 blink::WebInputEventResult result,
140 InputEventAckState ack_result) {
141 DCHECK(main_task_runner_->BelongsToCurrentThread());
142 scoped_refptr<MainThreadEventQueue> queue;
143 {
144 base::AutoLock locked(routes_lock_);
145 RouteQueueMap::iterator iter = route_queues_.find(routing_id);
146 if (iter == route_queues_.end() || !iter->second)
147 return;
148 queue = iter->second;
149 }
150
151 queue->EventHandled(type, result, ack_result);
152 }
153
154 void InputEventFilter::ProcessRafAlignedInput(int routing_id,
155 base::TimeTicks frame_time) {
156 DCHECK(main_task_runner_->BelongsToCurrentThread());
157 scoped_refptr<MainThreadEventQueue> queue;
158 {
159 base::AutoLock locked(routes_lock_);
160 RouteQueueMap::iterator iter = route_queues_.find(routing_id);
161 if (iter == route_queues_.end() || !iter->second)
162 return;
163 queue = iter->second;
164 }
165
166 queue->DispatchRafAlignedInput(frame_time);
167 }
168
169 void InputEventFilter::OnFilterAdded(IPC::Channel* channel) { 133 void InputEventFilter::OnFilterAdded(IPC::Channel* channel) {
170 io_task_runner_ = base::ThreadTaskRunnerHandle::Get(); 134 io_task_runner_ = base::ThreadTaskRunnerHandle::Get();
171 sender_ = channel; 135 sender_ = channel;
172 } 136 }
173 137
174 void InputEventFilter::OnFilterRemoved() { 138 void InputEventFilter::OnFilterRemoved() {
175 sender_ = NULL; 139 sender_ = NULL;
176 } 140 }
177 141
178 void InputEventFilter::OnChannelClosing() { 142 void InputEventFilter::OnChannelClosing() {
(...skipping 145 matching lines...) Expand 10 before | Expand all | Expand 10 after
324 288
325 bool success = sender_->Send(message.release()); 289 bool success = sender_->Send(message.release());
326 if (success) 290 if (success)
327 return; 291 return;
328 static size_t s_send_failure_count_ = 0; 292 static size_t s_send_failure_count_ = 0;
329 s_send_failure_count_++; 293 s_send_failure_count_++;
330 base::debug::SetCrashKeyValue("input-event-filter-send-failure", 294 base::debug::SetCrashKeyValue("input-event-filter-send-failure",
331 base::IntToString(s_send_failure_count_)); 295 base::IntToString(s_send_failure_count_));
332 } 296 }
333 297
334 void InputEventFilter::HandleEventOnMainThread(
335 int routing_id,
336 const blink::WebCoalescedInputEvent* event,
337 const ui::LatencyInfo& latency_info,
338 InputEventDispatchType dispatch_type) {
339 TRACE_EVENT_INSTANT0("input", "InputEventFilter::HandlEventOnMainThread",
340 TRACE_EVENT_SCOPE_THREAD);
341 IPC::Message new_msg = InputMsg_HandleInputEvent(
342 routing_id, &event->Event(), event->GetCoalescedEventsPointers(),
343 latency_info, dispatch_type);
344 main_listener_.Run(new_msg);
345 }
346
347 void InputEventFilter::SendInputEventAck(int routing_id,
348 blink::WebInputEvent::Type type,
349 InputEventAckState ack_result,
350 uint32_t touch_event_id) {
351 DCHECK(main_task_runner_->BelongsToCurrentThread());
352 InputEventAck ack(InputEventAckSource::MAIN_THREAD, type, ack_result,
353 touch_event_id);
354 SendMessage(std::unique_ptr<IPC::Message>(
355 new InputHostMsg_HandleInputEvent_ACK(routing_id, ack)));
356 }
357
358 void InputEventFilter::NeedsMainFrame(int routing_id) {
359 if (target_task_runner_->BelongsToCurrentThread()) {
360 input_handler_manager_->NeedsMainFrame(routing_id);
361 return;
362 }
363
364 CHECK(target_task_runner_->PostTask(
365 FROM_HERE,
366 base::Bind(&InputEventFilter::NeedsMainFrame, this, routing_id)))
367 << "PostTask failed";
368 }
369
370 } // namespace content 298 } // 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