Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(137)

Unified Diff: content/renderer/render_widget.cc

Issue 1980133002: Implement pointer lock API for out-of-process iframes. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: rebase Created 4 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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

Powered by Google App Engine
This is Rietveld 408576698