From 06d782279ccb2986579e584d0f4b2d029653113b Mon Sep 17 00:00:00 2001 From: Birunthan Mohanathas Date: Tue, 10 Oct 2017 22:55:15 +0300 Subject: [PATCH] Add systemPreferences.removeUserDefault() This can be used to restore the default or global value of a `key` previously set with `setUserDefault`. --- atom/browser/api/atom_api_system_preferences.cc | 1 + atom/browser/api/atom_api_system_preferences.h | 1 + .../api/atom_api_system_preferences_mac.mm | 5 +++++ docs/api/system-preferences.md | 15 +++++++++++---- spec/api-system-preferences-spec.js | 17 +++++++++++++++++ 5 files changed, 35 insertions(+), 4 deletions(-) diff --git a/atom/browser/api/atom_api_system_preferences.cc b/atom/browser/api/atom_api_system_preferences.cc index 8426c4dbbdf2..74d6d03ce7cb 100644 --- a/atom/browser/api/atom_api_system_preferences.cc +++ b/atom/browser/api/atom_api_system_preferences.cc @@ -67,6 +67,7 @@ void SystemPreferences::BuildPrototype( &SystemPreferences::UnsubscribeLocalNotification) .SetMethod("getUserDefault", &SystemPreferences::GetUserDefault) .SetMethod("setUserDefault", &SystemPreferences::SetUserDefault) + .SetMethod("removeUserDefault", &SystemPreferences::RemoveUserDefault) .SetMethod("isSwipeTrackingFromScrollEventsEnabled", &SystemPreferences::IsSwipeTrackingFromScrollEventsEnabled) #endif diff --git a/atom/browser/api/atom_api_system_preferences.h b/atom/browser/api/atom_api_system_preferences.h index 895974e9aef9..ea5daed94a5f 100644 --- a/atom/browser/api/atom_api_system_preferences.h +++ b/atom/browser/api/atom_api_system_preferences.h @@ -76,6 +76,7 @@ class SystemPreferences : public mate::EventEmitter void SetUserDefault(const std::string& name, const std::string& type, mate::Arguments* args); + void RemoveUserDefault(const std::string& name); bool IsSwipeTrackingFromScrollEventsEnabled(); #endif bool IsDarkMode(); diff --git a/atom/browser/api/atom_api_system_preferences_mac.mm b/atom/browser/api/atom_api_system_preferences_mac.mm index 877ad1a13288..58e9b848e25c 100644 --- a/atom/browser/api/atom_api_system_preferences_mac.mm +++ b/atom/browser/api/atom_api_system_preferences_mac.mm @@ -229,6 +229,11 @@ void SystemPreferences::SetUserDefault(const std::string& name, } } +void SystemPreferences::RemoveUserDefault(const std::string& name) { + NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults]; + [defaults removeObjectForKey:base::SysUTF8ToNSString(name)]; +} + bool SystemPreferences::IsDarkMode() { NSString* mode = [[NSUserDefaults standardUserDefaults] stringForKey:@"AppleInterfaceStyle"]; diff --git a/docs/api/system-preferences.md b/docs/api/system-preferences.md index 54d3ea8d6a21..5ec612246177 100644 --- a/docs/api/system-preferences.md +++ b/docs/api/system-preferences.md @@ -112,9 +112,9 @@ Same as `unsubscribeNotification`, but removes the subscriber from `NSNotificati * `type` String - Can be `string`, `boolean`, `integer`, `float`, `double`, `url`, `array`, `dictionary` -Returns `any` - The value of `key` in system preferences. +Returns `any` - The value of `key` in `NSUserDefaults`. -This API uses `NSUserDefaults` on macOS. Some popular `key` and `type`s are: +Some popular `key` and `type`s are: * `AppleInterfaceStyle`: `string` * `AppleAquaColorVariant`: `integer` @@ -130,15 +130,22 @@ This API uses `NSUserDefaults` on macOS. Some popular `key` and `type`s are: * `type` String - See [`getUserDefault`][#systempreferencesgetuserdefaultkey-type-macos] * `value` String -Set the value of `key` in system preferences. +Set the value of `key` in `NSUserDefaults`. Note that `type` should match actual type of `value`. An exception is thrown if they don't. -This API uses `NSUserDefaults` on macOS. Some popular `key` and `type`s are: +Some popular `key` and `type`s are: * `ApplePressAndHoldEnabled`: `boolean` +### `systemPreferences.removeUserDefault(key)` _macOS_ + +* `key` String + +Removes the `key` in `NSUserDefaults`. This can be used to restore the default +or global value of a `key` previously set with `setUserDefault`. + ### `systemPreferences.isAeroGlassEnabled()` _Windows_ Returns `Boolean` - `true` if [DWM composition][dwm-composition] (Aero Glass) is diff --git a/spec/api-system-preferences-spec.js b/spec/api-system-preferences-spec.js index 1c03d70d9860..afcb5d1f9e2a 100644 --- a/spec/api-system-preferences-spec.js +++ b/spec/api-system-preferences-spec.js @@ -100,6 +100,23 @@ describe('systemPreferences module', function () { }) }) + describe('systemPreferences.setUserDefault(key, type, value)', () => { + if (process.platform !== 'darwin') { + return + } + + it('removes keys', () => { + const KEY = 'SystemPreferencesTest' + systemPreferences.setUserDefault(KEY, 'string', 'foo') + systemPreferences.removeUserDefault(KEY) + assert.equal(systemPreferences.getUserDefault(KEY, 'string'), '') + }) + + it('does not throw for missing keys', () => { + systemPreferences.removeUserDefault('some-missing-key') + }) + }) + describe('systemPreferences.isInvertedColorScheme()', function () { it('returns a boolean', function () { assert.equal(typeof systemPreferences.isInvertedColorScheme(), 'boolean')