diff options
-rw-r--r-- | content/browser/renderer_host/render_widget_host_impl.cc | 13 | ||||
-rw-r--r-- | content/browser/renderer_host/render_widget_host_impl.h | 9 | ||||
-rw-r--r-- | content/browser/web_contents/web_contents_impl.cc | 8 | ||||
-rw-r--r-- | content/common/view_messages.h | 8 | ||||
-rw-r--r-- | content/content_renderer.gypi | 2 | ||||
-rw-r--r-- | content/renderer/mouse_lock_dispatcher.cc | 49 | ||||
-rw-r--r-- | content/renderer/mouse_lock_dispatcher.h | 32 | ||||
-rw-r--r-- | content/renderer/pepper/pepper_plugin_delegate_impl.cc | 17 | ||||
-rw-r--r-- | content/renderer/pepper/pepper_plugin_delegate_impl.h | 3 | ||||
-rw-r--r-- | content/renderer/render_view_impl.cc | 4 | ||||
-rw-r--r-- | content/renderer/render_view_mouse_lock_dispatcher.cc | 62 | ||||
-rw-r--r-- | content/renderer/render_view_mouse_lock_dispatcher.h | 38 | ||||
-rw-r--r-- | content/renderer/render_widget_fullscreen_pepper.cc | 57 | ||||
-rw-r--r-- | content/renderer/render_widget_fullscreen_pepper.h | 9 | ||||
-rw-r--r-- | ppapi/examples/mouse_lock/mouse_lock.cc | 15 | ||||
-rw-r--r-- | ppapi/examples/mouse_lock/mouse_lock.html | 26 | ||||
-rw-r--r-- | webkit/plugins/ppapi/fullscreen_container.h | 7 |
17 files changed, 268 insertions, 91 deletions
diff --git a/content/browser/renderer_host/render_widget_host_impl.cc b/content/browser/renderer_host/render_widget_host_impl.cc index 04ee30d..cf74009 100644 --- a/content/browser/renderer_host/render_widget_host_impl.cc +++ b/content/browser/renderer_host/render_widget_host_impl.cc @@ -130,6 +130,7 @@ RenderWidgetHostImpl::RenderWidgetHostImpl(RenderWidgetHostDelegate* delegate, text_direction_canceled_(false), suppress_next_char_events_(false), pending_mouse_lock_request_(false), + allow_privileged_mouse_lock_(false), has_touch_handler_(false), ALLOW_THIS_IN_INITIALIZER_LIST(weak_factory_(this)), tap_suppression_controller_(new TapSuppressionController(this)) { @@ -233,6 +234,8 @@ void RenderWidgetHostImpl::Init() { } void RenderWidgetHostImpl::Shutdown() { + RejectMouseLockOrUnlockIfNecessary(); + if (process_->HasConnection()) { // Tell the renderer object to close. bool rv = Send(new ViewMsg_Close(routing_id_)); @@ -1488,7 +1491,8 @@ void RenderWidgetHostImpl::OnMsgDidActivateAcceleratedCompositing( } void RenderWidgetHostImpl::OnMsgLockMouse(bool user_gesture, - bool last_unlocked_by_target) { + bool last_unlocked_by_target, + bool privileged) { if (pending_mouse_lock_request_) { Send(new ViewMsg_LockMouse_ACK(routing_id_, false)); @@ -1499,7 +1503,12 @@ void RenderWidgetHostImpl::OnMsgLockMouse(bool user_gesture, } pending_mouse_lock_request_ = true; - RequestToLockMouse(user_gesture, last_unlocked_by_target); + if (privileged && allow_privileged_mouse_lock_) { + // Directly approve to lock the mouse. + GotResponseToLockMouseRequest(true); + } else { + RequestToLockMouse(user_gesture, last_unlocked_by_target); + } } void RenderWidgetHostImpl::OnMsgUnlockMouse() { diff --git a/content/browser/renderer_host/render_widget_host_impl.h b/content/browser/renderer_host/render_widget_host_impl.h index 5a3e0f7..c50ad01 100644 --- a/content/browser/renderer_host/render_widget_host_impl.h +++ b/content/browser/renderer_host/render_widget_host_impl.h @@ -360,6 +360,10 @@ class CONTENT_EXPORT RenderWidgetHostImpl : virtual public RenderWidgetHost, // event. void CompositingSurfaceUpdated(); + void set_allow_privileged_mouse_lock(bool allow) { + allow_privileged_mouse_lock_ = allow; + } + protected: virtual RenderWidgetHostImpl* AsRenderWidgetHostImpl() OVERRIDE; @@ -484,7 +488,9 @@ class CONTENT_EXPORT RenderWidgetHostImpl : virtual public RenderWidgetHost, void OnMsgDidActivateAcceleratedCompositing(bool activated); - void OnMsgLockMouse(bool user_gesture, bool last_unlocked_by_target); + void OnMsgLockMouse(bool user_gesture, + bool last_unlocked_by_target, + bool privileged); void OnMsgUnlockMouse(); #if defined(OS_POSIX) || defined(USE_AURA) @@ -711,6 +717,7 @@ class CONTENT_EXPORT RenderWidgetHostImpl : virtual public RenderWidgetHost, gfx::Point last_scroll_offset_; bool pending_mouse_lock_request_; + bool allow_privileged_mouse_lock_; // Keeps track of whether the webpage has any touch event handler. If it does, // then touch events are sent to the renderer. Otherwise, the touch events are diff --git a/content/browser/web_contents/web_contents_impl.cc b/content/browser/web_contents/web_contents_impl.cc index 218f6f9..a5debc8 100644 --- a/content/browser/web_contents/web_contents_impl.cc +++ b/content/browser/web_contents/web_contents_impl.cc @@ -1250,7 +1250,13 @@ void WebContentsImpl::ShowCreatedWidget(int route_id, } else { widget_host_view->InitAsPopup(GetRenderWidgetHostView(), initial_pos); } - RenderWidgetHostImpl::From(widget_host_view->GetRenderWidgetHost())->Init(); + + RenderWidgetHostImpl* render_widget_host_impl = + RenderWidgetHostImpl::From(widget_host_view->GetRenderWidgetHost()); + render_widget_host_impl->Init(); + // Only allow privileged mouse lock for fullscreen render widget, which is + // used to implement Pepper Flash fullscreen. + render_widget_host_impl->set_allow_privileged_mouse_lock(is_fullscreen); #if defined(OS_MACOSX) // A RenderWidgetHostViewMac has lifetime scoped to the view. Now that it's diff --git a/content/common/view_messages.h b/content/common/view_messages.h index 346295a..cb005c7 100644 --- a/content/common/view_messages.h +++ b/content/common/view_messages.h @@ -2067,9 +2067,13 @@ IPC_MESSAGE_CONTROL1(ViewHostMsg_MediaLogEvent, // Requests to lock the mouse. Will result in a ViewMsg_LockMouse_ACK message // being sent back. -IPC_MESSAGE_ROUTED2(ViewHostMsg_LockMouse, +// |privileged| is used by Pepper Flash. If this flag is set to true, we won't +// pop up a bubble to ask for user permission or take mouse lock content into +// account. +IPC_MESSAGE_ROUTED3(ViewHostMsg_LockMouse, bool /* user_gesture */, - bool /* last_unlocked_by_target */) + bool /* last_unlocked_by_target */, + bool /* privileged */) // Requests to unlock the mouse. A ViewMsg_MouseLockLost message will be sent // whenever the mouse is unlocked (which may or may not be caused by diff --git a/content/content_renderer.gypi b/content/content_renderer.gypi index df4530e..af45987 100644 --- a/content/content_renderer.gypi +++ b/content/content_renderer.gypi @@ -178,6 +178,8 @@ 'renderer/render_view_impl.cc', 'renderer/render_view_impl.h', 'renderer/render_view_linux.cc', + 'renderer/render_view_mouse_lock_dispatcher.cc', + 'renderer/render_view_mouse_lock_dispatcher.h', 'renderer/render_view_selection.cc', 'renderer/render_view_selection.h', 'renderer/render_widget.cc', diff --git a/content/renderer/mouse_lock_dispatcher.cc b/content/renderer/mouse_lock_dispatcher.cc index dd2326a..225c5a6 100644 --- a/content/renderer/mouse_lock_dispatcher.cc +++ b/content/renderer/mouse_lock_dispatcher.cc @@ -4,20 +4,14 @@ #include "content/renderer/mouse_lock_dispatcher.h" -#include "content/common/view_messages.h" -#include "content/renderer/render_view_impl.h" -#include "third_party/WebKit/Source/WebKit/chromium/public/WebFrame.h" +#include "base/logging.h" #include "third_party/WebKit/Source/WebKit/chromium/public/WebInputEvent.h" -#include "third_party/WebKit/Source/WebKit/chromium/public/WebWidget.h" - -MouseLockDispatcher::MouseLockDispatcher(RenderViewImpl* render_view_impl) - : content::RenderViewObserver(render_view_impl), - render_view_impl_(render_view_impl), - mouse_locked_(false), - pending_lock_request_(false), - pending_unlock_request_(false), - unlocked_by_target_(false), - target_(NULL) { + +MouseLockDispatcher::MouseLockDispatcher() : mouse_locked_(false), + pending_lock_request_(false), + pending_unlock_request_(false), + unlocked_by_target_(false), + target_(NULL) { } MouseLockDispatcher::~MouseLockDispatcher() { @@ -30,13 +24,7 @@ bool MouseLockDispatcher::LockMouse(LockTarget* target) { pending_lock_request_ = true; target_ = target; - bool user_gesture = - render_view_impl_->webview() && - render_view_impl_->webview()->mainFrame() && - render_view_impl_->webview()->mainFrame()->isProcessingUserGesture(); - Send(new ViewHostMsg_LockMouse(routing_id(), - user_gesture, - unlocked_by_target_)); + SendLockMouseRequest(unlocked_by_target_); unlocked_by_target_ = false; return true; } @@ -45,7 +33,7 @@ void MouseLockDispatcher::UnlockMouse(LockTarget* target) { if (target && target == target_ && !pending_unlock_request_) { pending_unlock_request_ = true; unlocked_by_target_ = true; - Send(new ViewHostMsg_UnlockMouse(routing_id())); + SendUnlockMouseRequest(); } } @@ -67,16 +55,6 @@ bool MouseLockDispatcher::WillHandleMouseEvent( return false; } -bool MouseLockDispatcher::OnMessageReceived(const IPC::Message& message) { - bool handled = true; - IPC_BEGIN_MESSAGE_MAP(MouseLockDispatcher, message) - IPC_MESSAGE_HANDLER(ViewMsg_LockMouse_ACK, OnLockMouseACK) - IPC_MESSAGE_HANDLER(ViewMsg_MouseLockLost, OnMouseLockLost) - IPC_MESSAGE_UNHANDLED(handled = false) - IPC_END_MESSAGE_MAP() - return handled; -} - void MouseLockDispatcher::OnLockMouseACK(bool succeeded) { DCHECK(!mouse_locked_ && pending_lock_request_); @@ -98,15 +76,6 @@ void MouseLockDispatcher::OnLockMouseACK(bool succeeded) { if (last_target) last_target->OnLockMouseACK(succeeded); - - // Mouse Lock removes the system cursor and provides all mouse motion as - // .movementX/Y values on events all sent to a fixed target. This requires - // content to specifically request the mode to be entered. - // Mouse Capture is implicitly given for the duration of a drag event, and - // sends all mouse events to the initial target of the drag. - // If Lock is entered it supercedes any in progress Capture. - if (succeeded && render_view_impl_->webwidget()) - render_view_impl_->webwidget()->mouseCaptureLost(); } void MouseLockDispatcher::OnMouseLockLost() { diff --git a/content/renderer/mouse_lock_dispatcher.h b/content/renderer/mouse_lock_dispatcher.h index f77f56e..120ca37 100644 --- a/content/renderer/mouse_lock_dispatcher.h +++ b/content/renderer/mouse_lock_dispatcher.h @@ -7,25 +7,15 @@ #pragma once #include "base/basictypes.h" -#include "content/public/renderer/render_view_observer.h" - -class RenderViewImpl; +#include "content/common/content_export.h" 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 { +class CONTENT_EXPORT MouseLockDispatcher { public: - explicit MouseLockDispatcher(RenderViewImpl* render_view_impl); + MouseLockDispatcher(); virtual ~MouseLockDispatcher(); class LockTarget { @@ -54,20 +44,22 @@ class CONTENT_EXPORT MouseLockDispatcher : public content::RenderViewObserver { // 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. + // 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_; } - 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 diff --git a/content/renderer/pepper/pepper_plugin_delegate_impl.cc b/content/renderer/pepper/pepper_plugin_delegate_impl.cc index 630dc78..c1ca266 100644 --- a/content/renderer/pepper/pepper_plugin_delegate_impl.cc +++ b/content/renderer/pepper/pepper_plugin_delegate_impl.cc @@ -1363,20 +1363,19 @@ ppapi::Preferences PepperPluginDelegateImpl::GetPreferences() { bool PepperPluginDelegateImpl::LockMouse( webkit::ppapi::PluginInstance* instance) { - - return render_view_->mouse_lock_dispatcher()->LockMouse( + return GetMouseLockDispatcher(instance)->LockMouse( GetOrCreateLockTargetAdapter(instance)); } void PepperPluginDelegateImpl::UnlockMouse( webkit::ppapi::PluginInstance* instance) { - render_view_->mouse_lock_dispatcher()->UnlockMouse( + GetMouseLockDispatcher(instance)->UnlockMouse( GetOrCreateLockTargetAdapter(instance)); } bool PepperPluginDelegateImpl::IsMouseLocked( webkit::ppapi::PluginInstance* instance) { - return render_view_->mouse_lock_dispatcher()->IsMouseLockedTo( + return GetMouseLockDispatcher(instance)->IsMouseLockedTo( GetOrCreateLockTargetAdapter(instance)); } @@ -1679,12 +1678,20 @@ void PepperPluginDelegateImpl::UnSetAndDeleteLockTargetAdapter( LockTargetMap::iterator it = mouse_lock_instances_.find(instance); if (it != mouse_lock_instances_.end()) { MouseLockDispatcher::LockTarget* target = it->second; - render_view_->mouse_lock_dispatcher()->OnLockTargetDestroyed(target); + GetMouseLockDispatcher(instance)->OnLockTargetDestroyed(target); delete target; mouse_lock_instances_.erase(it); } } +MouseLockDispatcher* PepperPluginDelegateImpl::GetMouseLockDispatcher( + webkit::ppapi::PluginInstance* instance) { + if (instance->flash_fullscreen()) + return instance->fullscreen_container()->GetMouseLockDispatcher(); + else + return render_view_->mouse_lock_dispatcher(); +} + webkit_glue::ClipboardClient* PepperPluginDelegateImpl::CreateClipboardClient() const { return new RendererClipboardClient; diff --git a/content/renderer/pepper/pepper_plugin_delegate_impl.h b/content/renderer/pepper/pepper_plugin_delegate_impl.h index 54ac84c..21b2f1e 100644 --- a/content/renderer/pepper/pepper_plugin_delegate_impl.h +++ b/content/renderer/pepper/pepper_plugin_delegate_impl.h @@ -462,6 +462,9 @@ class PepperPluginDelegateImpl webkit::ppapi::PluginInstance* instance); void UnSetAndDeleteLockTargetAdapter(webkit::ppapi::PluginInstance* instance); + MouseLockDispatcher* GetMouseLockDispatcher( + webkit::ppapi::PluginInstance* instance); + // Pointer to the RenderView that owns us. RenderViewImpl* render_view_; diff --git a/content/renderer/render_view_impl.cc b/content/renderer/render_view_impl.cc index 36a330c..117a583 100644 --- a/content/renderer/render_view_impl.cc +++ b/content/renderer/render_view_impl.cc @@ -79,12 +79,12 @@ #include "content/renderer/media/render_media_log.h" #include "content/renderer/media/renderer_gpu_video_decoder_factories.h" #include "content/renderer/mhtml_generator.h" -#include "content/renderer/mouse_lock_dispatcher.h" #include "content/renderer/notification_provider.h" #include "content/renderer/p2p/socket_dispatcher.h" #include "content/renderer/plugin_channel_host.h" #include "content/renderer/render_process.h" #include "content/renderer/render_thread_impl.h" +#include "content/renderer/render_view_mouse_lock_dispatcher.h" #include "content/renderer/render_widget_fullscreen_pepper.h" #include "content/renderer/renderer_accessibility.h" #include "content/renderer/renderer_webapplicationcachehost_impl.h" @@ -621,7 +621,7 @@ RenderViewImpl::RenderViewImpl( // along with the RenderView automatically. devtools_agent_ = new DevToolsAgent(this); renderer_accessibility_ = new RendererAccessibility(this, accessibility_mode); - mouse_lock_dispatcher_ = new MouseLockDispatcher(this); + mouse_lock_dispatcher_ = new RenderViewMouseLockDispatcher(this); intents_host_ = new WebIntentsHost(this); new IdleUserDetector(this); diff --git a/content/renderer/render_view_mouse_lock_dispatcher.cc b/content/renderer/render_view_mouse_lock_dispatcher.cc new file mode 100644 index 0000000..15366c4 --- /dev/null +++ b/content/renderer/render_view_mouse_lock_dispatcher.cc @@ -0,0 +1,62 @@ +// 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. + +#include "content/renderer/render_view_mouse_lock_dispatcher.h" + +#include "content/common/view_messages.h" +#include "content/renderer/render_view_impl.h" +#include "third_party/WebKit/Source/WebKit/chromium/public/WebFrame.h" +#include "third_party/WebKit/Source/WebKit/chromium/public/WebView.h" +#include "third_party/WebKit/Source/WebKit/chromium/public/WebWidget.h" + +RenderViewMouseLockDispatcher::RenderViewMouseLockDispatcher( + RenderViewImpl* render_view_impl) + : content::RenderViewObserver(render_view_impl), + render_view_impl_(render_view_impl) { +} + +RenderViewMouseLockDispatcher::~RenderViewMouseLockDispatcher() { +} + +void RenderViewMouseLockDispatcher::SendLockMouseRequest( + bool unlocked_by_target) { + bool user_gesture = + render_view_impl_->webview() && + render_view_impl_->webview()->mainFrame() && + render_view_impl_->webview()->mainFrame()->isProcessingUserGesture(); + + Send(new ViewHostMsg_LockMouse(routing_id(), user_gesture, unlocked_by_target, + false)); +} + +void RenderViewMouseLockDispatcher::SendUnlockMouseRequest() { + Send(new ViewHostMsg_UnlockMouse(routing_id())); +} + +bool RenderViewMouseLockDispatcher::OnMessageReceived( + const IPC::Message& message) { + bool handled = true; + IPC_BEGIN_MESSAGE_MAP(RenderViewMouseLockDispatcher, message) + IPC_MESSAGE_HANDLER(ViewMsg_LockMouse_ACK, OnMsgLockMouseACK) + IPC_MESSAGE_FORWARD(ViewMsg_MouseLockLost, + static_cast<MouseLockDispatcher*>(this), + MouseLockDispatcher::OnMouseLockLost) + IPC_MESSAGE_UNHANDLED(handled = false) + IPC_END_MESSAGE_MAP() + return handled; +} + +void RenderViewMouseLockDispatcher::OnMsgLockMouseACK(bool succeeded) { + // Notify the base class. + OnLockMouseACK(succeeded); + + // Mouse Lock removes the system cursor and provides all mouse motion as + // .movementX/Y values on events all sent to a fixed target. This requires + // content to specifically request the mode to be entered. + // Mouse Capture is implicitly given for the duration of a drag event, and + // sends all mouse events to the initial target of the drag. + // If Lock is entered it supercedes any in progress Capture. + if (succeeded && render_view_impl_->webwidget()) + render_view_impl_->webwidget()->mouseCaptureLost(); +} diff --git a/content/renderer/render_view_mouse_lock_dispatcher.h b/content/renderer/render_view_mouse_lock_dispatcher.h new file mode 100644 index 0000000..38ed4c8 --- /dev/null +++ b/content/renderer/render_view_mouse_lock_dispatcher.h @@ -0,0 +1,38 @@ +// 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_RENDER_VIEW_MOUSE_LOCK_DISPATCHER_H_ +#define CONTENT_RENDERER_RENDER_VIEW_MOUSE_LOCK_DISPATCHER_H_ +#pragma once + +#include "base/basictypes.h" +#include "base/compiler_specific.h" +#include "content/public/renderer/render_view_observer.h" +#include "content/renderer/mouse_lock_dispatcher.h" + +class RenderViewImpl; + +// RenderViewMouseLockDispatcher is owned by RenderViewImpl. +class RenderViewMouseLockDispatcher : public MouseLockDispatcher, + public content::RenderViewObserver { + public: + explicit RenderViewMouseLockDispatcher(RenderViewImpl* render_view_impl); + virtual ~RenderViewMouseLockDispatcher(); + + private: + // MouseLockDispatcher implementation. + virtual void SendLockMouseRequest(bool unlocked_by_target) OVERRIDE; + virtual void SendUnlockMouseRequest() OVERRIDE; + + // RenderView::Observer implementation. + virtual bool OnMessageReceived(const IPC::Message& message) OVERRIDE; + + void OnMsgLockMouseACK(bool succeeded); + + RenderViewImpl* render_view_impl_; + + DISALLOW_COPY_AND_ASSIGN(RenderViewMouseLockDispatcher); +}; + +#endif // CONTENT_RENDERER_RENDER_VIEW_MOUSE_LOCK_DISPATCHER_H_ diff --git a/content/renderer/render_widget_fullscreen_pepper.cc b/content/renderer/render_widget_fullscreen_pepper.cc index 27293e1..acd585a9 100644 --- a/content/renderer/render_widget_fullscreen_pepper.cc +++ b/content/renderer/render_widget_fullscreen_pepper.cc @@ -36,6 +36,38 @@ using WebKit::WGC3Dintptr; namespace { +class FullscreenMouseLockDispatcher : public MouseLockDispatcher { + public: + explicit FullscreenMouseLockDispatcher(RenderWidgetFullscreenPepper* widget); + virtual ~FullscreenMouseLockDispatcher(); + + private: + // MouseLockDispatcher implementation. + virtual void SendLockMouseRequest(bool unlocked_by_target) OVERRIDE; + virtual void SendUnlockMouseRequest() OVERRIDE; + + RenderWidgetFullscreenPepper* widget_; + + DISALLOW_COPY_AND_ASSIGN(FullscreenMouseLockDispatcher); +}; + +FullscreenMouseLockDispatcher::FullscreenMouseLockDispatcher( + RenderWidgetFullscreenPepper* widget) : widget_(widget) { +} + +FullscreenMouseLockDispatcher::~FullscreenMouseLockDispatcher() { +} + +void FullscreenMouseLockDispatcher::SendLockMouseRequest( + bool unlocked_by_target) { + widget_->Send(new ViewHostMsg_LockMouse(widget_->routing_id(), false, + unlocked_by_target, true)); +} + +void FullscreenMouseLockDispatcher::SendUnlockMouseRequest() { + widget_->Send(new ViewHostMsg_UnlockMouse(widget_->routing_id())); +} + // WebWidget that simply wraps the pepper plugin. class PepperWidget : public WebWidget { public: @@ -240,7 +272,9 @@ RenderWidgetFullscreenPepper::RenderWidgetFullscreenPepper( context_(NULL), buffer_(0), program_(0), - weak_ptr_factory_(ALLOW_THIS_IN_INITIALIZER_LIST(this)) { + weak_ptr_factory_(ALLOW_THIS_IN_INITIALIZER_LIST(this)), + mouse_lock_dispatcher_(new FullscreenMouseLockDispatcher( + ALLOW_THIS_IN_INITIALIZER_LIST(this))) { } RenderWidgetFullscreenPepper::~RenderWidgetFullscreenPepper() { @@ -316,6 +350,27 @@ RenderWidgetFullscreenPepper::CreateContext3D() { #endif } +MouseLockDispatcher* RenderWidgetFullscreenPepper::GetMouseLockDispatcher() { + return mouse_lock_dispatcher_.get(); +} + +bool RenderWidgetFullscreenPepper::OnMessageReceived(const IPC::Message& msg) { + bool handled = true; + IPC_BEGIN_MESSAGE_MAP(RenderWidgetFullscreenPepper, msg) + IPC_MESSAGE_FORWARD(ViewMsg_LockMouse_ACK, + mouse_lock_dispatcher_.get(), + MouseLockDispatcher::OnLockMouseACK) + IPC_MESSAGE_FORWARD(ViewMsg_MouseLockLost, + mouse_lock_dispatcher_.get(), + MouseLockDispatcher::OnMouseLockLost) + IPC_MESSAGE_UNHANDLED(handled = false) + IPC_END_MESSAGE_MAP() + if (handled) + return true; + + return RenderWidgetFullscreen::OnMessageReceived(msg); +} + void RenderWidgetFullscreenPepper::WillInitiatePaint() { if (plugin_) plugin_->ViewWillInitiatePaint(); diff --git a/content/renderer/render_widget_fullscreen_pepper.h b/content/renderer/render_widget_fullscreen_pepper.h index cf45611..8d527c7a 100644 --- a/content/renderer/render_widget_fullscreen_pepper.h +++ b/content/renderer/render_widget_fullscreen_pepper.h @@ -5,8 +5,10 @@ #ifndef CONTENT_RENDERER_RENDER_WIDGET_FULLSCREEN_PEPPER_H_ #define CONTENT_RENDERER_RENDER_WIDGET_FULLSCREEN_PEPPER_H_ +#include "base/memory/scoped_ptr.h" #include "base/memory/weak_ptr.h" #include "content/common/gpu/client/webgraphicscontext3d_command_buffer_impl.h" +#include "content/renderer/mouse_lock_dispatcher.h" #include "content/renderer/pepper/pepper_parent_context_provider.h" #include "content/renderer/render_widget_fullscreen.h" #include "third_party/WebKit/Source/Platform/chromium/public/WebGraphicsContext3D.h" @@ -50,6 +52,11 @@ class RenderWidgetFullscreenPepper : virtual void DidChangeCursor(const WebKit::WebCursorInfo& cursor) OVERRIDE; virtual webkit::ppapi::PluginDelegate::PlatformContext3D* CreateContext3D() OVERRIDE; + virtual MouseLockDispatcher* GetMouseLockDispatcher() OVERRIDE; + + // IPC::Channel::Listener implementation. This overrides the implementation + // in RenderWidgetFullscreen. + virtual bool OnMessageReceived(const IPC::Message& msg) OVERRIDE; WebGraphicsContext3DCommandBufferImpl* context() const { return context_; } void SwapBuffers(); @@ -110,6 +117,8 @@ class RenderWidgetFullscreenPepper : base::WeakPtrFactory<RenderWidgetFullscreenPepper> weak_ptr_factory_; + scoped_ptr<MouseLockDispatcher> mouse_lock_dispatcher_; + DISALLOW_COPY_AND_ASSIGN(RenderWidgetFullscreenPepper); }; diff --git a/ppapi/examples/mouse_lock/mouse_lock.cc b/ppapi/examples/mouse_lock/mouse_lock.cc index 7eec828..4203622 100644 --- a/ppapi/examples/mouse_lock/mouse_lock.cc +++ b/ppapi/examples/mouse_lock/mouse_lock.cc @@ -15,6 +15,7 @@ #include "ppapi/cpp/logging.h" #include "ppapi/cpp/module.h" #include "ppapi/cpp/mouse_lock.h" +#include "ppapi/cpp/private/flash_fullscreen.h" #include "ppapi/cpp/rect.h" #include "ppapi/cpp/var.h" #include "ppapi/utility/completion_callback_factory.h" @@ -30,7 +31,8 @@ class MyInstance : public pp::Instance, public pp::MouseLock { pending_paint_(false), waiting_for_flush_completion_(false), callback_factory_(this), - console_(NULL) { + console_(NULL), + flash_fullscreen_(this) { } virtual ~MyInstance() {} @@ -66,13 +68,18 @@ class MyInstance : public pp::Instance, public pp::MouseLock { } case PP_INPUTEVENT_TYPE_KEYDOWN: { pp::KeyboardInputEvent key_event(event); - // Lock the mouse when the Enter key is pressed. if (key_event.GetKeyCode() == 13) { + // Lock the mouse when the Enter key is pressed. if (mouse_locked_) UnlockMouse(); else LockMouse(callback_factory_.NewCallback(&MyInstance::DidLockMouse)); return true; + } else if (key_event.GetKeyCode() == 70) { + // Enter Flash fullscreen mode when the 'f' key is pressed. + if (!flash_fullscreen_.IsFullscreen()) + flash_fullscreen_.SetFullscreen(true); + return true; } return false; } @@ -199,7 +206,7 @@ class MyInstance : public pp::Instance, public pp::MouseLock { (direction == UP && y < center_y) || (direction == DOWN && y > center_y) || (direction == LEFT && x < center_x) || - (direction == RIGHT && x > center_y); + (direction == RIGHT && x > center_x); if (within_bound_1 && within_bound_2 && within_bound_3) { *image.GetAddr32(pp::Point(x, y)) = foreground_color; @@ -244,6 +251,8 @@ class MyInstance : public pp::Instance, public pp::MouseLock { const PPB_Console_Dev* console_; + pp::FlashFullscreen flash_fullscreen_; + pp::Graphics2D device_context_; }; diff --git a/ppapi/examples/mouse_lock/mouse_lock.html b/ppapi/examples/mouse_lock/mouse_lock.html index 5f0e5aa..e06349c 100644 --- a/ppapi/examples/mouse_lock/mouse_lock.html +++ b/ppapi/examples/mouse_lock/mouse_lock.html @@ -17,18 +17,6 @@ <body title="This tooltip should not be shown if the mouse is locked."> <div id="container"> <ul> - <li>There are two different kinds of fullscreen mode - "tab fullscreen" and - "browser fullscreen". - <ul> - <li>"tab fullscreen" refers to when a tab enters fullscreen mode via the - JS or Pepper fullscreen API;</li> - <li>"browser fullscreen" refers to the user putting the browser itself - into fullscreen mode from the UI (e.g., pressing F11).</li> - </ul> - <span style="font-weight:bold"> - NOTE: Mouse lock is only allowed in "tab fullscreen" mode. - </span> - </li> <li>Lock mouse: <ul> <li>left click in either of the two boxes; or</li> @@ -46,7 +34,19 @@ <ul> <li>lose focus; or</li> <li>press Esc key; or</li> - <li>exit from the "tab fullscreen" mode.</li> + <li>exit from "tab fullscreen"/"browser fullscreen"/"Flash fullscreen". + <ul> + <li>"tab fullscreen" refers to when a tab enters fullscreen mode via + the JS or Pepper fullscreen API;</li> + <li>"browser fullscreen" refers to the user putting the browser + itself into fullscreen mode from the UI (e.g., pressing F11). + </li> + <li>"Flash fullscreen" refers to the fullscreen mode used by Pepper + Flash. You could enter Flash fullscreen by pressing 'f' key + when either of the boxes is focused, and exit by pressing Esc + key.</li> + </ul> + </li> </ul> </li> </ul> diff --git a/webkit/plugins/ppapi/fullscreen_container.h b/webkit/plugins/ppapi/fullscreen_container.h index dafaea6..f8d4356 100644 --- a/webkit/plugins/ppapi/fullscreen_container.h +++ b/webkit/plugins/ppapi/fullscreen_container.h @@ -1,4 +1,4 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. +// 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. @@ -7,6 +7,8 @@ #include "webkit/plugins/ppapi/plugin_delegate.h" +class MouseLockDispatcher; + namespace WebKit { struct WebCursorInfo; struct WebRect; @@ -38,6 +40,9 @@ class FullscreenContainer { virtual void DidChangeCursor(const WebKit::WebCursorInfo& cursor) = 0; virtual PluginDelegate::PlatformContext3D* CreateContext3D() = 0; + + // The returned object is owned by FullscreenContainer. + virtual MouseLockDispatcher* GetMouseLockDispatcher() = 0; }; } // namespace ppapi |