| Index: content/renderer/render_widget.cc
|
| diff --git a/content/renderer/render_widget.cc b/content/renderer/render_widget.cc
|
| index 30bd0de9a33ad1e8e89a59e279b01e9f1052bb0c..f4e67956f6be0bd5c62ced7c815f33188e2b9924 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().
|
| + 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),
|
| 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)
|
| @@ -2090,4 +2125,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
|
|
|