Index: content/renderer/input/input_event_filter.cc |
diff --git a/content/renderer/input/input_event_filter.cc b/content/renderer/input/input_event_filter.cc |
index 076eec831668228b1cadaa95a7c005f4f70700cc..e9bd18ce6663e9e9a130212d230cb74aff34a86d 100644 |
--- a/content/renderer/input/input_event_filter.cc |
+++ b/content/renderer/input/input_event_filter.cc |
@@ -16,7 +16,9 @@ |
#include "base/trace_event/trace_event.h" |
#include "content/common/input_messages.h" |
#include "content/common/view_messages.h" |
+#include "content/public/common/content_features.h" |
#include "content/public/common/content_switches.h" |
+#include "content/renderer/input/input_handler_manager.h" |
#include "content/renderer/render_thread_impl.h" |
#include "ipc/ipc_listener.h" |
#include "ipc/ipc_sender.h" |
@@ -53,6 +55,7 @@ InputEventFilter::InputEventFilter( |
main_listener_(main_listener), |
sender_(NULL), |
target_task_runner_(target_task_runner), |
+ input_handler_manager_(NULL), |
current_overscroll_params_(NULL), |
renderer_scheduler_(NULL) { |
DCHECK(target_task_runner_.get()); |
@@ -62,9 +65,10 @@ InputEventFilter::InputEventFilter( |
render_thread_impl ? render_thread_impl->GetRendererScheduler() : nullptr; |
} |
-void InputEventFilter::SetBoundHandler(const Handler& handler) { |
+void InputEventFilter::SetInputHandlerManager( |
+ InputHandlerManager* input_handler_manager) { |
DCHECK(main_task_runner_->BelongsToCurrentThread()); |
- handler_ = handler; |
+ input_handler_manager_ = input_handler_manager; |
} |
void InputEventFilter::SetIsFlingingInMainThreadEventQueue(int routing_id, |
@@ -125,6 +129,20 @@ void InputEventFilter::NotifyInputEventHandled(int routing_id, |
queue->EventHandled(type, ack_result); |
} |
+void InputEventFilter::ProcessRafAlignedInput(int routing_id) { |
+ DCHECK(main_task_runner_->BelongsToCurrentThread()); |
+ scoped_refptr<MainThreadEventQueue> queue; |
+ { |
+ base::AutoLock locked(routes_lock_); |
+ RouteQueueMap::iterator iter = route_queues_.find(routing_id); |
+ if (iter == route_queues_.end() || !iter->second) |
+ return; |
+ queue = iter->second; |
+ } |
+ |
+ queue->DispatchRafAlignedInput(); |
+} |
+ |
void InputEventFilter::OnFilterAdded(IPC::Sender* sender) { |
io_task_runner_ = base::ThreadTaskRunnerHandle::Get(); |
sender_ = sender; |
@@ -170,7 +188,7 @@ InputEventFilter::~InputEventFilter() { |
} |
void InputEventFilter::ForwardToHandler(const IPC::Message& message) { |
- DCHECK(!handler_.is_null()); |
+ DCHECK(input_handler_manager_); |
DCHECK(target_task_runner_->BelongsToCurrentThread()); |
TRACE_EVENT1("input", "InputEventFilter::ForwardToHandler", |
"message_type", GetInputMessageTypeName(message)); |
@@ -205,8 +223,8 @@ void InputEventFilter::ForwardToHandler(const IPC::Message& message) { |
auto_reset_current_overscroll_params( |
¤t_overscroll_params_, send_ack ? &overscroll_params : NULL); |
- InputEventAckState ack_state = |
- handler_.Run(routing_id, event.get(), &latency_info); |
+ InputEventAckState ack_state = input_handler_manager_->HandleInputEvent( |
+ routing_id, event.get(), &latency_info); |
uint32_t unique_touch_event_id = |
ui::WebInputEventTraits::GetUniqueTouchEventId(*event); |
@@ -269,4 +287,15 @@ void InputEventFilter::SendInputEventAck(int routing_id, |
new InputHostMsg_HandleInputEvent_ACK(routing_id, ack))); |
} |
+void InputEventFilter::NeedsMainFrame(int routing_id) { |
+ if (target_task_runner_->BelongsToCurrentThread()) { |
+ input_handler_manager_->NeedsMainFrame(routing_id); |
+ return; |
+ } |
+ |
+ target_task_runner_->PostTask( |
+ FROM_HERE, |
+ base::Bind(&InputEventFilter::NeedsMainFrame, this, routing_id)); |
+} |
+ |
} // namespace content |