diff --git a/atom/browser/api/atom_api_system_preferences_mac.mm b/atom/browser/api/atom_api_system_preferences_mac.mm index aee0b4631613..edb875c0b243 100644 --- a/atom/browser/api/atom_api_system_preferences_mac.mm +++ b/atom/browser/api/atom_api_system_preferences_mac.mm @@ -28,17 +28,17 @@ std::map g_id_map; } // namespace -void SystemPreferences::PostNotification(const std::string& name, +void SystemPreferences::PostNotification(const std::string& name, const base::DictionaryValue& user_info) { DoPostNotification(name, user_info, false); } -void SystemPreferences::PostLocalNotification(const std::string& name, +void SystemPreferences::PostLocalNotification(const std::string& name, const base::DictionaryValue& user_info) { DoPostNotification(name, user_info, true); } -void SystemPreferences::DoPostNotification(const std::string& name, +void SystemPreferences::DoPostNotification(const std::string& name, const base::DictionaryValue& user_info, bool is_local) { NSNotificationCenter* center = is_local ? [NSNotificationCenter defaultCenter] : @@ -128,11 +128,17 @@ v8::Local SystemPreferences::GetUserDefault( return mate::ConvertToV8(isolate(), net::GURLWithNSURL([defaults URLForKey:key])); } else if (type == "array") { - return mate::ConvertToV8(isolate(), - *NSArrayToListValue([defaults arrayForKey:key])); + std::unique_ptr list = + NSArrayToListValue([defaults arrayForKey:key]); + if (list == nullptr) + list.reset(new base::ListValue()); + return mate::ConvertToV8(isolate(), *list); } else if (type == "dictionary") { - return mate::ConvertToV8(isolate(), - *NSDictionaryToDictionaryValue([defaults dictionaryForKey:key])); + std::unique_ptr dictionary = + NSDictionaryToDictionaryValue([defaults dictionaryForKey:key]); + if (dictionary == nullptr) + dictionary.reset(new base::DictionaryValue()); + return mate::ConvertToV8(isolate(), *dictionary); } else { return v8::Undefined(isolate()); } diff --git a/spec/api-system-preferences-spec.js b/spec/api-system-preferences-spec.js index e61ae726dfcc..e893a7c55e24 100644 --- a/spec/api-system-preferences-spec.js +++ b/spec/api-system-preferences-spec.js @@ -37,14 +37,26 @@ describe('systemPreferences module', function () { } it('returns values for known user defaults', function () { - let locale = systemPreferences.getUserDefault('AppleLocale', 'string') - assert.notEqual(locale, null) + const locale = systemPreferences.getUserDefault('AppleLocale', 'string') + assert.equal(typeof locale, 'string') assert(locale.length > 0) - let languages = systemPreferences.getUserDefault('AppleLanguages', 'array') - assert.notEqual(languages, null) + const languages = systemPreferences.getUserDefault('AppleLanguages', 'array') + assert(Array.isArray(languages)) assert(languages.length > 0) }) + + it('returns values for unknown user defaults', function () { + assert.equal(systemPreferences.getUserDefault('UserDefaultDoesNotExist', 'boolean'), false) + assert.equal(systemPreferences.getUserDefault('UserDefaultDoesNotExist', 'integer'), 0) + assert.equal(systemPreferences.getUserDefault('UserDefaultDoesNotExist', 'float'), 0) + assert.equal(systemPreferences.getUserDefault('UserDefaultDoesNotExist', 'double'), 0) + assert.equal(systemPreferences.getUserDefault('UserDefaultDoesNotExist', 'string'), '') + assert.equal(systemPreferences.getUserDefault('UserDefaultDoesNotExist', 'url'), '') + assert.equal(systemPreferences.getUserDefault('UserDefaultDoesNotExist', 'badtype'), undefined) + assert.deepEqual(systemPreferences.getUserDefault('UserDefaultDoesNotExist', 'array'), []) + assert.deepEqual(systemPreferences.getUserDefault('UserDefaultDoesNotExist', 'dictionary'), {}) + }) }) describe('systemPreferences.isInvertedColorScheme()', function () {