| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/browser/ui/webui/options/chromeos/core_chromeos_options_handler
.h" | 5 #include "chrome/browser/ui/webui/options/chromeos/core_chromeos_options_handler
.h" |
| 6 | 6 |
| 7 #include <stddef.h> | 7 #include <stddef.h> |
| 8 #include <string> | 8 #include <string> |
| 9 #include <utility> | 9 #include <utility> |
| 10 | 10 |
| 11 #include "base/bind.h" | 11 #include "base/bind.h" |
| 12 #include "base/location.h" | 12 #include "base/location.h" |
| 13 #include "base/macros.h" | 13 #include "base/macros.h" |
| 14 #include "base/memory/ptr_util.h" | 14 #include "base/memory/ptr_util.h" |
| 15 #include "base/single_thread_task_runner.h" | 15 #include "base/single_thread_task_runner.h" |
| 16 #include "base/strings/string_number_conversions.h" | 16 #include "base/strings/string_number_conversions.h" |
| 17 #include "base/strings/string_util.h" | 17 #include "base/strings/string_util.h" |
| 18 #include "base/strings/utf_string_conversions.h" | 18 #include "base/strings/utf_string_conversions.h" |
| 19 #include "base/sys_info.h" | 19 #include "base/sys_info.h" |
| 20 #include "base/threading/thread_task_runner_handle.h" | 20 #include "base/threading/thread_task_runner_handle.h" |
| 21 #include "chrome/browser/browser_process.h" | 21 #include "chrome/browser/browser_process.h" |
| 22 #include "chrome/browser/chrome_notification_types.h" | 22 #include "chrome/browser/chrome_notification_types.h" |
| 23 #include "chrome/browser/chromeos/ownership/owner_settings_service_chromeos.h" | 23 #include "chrome/browser/chromeos/ownership/owner_settings_service_chromeos.h" |
| 24 #include "chrome/browser/chromeos/ownership/owner_settings_service_chromeos_fact
ory.h" | 24 #include "chrome/browser/chromeos/ownership/owner_settings_service_chromeos_fact
ory.h" |
| 25 #include "chrome/browser/chromeos/policy/browser_policy_connector_chromeos.h" | 25 #include "chrome/browser/chromeos/policy/browser_policy_connector_chromeos.h" |
| 26 #include "chrome/browser/chromeos/profiles/profile_helper.h" | 26 #include "chrome/browser/chromeos/profiles/profile_helper.h" |
| 27 #include "chrome/browser/chromeos/proxy_cros_settings_parser.h" | 27 #include "chrome/browser/chromeos/proxy_cros_settings_parser.h" |
| 28 #include "chrome/browser/chromeos/settings/cros_settings.h" | 28 #include "chrome/browser/chromeos/settings/cros_settings.h" |
| 29 #include "chrome/browser/chromeos/system/timezone_util.h" |
| 29 #include "chrome/browser/profiles/profile.h" | 30 #include "chrome/browser/profiles/profile.h" |
| 30 #include "chrome/browser/ui/ash/session_controller_client.h" | 31 #include "chrome/browser/ui/ash/session_controller_client.h" |
| 31 #include "chrome/browser/ui/webui/chromeos/ui_account_tweaks.h" | 32 #include "chrome/browser/ui/webui/chromeos/ui_account_tweaks.h" |
| 32 #include "chrome/browser/ui/webui/options/chromeos/accounts_options_handler.h" | 33 #include "chrome/browser/ui/webui/options/chromeos/accounts_options_handler.h" |
| 33 #include "chrome/common/pref_names.h" | 34 #include "chrome/common/pref_names.h" |
| 34 #include "chrome/grit/generated_resources.h" | 35 #include "chrome/grit/generated_resources.h" |
| 35 #include "chromeos/network/network_handler.h" | 36 #include "chromeos/network/network_handler.h" |
| 36 #include "chromeos/network/proxy/ui_proxy_config_service.h" | 37 #include "chromeos/network/proxy/ui_proxy_config_service.h" |
| 37 #include "components/onc/onc_pref_names.h" | 38 #include "components/onc/onc_pref_names.h" |
| 38 #include "components/prefs/pref_change_registrar.h" | 39 #include "components/prefs/pref_change_registrar.h" |
| 39 #include "components/proxy_config/proxy_config_pref_names.h" | 40 #include "components/proxy_config/proxy_config_pref_names.h" |
| 40 #include "components/user_manager/user_manager.h" | 41 #include "components/user_manager/user_manager.h" |
| 41 #include "content/public/browser/notification_service.h" | 42 #include "content/public/browser/notification_service.h" |
| 42 #include "content/public/browser/web_ui.h" | 43 #include "content/public/browser/web_ui.h" |
| 43 #include "ui/base/l10n/l10n_util.h" | 44 #include "ui/base/l10n/l10n_util.h" |
| 44 | 45 |
| 45 namespace chromeos { | 46 namespace chromeos { |
| 46 namespace options { | 47 namespace options { |
| 47 | 48 |
| 48 namespace { | 49 namespace { |
| 49 | 50 |
| 50 // List of settings that should be changeable by all users. | 51 // List of settings that are not changeable by users. |
| 51 const char* kNonPrivilegedSettings[] = { | 52 const char* kReadOnlySettings[] = { |
| 52 kSystemTimezone | 53 kSystemTimezone |
| 53 }; | 54 }; |
| 54 | 55 |
| 55 // List of settings that should only be changeable by the primary user. | 56 // List of settings that should only be changeable by the primary user. |
| 56 const char* kPrimaryUserSettings[] = { | 57 const char* kPrimaryUserSettings[] = { |
| 57 prefs::kWakeOnWifiDarkConnect, | 58 prefs::kWakeOnWifiDarkConnect, |
| 59 prefs::kUserTimezone, |
| 60 prefs::kResolveTimezoneByGeolocation |
| 58 }; | 61 }; |
| 59 | 62 |
| 60 // Returns true if |pref| can be controlled (e.g. by policy or owner). | 63 // Returns true if |pref| can be controlled (e.g. by policy or owner). |
| 61 bool IsSettingPrivileged(const std::string& pref) { | 64 bool IsSettingPrivileged(const std::string& pref) { |
| 62 const char** end = kNonPrivilegedSettings + arraysize(kNonPrivilegedSettings); | 65 if (!chromeos::system::PerUserTimezoneEnabled()) { |
| 63 return std::find(kNonPrivilegedSettings, end, pref) == end; | 66 return pref != kSystemTimezone; |
| 67 } |
| 68 // All the other Cros Settings are controlled. |
| 69 return true; |
| 70 } |
| 71 |
| 72 // Returns true if |pref| is modifiable from UI. |
| 73 bool IsSettingWritable(const std::string& pref) { |
| 74 if (!system::PerUserTimezoneEnabled()) |
| 75 return true; |
| 76 |
| 77 const char** end = kReadOnlySettings + arraysize(kReadOnlySettings); |
| 78 return std::find(kReadOnlySettings, end, pref) == end; |
| 64 } | 79 } |
| 65 | 80 |
| 66 // Returns true if |pref| is shared (controlled by the primary user). | 81 // Returns true if |pref| is shared (controlled by the primary user). |
| 67 bool IsSettingShared(const std::string& pref) { | 82 bool IsSettingShared(const std::string& pref) { |
| 68 const char** end = kPrimaryUserSettings + arraysize(kPrimaryUserSettings); | 83 const char** end = kPrimaryUserSettings + arraysize(kPrimaryUserSettings); |
| 69 return std::find(kPrimaryUserSettings, end, pref) != end; | 84 return std::find(kPrimaryUserSettings, end, pref) != end; |
| 70 } | 85 } |
| 71 | 86 |
| 72 // Creates a user info dictionary to be stored in the |ListValue| that is | 87 // Creates a user info dictionary to be stored in the |ListValue| that is |
| 73 // passed to Javascript for the |kAccountsPrefUsers| preference. | 88 // passed to Javascript for the |kAccountsPrefUsers| preference. |
| (...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 193 return value; | 208 return value; |
| 194 base::DictionaryValue* dict; | 209 base::DictionaryValue* dict; |
| 195 if (!value->GetAsDictionary(&dict) || dict->HasKey("controlledBy")) | 210 if (!value->GetAsDictionary(&dict) || dict->HasKey("controlledBy")) |
| 196 return value; | 211 return value; |
| 197 Profile* primary_profile = ProfileHelper::Get()->GetProfileByUser( | 212 Profile* primary_profile = ProfileHelper::Get()->GetProfileByUser( |
| 198 user_manager::UserManager::Get()->GetPrimaryUser()); | 213 user_manager::UserManager::Get()->GetPrimaryUser()); |
| 199 if (!primary_profile) | 214 if (!primary_profile) |
| 200 return value; | 215 return value; |
| 201 dict->SetString("controlledBy", "shared"); | 216 dict->SetString("controlledBy", "shared"); |
| 202 dict->SetBoolean("disabled", true); | 217 dict->SetBoolean("disabled", true); |
| 203 dict->SetBoolean("value", primary_profile->GetPrefs()->GetBoolean( | 218 if (system::PerUserTimezoneEnabled()) { |
| 204 pref_name)); | 219 const PrefService::Preference* pref = |
| 220 primary_profile->GetPrefs()->FindPreference(pref_name); |
| 221 dict->Set("value", base::MakeUnique<base::Value>(*pref->GetValue())); |
| 222 } else { |
| 223 dict->SetBoolean("value", |
| 224 primary_profile->GetPrefs()->GetBoolean(pref_name)); |
| 225 } |
| 205 return value; | 226 return value; |
| 206 } | 227 } |
| 207 | 228 |
| 208 const base::Value* pref_value = CrosSettings::Get()->GetPref(pref_name); | 229 const base::Value* pref_value = CrosSettings::Get()->GetPref(pref_name); |
| 209 if (!pref_value) | 230 if (!pref_value) |
| 210 return base::MakeUnique<base::Value>(); | 231 return base::MakeUnique<base::Value>(); |
| 211 | 232 |
| 212 // Decorate pref value as CoreOptionsHandler::CreateValueForPref() does. | 233 // Decorate pref value as CoreOptionsHandler::CreateValueForPref() does. |
| 213 // TODO(estade): seems that this should replicate CreateValueForPref less. | 234 // TODO(estade): seems that this should replicate CreateValueForPref less. |
| 214 auto dict = base::MakeUnique<base::DictionaryValue>(); | 235 auto dict = base::MakeUnique<base::DictionaryValue>(); |
| 215 if (pref_name == kAccountsPrefUsers) | 236 if (pref_name == kAccountsPrefUsers) |
| 216 dict->Set("value", CreateUsersWhitelist(pref_value)); | 237 dict->Set("value", CreateUsersWhitelist(pref_value)); |
| 217 else | 238 else |
| 218 dict->Set("value", base::MakeUnique<base::Value>(*pref_value)); | 239 dict->Set("value", base::MakeUnique<base::Value>(*pref_value)); |
| 219 | 240 |
| 220 std::string controlled_by; | 241 std::string controlled_by; |
| 221 if (IsSettingPrivileged(pref_name)) { | 242 if (system::PerUserTimezoneEnabled() || IsSettingPrivileged(pref_name)) { |
| 222 policy::BrowserPolicyConnectorChromeOS* connector = | 243 policy::BrowserPolicyConnectorChromeOS* connector = |
| 223 g_browser_process->platform_part()->browser_policy_connector_chromeos(); | 244 g_browser_process->platform_part()->browser_policy_connector_chromeos(); |
| 224 if (connector->IsEnterpriseManaged()) | 245 if (connector->IsEnterpriseManaged()) |
| 225 controlled_by = "policy"; | 246 controlled_by = "policy"; |
| 226 else if (!ProfileHelper::IsOwnerProfile(profile)) | 247 else if (!ProfileHelper::IsOwnerProfile(profile)) |
| 227 controlled_by = "owner"; | 248 controlled_by = "owner"; |
| 228 } | 249 } |
| 229 dict->SetBoolean("disabled", !controlled_by.empty()); | |
| 230 if (!controlled_by.empty()) | 250 if (!controlled_by.empty()) |
| 231 dict->SetString("controlledBy", controlled_by); | 251 dict->SetString("controlledBy", controlled_by); |
| 252 |
| 253 // Read-only setting is always disabled. |
| 254 dict->SetBoolean("disabled", |
| 255 !controlled_by.empty() || !IsSettingWritable(pref_name)); |
| 232 return std::move(dict); | 256 return std::move(dict); |
| 233 } | 257 } |
| 234 | 258 |
| 235 void CoreChromeOSOptionsHandler::ObservePref(const std::string& pref_name) { | 259 void CoreChromeOSOptionsHandler::ObservePref(const std::string& pref_name) { |
| 236 if (proxy_cros_settings_parser::IsProxyPref(pref_name)) { | 260 if (proxy_cros_settings_parser::IsProxyPref(pref_name)) { |
| 237 // We observe those all the time. | 261 // We observe those all the time. |
| 238 return; | 262 return; |
| 239 } | 263 } |
| 240 if (!CrosSettings::IsCrosSettings(pref_name)) | 264 if (!CrosSettings::IsCrosSettings(pref_name)) |
| 241 return ::options::CoreOptionsHandler::ObservePref(pref_name); | 265 return ::options::CoreOptionsHandler::ObservePref(pref_name); |
| (...skipping 13 matching lines...) Expand all Loading... |
| 255 proxy_cros_settings_parser::SetProxyPrefValue( | 279 proxy_cros_settings_parser::SetProxyPrefValue( |
| 256 network_guid_, pref_name, value, GetUiProxyConfigService()); | 280 network_guid_, pref_name, value, GetUiProxyConfigService()); |
| 257 base::Value proxy_type(pref_name); | 281 base::Value proxy_type(pref_name); |
| 258 web_ui()->CallJavascriptFunctionUnsafe( | 282 web_ui()->CallJavascriptFunctionUnsafe( |
| 259 "options.internet.DetailsInternetPage.updateProxySettings", proxy_type); | 283 "options.internet.DetailsInternetPage.updateProxySettings", proxy_type); |
| 260 ProcessUserMetric(value, metric); | 284 ProcessUserMetric(value, metric); |
| 261 return; | 285 return; |
| 262 } | 286 } |
| 263 if (!CrosSettings::IsCrosSettings(pref_name)) | 287 if (!CrosSettings::IsCrosSettings(pref_name)) |
| 264 return ::options::CoreOptionsHandler::SetPref(pref_name, value, metric); | 288 return ::options::CoreOptionsHandler::SetPref(pref_name, value, metric); |
| 289 if (!IsSettingWritable(pref_name)) { |
| 290 NOTREACHED() << pref_name; |
| 291 return; |
| 292 } |
| 265 OwnerSettingsServiceChromeOS* service = | 293 OwnerSettingsServiceChromeOS* service = |
| 266 OwnerSettingsServiceChromeOS::FromWebUI(web_ui()); | 294 OwnerSettingsServiceChromeOS::FromWebUI(web_ui()); |
| 267 if (service && service->HandlesSetting(pref_name)) | 295 if (service && service->HandlesSetting(pref_name)) |
| 268 service->Set(pref_name, *value); | 296 service->Set(pref_name, *value); |
| 269 else | 297 else |
| 270 CrosSettings::Get()->Set(pref_name, *value); | 298 CrosSettings::Get()->Set(pref_name, *value); |
| 271 | 299 |
| 272 ProcessUserMetric(value, metric); | 300 ProcessUserMetric(value, metric); |
| 273 } | 301 } |
| 274 | 302 |
| (...skipping 142 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 417 network_guid_, proxy_cros_settings_parser::kProxySettings[i], | 445 network_guid_, proxy_cros_settings_parser::kProxySettings[i], |
| 418 GetUiProxyConfigService(), &value); | 446 GetUiProxyConfigService(), &value); |
| 419 DCHECK(value); | 447 DCHECK(value); |
| 420 DispatchPrefChangeNotification( | 448 DispatchPrefChangeNotification( |
| 421 proxy_cros_settings_parser::kProxySettings[i], std::move(value)); | 449 proxy_cros_settings_parser::kProxySettings[i], std::move(value)); |
| 422 } | 450 } |
| 423 } | 451 } |
| 424 | 452 |
| 425 } // namespace options | 453 } // namespace options |
| 426 } // namespace chromeos | 454 } // namespace chromeos |
| OLD | NEW |