| 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 23a03d9b75fac5e2fd7bb91fa7001bfe8296fbcc..59d1213b39a2ed7bb07686f7445af0adf97867de 100644
|
| --- a/content/browser/web_contents/web_contents_impl.cc
|
| +++ b/content/browser/web_contents/web_contents_impl.cc
|
| @@ -1707,8 +1707,7 @@ void WebContentsImpl::RenderWidgetDeleted(
|
| view_->RestoreFocus();
|
| }
|
|
|
| - if (mouse_lock_widget_ == render_widget_host)
|
| - mouse_lock_widget_ = nullptr;
|
| + CHECK(mouse_lock_widget_ != render_widget_host);
|
| }
|
|
|
| void WebContentsImpl::RenderWidgetGotFocus(
|
| @@ -1897,12 +1896,19 @@ blink::WebDisplayMode WebContentsImpl::GetDisplayMode(
|
| void WebContentsImpl::RequestToLockMouse(
|
| RenderWidgetHostImpl* render_widget_host,
|
| bool user_gesture,
|
| - bool last_unlocked_by_target) {
|
| + bool last_unlocked_by_target,
|
| + bool privileged) {
|
| if (mouse_lock_widget_) {
|
| render_widget_host->GotResponseToLockMouseRequest(false);
|
| return;
|
| }
|
|
|
| + if (privileged) {
|
| + mouse_lock_widget_ = render_widget_host;
|
| + render_widget_host->GotResponseToLockMouseRequest(true);
|
| + return;
|
| + }
|
| +
|
| bool widget_in_frame_tree = false;
|
| for (FrameTreeNode* node : frame_tree_.Nodes()) {
|
| if (node->current_frame_host()->GetRenderWidgetHost() ==
|
| @@ -1929,6 +1935,14 @@ void WebContentsImpl::LostMouseLock(RenderWidgetHostImpl* render_widget_host) {
|
| delegate_->LostMouseLock();
|
| }
|
|
|
| +bool WebContentsImpl::HasMouseLock(RenderWidgetHostImpl* render_widget_host) {
|
| + // To verify if the mouse is locked, the mouse_lock_widget_ needs to be
|
| + // assigned to the widget that requested the mouse lock, and the top-level
|
| + // platform RenderWidgetHostView needs to hold the mouse lock from the OS.
|
| + return mouse_lock_widget_ == render_widget_host &&
|
| + GetTopLevelRenderWidgetHostView()->IsMouseLocked();
|
| +}
|
| +
|
| void WebContentsImpl::ForwardCompositorProto(
|
| RenderWidgetHostImpl* render_widget_host,
|
| const std::vector<uint8_t>& proto) {
|
| @@ -2986,8 +3000,11 @@ bool WebContentsImpl::GotResponseToLockMouseRequest(bool allowed) {
|
| if (GetBrowserPluginGuest())
|
| return GetBrowserPluginGuest()->LockMouse(allowed);
|
|
|
| - if (mouse_lock_widget_)
|
| - return mouse_lock_widget_->GotResponseToLockMouseRequest(allowed);
|
| + if (mouse_lock_widget_ &&
|
| + mouse_lock_widget_->GotResponseToLockMouseRequest(allowed))
|
| + return true;
|
| +
|
| + mouse_lock_widget_ = nullptr;
|
| return false;
|
| }
|
|
|
|
|