// 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_ #pragma once #include "base/basictypes.h" #include "content/public/renderer/render_view_observer.h" class RenderViewImpl; namespace WebKit { class WebMouseEvent; class WebWidget; } // namespace WebKit namespace webkit{ namespace ppapi { class PluginInstance; } // namespace ppapi } // namespace webkit // MouseLockDispatcher is owned by RenderViewImpl. class CONTENT_EXPORT MouseLockDispatcher : public content::RenderViewObserver { public: explicit MouseLockDispatcher(RenderViewImpl* render_view_impl); 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 WebKit::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 WebKit::WebMouseEvent& event); private: // RenderView::Observer implementation. virtual bool OnMessageReceived(const IPC::Message& message) OVERRIDE; // IPC handlers. void OnLockMouseACK(bool succeeded); void OnMouseLockLost(); bool MouseLockedOrPendingAction() const { return mouse_locked_ || pending_lock_request_ || pending_unlock_request_; } RenderViewImpl* render_view_impl_; 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_; // |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); }; #endif // CONTENT_RENDERER_MOUSE_LOCK_DISPATCHER_H_