summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--content/browser/renderer_host/render_widget_host_impl.cc13
-rw-r--r--content/browser/renderer_host/render_widget_host_impl.h9
-rw-r--r--content/browser/web_contents/web_contents_impl.cc8
-rw-r--r--content/common/view_messages.h8
-rw-r--r--content/content_renderer.gypi2
-rw-r--r--content/renderer/mouse_lock_dispatcher.cc49
-rw-r--r--content/renderer/mouse_lock_dispatcher.h32
-rw-r--r--content/renderer/pepper/pepper_plugin_delegate_impl.cc17
-rw-r--r--content/renderer/pepper/pepper_plugin_delegate_impl.h3
-rw-r--r--content/renderer/render_view_impl.cc4
-rw-r--r--content/renderer/render_view_mouse_lock_dispatcher.cc62
-rw-r--r--content/renderer/render_view_mouse_lock_dispatcher.h38
-rw-r--r--content/renderer/render_widget_fullscreen_pepper.cc57
-rw-r--r--content/renderer/render_widget_fullscreen_pepper.h9
-rw-r--r--ppapi/examples/mouse_lock/mouse_lock.cc15
-rw-r--r--ppapi/examples/mouse_lock/mouse_lock.html26
-rw-r--r--webkit/plugins/ppapi/fullscreen_container.h7
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