// Copyright (c) 2012 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_MOUSE_LOCK_DISPATCHER_H_ #define CONTENT_RENDERER_MOUSE_LOCK_DISPATCHER_H_ #include "base/basictypes.h" #include "content/common/content_export.h" namespace blink { class WebMouseEvent; } // namespace blink namespace content { class CONTENT_EXPORT MouseLockDispatcher { public: MouseLockDispatcher(); virtual ~MouseLockDispatcher(); class LockTarget { public: virtual ~LockTarget() {} // A mouse lock request was pending and this reports success or failure. virtual void OnLockMouseACK(bool succeeded) = 0; // A mouse lock was in place, but has been lost. virtual void OnMouseLockLost() = 0; // A mouse lock is enabled and mouse events are being delievered. virtual bool HandleMouseLockedInputEvent( const blink::WebMouseEvent& event) = 0; }; // Locks the mouse to the |target|. If true is returned, an asynchronous // response to target->OnLockMouseACK() will follow. bool LockMouse(LockTarget* target); // Request to unlock the mouse. An asynchronous response to // target->OnMouseLockLost() will follow. void UnlockMouse(LockTarget* target); // Clears out the reference to the |target| because it has or is being // destroyed. Unlocks if locked. The pointer will not be accessed. void OnLockTargetDestroyed(LockTarget* target); bool IsMouseLockedTo(LockTarget* target); // Allow lock target to consumed a mouse event, if it does return true. bool WillHandleMouseEvent(const blink::WebMouseEvent& event); // Subclasses or users have to call these methods to report mouse lock events // from the browser. void OnLockMouseACK(bool succeeded); void OnMouseLockLost(); protected: // Subclasses must implement these methods to send mouse lock requests to the // browser. virtual void SendLockMouseRequest(bool unlocked_by_target) = 0; virtual void SendUnlockMouseRequest() = 0; private: bool MouseLockedOrPendingAction() const { return mouse_locked_ || pending_lock_request_ || pending_unlock_request_; } bool mouse_locked_; // If both |pending_lock_request_| and |pending_unlock_request_| are true, // it means a lock request was sent before an unlock request and we haven't // received responses for them. The logic in LockMouse() makes sure that a // lock request won't be sent when there is a pending unlock request. bool pending_lock_request_; bool pending_unlock_request_; // Used when locking to indicate when a target application has voluntarily // unlocked and desires to relock the mouse. If the mouse is unlocked due // to ESC being pressed by the user, this will be false bool unlocked_by_target_; // |target_| is the pending or current owner of mouse lock. We retain a non // owning reference here that must be cleared by |OnLockTargetDestroyed| // when it is destroyed. LockTarget* target_; DISALLOW_COPY_AND_ASSIGN(MouseLockDispatcher); }; } // namespace content #endif // CONTENT_RENDERER_MOUSE_LOCK_DISPATCHER_H_