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

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
« no previous file with comments | « content/renderer/render_widget.h ('k') | content/renderer/render_widget_mouse_lock_dispatcher.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: content/renderer/render_widget.cc
diff --git a/content/renderer/render_widget.cc b/content/renderer/render_widget.cc
index a7d25020b4dfc937ce05a13394ce1c5463250de8..cc25047179fdb7ca43ece0e0e0d8497929d995aa 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() {
@@ -373,6 +396,8 @@ bool RenderWidget::DoInit(int32_t opener_id,
opener_id_ = opener_id;
webwidget_ = web_widget;
+ webwidget_mouse_lock_target_.reset(new WebWidgetLockTarget(webwidget_));
+ mouse_lock_dispatcher_.reset(new RenderWidgetMouseLockDispatcher(this));
bool result = true;
if (create_widget_message)
@@ -449,6 +474,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 +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
« no previous file with comments | « content/renderer/render_widget.h ('k') | content/renderer/render_widget_mouse_lock_dispatcher.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698