Index: content/renderer/render_widget.cc |
diff --git a/content/renderer/render_widget.cc b/content/renderer/render_widget.cc |
index a7d25020b4dfc937ce05a13394ce1c5463250de8..477c964e0b804ac3c645390daed20ccd59f50672 100644 |
--- a/content/renderer/render_widget.cc |
+++ b/content/renderer/render_widget.cc |
@@ -139,6 +139,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 Blink's handleInputEvent(). |
+ return false; |
+ } |
+ |
+ private: |
+ blink::WebWidget* webwidget_; |
+}; |
+ |
class TextInputModeMapSingleton { |
public: |
static TextInputModeMapSingleton* GetInstance() { |
@@ -312,7 +335,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; |
@@ -356,7 +379,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; |
@@ -366,18 +389,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) { |
dcheng
2016/06/04 05:28:56
Can we just make RenderView::Initialize() not add
lfg
2016/06/06 20:09:43
Done.
|
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)); |
dcheng
2016/06/04 05:28:56
Nit: base::MakeUnique, or be consistent with line
lfg
2016/06/06 20:09:43
Done.
|
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 |
@@ -449,6 +479,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) |
@@ -2096,4 +2130,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 |