15d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "content/renderer/input/input_event_filter.h"
65d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
7cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "base/auto_reset.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h"
97d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "base/command_line.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/debug/trace_event.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/location.h"
12868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/message_loop/message_loop_proxy.h"
131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/single_thread_task_runner.h"
149ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "cc/input/input_handler.h"
15e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch#include "content/common/input/did_overscroll_params.h"
165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "content/common/input/web_input_event_traits.h"
17c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "content/common/input_messages.h"
187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "content/common/view_messages.h"
197d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "content/public/common/content_switches.h"
205c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "ipc/ipc_listener.h"
21f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "ipc/ipc_sender.h"
227d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "ui/gfx/vector2d_f.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebInputEvent;
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include "ipc/ipc_message_null_macros.h"
2723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#undef IPC_MESSAGE_DECL
2823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#define IPC_MESSAGE_DECL(kind, type, name, in, out, ilist, olist) \
2923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  case name::ID: return #name;
3023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
3123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)const char* GetInputMessageTypeName(const IPC::Message& message) {
3223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  switch (message.type()) {
3323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include "content/common/input_messages.h"
3423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    default:
3523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      NOTREACHED() << "Invalid message type: " << message.type();
3623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      break;
3723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  };
3823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  return "NonInputMsgType";
3923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)}
4023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content {
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)InputEventFilter::InputEventFilter(
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    IPC::Listener* main_listener,
451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const scoped_refptr<base::SingleThreadTaskRunner>& main_task_runner,
46868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    const scoped_refptr<base::MessageLoopProxy>& target_loop)
471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    : main_task_runner_(main_task_runner),
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      main_listener_(main_listener),
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sender_(NULL),
507d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      target_loop_(target_loop),
51cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      overscroll_notifications_enabled_(false),
52cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      current_overscroll_params_(NULL) {
537d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  DCHECK(target_loop_.get());
547d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  overscroll_notifications_enabled_ =
557d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      CommandLine::ForCurrentProcess()->HasSwitch(
567d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)          switches::kEnableOverscrollNotifications);
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
59868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void InputEventFilter::SetBoundHandler(const Handler& handler) {
601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  DCHECK(main_task_runner_->BelongsToCurrentThread());
61868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  handler_ = handler;
62868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
63868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
647d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)void InputEventFilter::DidAddInputHandler(int routing_id,
657d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                          cc::InputHandler* input_handler) {
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::AutoLock locked(routes_lock_);
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  routes_.insert(routing_id);
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
70868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void InputEventFilter::DidRemoveInputHandler(int routing_id) {
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::AutoLock locked(routes_lock_);
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  routes_.erase(routing_id);
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
757d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)void InputEventFilter::DidOverscroll(int routing_id,
76e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch                                     const DidOverscrollParams& params) {
777d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (!overscroll_notifications_enabled_)
787d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    return;
797d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
80cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (current_overscroll_params_) {
81cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    current_overscroll_params_->reset(new DidOverscrollParams(params));
82cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return;
83cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
84cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
85cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  SendMessage(scoped_ptr<IPC::Message>(
86cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      new InputHostMsg_DidOverscroll(routing_id, params)));
875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void InputEventFilter::DidStopFlinging(int routing_id) {
90cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  SendMessage(
91cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      scoped_ptr<IPC::Message>(new ViewHostMsg_DidStopFlinging(routing_id)));
927d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
937d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
94f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void InputEventFilter::OnFilterAdded(IPC::Sender* sender) {
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  io_loop_ = base::MessageLoopProxy::current();
96f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  sender_ = sender;
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void InputEventFilter::OnFilterRemoved() {
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sender_ = NULL;
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void InputEventFilter::OnChannelClosing() {
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sender_ = NULL;
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
107c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// This function returns true if the IPC message is one that the compositor
108c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// thread can handle *or* one that needs to preserve relative order with
109c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// messages that the compositor thread can handle. Returning true for a message
110c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// type means that the message will go through an extra copy and thread hop, so
111c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// use with care.
112c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)static bool RequiresThreadBounce(const IPC::Message& message) {
113c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return IPC_MESSAGE_ID_CLASS(message.type()) == InputMsgStart;
114c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
115c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool InputEventFilter::OnMessageReceived(const IPC::Message& message) {
117c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (!RequiresThreadBounce(message))
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  TRACE_EVENT0("input", "InputEventFilter::OnMessageReceived::InputMessage");
12123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::AutoLock locked(routes_lock_);
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (routes_.find(message.routing_id()) == routes_.end())
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return false;
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  target_loop_->PostTask(
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      FROM_HERE,
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&InputEventFilter::ForwardToHandler, this, message));
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)InputEventFilter::~InputEventFilter() {
135cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  DCHECK(!current_overscroll_params_);
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void InputEventFilter::ForwardToMainListener(const IPC::Message& message) {
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  main_listener_->OnMessageReceived(message);
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void InputEventFilter::ForwardToHandler(const IPC::Message& message) {
143868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  DCHECK(!handler_.is_null());
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(target_loop_->BelongsToCurrentThread());
14523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  TRACE_EVENT1("input", "InputEventFilter::ForwardToHandler",
14623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)               "message_type", GetInputMessageTypeName(message));
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
148c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (message.type() != InputMsg_HandleInputEvent::ID) {
14923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    TRACE_EVENT_INSTANT0(
15023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)        "input",
15123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)        "InputEventFilter::ForwardToHandler::ForwardToMainListener",
15223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)        TRACE_EVENT_SCOPE_THREAD);
1531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    main_task_runner_->PostTask(
154c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        FROM_HERE,
1551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        base::Bind(&InputEventFilter::ForwardToMainListener, this, message));
156c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return;
157c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
158c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1593240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  int routing_id = message.routing_id();
160cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  InputMsg_HandleInputEvent::Param params;
161cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (!InputMsg_HandleInputEvent::Read(&message, &params))
1623240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch    return;
163cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  const WebInputEvent* event = params.a;
164cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ui::LatencyInfo latency_info = params.b;
165cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  bool is_keyboard_shortcut = params.c;
1663240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  DCHECK(event);
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  const bool send_ack = !WebInputEventTraits::IgnoresAckDisposition(*event);
16903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
170cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Intercept |DidOverscroll| notifications, bundling any triggered overscroll
171cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // response with the input event ack.
172cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  scoped_ptr<DidOverscrollParams> overscroll_params;
173cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  base::AutoReset<scoped_ptr<DidOverscrollParams>*>
17403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      auto_reset_current_overscroll_params(
17503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)          &current_overscroll_params_, send_ack ? &overscroll_params : NULL);
176cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
177cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  InputEventAckState ack_state = handler_.Run(routing_id, event, &latency_info);
178868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
179cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (ack_state == INPUT_EVENT_ACK_STATE_NOT_CONSUMED) {
180cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    DCHECK(!overscroll_params);
18123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    TRACE_EVENT_INSTANT0(
18223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)        "input",
18323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)        "InputEventFilter::ForwardToHandler::ForwardToMainListener",
18423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)        TRACE_EVENT_SCOPE_THREAD);
1853240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch    IPC::Message new_msg = InputMsg_HandleInputEvent(
1863240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch        routing_id, event, latency_info, is_keyboard_shortcut);
1871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    main_task_runner_->PostTask(
188868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        FROM_HERE,
1891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        base::Bind(&InputEventFilter::ForwardToMainListener, this, new_msg));
190868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    return;
191868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  }
192868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
19303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  if (!send_ack)
194cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return;
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
196cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  InputHostMsg_HandleInputEvent_ACK_Params ack;
197cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ack.type = event->type;
198cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ack.state = ack_state;
199cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ack.latency = latency_info;
200cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ack.overscroll = overscroll_params.Pass();
201cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  SendMessage(scoped_ptr<IPC::Message>(
202cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      new InputHostMsg_HandleInputEvent_ACK(routing_id, ack)));
2035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
2045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
205cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void InputEventFilter::SendMessage(scoped_ptr<IPC::Message> message) {
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(target_loop_->BelongsToCurrentThread());
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
208cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  io_loop_->PostTask(FROM_HERE,
209cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                     base::Bind(&InputEventFilter::SendMessageOnIOThread,
210cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                this,
211cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                base::Passed(&message)));
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
214cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void InputEventFilter::SendMessageOnIOThread(scoped_ptr<IPC::Message> message) {
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(io_loop_->BelongsToCurrentThread());
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!sender_)
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;  // Filter was removed.
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
220cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  sender_->Send(message.release());
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace content
224