Chromium Code Reviews| 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 c8b38722cbd096c893ec16e258aae8768681b16b..03fa5d5aee10f1f32d234d9d48007c7289849200 100644 |
| --- a/content/browser/web_contents/web_contents_impl.cc |
| +++ b/content/browser/web_contents/web_contents_impl.cc |
| @@ -1916,12 +1916,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_) { |
|
ncarter (slow)
2016/12/22 00:01:07
I'm wondering if we should contemplate having some
lfg
2016/12/22 19:23:55
I thought about that a bit, but for a single point
|
| + render_widget_host->GotResponseToLockMouseRequest(false); |
| + return; |
| + } |
| } |
| if (privileged) { |
| + DCHECK(!GetOuterWebContents()); |
| mouse_lock_widget_ = render_widget_host; |
| render_widget_host->GotResponseToLockMouseRequest(true); |
| return; |
| @@ -1937,7 +1941,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); |
| @@ -1946,8 +1954,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(); |
| @@ -3063,14 +3078,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) { |
|
ncarter (slow)
2016/12/22 00:01:07
When does this case happen?
From what I can tell,
lfg
2016/12/22 19:23:55
GotResponseToLockMouseRequest is a poor name for t
|
| + 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; |
| } |