// Copyright 2013 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef CONTENT_RENDERER_INPUT_INPUT_HANDLER_PROXY_H_ #define CONTENT_RENDERER_INPUT_INPUT_HANDLER_PROXY_H_ #include "base/basictypes.h" #include "base/containers/hash_tables.h" #include "base/memory/scoped_ptr.h" #include "cc/input/input_handler.h" #include "content/common/content_export.h" #include "third_party/WebKit/public/platform/WebGestureCurve.h" #include "third_party/WebKit/public/platform/WebGestureCurveTarget.h" #include "third_party/WebKit/public/web/WebActiveWheelFlingParameters.h" #include "third_party/WebKit/public/web/WebInputEvent.h" namespace content { class InputHandlerProxyClient; // This class is a proxy between the content input event filtering and the // compositor's input handling logic. InputHandlerProxy instances live entirely // on the compositor thread. Each InputHandler instance handles input events // intended for a specific WebWidget. class CONTENT_EXPORT InputHandlerProxy : public cc::InputHandlerClient, public NON_EXPORTED_BASE(blink::WebGestureCurveTarget) { public: explicit InputHandlerProxy(cc::InputHandler* input_handler); virtual ~InputHandlerProxy(); void SetClient(InputHandlerProxyClient* client); enum EventDisposition { DID_HANDLE, DID_NOT_HANDLE, DROP_EVENT }; EventDisposition HandleInputEventWithLatencyInfo( const blink::WebInputEvent& event, ui::LatencyInfo* latency_info); EventDisposition HandleInputEvent(const blink::WebInputEvent& event); // cc::InputHandlerClient implementation. virtual void WillShutdown() OVERRIDE; virtual void Animate(base::TimeTicks time) OVERRIDE; virtual void MainThreadHasStoppedFlinging() OVERRIDE; virtual void DidOverscroll(const cc::DidOverscrollParams& params) OVERRIDE; // blink::WebGestureCurveTarget implementation. virtual void scrollBy(const blink::WebFloatSize& offset); virtual void notifyCurrentFlingVelocity(const blink::WebFloatSize& velocity); bool gesture_scroll_on_impl_thread_for_testing() const { return gesture_scroll_on_impl_thread_; } private: EventDisposition HandleGestureFling(const blink::WebGestureEvent& event); // Returns true if we scrolled by the increment. bool TouchpadFlingScroll(const blink::WebFloatSize& increment); // Returns true if we actually had an active fling to cancel. bool CancelCurrentFling(); scoped_ptr<blink::WebGestureCurve> fling_curve_; // Parameters for the active fling animation, stored in case we need to // transfer it out later. blink::WebActiveWheelFlingParameters fling_parameters_; InputHandlerProxyClient* client_; cc::InputHandler* input_handler_; #ifndef NDEBUG bool expect_scroll_update_end_; bool expect_pinch_update_end_; #endif bool gesture_scroll_on_impl_thread_; bool gesture_pinch_on_impl_thread_; // This is always false when there are no flings on the main thread, but // conservative in the sense that we might not be actually flinging when it is // true. bool fling_may_be_active_on_main_thread_; // The axes on which the current fling has overshot the bounds of the content. bool fling_overscrolled_horizontally_; bool fling_overscrolled_vertically_; DISALLOW_COPY_AND_ASSIGN(InputHandlerProxy); }; } // namespace content #endif // CONTENT_RENDERER_INPUT_INPUT_HANDLER_PROXY_H_