Merge pull request #7993 from electron/get-user-default-crash
Prevent systemPreferences.getUserDefault crash for missing arrays/dictionaries
This commit is contained in:
commit
82d17cb05d
2 changed files with 29 additions and 11 deletions
|
@ -28,17 +28,17 @@ std::map<int, id> 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<v8::Value> 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<base::ListValue> 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<base::DictionaryValue> dictionary =
|
||||
NSDictionaryToDictionaryValue([defaults dictionaryForKey:key]);
|
||||
if (dictionary == nullptr)
|
||||
dictionary.reset(new base::DictionaryValue());
|
||||
return mate::ConvertToV8(isolate(), *dictionary);
|
||||
} else {
|
||||
return v8::Undefined(isolate());
|
||||
}
|
||||
|
|
|
@ -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 () {
|
||||
|
|
Loading…
Reference in a new issue