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

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: addressing comments Created 4 years, 7 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 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

Powered by Google App Engine
This is Rietveld 408576698