Chromium Code Reviews| 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); |