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, ¶ms)) 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) ¤t_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