This source file includes following definitions.
- IsSettingPrivileged
- CreateUserInfo
- CreateUsersWhitelist
- RegisterMessages
- InitializeHandler
- FetchPref
- ObservePref
- SetPref
- StopObservingPref
- CreateValueForPref
- GetLocalizedValues
- SelectNetworkCallback
- OnPreferenceChanged
- NotifySettingsChanged
- NotifyProxyPrefsChanged
#include "chrome/browser/ui/webui/options/chromeos/core_chromeos_options_handler.h"
#include <string>
#include "ash/session_state_delegate.h"
#include "ash/shell.h"
#include "base/bind.h"
#include "base/prefs/pref_change_registrar.h"
#include "base/strings/string_number_conversions.h"
#include "base/strings/string_util.h"
#include "base/strings/utf_string_conversions.h"
#include "base/sys_info.h"
#include "chrome/browser/browser_process.h"
#include "chrome/browser/chromeos/login/user_manager.h"
#include "chrome/browser/chromeos/policy/browser_policy_connector_chromeos.h"
#include "chrome/browser/chromeos/profiles/profile_helper.h"
#include "chrome/browser/chromeos/proxy_cros_settings_parser.h"
#include "chrome/browser/chromeos/settings/cros_settings.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/ui/webui/chromeos/ui_account_tweaks.h"
#include "chrome/browser/ui/webui/options/chromeos/accounts_options_handler.h"
#include "chrome/common/pref_names.h"
#include "content/public/browser/user_metrics.h"
#include "content/public/browser/web_ui.h"
#include "grit/generated_resources.h"
#include "ui/base/l10n/l10n_util.h"
namespace chromeos {
namespace options {
namespace {
const char* kNonPrivilegedSettings[] = {
kSystemTimezone
};
bool IsSettingPrivileged(const std::string& pref) {
const char** end = kNonPrivilegedSettings + arraysize(kNonPrivilegedSettings);
return std::find(kNonPrivilegedSettings, end, pref) == end;
}
base::DictionaryValue* CreateUserInfo(const std::string& username,
const std::string& display_email,
const std::string& display_name) {
base::DictionaryValue* user_dict = new base::DictionaryValue;
user_dict->SetString("username", username);
user_dict->SetString("name", display_email);
user_dict->SetString("email", display_name);
bool is_owner = UserManager::Get()->GetOwnerEmail() == username;
user_dict->SetBoolean("owner", is_owner);
return user_dict;
}
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();
UserManager* user_manager = UserManager::Get();
for (base::ListValue::const_iterator i = list_value->begin();
i != list_value->end(); ++i) {
std::string email;
if ((*i)->GetAsString(&email)) {
std::string display_email = user_manager->GetUserDisplayEmail(email);
user_list->Append(CreateUserInfo(email, display_email, std::string()));
}
}
return user_list;
}
const char kSelectNetworkMessage[] = "selectNetwork";
}
CoreChromeOSOptionsHandler::CoreChromeOSOptionsHandler() {
}
CoreChromeOSOptionsHandler::~CoreChromeOSOptionsHandler() {
}
void CoreChromeOSOptionsHandler::RegisterMessages() {
CoreOptionsHandler::RegisterMessages();
web_ui()->RegisterMessageCallback(
kSelectNetworkMessage,
base::Bind(&CoreChromeOSOptionsHandler::SelectNetworkCallback,
base::Unretained(this)));
}
void CoreChromeOSOptionsHandler::InitializeHandler() {
proxy_config_service_.SetCurrentNetwork(std::string());
proxy_config_service_.UpdateFromPrefs();
CoreOptionsHandler::InitializeHandler();
PrefService* profile_prefs = NULL;
Profile* profile = Profile::FromWebUI(web_ui());
if (!ProfileHelper::IsSigninProfile(profile)) {
profile_prefs = profile->GetPrefs();
ObservePref(prefs::kOpenNetworkConfiguration);
}
ObservePref(prefs::kProxy);
ObservePref(prefs::kDeviceOpenNetworkConfiguration);
proxy_config_service_.SetPrefs(profile_prefs,
g_browser_process->local_state());
}
base::Value* CoreChromeOSOptionsHandler::FetchPref(
const std::string& pref_name) {
if (proxy_cros_settings_parser::IsProxyPref(pref_name)) {
base::Value *value = NULL;
proxy_cros_settings_parser::GetProxyPrefValue(
proxy_config_service_, pref_name, &value);
if (!value)
return base::Value::CreateNullValue();
return value;
}
if (!CrosSettings::IsCrosSettings(pref_name)) {
std::string controlling_pref =
pref_name == prefs::kUseSharedProxies ? prefs::kProxy : std::string();
return CreateValueForPref(pref_name, controlling_pref);
}
const base::Value* pref_value = CrosSettings::Get()->GetPref(pref_name);
if (!pref_value)
return base::Value::CreateNullValue();
base::DictionaryValue* dict = new base::DictionaryValue;
if (pref_name == kAccountsPrefUsers)
dict->Set("value", CreateUsersWhitelist(pref_value));
else
dict->Set("value", pref_value->DeepCopy());
std::string controlled_by;
if (IsSettingPrivileged(pref_name)) {
policy::BrowserPolicyConnectorChromeOS* connector =
g_browser_process->platform_part()->browser_policy_connector_chromeos();
if (connector->IsEnterpriseManaged())
controlled_by = "policy";
else if (!ProfileHelper::IsOwnerProfile(Profile::FromWebUI(web_ui())))
controlled_by = "owner";
}
dict->SetBoolean("disabled", !controlled_by.empty());
if (!controlled_by.empty())
dict->SetString("controlledBy", controlled_by);
return dict;
}
void CoreChromeOSOptionsHandler::ObservePref(const std::string& pref_name) {
if (proxy_cros_settings_parser::IsProxyPref(pref_name)) {
return;
}
if (!CrosSettings::IsCrosSettings(pref_name))
return ::options::CoreOptionsHandler::ObservePref(pref_name);
linked_ptr<CrosSettings::ObserverSubscription> subscription(
CrosSettings::Get()->AddSettingsObserver(
pref_name.c_str(),
base::Bind(&CoreChromeOSOptionsHandler::NotifySettingsChanged,
base::Unretained(this),
pref_name)).release());
pref_subscription_map_.insert(make_pair(pref_name, subscription));
}
void CoreChromeOSOptionsHandler::SetPref(const std::string& pref_name,
const base::Value* value,
const std::string& metric) {
if (proxy_cros_settings_parser::IsProxyPref(pref_name)) {
proxy_cros_settings_parser::SetProxyPrefValue(
pref_name, value, &proxy_config_service_);
base::StringValue proxy_type(pref_name);
web_ui()->CallJavascriptFunction(
"options.internet.DetailsInternetPage.updateProxySettings",
proxy_type);
ProcessUserMetric(value, metric);
return;
}
if (!CrosSettings::IsCrosSettings(pref_name))
return ::options::CoreOptionsHandler::SetPref(pref_name, value, metric);
CrosSettings::Get()->Set(pref_name, *value);
ProcessUserMetric(value, metric);
}
void CoreChromeOSOptionsHandler::StopObservingPref(const std::string& path) {
if (proxy_cros_settings_parser::IsProxyPref(path))
return;
if (CrosSettings::IsCrosSettings(path))
pref_subscription_map_.erase(path);
else
::options::CoreOptionsHandler::StopObservingPref(path);
}
base::Value* CoreChromeOSOptionsHandler::CreateValueForPref(
const std::string& pref_name,
const std::string& controlling_pref_name) {
if (pref_name == prefs::kEnableAutoScreenLock &&
UserManager::Get()->GetLoggedInUsers().size() > 1 &&
controlling_pref_name.empty()) {
PrefService* user_prefs = Profile::FromWebUI(web_ui())->GetPrefs();
const PrefService::Preference* pref =
user_prefs->FindPreference(prefs::kEnableAutoScreenLock);
ash::SessionStateDelegate* delegate =
ash::Shell::GetInstance()->session_state_delegate();
if (pref && pref->IsUserModifiable() &&
delegate->ShouldLockScreenBeforeSuspending()) {
bool screen_lock = false;
bool success = pref->GetValue()->GetAsBoolean(&screen_lock);
DCHECK(success);
if (!screen_lock) {
base::DictionaryValue* dict = new base::DictionaryValue;
dict->Set("value", pref->GetValue()->DeepCopy());
dict->SetString("controlledBy", "shared");
return dict;
}
}
}
return CoreOptionsHandler::CreateValueForPref(pref_name,
controlling_pref_name);
}
void CoreChromeOSOptionsHandler::GetLocalizedValues(
base::DictionaryValue* localized_strings) {
DCHECK(localized_strings);
CoreOptionsHandler::GetLocalizedValues(localized_strings);
Profile* profile = Profile::FromWebUI(web_ui());
AddAccountUITweaksLocalizedValues(localized_strings, profile);
UserManager* user_manager = UserManager::Get();
User* user = user_manager->GetUserByProfile(profile);
if (user && user->email() != user_manager->GetPrimaryUser()->email()) {
const std::string& primary_email = user_manager->GetPrimaryUser()->email();
localized_strings->SetBoolean("secondaryUser", true);
localized_strings->SetString("secondaryUserBannerText",
l10n_util::GetStringFUTF16(
IDS_OPTIONS_SETTINGS_SECONDARY_USER_BANNER,
base::ASCIIToUTF16(primary_email)));
localized_strings->SetString("controlledSettingShared",
l10n_util::GetStringFUTF16(
IDS_OPTIONS_CONTROLLED_SETTING_SHARED,
base::ASCIIToUTF16(primary_email)));
localized_strings->SetString("controlledSettingsShared",
l10n_util::GetStringFUTF16(
IDS_OPTIONS_CONTROLLED_SETTINGS_SHARED,
base::ASCIIToUTF16(primary_email)));
} else {
localized_strings->SetBoolean("secondaryUser", false);
localized_strings->SetString("secondaryUserBannerText", base::string16());
localized_strings->SetString("controlledSettingShared", base::string16());
localized_strings->SetString("controlledSettingsShared", base::string16());
}
localized_strings->SetString("screenLockShared",
l10n_util::GetStringUTF16(
IDS_OPTIONS_CONTROLLED_SETTING_SHARED_SCREEN_LOCK));
policy::BrowserPolicyConnectorChromeOS* connector =
g_browser_process->platform_part()->browser_policy_connector_chromeos();
if (connector->IsEnterpriseManaged()) {
localized_strings->SetString("controlledSettingOwner", base::string16());
} else {
localized_strings->SetString("controlledSettingOwner",
l10n_util::GetStringFUTF16(
IDS_OPTIONS_CONTROLLED_SETTING_OWNER,
base::ASCIIToUTF16(user_manager->GetOwnerEmail())));
}
}
void CoreChromeOSOptionsHandler::SelectNetworkCallback(
const base::ListValue* args) {
std::string service_path;
if (args->GetSize() != 1 ||
!args->GetString(0, &service_path)) {
NOTREACHED();
return;
}
proxy_config_service_.SetCurrentNetwork(service_path);
NotifyProxyPrefsChanged();
}
void CoreChromeOSOptionsHandler::OnPreferenceChanged(
PrefService* service,
const std::string& pref_name) {
if (pref_name == prefs::kOpenNetworkConfiguration ||
pref_name == prefs::kDeviceOpenNetworkConfiguration ||
pref_name == prefs::kProxy) {
NotifyProxyPrefsChanged();
return;
}
if (pref_name == prefs::kUseSharedProxies) {
NotifyPrefChanged(prefs::kUseSharedProxies, prefs::kProxy);
return;
}
::options::CoreOptionsHandler::OnPreferenceChanged(service, pref_name);
}
void CoreChromeOSOptionsHandler::NotifySettingsChanged(
const std::string& setting_name) {
DCHECK(CrosSettings::Get()->IsCrosSettings(setting_name));
scoped_ptr<base::Value> value(FetchPref(setting_name));
if (!value.get())
NOTREACHED();
DispatchPrefChangeNotification(setting_name, value.Pass());
}
void CoreChromeOSOptionsHandler::NotifyProxyPrefsChanged() {
proxy_config_service_.UpdateFromPrefs();
for (size_t i = 0; i < kProxySettingsCount; ++i) {
base::Value* value = NULL;
proxy_cros_settings_parser::GetProxyPrefValue(
proxy_config_service_, kProxySettings[i], &value);
DCHECK(value);
scoped_ptr<base::Value> ptr(value);
DispatchPrefChangeNotification(kProxySettings[i], ptr.Pass());
}
}
}
}