| Index: chrome/browser/extensions/api/settings_private/settings_private_delegate.cc
|
| diff --git a/chrome/browser/extensions/api/settings_private/settings_private_delegate.cc b/chrome/browser/extensions/api/settings_private/settings_private_delegate.cc
|
| index 57ba0a08eaaa9b613934cfc48e2c196d111b570f..ef3ec9189c20cccb972586ad5515a08baa727bdc 100644
|
| --- a/chrome/browser/extensions/api/settings_private/settings_private_delegate.cc
|
| +++ b/chrome/browser/extensions/api/settings_private/settings_private_delegate.cc
|
| @@ -8,6 +8,8 @@
|
| #include "base/prefs/pref_service.h"
|
| #include "base/values.h"
|
| #include "chrome/browser/browser_process.h"
|
| +#include "chrome/browser/extensions/api/settings_private/prefs_util.h"
|
| +#include "chrome/browser/profiles/profile.h"
|
| #include "chrome/common/pref_names.h"
|
| #include "components/url_fixer/url_fixer.h"
|
| #include "extensions/browser/extension_registry.h"
|
| @@ -18,93 +20,6 @@ namespace extensions {
|
|
|
| namespace settings_private = api::settings_private;
|
|
|
| -namespace {
|
| -
|
| -// NOTE: Consider moving this function to a separate file, e.g. in
|
| -// chrome/browser/prefs.
|
| -bool IsPrefUserModifiable(Profile* profile,
|
| - PrefService* pref_service,
|
| - const std::string& pref_name) {
|
| - if (pref_name != prefs::kBrowserGuestModeEnabled &&
|
| - pref_name != prefs::kBrowserAddPersonEnabled) {
|
| - return true;
|
| - }
|
| -
|
| - const PrefService::Preference* pref =
|
| - pref_service->FindPreference(pref_name.c_str());
|
| - if (!pref || !pref->IsUserModifiable() || profile->IsSupervised())
|
| - return false;
|
| -
|
| - return true;
|
| -}
|
| -
|
| -const TypedPrefMap& GetWhitelistedKeys() {
|
| - static TypedPrefMap* s_whitelist = nullptr;
|
| - if (s_whitelist)
|
| - return *s_whitelist;
|
| - s_whitelist = new TypedPrefMap();
|
| - (*s_whitelist)["download.default_directory"] =
|
| - settings_private::PrefType::PREF_TYPE_STRING;
|
| - (*s_whitelist)["download.prompt_for_download"] =
|
| - settings_private::PrefType::PREF_TYPE_BOOLEAN;
|
| - (*s_whitelist)["homepage"] =
|
| - settings_private::PrefType::PREF_TYPE_URL;
|
| - return *s_whitelist;
|
| -}
|
| -
|
| -#if defined(OS_CHROMEOS)
|
| -const TypedPrefMap& GetWhitelistedCrosKeys() {
|
| - static TypedPrefMap* s_whitelist = nullptr;
|
| - if (s_whitelist)
|
| - return *s_whitelist;
|
| - s_whitelist = new TypedPrefMap();
|
| - (*s_whitelist)["settings.accessibility"] =
|
| - settings_private::PrefType::PREF_TYPE_BOOLEAN;
|
| - (*s_whitelist)["settings.a11y.autoclick"] =
|
| - settings_private::PrefType::PREF_TYPE_BOOLEAN;
|
| - (*s_whitelist)["settings.a11y.autoclick_delay_ms"] =
|
| - settings_private::PrefType::PREF_TYPE_BOOLEAN;
|
| - (*s_whitelist)["settings.a11y.enable_menu"] =
|
| - settings_private::PrefType::PREF_TYPE_BOOLEAN;
|
| - (*s_whitelist)["settings.a11y.high_contrast_enabled"] =
|
| - settings_private::PrefType::PREF_TYPE_BOOLEAN;
|
| - (*s_whitelist)["settings.a11y.large_cursor_enabled"] =
|
| - settings_private::PrefType::PREF_TYPE_BOOLEAN;
|
| - (*s_whitelist)["settings.a11y.screen_magnifier"] =
|
| - settings_private::PrefType::PREF_TYPE_BOOLEAN;
|
| - (*s_whitelist)["settings.a11y.sticky_keys_enabled"] =
|
| - settings_private::PrefType::PREF_TYPE_BOOLEAN;
|
| - (*s_whitelist)["settings.a11y.virtual_keyboard"] =
|
| - settings_private::PrefType::PREF_TYPE_BOOLEAN;
|
| - (*s_whitelist)["settings.touchpad.enable_tap_dragging"] =
|
| - settings_private::PrefType::PREF_TYPE_BOOLEAN;
|
| - return *s_whitelist;
|
| -}
|
| -#endif
|
| -
|
| -bool 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;
|
| - }
|
| -
|
| -#if defined(OS_CHROMEOS)
|
| - const TypedPrefMap cros_keys = GetWhitelistedCrosKeys();
|
| - const auto& cros_iter = cros_keys.find(pref_name);
|
| - if (cros_iter != cros_keys.end()) {
|
| - pref_type = cros_iter->second;
|
| - }
|
| -#endif
|
| -
|
| - return pref_type == settings_private::PrefType::PREF_TYPE_URL;
|
| -}
|
| -
|
| -} // namespace
|
| -
|
| SettingsPrivateDelegate::SettingsPrivateDelegate(Profile* profile)
|
| : profile_(profile) {
|
| }
|
| @@ -114,111 +29,26 @@ SettingsPrivateDelegate::~SettingsPrivateDelegate() {
|
|
|
| scoped_ptr<base::Value> SettingsPrivateDelegate::GetPref(
|
| const std::string& name) {
|
| - PrefService* pref_service = profile_->GetPrefs();
|
| - const PrefService::Preference* pref = pref_service->FindPreference(name);
|
| - if (!pref)
|
| - return make_scoped_ptr(base::Value::CreateNullValue());
|
| -
|
| - api::settings_private::PrefObject* pref_object =
|
| - new api::settings_private::PrefObject();
|
| - pref_object->key = pref->name();
|
| - switch (pref->GetType()) {
|
| - case base::Value::Type::TYPE_BOOLEAN:
|
| - pref_object->type = api::settings_private::PrefType::PREF_TYPE_BOOLEAN;
|
| - break;
|
| - case base::Value::Type::TYPE_INTEGER:
|
| - case base::Value::Type::TYPE_DOUBLE:
|
| - pref_object->type = api::settings_private::PrefType::PREF_TYPE_NUMBER;
|
| - break;
|
| - case base::Value::Type::TYPE_STRING:
|
| - pref_object->type = IsPrefTypeURL(name)
|
| - ? api::settings_private::PrefType::PREF_TYPE_URL
|
| - : api::settings_private::PrefType::PREF_TYPE_STRING;
|
| - break;
|
| - case base::Value::Type::TYPE_LIST:
|
| - pref_object->type = api::settings_private::PrefType::PREF_TYPE_LIST;
|
| - break;
|
| - default:
|
| - break;
|
| - }
|
| -
|
| - pref_object->value.reset(pref->GetValue()->DeepCopy());
|
| -
|
| - if (pref->IsManaged()) {
|
| - if (pref->IsManagedByCustodian()) {
|
| - pref_object->policy_source =
|
| - api::settings_private::PolicySource::POLICY_SOURCE_DEVICE;
|
| - } else {
|
| - pref_object->policy_source =
|
| - api::settings_private::PolicySource::POLICY_SOURCE_USER;
|
| - }
|
| - pref_object->policy_enforcement =
|
| - pref->IsRecommended() ? api::settings_private::PolicyEnforcement::
|
| - POLICY_ENFORCEMENT_RECOMMENDED
|
| - : api::settings_private::PolicyEnforcement::
|
| - POLICY_ENFORCEMENT_ENFORCED;
|
| - } else if (!IsPrefUserModifiable(profile_, pref_service, name)) {
|
| - pref_object->policy_source =
|
| - api::settings_private::PolicySource::POLICY_SOURCE_USER;
|
| - pref_object->policy_enforcement =
|
| - api::settings_private::PolicyEnforcement::POLICY_ENFORCEMENT_ENFORCED;
|
| - }
|
| -
|
| - return pref_object->ToValue();
|
| + return prefs_util::GetPref(profile_, name)->ToValue();
|
| }
|
|
|
| scoped_ptr<base::Value> SettingsPrivateDelegate::GetAllPrefs() {
|
| scoped_ptr<base::ListValue> prefs(new base::ListValue());
|
|
|
| - const TypedPrefMap& keys = GetWhitelistedKeys();
|
| + const TypedPrefMap& keys = prefs_util::GetWhitelistedKeys();
|
| for (const auto& it : keys) {
|
| prefs->Append(GetPref(it.first).release());
|
| }
|
|
|
| -#if defined(OS_CHROMEOS)
|
| - const TypedPrefMap cros_keys = GetWhitelistedCrosKeys();
|
| - for (const auto& it : cros_keys) {
|
| - prefs->Append(GetPref(it.first).release());
|
| - }
|
| -#endif
|
| -
|
| return prefs.Pass();
|
| }
|
|
|
| -PrefService* SettingsPrivateDelegate::FindServiceForPref(
|
| - const std::string& pref_name) {
|
| - PrefService* user_prefs = profile_->GetPrefs();
|
| -
|
| - // Proxy is a peculiar case: on ChromeOS, settings exist in both user
|
| - // prefs and local state, but chrome://settings should affect only user prefs.
|
| - // Elsewhere the proxy settings are stored in local state.
|
| - // See http://crbug.com/157147
|
| -
|
| - if (pref_name == prefs::kProxy) {
|
| -#if defined(OS_CHROMEOS)
|
| - return user_prefs;
|
| -#else
|
| - return g_browser_process->local_state();
|
| -#endif
|
| - }
|
| -
|
| - // Find which PrefService contains the given pref. Pref names should not
|
| - // be duplicated across services, however if they are, prefer the user's
|
| - // prefs.
|
| - if (user_prefs->FindPreference(pref_name))
|
| - return user_prefs;
|
| -
|
| - if (g_browser_process->local_state()->FindPreference(pref_name))
|
| - return g_browser_process->local_state();
|
| -
|
| - return user_prefs;
|
| -}
|
| -
|
| bool SettingsPrivateDelegate::SetPref(const std::string& pref_name,
|
| const base::Value* value) {
|
| - PrefService* pref_service = FindServiceForPref(pref_name);
|
| + PrefService* pref_service =
|
| + prefs_util::FindServiceForPref(profile_, pref_name);
|
|
|
| - if (!IsPrefUserModifiable(profile_, pref_service, pref_name))
|
| + if (!prefs_util::IsPrefUserModifiable(profile_, pref_name))
|
| return false;
|
|
|
| const PrefService::Preference* pref =
|
| @@ -247,7 +77,7 @@ bool SettingsPrivateDelegate::SetPref(const std::string& pref_name,
|
| if (!value->GetAsString(&original))
|
| return false;
|
|
|
| - if (IsPrefTypeURL(pref_name)) {
|
| + if (prefs_util::IsPrefTypeURL(pref_name)) {
|
| GURL fixed = url_fixer::FixupURL(original, std::string());
|
| temp_value.reset(new base::StringValue(fixed.spec()));
|
| value = temp_value.get();
|
|
|