Commit 48a702f1 authored by jameshollyer's avatar jameshollyer Committed by Commit Bot

Reject Pointer Lock requests when not in focus

Recent changes to pointer lock requests(https://crrev.com/c/2069199)
caused an error in logic which allowed requests made while not in focus
to be able to succeed. This meant that a request made while changing
focus would cause a strange state. I also added an earlier check for
focus so that we error out before reaching the browser.

Bug: 1068339
Change-Id: If706d2a693ca6a9aa2a8cf6c85ed622b429b97fc
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2138501Reviewed-by: default avatarScott Violet <sky@chromium.org>
Reviewed-by: default avatarKen Buchanan <kenrb@chromium.org>
Commit-Queue: James Hollyer <jameshollyer@chromium.org>
Cr-Commit-Position: refs/heads/master@{#758382}
parent 37aa2d47
...@@ -83,21 +83,22 @@ class MockPointerLockRenderWidgetHostView : public RenderWidgetHostViewAura { ...@@ -83,21 +83,22 @@ class MockPointerLockRenderWidgetHostView : public RenderWidgetHostViewAura {
event_handler()->mouse_locked_unadjusted_movement_.reset(); event_handler()->mouse_locked_unadjusted_movement_.reset();
} }
bool IsMouseLocked() override { return event_handler()->mouse_locked(); } bool GetIsMouseLockedUnadjustedMovementForTesting() override {
return IsMouseLocked() &&
bool HasFocus() override { return true; } event_handler()->mouse_locked_unadjusted_movement_;
}
void OnWindowFocused(aura::Window* gained_focus, void OnWindowFocused(aura::Window* gained_focus,
aura::Window* lost_focus) override { aura::Window* lost_focus) override {
// Ignore window focus events. // Ignore window focus events.
} }
bool GetIsMouseLockedUnadjustedMovementForTesting() override { bool IsMouseLocked() override { return event_handler()->mouse_locked(); }
return IsMouseLocked() &&
event_handler()->mouse_locked_unadjusted_movement_; bool HasFocus() override { return has_focus_; }
}
RenderWidgetHostImpl* host_; RenderWidgetHostImpl* host_;
bool has_focus_ = true;
}; };
void InstallCreateHooksForPointerLockBrowserTests() { void InstallCreateHooksForPointerLockBrowserTests() {
...@@ -651,6 +652,37 @@ IN_PROC_BROWSER_TEST_F(PointerLockBrowserTest, PointerLockWidgetHidden) { ...@@ -651,6 +652,37 @@ IN_PROC_BROWSER_TEST_F(PointerLockBrowserTest, PointerLockWidgetHidden) {
EXPECT_EQ(nullptr, web_contents()->GetMouseLockWidget()); EXPECT_EQ(nullptr, web_contents()->GetMouseLockWidget());
} }
#ifdef USE_AURA
IN_PROC_BROWSER_TEST_F(PointerLockBrowserTest, PointerLockOutOfFocus) {
GURL main_url(embedded_test_server()->GetURL(
"a.com", "/cross_site_iframe_factory.html?a(b)"));
EXPECT_TRUE(NavigateToURL(shell(), main_url));
FrameTreeNode* root = web_contents()->GetFrameTree()->root();
MockPointerLockRenderWidgetHostView* root_view =
static_cast<MockPointerLockRenderWidgetHostView*>(
root->current_frame_host()->GetView());
root_view->has_focus_ = false;
// Request a pointer lock on the root frame's body.
ASSERT_TRUE(ExecJs(root, "document.body.requestPointerLock()"));
// setup promise structure to ensure request finishes.
EXPECT_TRUE(ExecJs(root, R"(
var advertisementreceivedPromise = new Promise(resolve => {
document.addEventListener('pointerlockerror',
event => {
resolve(true);
});
});
)"));
// Root frame should not have been granted pointer lock.
EXPECT_EQ(false,
EvalJs(root, "document.pointerLockElement == document.body"));
}
#endif
// Flaky. https://crbug.com/1014324 // Flaky. https://crbug.com/1014324
IN_PROC_BROWSER_TEST_F(PointerLockBrowserTestWithOptions, IN_PROC_BROWSER_TEST_F(PointerLockBrowserTestWithOptions,
DISABLED_PointerLockRequestUnadjustedMovement) { DISABLED_PointerLockRequestUnadjustedMovement) {
......
...@@ -2535,6 +2535,11 @@ void RenderWidgetHostImpl::RequestMouseLock( ...@@ -2535,6 +2535,11 @@ void RenderWidgetHostImpl::RequestMouseLock(
return; return;
} }
if (!view_ || !view_->HasFocus()) {
std::move(response).Run(blink::mojom::PointerLockResult::kWrongDocument);
return;
}
request_mouse_callback_ = std::move(response); request_mouse_callback_ = std::move(response);
pending_mouse_lock_request_ = true; pending_mouse_lock_request_ = true;
...@@ -2860,8 +2865,8 @@ bool RenderWidgetHostImpl::GotResponseToLockMouseRequest( ...@@ -2860,8 +2865,8 @@ bool RenderWidgetHostImpl::GotResponseToLockMouseRequest(
} }
std::move(request_mouse_callback_) std::move(request_mouse_callback_)
.Run(blink::mojom::PointerLockResult::kSuccess); .Run(blink::mojom::PointerLockResult::kWrongDocument);
return true; return false;
} }
void RenderWidgetHostImpl::GotResponseToKeyboardLockRequest(bool allowed) { void RenderWidgetHostImpl::GotResponseToKeyboardLockRequest(bool allowed) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment