Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(490)

Unified Diff: chrome/browser/extensions/api/settings_private/prefs_util.cc

Issue 1061613002: chrome.settingsPrivate: Implement onPrefsChanged event handling. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Respond to Steven's comments + add an APItest Created 5 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/browser/extensions/api/settings_private/prefs_util.cc
diff --git a/chrome/browser/extensions/api/settings_private/settings_private_delegate.cc b/chrome/browser/extensions/api/settings_private/prefs_util.cc
similarity index 53%
copy from chrome/browser/extensions/api/settings_private/settings_private_delegate.cc
copy to chrome/browser/extensions/api/settings_private/prefs_util.cc
index 57ba0a08eaaa9b613934cfc48e2c196d111b570f..81d6defc57dcda672e15dc929eb217b0a5e10aa0 100644
--- a/chrome/browser/extensions/api/settings_private/settings_private_delegate.cc
+++ b/chrome/browser/extensions/api/settings_private/prefs_util.cc
@@ -2,41 +2,17 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#include "chrome/browser/extensions/api/settings_private/settings_private_delegate.h"
-
-#include "base/json/json_reader.h"
#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"
-#include "extensions/common/extension.h"
-#include "url/gurl.h"
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;
-}
+namespace prefs_util {
const TypedPrefMap& GetWhitelistedKeys() {
static TypedPrefMap* s_whitelist = nullptr;
@@ -47,17 +23,9 @@ const TypedPrefMap& GetWhitelistedKeys() {
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;
-}
+ (*s_whitelist)["homepage"] = settings_private::PrefType::PREF_TYPE_URL;
#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"] =
@@ -78,49 +46,21 @@ const TypedPrefMap& GetWhitelistedCrosKeys() {
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) {
+ return *s_whitelist;
}
-SettingsPrivateDelegate::~SettingsPrivateDelegate() {
-}
+scoped_ptr<api::settings_private::PrefObject> GetPref(Profile* profile,
+ const std::string& name) {
+ scoped_ptr<api::settings_private::PrefObject> pref_object(
+ new api::settings_private::PrefObject());
-scoped_ptr<base::Value> SettingsPrivateDelegate::GetPref(
- const std::string& name) {
- PrefService* pref_service = profile_->GetPrefs();
+ PrefService* pref_service = FindServiceForPref(profile, name);
const PrefService::Preference* pref = pref_service->FindPreference(name);
if (!pref)
- return make_scoped_ptr(base::Value::CreateNullValue());
+ return pref_object.Pass();
- 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:
@@ -131,9 +71,10 @@ scoped_ptr<base::Value> SettingsPrivateDelegate::GetPref(
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;
+ 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;
@@ -157,37 +98,47 @@ scoped_ptr<base::Value> SettingsPrivateDelegate::GetPref(
POLICY_ENFORCEMENT_RECOMMENDED
: api::settings_private::PolicyEnforcement::
POLICY_ENFORCEMENT_ENFORCED;
- } else if (!IsPrefUserModifiable(profile_, pref_service, name)) {
+ } else if (!IsPrefUserModifiable(profile, 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 pref_object.Pass();
}
-scoped_ptr<base::Value> SettingsPrivateDelegate::GetAllPrefs() {
- scoped_ptr<base::ListValue> prefs(new base::ListValue());
+bool IsPrefTypeURL(const std::string& pref_name) {
+ settings_private::PrefType pref_type =
+ settings_private::PrefType::PREF_TYPE_NONE;
- const TypedPrefMap& keys = GetWhitelistedKeys();
- for (const auto& it : keys) {
- prefs->Append(GetPref(it.first).release());
+ const TypedPrefMap keys = GetWhitelistedKeys();
+ const auto& iter = keys.find(pref_name);
+ if (iter != keys.end()) {
+ pref_type = iter->second;
}
stevenjb 2015/04/06 23:33:38 nit: no {}
Oren Blasberg 2015/04/06 23:41:30 Done. (Thanks. Old habits from Javascript world di
-#if defined(OS_CHROMEOS)
- const TypedPrefMap cros_keys = GetWhitelistedCrosKeys();
- for (const auto& it : cros_keys) {
- prefs->Append(GetPref(it.first).release());
+ return pref_type == settings_private::PrefType::PREF_TYPE_URL;
+}
+
+bool IsPrefUserModifiable(Profile* profile, const std::string& pref_name) {
+ if (pref_name != prefs::kBrowserGuestModeEnabled &&
+ pref_name != prefs::kBrowserAddPersonEnabled) {
+ return true;
}
-#endif
- return prefs.Pass();
+ PrefService* pref_service = profile->GetPrefs();
+ const PrefService::Preference* pref =
+ pref_service->FindPreference(pref_name.c_str());
+ if (!pref || !pref->IsUserModifiable() || profile->IsSupervised())
+ return false;
+
+ return true;
}
-PrefService* SettingsPrivateDelegate::FindServiceForPref(
- const std::string& pref_name) {
- PrefService* user_prefs = profile_->GetPrefs();
+PrefService* FindServiceForPref(Profile* profile,
+ 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.
@@ -214,70 +165,6 @@ PrefService* SettingsPrivateDelegate::FindServiceForPref(
return user_prefs;
}
-bool SettingsPrivateDelegate::SetPref(const std::string& pref_name,
- const base::Value* value) {
- PrefService* pref_service = FindServiceForPref(pref_name);
-
- if (!IsPrefUserModifiable(profile_, pref_service, pref_name))
- return false;
-
- const PrefService::Preference* pref =
- pref_service->FindPreference(pref_name.c_str());
- if (!pref)
- return false;
-
- DCHECK_EQ(pref->GetType(), value->GetType());
-
- scoped_ptr<base::Value> temp_value;
-
- switch (pref->GetType()) {
- case base::Value::TYPE_INTEGER: {
- // In JS all numbers are doubles.
- double double_value;
- if (!value->GetAsDouble(&double_value))
- return false;
-
- int int_value = static_cast<int>(double_value);
- temp_value.reset(new base::FundamentalValue(int_value));
- value = temp_value.get();
- break;
- }
- case base::Value::TYPE_STRING: {
- std::string original;
- if (!value->GetAsString(&original))
- return false;
-
- if (IsPrefTypeURL(pref_name)) {
- GURL fixed = url_fixer::FixupURL(original, std::string());
- temp_value.reset(new base::StringValue(fixed.spec()));
- value = temp_value.get();
- }
- break;
- }
- case base::Value::TYPE_LIST: {
- // In case we have a List pref we got a JSON string.
- std::string json_string;
- if (!value->GetAsString(&json_string))
- return false;
-
- temp_value.reset(base::JSONReader::Read(json_string));
- value = temp_value.get();
- if (!value->IsType(base::Value::TYPE_LIST))
- return false;
-
- break;
- }
- case base::Value::TYPE_BOOLEAN:
- case base::Value::TYPE_DOUBLE:
- break;
- default:
- return false;
- }
-
- // TODO(orenb): Process setting metrics here (like "ProcessUserMetric" in
- // CoreOptionsHandler).
- pref_service->Set(pref_name.c_str(), *value);
- return true;
-}
+} // namespace prefs_util
} // namespace extensions

Powered by Google App Engine
This is Rietveld 408576698