Chromium Code Reviews| Index: chrome/browser/extensions/api/settings_private/prefs_util.cc |
| diff --git a/chrome/browser/extensions/api/settings_private/prefs_util.cc b/chrome/browser/extensions/api/settings_private/prefs_util.cc |
| index 0bf1e5e6b49fb30b7c49f3ca0e2b9b60ca95f673..306d39963aa496b3b154cb1feb0847ef62f73d62 100644 |
| --- a/chrome/browser/extensions/api/settings_private/prefs_util.cc |
| +++ b/chrome/browser/extensions/api/settings_private/prefs_util.cc |
| @@ -372,6 +372,14 @@ const PrefsUtil::TypedPrefMap& PrefsUtil::GetWhitelistedKeys() { |
| return *s_whitelist; |
| } |
| +settings_private::PrefType PrefsUtil::GetWhitelistedPrefType( |
| + const std::string& pref_name) { |
| + const TypedPrefMap& keys = GetWhitelistedKeys(); |
| + const auto& iter = keys.find(pref_name); |
|
michaelpg
2017/04/04 00:37:09
nit: keys.count(pref_name) ? : is (IMO) prettier t
stevenjb
2017/04/04 18:18:11
We need to return iter->second.
|
| + return iter != keys.end() ? iter->second |
| + : settings_private::PrefType::PREF_TYPE_NONE; |
| +} |
| + |
| settings_private::PrefType PrefsUtil::GetType(const std::string& name, |
| base::Value::Type type) { |
| switch (type) { |
| @@ -399,7 +407,10 @@ std::unique_ptr<settings_private::PrefObject> PrefsUtil::GetCrosSettingsPref( |
| #if defined(OS_CHROMEOS) |
| const base::Value* value = CrosSettings::Get()->GetPref(name); |
| - DCHECK(value) << "Pref not found: " << name; |
| + if (!value) { |
| + LOG(ERROR) << "Cros settings pref not found: " << name; |
|
michaelpg
2017/04/04 00:37:09
would NOTREACHED be more appropriate than removing
stevenjb
2017/04/04 18:18:11
We should only use DCHECK for code that is logical
|
| + return nullptr; |
| + } |
| pref_object->key = name; |
| pref_object->type = GetType(name, value->GetType()); |
| pref_object->value.reset(value->DeepCopy()); |
| @@ -410,10 +421,17 @@ std::unique_ptr<settings_private::PrefObject> PrefsUtil::GetCrosSettingsPref( |
| std::unique_ptr<settings_private::PrefObject> PrefsUtil::GetPref( |
| const std::string& name) { |
| + if (GetWhitelistedPrefType(name) == |
| + settings_private::PrefType::PREF_TYPE_NONE) { |
| + return nullptr; |
| + } |
| + |
| const PrefService::Preference* pref = nullptr; |
| std::unique_ptr<settings_private::PrefObject> pref_object; |
| if (IsCrosSetting(name)) { |
| pref_object = GetCrosSettingsPref(name); |
| + if (!pref_object) |
| + return nullptr; |
| } else { |
| PrefService* pref_service = FindServiceForPref(name); |
| pref = pref_service->FindPreference(name); |
| @@ -506,6 +524,11 @@ std::unique_ptr<settings_private::PrefObject> PrefsUtil::GetPref( |
| PrefsUtil::SetPrefResult PrefsUtil::SetPref(const std::string& pref_name, |
| const base::Value* value) { |
| + if (GetWhitelistedPrefType(pref_name) == |
| + settings_private::PrefType::PREF_TYPE_NONE) { |
| + return PREF_NOT_FOUND; |
| + } |
| + |
| if (IsCrosSetting(pref_name)) |
| return SetCrosSettingsPref(pref_name, value); |
| @@ -621,15 +644,8 @@ bool PrefsUtil::RemoveFromListCrosSetting(const std::string& pref_name, |
| } |
| bool PrefsUtil::IsPrefTypeURL(const std::string& pref_name) { |
| - settings_private::PrefType pref_type = |
| - settings_private::PrefType::PREF_TYPE_NONE; |
| - |
| - const TypedPrefMap keys = GetWhitelistedKeys(); |
| - const auto& iter = keys.find(pref_name); |
| - if (iter != keys.end()) |
| - pref_type = iter->second; |
| - |
| - return pref_type == settings_private::PrefType::PREF_TYPE_URL; |
| + return GetWhitelistedPrefType(pref_name) == |
| + settings_private::PrefType::PREF_TYPE_URL; |
| } |
| #if defined(OS_CHROMEOS) |