Skip to content

Commit

Permalink
fix: pointer lock escape handling (#32828)
Browse files Browse the repository at this point in the history
  • Loading branch information
trop[bot] committed Mar 30, 2022
1 parent 41aaed3 commit befe53e
Show file tree
Hide file tree
Showing 4 changed files with 52 additions and 25 deletions.
40 changes: 32 additions & 8 deletions shell/browser/api/electron_api_web_contents.cc
Expand Up @@ -1250,6 +1250,9 @@ bool WebContents::PlatformHandleKeyboardEvent(
content::KeyboardEventProcessingResult WebContents::PreHandleKeyboardEvent(
content::WebContents* source,
const content::NativeWebKeyboardEvent& event) {
if (exclusive_access_manager_->HandleUserKeyEvent(event))
return content::KeyboardEventProcessingResult::HANDLED;

if (event.GetType() == blink::WebInputEvent::Type::kRawKeyDown ||
event.GetType() == blink::WebInputEvent::Type::kKeyUp) {
bool prevent_default = Emit("before-input-event", event);
Expand Down Expand Up @@ -1398,6 +1401,35 @@ void WebContents::FindReply(content::WebContents* web_contents,
Emit("found-in-page", result.GetHandle());
}

void WebContents::RequestExclusivePointerAccess(
content::WebContents* web_contents,
bool user_gesture,
bool last_unlocked_by_target,
bool allowed) {
if (allowed) {
exclusive_access_manager_->mouse_lock_controller()->RequestToLockMouse(
web_contents, user_gesture, last_unlocked_by_target);
} else {
web_contents->GotResponseToLockMouseRequest(
blink::mojom::PointerLockResult::kPermissionDenied);
}
}

void WebContents::RequestToLockMouse(content::WebContents* web_contents,
bool user_gesture,
bool last_unlocked_by_target) {
auto* permission_helper =
WebContentsPermissionHelper::FromWebContents(web_contents);
permission_helper->RequestPointerLockPermission(
user_gesture, last_unlocked_by_target,
base::BindOnce(&WebContents::RequestExclusivePointerAccess,
base::Unretained(this)));
}

void WebContents::LostMouseLock() {
exclusive_access_manager_->mouse_lock_controller()->LostMouseLock();
}

void WebContents::RequestKeyboardLock(content::WebContents* web_contents,
bool esc_key_locked) {
exclusive_access_manager_->keyboard_lock_controller()->RequestKeyboardLock(
Expand Down Expand Up @@ -1430,14 +1462,6 @@ void WebContents::RequestMediaAccessPermission(
permission_helper->RequestMediaAccessPermission(request, std::move(callback));
}

void WebContents::RequestToLockMouse(content::WebContents* web_contents,
bool user_gesture,
bool last_unlocked_by_target) {
auto* permission_helper =
WebContentsPermissionHelper::FromWebContents(web_contents);
permission_helper->RequestPointerLockPermission(user_gesture);
}

content::JavaScriptDialogManager* WebContents::GetJavaScriptDialogManager(
content::WebContents* source) {
if (!dialog_manager_)
Expand Down
11 changes: 8 additions & 3 deletions shell/browser/api/electron_api_web_contents.h
Expand Up @@ -560,6 +560,14 @@ class WebContents : public ExclusiveAccessContext,
const gfx::Rect& selection_rect,
int active_match_ordinal,
bool final_update) override;
void RequestExclusivePointerAccess(content::WebContents* web_contents,
bool user_gesture,
bool last_unlocked_by_target,
bool allowed);
void RequestToLockMouse(content::WebContents* web_contents,
bool user_gesture,
bool last_unlocked_by_target) override;
void LostMouseLock() override;
void RequestKeyboardLock(content::WebContents* web_contents,
bool esc_key_locked) override;
void CancelKeyboardLockRequest(content::WebContents* web_contents) override;
Expand All @@ -570,9 +578,6 @@ class WebContents : public ExclusiveAccessContext,
content::WebContents* web_contents,
const content::MediaStreamRequest& request,
content::MediaResponseCallback callback) override;
void RequestToLockMouse(content::WebContents* web_contents,
bool user_gesture,
bool last_unlocked_by_target) override;
content::JavaScriptDialogManager* GetJavaScriptDialogManager(
content::WebContents* source) override;
void OnAudioStateChanged(bool audible) override;
Expand Down
20 changes: 7 additions & 13 deletions shell/browser/web_contents_permission_helper.cc
Expand Up @@ -43,17 +43,6 @@ void MediaAccessAllowed(const content::MediaStreamRequest& request,
controller.Deny(blink::mojom::MediaStreamRequestResult::PERMISSION_DENIED);
}

void OnPointerLockResponse(content::WebContents* web_contents, bool allowed) {
if (web_contents) {
if (allowed)
web_contents->GotResponseToLockMouseRequest(
blink::mojom::PointerLockResult::kSuccess);
else
web_contents->GotResponseToLockMouseRequest(
blink::mojom::PointerLockResult::kPermissionDenied);
}
}

void OnPermissionResponse(base::OnceCallback<void(bool)> callback,
blink::mojom::PermissionStatus status) {
if (status == blink::mojom::PermissionStatus::GRANTED)
Expand Down Expand Up @@ -157,10 +146,15 @@ void WebContentsPermissionHelper::RequestWebNotificationPermission(
}

void WebContentsPermissionHelper::RequestPointerLockPermission(
bool user_gesture) {
bool user_gesture,
bool last_unlocked_by_target,
base::OnceCallback<void(content::WebContents*, bool, bool, bool)>
callback) {
RequestPermission(
static_cast<content::PermissionType>(PermissionType::POINTER_LOCK),
base::BindOnce(&OnPointerLockResponse, web_contents_), user_gesture);
base::BindOnce(std::move(callback), web_contents_, user_gesture,
last_unlocked_by_target),
user_gesture);
}

void WebContentsPermissionHelper::RequestOpenExternalPermission(
Expand Down
6 changes: 5 additions & 1 deletion shell/browser/web_contents_permission_helper.h
Expand Up @@ -36,9 +36,13 @@ class WebContentsPermissionHelper
void RequestFullscreenPermission(base::OnceCallback<void(bool)> callback);
void RequestMediaAccessPermission(const content::MediaStreamRequest& request,
content::MediaResponseCallback callback);
void RequestPointerLockPermission(
bool user_gesture,
bool last_unlocked_by_target,
base::OnceCallback<void(content::WebContents*, bool, bool, bool)>
callback);
void RequestWebNotificationPermission(
base::OnceCallback<void(bool)> callback);
void RequestPointerLockPermission(bool user_gesture);
void RequestOpenExternalPermission(base::OnceCallback<void(bool)> callback,
bool user_gesture,
const GURL& url);
Expand Down

0 comments on commit befe53e

Please sign in to comment.