Chromium Code Reviews| Index: content/renderer/render_widget.cc |
| diff --git a/content/renderer/render_widget.cc b/content/renderer/render_widget.cc |
| index 157b4e68bcc61099f60ec13dc03a89c65dd6eade..cb707aca777b56096ed91b5850f566b2b40be40f 100644 |
| --- a/content/renderer/render_widget.cc |
| +++ b/content/renderer/render_widget.cc |
| @@ -140,6 +140,29 @@ namespace { |
| typedef std::map<std::string, ui::TextInputMode> TextInputModeMap; |
| +class WebWidgetLockTarget : public content::MouseLockDispatcher::LockTarget { |
| + public: |
| + explicit WebWidgetLockTarget(blink::WebWidget* webwidget) |
| + : webwidget_(webwidget) {} |
| + |
| + void OnLockMouseACK(bool succeeded) override { |
| + if (succeeded) |
| + webwidget_->didAcquirePointerLock(); |
| + else |
| + webwidget_->didNotAcquirePointerLock(); |
| + } |
| + |
| + void OnMouseLockLost() override { webwidget_->didLosePointerLock(); } |
| + |
| + bool HandleMouseLockedInputEvent(const blink::WebMouseEvent& event) override { |
| + // The WebWidget handles mouse lock in WebKit's handleInputEvent(). |
|
nasko
2016/05/25 21:12:01
nit: s/WebKit/Blink/
lfg
2016/05/31 21:13:20
Done.
|
| + return false; |
| + } |
| + |
| + private: |
| + blink::WebWidget* webwidget_; |
| +}; |
| + |
| class TextInputModeMapSingleton { |
| public: |
| static TextInputModeMapSingleton* GetInstance() { |
| @@ -247,6 +270,7 @@ RenderWidget::RenderWidget(CompositorDependencies* compositor_deps, |
| frame_swap_message_queue_(new FrameSwapMessageQueue()), |
| resizing_mode_selector_(new ResizingModeSelector()), |
| has_host_context_menu_location_(false), |
| + mouse_lock_dispatcher_(nullptr), |
|
nasko
2016/05/25 21:12:01
unique_ptr doesn't need explicit initialization to
lfg
2016/05/31 21:13:20
Right, it used to be a raw pointer, I've changed i
|
| has_focus_(false) { |
| if (!swapped_out) |
| RenderProcess::current()->AddRefProcess(); |
| @@ -313,7 +337,7 @@ RenderWidget* RenderWidget::CreateForFrame( |
| // this function returns. |
| if (widget->DoInit(MSG_ROUTING_NONE, |
| RenderWidget::CreateWebFrameWidget(widget.get(), frame), |
| - nullptr)) { |
| + nullptr, true)) { |
| return widget.get(); |
| } |
| return nullptr; |
| @@ -357,7 +381,7 @@ void RenderWidget::SetRoutingID(int32_t routing_id) { |
| bool RenderWidget::Init(int32_t opener_id) { |
| bool success = DoInit( |
| opener_id, RenderWidget::CreateWebWidget(this), |
| - new ViewHostMsg_CreateWidget(opener_id, popup_type_, &routing_id_)); |
| + new ViewHostMsg_CreateWidget(opener_id, popup_type_, &routing_id_), true); |
| if (success) { |
| SetRoutingID(routing_id_); |
| return true; |
| @@ -367,18 +391,25 @@ bool RenderWidget::Init(int32_t opener_id) { |
| bool RenderWidget::DoInit(int32_t opener_id, |
| WebWidget* web_widget, |
| - IPC::SyncMessage* create_widget_message) { |
| + IPC::SyncMessage* create_widget_message, |
| + bool should_add_route) { |
| DCHECK(!webwidget_); |
| if (opener_id != MSG_ROUTING_NONE) |
| opener_id_ = opener_id; |
| webwidget_ = web_widget; |
| + webwidget_mouse_lock_target_.reset(new WebWidgetLockTarget(webwidget_)); |
| + mouse_lock_dispatcher_ = |
| + base::WrapUnique(new RenderWidgetMouseLockDispatcher(this)); |
| bool result = true; |
| if (create_widget_message) |
| result = RenderThread::Get()->Send(create_widget_message); |
| + if (!should_add_route) |
| + return true; |
| + |
| if (result) { |
| RenderThread::Get()->AddRoute(routing_id_, this); |
| // Take a reference on behalf of the RenderThread. This will be balanced |
| @@ -450,6 +481,10 @@ void RenderWidget::OnShowHostContextMenu(ContextMenuParams* params) { |
| } |
| bool RenderWidget::OnMessageReceived(const IPC::Message& message) { |
| + if (mouse_lock_dispatcher_ && |
| + mouse_lock_dispatcher_->OnMessageReceived(message)) |
| + return true; |
| + |
| bool handled = true; |
| IPC_BEGIN_MESSAGE_MAP(RenderWidget, message) |
| IPC_MESSAGE_HANDLER(InputMsg_HandleInputEvent, OnHandleInputEvent) |
| @@ -2098,4 +2133,17 @@ float RenderWidget::GetOriginalDeviceScaleFactor() const { |
| device_scale_factor_; |
| } |
| +bool RenderWidget::requestPointerLock() { |
| + return mouse_lock_dispatcher_->LockMouse(webwidget_mouse_lock_target_.get()); |
| +} |
| + |
| +void RenderWidget::requestPointerUnlock() { |
| + mouse_lock_dispatcher_->UnlockMouse(webwidget_mouse_lock_target_.get()); |
| +} |
| + |
| +bool RenderWidget::isPointerLocked() { |
| + return mouse_lock_dispatcher_->IsMouseLockedTo( |
| + webwidget_mouse_lock_target_.get()); |
| +} |
| + |
| } // namespace content |