From 7999ea39e2ee9702e64e4125e8e89c314e9f468f Mon Sep 17 00:00:00 2001 From: Shelley Vohr Date: Mon, 6 Nov 2023 11:54:31 -0800 Subject: [PATCH] feat: `keyboard.lock()` should use permissions helper (#40369) feat: `keyboard.lock()` should use permissions helper --- docs/api/session.md | 1 + .../browser/api/electron_api_web_contents.cc | 29 ++++++++++++++----- shell/browser/api/electron_api_web_contents.h | 11 ++++--- .../browser/web_contents_permission_helper.cc | 9 ++++++ .../browser/web_contents_permission_helper.h | 6 +++- .../gin_converters/content_converter.cc | 2 ++ 6 files changed, 45 insertions(+), 13 deletions(-) diff --git a/docs/api/session.md b/docs/api/session.md index b058ea4768..35120645c0 100644 --- a/docs/api/session.md +++ b/docs/api/session.md @@ -901,6 +901,7 @@ win.webContents.session.setCertificateVerifyProc((request, callback) => { * `midiSysex` - Request the use of system exclusive messages in the [Web MIDI API](https://developer.mozilla.org/en-US/docs/Web/API/Web_MIDI_API). * `notifications` - Request notification creation and the ability to display them in the user's system tray using the [Notifications API](https://developer.mozilla.org/en-US/docs/Web/API/notification) * `pointerLock` - Request to directly interpret mouse movements as an input method via the [Pointer Lock API](https://developer.mozilla.org/en-US/docs/Web/API/Pointer_Lock_API). These requests always appear to originate from the main frame. + * `keyboardLock` - Request capture of keypresses for any or all of the keys on the physical keyboard via the [Keyboard Lock API](https://developer.mozilla.org/en-US/docs/Web/API/Keyboard/lock). These requests always appear to originate from the main frame. * `openExternal` - Request to open links in external applications. * `window-management` - Request access to enumerate screens using the [`getScreenDetails`](https://developer.chrome.com/en/articles/multi-screen-window-placement/) API. * `unknown` - An unrecognized permission request. diff --git a/shell/browser/api/electron_api_web_contents.cc b/shell/browser/api/electron_api_web_contents.cc index cb66a8d963..5d954f877b 100644 --- a/shell/browser/api/electron_api_web_contents.cc +++ b/shell/browser/api/electron_api_web_contents.cc @@ -1511,11 +1511,10 @@ 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) { +void WebContents::OnRequestToLockMouse(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); @@ -1532,7 +1531,7 @@ void WebContents::RequestToLockMouse(content::WebContents* web_contents, WebContentsPermissionHelper::FromWebContents(web_contents); permission_helper->RequestPointerLockPermission( user_gesture, last_unlocked_by_target, - base::BindOnce(&WebContents::RequestExclusivePointerAccess, + base::BindOnce(&WebContents::OnRequestToLockMouse, base::Unretained(this))); } @@ -1540,10 +1539,24 @@ void WebContents::LostMouseLock() { exclusive_access_manager_.mouse_lock_controller()->LostMouseLock(); } +void WebContents::OnRequestKeyboardLock(content::WebContents* web_contents, + bool esc_key_locked, + bool allowed) { + if (allowed) { + exclusive_access_manager_.keyboard_lock_controller()->RequestKeyboardLock( + web_contents, esc_key_locked); + } else { + web_contents->GotResponseToKeyboardLockRequest(false); + } +} + void WebContents::RequestKeyboardLock(content::WebContents* web_contents, bool esc_key_locked) { - exclusive_access_manager_.keyboard_lock_controller()->RequestKeyboardLock( - web_contents, esc_key_locked); + auto* permission_helper = + WebContentsPermissionHelper::FromWebContents(web_contents); + permission_helper->RequestKeyboardLockPermission( + esc_key_locked, base::BindOnce(&WebContents::OnRequestKeyboardLock, + base::Unretained(this))); } void WebContents::CancelKeyboardLockRequest( diff --git a/shell/browser/api/electron_api_web_contents.h b/shell/browser/api/electron_api_web_contents.h index c65e743c00..a3a5dc098b 100644 --- a/shell/browser/api/electron_api_web_contents.h +++ b/shell/browser/api/electron_api_web_contents.h @@ -568,14 +568,17 @@ 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 OnRequestToLockMouse(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 OnRequestKeyboardLock(content::WebContents* web_contents, + bool esc_key_locked, + bool allowed); void RequestKeyboardLock(content::WebContents* web_contents, bool esc_key_locked) override; void CancelKeyboardLockRequest(content::WebContents* web_contents) override; diff --git a/shell/browser/web_contents_permission_helper.cc b/shell/browser/web_contents_permission_helper.cc index 39909b7bac..b33598437d 100644 --- a/shell/browser/web_contents_permission_helper.cc +++ b/shell/browser/web_contents_permission_helper.cc @@ -253,6 +253,15 @@ void WebContentsPermissionHelper::RequestPointerLockPermission( user_gesture); } +void WebContentsPermissionHelper::RequestKeyboardLockPermission( + bool esc_key_locked, + base::OnceCallback callback) { + RequestPermission( + web_contents_->GetPrimaryMainFrame(), + static_cast(PermissionType::KEYBOARD_LOCK), + base::BindOnce(std::move(callback), web_contents_, esc_key_locked)); +} + void WebContentsPermissionHelper::RequestOpenExternalPermission( content::RenderFrameHost* requesting_frame, base::OnceCallback callback, diff --git a/shell/browser/web_contents_permission_helper.h b/shell/browser/web_contents_permission_helper.h index bde6b2952c..6199b71caa 100644 --- a/shell/browser/web_contents_permission_helper.h +++ b/shell/browser/web_contents_permission_helper.h @@ -31,7 +31,8 @@ class WebContentsPermissionHelper OPEN_EXTERNAL, SERIAL, HID, - USB + USB, + KEYBOARD_LOCK }; // Asynchronous Requests @@ -44,6 +45,9 @@ class WebContentsPermissionHelper bool last_unlocked_by_target, base::OnceCallback callback); + void RequestKeyboardLockPermission( + bool esc_key_locked, + base::OnceCallback callback); void RequestWebNotificationPermission( content::RenderFrameHost* requesting_frame, base::OnceCallback callback); diff --git a/shell/common/gin_converters/content_converter.cc b/shell/common/gin_converters/content_converter.cc index 4a2afc8512..7d2033c1e9 100644 --- a/shell/common/gin_converters/content_converter.cc +++ b/shell/common/gin_converters/content_converter.cc @@ -300,6 +300,8 @@ v8::Local Converter::ToV8( switch (static_cast(val)) { case PermissionType::POINTER_LOCK: return StringToV8(isolate, "pointerLock"); + case PermissionType::KEYBOARD_LOCK: + return StringToV8(isolate, "keyboardLock"); case PermissionType::FULLSCREEN: return StringToV8(isolate, "fullscreen"); case PermissionType::OPEN_EXTERNAL: