diff --git a/atom/browser/api/atom_api_system_preferences.cc b/atom/browser/api/atom_api_system_preferences.cc index 74d6d03ce7cb..82c3b2e1017f 100644 --- a/atom/browser/api/atom_api_system_preferences.cc +++ b/atom/browser/api/atom_api_system_preferences.cc @@ -65,6 +65,7 @@ void SystemPreferences::BuildPrototype( &SystemPreferences::SubscribeLocalNotification) .SetMethod("unsubscribeLocalNotification", &SystemPreferences::UnsubscribeLocalNotification) + .SetMethod("registerDefaults", &SystemPreferences::RegisterDefaults) .SetMethod("getUserDefault", &SystemPreferences::GetUserDefault) .SetMethod("setUserDefault", &SystemPreferences::SetUserDefault) .SetMethod("removeUserDefault", &SystemPreferences::RemoveUserDefault) diff --git a/atom/browser/api/atom_api_system_preferences.h b/atom/browser/api/atom_api_system_preferences.h index ea5daed94a5f..4e432d7e51e1 100644 --- a/atom/browser/api/atom_api_system_preferences.h +++ b/atom/browser/api/atom_api_system_preferences.h @@ -73,6 +73,7 @@ class SystemPreferences : public mate::EventEmitter void UnsubscribeLocalNotification(int request_id); v8::Local GetUserDefault(const std::string& name, const std::string& type); + void RegisterDefaults(mate::Arguments* args); void SetUserDefault(const std::string& name, const std::string& type, mate::Arguments* args); diff --git a/atom/browser/api/atom_api_system_preferences_mac.mm b/atom/browser/api/atom_api_system_preferences_mac.mm index 58e9b848e25c..8f7ce7f144c5 100644 --- a/atom/browser/api/atom_api_system_preferences_mac.mm +++ b/atom/browser/api/atom_api_system_preferences_mac.mm @@ -144,6 +144,28 @@ v8::Local SystemPreferences::GetUserDefault( } } +void SystemPreferences::RegisterDefaults(mate::Arguments* args) { + base::DictionaryValue value; + + if(!args->GetNext(&value)) { + args->ThrowError("Invalid userDefault data provided"); + } else { + @try { + NSDictionary* dict = DictionaryValueToNSDictionary(value); + for (id key in dict) { + id value = [dict objectForKey:key]; + if ([value isKindOfClass:[NSNull class]] || value == nil) { + args->ThrowError("Invalid userDefault data provided"); + return; + } + } + [[NSUserDefaults standardUserDefaults] registerDefaults:dict]; + } @catch (NSException* exception) { + args->ThrowError("Invalid userDefault data provided"); + } + } +} + void SystemPreferences::SetUserDefault(const std::string& name, const std::string& type, mate::Arguments* args) { diff --git a/docs/api/system-preferences.md b/docs/api/system-preferences.md index 1fe53eed360b..5f6f004a3c1e 100644 --- a/docs/api/system-preferences.md +++ b/docs/api/system-preferences.md @@ -106,6 +106,12 @@ This is necessary for events such as `NSUserDefaultsDidChangeNotification`. Same as `unsubscribeNotification`, but removes the subscriber from `NSNotificationCenter`. +### `systemPreferences.registerDefaults(defaults)` _macOS_ + +* `defaults` Object - a dictionary of (`key: value`) user defaults + +Add the specified defaults to your application's `NSUserDefaults`. + ### `systemPreferences.getUserDefault(key, type)` _macOS_ * `key` String diff --git a/spec/api-system-preferences-spec.js b/spec/api-system-preferences-spec.js index d6513b364b33..96e52979fdd5 100644 --- a/spec/api-system-preferences-spec.js +++ b/spec/api-system-preferences-spec.js @@ -35,6 +35,48 @@ describe('systemPreferences module', () => { }) }) + describe('systemPreferences.registerDefaults(defaults)', () => { + before(function () { + if (process.platform !== 'darwin') { + this.skip() + } + }) + + it('registers defaults', () => { + const defaultsMap = [ + { key: 'one', type: 'string', value: 'ONE' }, + { key: 'two', value: 2, type: 'integer' }, + { key: 'three', value: [1, 2, 3], type: 'array' } + ] + + const defaultsDict = {} + defaultsMap.forEach(row => { defaultsDict[row.key] = row.value }) + + systemPreferences.registerDefaults(defaultsDict) + + for (const userDefault of defaultsMap) { + const { key, value: expectedValue, type } = userDefault + const actualValue = systemPreferences.getUserDefault(key, type) + assert.deepEqual(actualValue, expectedValue) + } + }) + + it('throws when bad defaults are passed', () => { + const badDefaults = [ + 1, + null, + new Date(), + { 'one': null } + ] + + for (const badDefault of badDefaults) { + assert.throws(() => { + systemPreferences.registerDefaults(badDefault) + }, 'Invalid userDefault data provided') + } + }) + }) + describe('systemPreferences.getUserDefault(key, type)', () => { before(function () { if (process.platform !== 'darwin') {