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 3 // found in the LICENSE file. 4 5 #include "content/browser/android/in_process/synchronous_input_event_filter.h" 6 7 #include "base/callback.h" 8 #include "cc/input/input_handler.h" 9 #include "content/browser/android/in_process/synchronous_compositor_impl.h" 10 #include "content/public/browser/browser_thread.h" 11 #include "ui/base/latency_info.h" 12 13 using WebKit::WebInputEvent; 14 15 namespace content { 16 17 SynchronousInputEventFilter::SynchronousInputEventFilter() { 18 } 19 20 SynchronousInputEventFilter::~SynchronousInputEventFilter() { 21 } 22 23 InputEventAckState SynchronousInputEventFilter::HandleInputEvent( 24 int routing_id, 25 const WebKit::WebInputEvent& input_event) { 26 // The handler will be empty both before renderer initialization and after 27 // renderer destruction. It's possible that this will be reached in such a 28 // state. While not good, it should also not be fatal. 29 if (handler_.is_null()) 30 return INPUT_EVENT_ACK_STATE_NO_CONSUMER_EXISTS; 31 32 return handler_.Run(routing_id, &input_event, ui::LatencyInfo()); 33 } 34 35 void SynchronousInputEventFilter::SetBoundHandler(const Handler& handler) { 36 BrowserThread::PostTask( 37 BrowserThread::UI, FROM_HERE, 38 base::Bind(&SynchronousInputEventFilter::SetBoundHandlerOnUIThread, 39 base::Unretained(this), handler)); 40 } 41 42 void SynchronousInputEventFilter::SetBoundHandlerOnUIThread( 43 const Handler& handler) { 44 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 45 handler_ = handler; 46 } 47 48 void SynchronousInputEventFilter::DidAddInputHandler( 49 int routing_id, 50 cc::InputHandler* input_handler) { 51 // The SynchronusCompositorImpl can be NULL if the WebContents that it's 52 // bound to has already been deleted. 53 SynchronousCompositorImpl* compositor = 54 SynchronousCompositorImpl::FromRoutingID(routing_id); 55 if (compositor) 56 compositor->SetInputHandler(input_handler); 57 } 58 59 void SynchronousInputEventFilter::DidRemoveInputHandler(int routing_id) { 60 // The SynchronusCompositorImpl can be NULL if the WebContents that it's 61 // bound to has already been deleted. 62 SynchronousCompositorImpl* compositor = 63 SynchronousCompositorImpl::FromRoutingID(routing_id); 64 if (compositor) 65 compositor->SetInputHandler(NULL); 66 } 67 68 void SynchronousInputEventFilter::DidOverscroll( 69 int routing_id, 70 const cc::DidOverscrollParams& params) { 71 // The SynchronusCompositorImpl can be NULL if the WebContents that it's 72 // bound to has already been deleted. 73 SynchronousCompositorImpl* compositor = 74 SynchronousCompositorImpl::FromRoutingID(routing_id); 75 if (compositor) 76 compositor->DidOverscroll(params); 77 } 78 79 } // namespace content 80