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 |