From 19043563522c6b48882044955c3cd76a6cc3dcc6 Mon Sep 17 00:00:00 2001 From: Shelley Vohr Date: Thu, 6 Jan 2022 17:15:26 +0100 Subject: [PATCH 1/3] fix: pointer lock escape handling --- .../browser/api/electron_api_web_contents.cc | 22 ++++++++++++------- shell/browser/api/electron_api_web_contents.h | 7 +++--- .../browser/web_contents_permission_helper.cc | 18 --------------- .../browser/web_contents_permission_helper.h | 1 - 4 files changed, 18 insertions(+), 30 deletions(-) diff --git a/shell/browser/api/electron_api_web_contents.cc b/shell/browser/api/electron_api_web_contents.cc index 43ef330cc74ad..95277ebcd2de8 100644 --- a/shell/browser/api/electron_api_web_contents.cc +++ b/shell/browser/api/electron_api_web_contents.cc @@ -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); @@ -1398,6 +1401,17 @@ void WebContents::FindReply(content::WebContents* web_contents, Emit("found-in-page", result.GetHandle()); } +void WebContents::RequestToLockMouse(content::WebContents* web_contents, + bool user_gesture, + bool last_unlocked_by_target) { + exclusive_access_manager_->mouse_lock_controller()->RequestToLockMouse( + web_contents, user_gesture, last_unlocked_by_target); +} + +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( @@ -1430,14 +1444,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_) diff --git a/shell/browser/api/electron_api_web_contents.h b/shell/browser/api/electron_api_web_contents.h index 5bd418b79401c..f312bbe92998d 100644 --- a/shell/browser/api/electron_api_web_contents.h +++ b/shell/browser/api/electron_api_web_contents.h @@ -560,6 +560,10 @@ class WebContents : public ExclusiveAccessContext, const gfx::Rect& selection_rect, int active_match_ordinal, bool final_update) override; + 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; @@ -570,9 +574,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; diff --git a/shell/browser/web_contents_permission_helper.cc b/shell/browser/web_contents_permission_helper.cc index 44129dd295834..d95ec28397c91 100644 --- a/shell/browser/web_contents_permission_helper.cc +++ b/shell/browser/web_contents_permission_helper.cc @@ -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 callback, blink::mojom::PermissionStatus status) { if (status == blink::mojom::PermissionStatus::GRANTED) @@ -156,13 +145,6 @@ void WebContentsPermissionHelper::RequestWebNotificationPermission( std::move(callback)); } -void WebContentsPermissionHelper::RequestPointerLockPermission( - bool user_gesture) { - RequestPermission( - static_cast(PermissionType::POINTER_LOCK), - base::BindOnce(&OnPointerLockResponse, web_contents_), user_gesture); -} - void WebContentsPermissionHelper::RequestOpenExternalPermission( base::OnceCallback callback, bool user_gesture, diff --git a/shell/browser/web_contents_permission_helper.h b/shell/browser/web_contents_permission_helper.h index 6f320b7a6a9b7..5a6c2fd0e2dc0 100644 --- a/shell/browser/web_contents_permission_helper.h +++ b/shell/browser/web_contents_permission_helper.h @@ -38,7 +38,6 @@ class WebContentsPermissionHelper content::MediaResponseCallback callback); void RequestWebNotificationPermission( base::OnceCallback callback); - void RequestPointerLockPermission(bool user_gesture); void RequestOpenExternalPermission(base::OnceCallback callback, bool user_gesture, const GURL& url); From 45a2050a933c1c408274f76e9ff94a9aea3242ad Mon Sep 17 00:00:00 2001 From: Shelley Vohr Date: Tue, 11 Jan 2022 16:10:39 +0100 Subject: [PATCH 2/3] refactor: don't drop permission controls --- .../browser/api/electron_api_web_contents.cc | 19 ++++++++++++++-- shell/browser/api/electron_api_web_contents.h | 4 ++++ .../browser/web_contents_permission_helper.cc | 22 +++++++++++++++++++ .../browser/web_contents_permission_helper.h | 5 +++++ 4 files changed, 48 insertions(+), 2 deletions(-) diff --git a/shell/browser/api/electron_api_web_contents.cc b/shell/browser/api/electron_api_web_contents.cc index 95277ebcd2de8..b5b21d71a92ba 100644 --- a/shell/browser/api/electron_api_web_contents.cc +++ b/shell/browser/api/electron_api_web_contents.cc @@ -1401,11 +1401,26 @@ 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); + } +} + void WebContents::RequestToLockMouse(content::WebContents* web_contents, bool user_gesture, bool last_unlocked_by_target) { - exclusive_access_manager_->mouse_lock_controller()->RequestToLockMouse( - web_contents, user_gesture, 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() { diff --git a/shell/browser/api/electron_api_web_contents.h b/shell/browser/api/electron_api_web_contents.h index f312bbe92998d..996c90cbbbc39 100644 --- a/shell/browser/api/electron_api_web_contents.h +++ b/shell/browser/api/electron_api_web_contents.h @@ -560,6 +560,10 @@ 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; diff --git a/shell/browser/web_contents_permission_helper.cc b/shell/browser/web_contents_permission_helper.cc index d95ec28397c91..07f99d157dbe2 100644 --- a/shell/browser/web_contents_permission_helper.cc +++ b/shell/browser/web_contents_permission_helper.cc @@ -43,6 +43,16 @@ void MediaAccessAllowed(const content::MediaStreamRequest& request, controller.Deny(blink::mojom::MediaStreamRequestResult::PERMISSION_DENIED); } +void OnPointerLockResponse( + base::OnceCallback callback, + content::WebContents* web_contents, + bool user_gesture, + bool last_unlocked_by_target, + bool allowed) { + std::move(callback).Run(web_contents, user_gesture, last_unlocked_by_target, + allowed); +} + void OnPermissionResponse(base::OnceCallback callback, blink::mojom::PermissionStatus status) { if (status == blink::mojom::PermissionStatus::GRANTED) @@ -145,6 +155,18 @@ void WebContentsPermissionHelper::RequestWebNotificationPermission( std::move(callback)); } +void WebContentsPermissionHelper::RequestPointerLockPermission( + bool user_gesture, + bool last_unlocked_by_target, + base::OnceCallback + callback) { + RequestPermission( + static_cast(PermissionType::POINTER_LOCK), + base::BindOnce(&OnPointerLockResponse, std::move(callback), web_contents_, + user_gesture, last_unlocked_by_target), + user_gesture); +} + void WebContentsPermissionHelper::RequestOpenExternalPermission( base::OnceCallback callback, bool user_gesture, diff --git a/shell/browser/web_contents_permission_helper.h b/shell/browser/web_contents_permission_helper.h index 5a6c2fd0e2dc0..639dcd8a8829a 100644 --- a/shell/browser/web_contents_permission_helper.h +++ b/shell/browser/web_contents_permission_helper.h @@ -36,6 +36,11 @@ class WebContentsPermissionHelper void RequestFullscreenPermission(base::OnceCallback callback); void RequestMediaAccessPermission(const content::MediaStreamRequest& request, content::MediaResponseCallback callback); + void RequestPointerLockPermission( + bool user_gesture, + bool last_unlocked_by_target, + base::OnceCallback + callback); void RequestWebNotificationPermission( base::OnceCallback callback); void RequestOpenExternalPermission(base::OnceCallback callback, From 4b5f1bad45e228a613baa55dfdbb7e4cb1ffc2c9 Mon Sep 17 00:00:00 2001 From: Shelley Vohr Date: Wed, 19 Jan 2022 09:39:53 +0100 Subject: [PATCH 3/3] chore: cancel active pending requests if denied --- shell/browser/api/electron_api_web_contents.cc | 3 +++ shell/browser/web_contents_permission_helper.cc | 14 ++------------ 2 files changed, 5 insertions(+), 12 deletions(-) diff --git a/shell/browser/api/electron_api_web_contents.cc b/shell/browser/api/electron_api_web_contents.cc index b5b21d71a92ba..e4030acac92d4 100644 --- a/shell/browser/api/electron_api_web_contents.cc +++ b/shell/browser/api/electron_api_web_contents.cc @@ -1409,6 +1409,9 @@ void WebContents::RequestExclusivePointerAccess( 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); } } diff --git a/shell/browser/web_contents_permission_helper.cc b/shell/browser/web_contents_permission_helper.cc index 07f99d157dbe2..2fd8cb0a6c699 100644 --- a/shell/browser/web_contents_permission_helper.cc +++ b/shell/browser/web_contents_permission_helper.cc @@ -43,16 +43,6 @@ void MediaAccessAllowed(const content::MediaStreamRequest& request, controller.Deny(blink::mojom::MediaStreamRequestResult::PERMISSION_DENIED); } -void OnPointerLockResponse( - base::OnceCallback callback, - content::WebContents* web_contents, - bool user_gesture, - bool last_unlocked_by_target, - bool allowed) { - std::move(callback).Run(web_contents, user_gesture, last_unlocked_by_target, - allowed); -} - void OnPermissionResponse(base::OnceCallback callback, blink::mojom::PermissionStatus status) { if (status == blink::mojom::PermissionStatus::GRANTED) @@ -162,8 +152,8 @@ void WebContentsPermissionHelper::RequestPointerLockPermission( callback) { RequestPermission( static_cast(PermissionType::POINTER_LOCK), - base::BindOnce(&OnPointerLockResponse, std::move(callback), web_contents_, - user_gesture, last_unlocked_by_target), + base::BindOnce(std::move(callback), web_contents_, user_gesture, + last_unlocked_by_target), user_gesture); }