Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(52)

Unified Diff: content/renderer/render_view_impl.cc

Issue 10458008: Support mouse lock in Flash fullscreen mode. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 8 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: content/renderer/render_view_impl.cc
diff --git a/content/renderer/render_view_impl.cc b/content/renderer/render_view_impl.cc
index b133a2cf5a796b2932355b1ee082e25c98e5da33..60dd5cc8f0b31c0bc616a0230ebaeb8f373baa75 100644
--- a/content/renderer/render_view_impl.cc
+++ b/content/renderer/render_view_impl.cc
@@ -448,6 +448,77 @@ struct RenderViewImpl::PendingFileChooser {
namespace {
scheib 2012/05/29 21:47:14 Consider moving to a new implementation file? rend
yzshen1 2012/05/30 06:41:30 Good point. Thanks! On 2012/05/29 21:47:14, schei
+// RenderViewMouseLockDispatcher is owned by RenderViewImpl.
+class RenderViewMouseLockDispatcher : public MouseLockDispatcher,
brettw 2012/05/29 21:27:10 Could you move this to a separate file for just th
yzshen1 2012/05/30 06:41:30 Done. Thanks! On 2012/05/29 21:27:10, brettw wrot
+ public content::RenderViewObserver {
+ public:
+ explicit RenderViewMouseLockDispatcher(RenderViewImpl* render_view_impl);
+ virtual ~RenderViewMouseLockDispatcher();
+
+ private:
+ // MouseLockDispatcher implementation.
+ virtual void SendLockMouseRequest() 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);
+};
+
+RenderViewMouseLockDispatcher::RenderViewMouseLockDispatcher(
+ RenderViewImpl* render_view_impl)
+ : content::RenderViewObserver(render_view_impl),
+ render_view_impl_(render_view_impl) {
+}
+
+RenderViewMouseLockDispatcher::~RenderViewMouseLockDispatcher() {
+}
+
+void RenderViewMouseLockDispatcher::SendLockMouseRequest() {
+ 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, 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();
+}
+
class WebWidgetLockTarget : public MouseLockDispatcher::LockTarget {
public:
explicit WebWidgetLockTarget(WebKit::WebWidget* webwidget)
@@ -619,7 +690,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);

Powered by Google App Engine
This is Rietveld 408576698