| Index: chrome/browser/ui/webui/options/chromeos/core_chromeos_options_handler.cc
|
| diff --git a/chrome/browser/ui/webui/options/chromeos/core_chromeos_options_handler.cc b/chrome/browser/ui/webui/options/chromeos/core_chromeos_options_handler.cc
|
| index 295b834849a0fab0b711d9183b00e6b794d5f952..f172a87c3c222c83f482bd1cddf0a47fa1a5b28f 100644
|
| --- a/chrome/browser/ui/webui/options/chromeos/core_chromeos_options_handler.cc
|
| +++ b/chrome/browser/ui/webui/options/chromeos/core_chromeos_options_handler.cc
|
| @@ -8,7 +8,10 @@
|
|
|
| #include "base/string_number_conversions.h"
|
| #include "base/string_util.h"
|
| +#include "chrome/browser/browser_process.h"
|
| #include "chrome/browser/chromeos/cros_settings.h"
|
| +#include "chrome/browser/chromeos/login/user_manager.h"
|
| +#include "chrome/browser/policy/browser_policy_connector.h"
|
| #include "chrome/common/chrome_notification_types.h"
|
| #include "content/browser/user_metrics.h"
|
| #include "content/common/notification_details.h"
|
| @@ -16,35 +19,89 @@
|
|
|
| namespace chromeos {
|
|
|
| +namespace {
|
| +
|
| +// Create a settings value with "managed" and "disabled" property.
|
| +// "managed" property is true if the setting is managed by administrator.
|
| +// "disabled" property is true if the UI for the setting should be disabled.
|
| +base::Value* CreateSettingsValue(base::Value *value,
|
| + bool managed,
|
| + bool disabled) {
|
| + DictionaryValue* dict = new DictionaryValue;
|
| + dict->Set("value", value);
|
| + dict->Set("managed", base::Value::CreateBooleanValue(managed));
|
| + dict->Set("disabled", base::Value::CreateBooleanValue(disabled));
|
| + return dict;
|
| +}
|
| +
|
| +// This function decorates the bare list of emails with some more information
|
| +// needed by the UI to properly display the Accounts page.
|
| +base::Value* CreateUsersWhitelist(const base::Value *pref_value) {
|
| + const base::ListValue *list_value =
|
| + static_cast<const base::ListValue*>(pref_value);
|
| + base::ListValue *user_list = new base::ListValue();
|
| +
|
| + const UserManager::User& self = UserManager::Get()->logged_in_user();
|
| + bool is_owner = UserManager::Get()->current_user_is_owner();
|
| +
|
| + for (base::ListValue::const_iterator i = list_value->begin();
|
| + i != list_value->end(); ++i) {
|
| + std::string email;
|
| + if ((*i)->GetAsString(&email)) {
|
| + DictionaryValue* user = new DictionaryValue;
|
| + user->SetString("email", email);
|
| + user->SetString("name", "");
|
| + user->SetBoolean("owner", is_owner && email == self.email());
|
| + user_list->Append(user);
|
| + }
|
| + }
|
| + return user_list;
|
| +}
|
| +
|
| +} // namespace
|
| +
|
| CoreChromeOSOptionsHandler::CoreChromeOSOptionsHandler()
|
| : handling_change_(false) {
|
| }
|
|
|
| -Value* CoreChromeOSOptionsHandler::FetchPref(const std::string& pref_name) {
|
| +base::Value* CoreChromeOSOptionsHandler::FetchPref(
|
| + const std::string& pref_name) {
|
| if (!CrosSettings::IsCrosSettings(pref_name))
|
| return ::CoreOptionsHandler::FetchPref(pref_name);
|
|
|
| - Value* pref_value = NULL;
|
| - CrosSettings::Get()->Get(pref_name, &pref_value);
|
| - return pref_value ? pref_value : Value::CreateNullValue();
|
| + const base::Value* pref_value =
|
| + CrosSettings::Get()->GetPref(pref_name);
|
| + if (!pref_value)
|
| + return base::Value::CreateNullValue();
|
| +
|
| + // Lists don't get the standard pref decoration.
|
| + if (pref_value->GetType() == base::Value::TYPE_LIST) {
|
| + if (pref_name == kAccountsPrefUsers)
|
| + return CreateUsersWhitelist(pref_value);
|
| + return pref_value->DeepCopy();
|
| + }
|
| + // All other prefs are decorated the same way.
|
| + return CreateSettingsValue(
|
| + pref_value->DeepCopy(),
|
| + g_browser_process->browser_policy_connector()->IsEnterpriseManaged(),
|
| + !UserManager::Get()->current_user_is_owner());
|
| }
|
|
|
| void CoreChromeOSOptionsHandler::ObservePref(const std::string& pref_name) {
|
| if (!CrosSettings::IsCrosSettings(pref_name))
|
| return ::CoreOptionsHandler::ObservePref(pref_name);
|
|
|
| - // TODO(xiyuan): Change this when CrosSettings supports observers.
|
| CrosSettings::Get()->AddSettingsObserver(pref_name.c_str(), this);
|
| }
|
|
|
| void CoreChromeOSOptionsHandler::SetPref(const std::string& pref_name,
|
| - const Value* value,
|
| + const base::Value* value,
|
| const std::string& metric) {
|
| if (!CrosSettings::IsCrosSettings(pref_name))
|
| return ::CoreOptionsHandler::SetPref(pref_name, value, metric);
|
| handling_change_ = true;
|
| // CrosSettings takes ownership of its value so we need to copy it.
|
| - Value* pref_value = value->DeepCopy();
|
| + base::Value* pref_value = value->DeepCopy();
|
| CrosSettings::Get()->Set(pref_name, pref_value);
|
| handling_change_ = false;
|
|
|
| @@ -76,11 +133,9 @@ void CoreChromeOSOptionsHandler::NotifySettingsChanged(
|
| const std::string* setting_name) {
|
| DCHECK(web_ui_);
|
| DCHECK(CrosSettings::Get()->IsCrosSettings(*setting_name));
|
| - Value* value = NULL;
|
| - if (!CrosSettings::Get()->Get(*setting_name, &value)) {
|
| + const base::Value* value = CrosSettings::Get()->GetPref(*setting_name);
|
| + if (!value) {
|
| NOTREACHED();
|
| - if (value)
|
| - delete value;
|
| return;
|
| }
|
| for (PreferenceCallbackMap::const_iterator iter =
|
| @@ -93,8 +148,6 @@ void CoreChromeOSOptionsHandler::NotifySettingsChanged(
|
| web_ui_->CallJavascriptFunction(WideToASCII(callback_function),
|
| result_value);
|
| }
|
| - if (value)
|
| - delete value;
|
| }
|
|
|
| } // namespace chromeos
|
|
|