diff --git a/docs/api/app.md b/docs/api/app.md index e234d5a6d5a..283988307ba 100644 --- a/docs/api/app.md +++ b/docs/api/app.md @@ -1304,6 +1304,25 @@ app.moveToApplicationsFolder({ Would mean that if an app already exists in the user directory, if the user chooses to 'Continue Move' then the function would continue with its default behavior and the existing app will be trashed and the active app moved into its place. +### `app.isSecureKeyboardEntryEnabled()` _macOS_ + +Returns `Boolean` - whether `Secure Keyboard Entry` is enabled. + +By default this API will return `false`. + +### `app.setSecureKeyboardEntryEnabled(enabled)` _macOS_ + +* `enabled` Boolean - Enable or disable `Secure Keyboard Entry` + +Set the `Secure Keyboard Entry` is enabled in your application. + +By using this API, important information such as password and other sensitive information can be prevented from being intercepted by other processes. + +See [Apple's documentation](https://developer.apple.com/library/archive/technotes/tn2150/_index.html) for more +details. + +**Note:** Enable `Secure Keyboard Entry` only when it is needed and disable it when it is no longer needed. + ## Properties ### `app.accessibilitySupportEnabled` _macOS_ _Windows_ diff --git a/shell/browser/api/electron_api_app.cc b/shell/browser/api/electron_api_app.cc index 5ca71f785c4..9ca9a7ad0dd 100644 --- a/shell/browser/api/electron_api_app.cc +++ b/shell/browser/api/electron_api_app.cc @@ -1525,6 +1525,14 @@ void App::BuildPrototype(v8::Isolate* isolate, base::BindRepeating(&Browser::SetAboutPanelOptions, browser)) .SetMethod("showAboutPanel", base::BindRepeating(&Browser::ShowAboutPanel, browser)) +#if defined(OS_MACOSX) + .SetMethod( + "isSecureKeyboardEntryEnabled", + base::BindRepeating(&Browser::IsSecureKeyboardEntryEnabled, browser)) + .SetMethod( + "setSecureKeyboardEntryEnabled", + base::BindRepeating(&Browser::SetSecureKeyboardEntryEnabled, browser)) +#endif #if defined(OS_MACOSX) || defined(OS_WIN) .SetMethod("showEmojiPanel", base::BindRepeating(&Browser::ShowEmojiPanel, browser)) diff --git a/shell/browser/browser.h b/shell/browser/browser.h index 4fbab02d8c4..0cce2b27508 100644 --- a/shell/browser/browser.h +++ b/shell/browser/browser.h @@ -23,6 +23,10 @@ #include "base/files/file_path.h" #endif +#if defined(OS_MACOSX) +#include "ui/base/cocoa/secure_password_input.h" +#endif + namespace base { class FilePath; } @@ -261,6 +265,12 @@ class Browser : public WindowListObserver { void RemoveObserver(BrowserObserver* obs) { observers_.RemoveObserver(obs); } +#if defined(OS_MACOSX) + // Returns whether secure input is enabled + bool IsSecureKeyboardEntryEnabled(); + void SetSecureKeyboardEntryEnabled(bool enabled); +#endif + bool is_shutting_down() const { return is_shutdown_; } bool is_quiting() const { return is_quiting_; } bool is_ready() const { return is_ready_; } @@ -305,6 +315,10 @@ class Browser : public WindowListObserver { std::unique_ptr> ready_promise_; +#if defined(OS_MACOSX) + std::unique_ptr password_input_enabler_; +#endif + #if defined(OS_LINUX) || defined(OS_WIN) base::Value about_panel_options_; #elif defined(OS_MACOSX) diff --git a/shell/browser/browser_mac.mm b/shell/browser/browser_mac.mm index b51860340e4..ec0f832479e 100644 --- a/shell/browser/browser_mac.mm +++ b/shell/browser/browser_mac.mm @@ -4,6 +4,7 @@ #include "shell/browser/browser.h" +#include #include #include @@ -430,4 +431,17 @@ bool Browser::IsEmojiPanelSupported() { return true; } +bool Browser::IsSecureKeyboardEntryEnabled() { + return password_input_enabler_.get() != nullptr; +} + +void Browser::SetSecureKeyboardEntryEnabled(bool enabled) { + if (enabled) { + password_input_enabler_ = + std::make_unique(); + } else { + password_input_enabler_.reset(); + } +} + } // namespace electron diff --git a/spec-main/api-app-spec.ts b/spec-main/api-app-spec.ts index a3ffe1be272..f6e785c9156 100644 --- a/spec-main/api-app-spec.ts +++ b/spec-main/api-app-spec.ts @@ -1439,6 +1439,15 @@ describe('app module', () => { expect(getSwitchValue).to.equal(''); }); }); + + ifdescribe(process.platform === 'darwin')('app.setSecureKeyboardEntryEnabled', () => { + it('changes Secure Keyboard Entry is enabled', () => { + app.setSecureKeyboardEntryEnabled(true); + expect(app.isSecureKeyboardEntryEnabled()).to.equal(true); + app.setSecureKeyboardEntryEnabled(false); + expect(app.isSecureKeyboardEntryEnabled()).to.equal(false); + }); + }); }); describe('default behavior', () => {