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

Unified Diff: content/browser/web_contents/web_contents_impl.cc

Issue 2591783003: Implement pointer lock across outer/inner WebContents. (Closed)
Patch Set: rebase Created 3 years, 12 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/browser/web_contents/web_contents_impl.cc
diff --git a/content/browser/web_contents/web_contents_impl.cc b/content/browser/web_contents/web_contents_impl.cc
index 37e888778c1307e392997a508432cf75cda71c15..a1542f0cd5b9954b84a42e8affaf53a7065c0f7d 100644
--- a/content/browser/web_contents/web_contents_impl.cc
+++ b/content/browser/web_contents/web_contents_impl.cc
@@ -1923,12 +1923,16 @@ void WebContentsImpl::RequestToLockMouse(
bool user_gesture,
bool last_unlocked_by_target,
bool privileged) {
- if (mouse_lock_widget_) {
- render_widget_host->GotResponseToLockMouseRequest(false);
- return;
+ for (WebContentsImpl* current = this; current;
+ current = current->GetOuterWebContents()) {
+ if (current->mouse_lock_widget_) {
+ render_widget_host->GotResponseToLockMouseRequest(false);
+ return;
+ }
}
if (privileged) {
+ DCHECK(!GetOuterWebContents());
mouse_lock_widget_ = render_widget_host;
render_widget_host->GotResponseToLockMouseRequest(true);
return;
@@ -1944,7 +1948,11 @@ void WebContentsImpl::RequestToLockMouse(
}
if (widget_in_frame_tree && delegate_) {
- mouse_lock_widget_ = render_widget_host;
+ for (WebContentsImpl* current = this; current;
+ current = current->GetOuterWebContents()) {
+ current->mouse_lock_widget_ = render_widget_host;
+ }
+
delegate_->RequestToLockMouse(this, user_gesture, last_unlocked_by_target);
} else {
render_widget_host->GotResponseToLockMouseRequest(false);
@@ -1953,8 +1961,15 @@ void WebContentsImpl::RequestToLockMouse(
void WebContentsImpl::LostMouseLock(RenderWidgetHostImpl* render_widget_host) {
CHECK(mouse_lock_widget_);
+
+ if (mouse_lock_widget_->delegate()->GetAsWebContents() != this)
+ return mouse_lock_widget_->delegate()->LostMouseLock(render_widget_host);
+
mouse_lock_widget_->SendMouseLockLost();
- mouse_lock_widget_ = nullptr;
+ for (WebContentsImpl* current = this; current;
+ current = current->GetOuterWebContents()) {
+ current->mouse_lock_widget_ = nullptr;
+ }
if (delegate_)
delegate_->LostMouseLock();
@@ -3070,14 +3085,26 @@ gfx::Size WebContentsImpl::GetPreferredSize() const {
}
bool WebContentsImpl::GotResponseToLockMouseRequest(bool allowed) {
- if (GetBrowserPluginGuest())
+ if (!GuestMode::IsCrossProcessFrameGuest(GetWebContents()) &&
+ GetBrowserPluginGuest())
return GetBrowserPluginGuest()->LockMouse(allowed);
- if (mouse_lock_widget_ &&
- mouse_lock_widget_->GotResponseToLockMouseRequest(allowed))
- return true;
+ if (mouse_lock_widget_) {
+ if (mouse_lock_widget_->delegate()->GetAsWebContents() != this) {
+ return mouse_lock_widget_->delegate()
+ ->GetAsWebContents()
+ ->GotResponseToLockMouseRequest(allowed);
+ }
+
+ if (mouse_lock_widget_->GotResponseToLockMouseRequest(allowed))
+ return true;
+ }
+
+ for (WebContentsImpl* current = this; current;
+ current = current->GetOuterWebContents()) {
+ current->mouse_lock_widget_ = nullptr;
+ }
- mouse_lock_widget_ = nullptr;
return false;
}

Powered by Google App Engine
This is Rietveld 408576698