| Index: chrome/browser/chromeos/device_settings_provider.cc | 
| diff --git a/chrome/browser/chromeos/device_settings_provider.cc b/chrome/browser/chromeos/device_settings_provider.cc | 
| index e65ba0373dca2ec9ecf35a2804b6067b477781f6..5059ae3426f1516e17b2a85fc517668d9e6dd510 100644 | 
| --- a/chrome/browser/chromeos/device_settings_provider.cc | 
| +++ b/chrome/browser/chromeos/device_settings_provider.cc | 
| @@ -22,7 +22,6 @@ | 
| #include "chrome/browser/chromeos/login/signed_settings_helper.h" | 
| #include "chrome/browser/chromeos/login/user_manager.h" | 
| #include "chrome/browser/policy/app_pack_updater.h" | 
| -#include "chrome/browser/policy/proto/chrome_device_policy.pb.h" | 
| #include "chrome/browser/ui/options/options_util.h" | 
| #include "chrome/common/chrome_notification_types.h" | 
| #include "chrome/installer/util/google_update_settings.h" | 
| @@ -45,10 +44,14 @@ const char* kKnownSettings[] = { | 
| kAccountsPrefUsers, | 
| kAppPack, | 
| kDeviceOwner, | 
| +  kIdleLogoutTimeout, | 
| +  kIdleLogoutWarningDuration, | 
| kReleaseChannel, | 
| kReportDeviceActivityTimes, | 
| kReportDeviceBootMode, | 
| kReportDeviceVersionInfo, | 
| +  kScreenSaverExtensionId, | 
| +  kScreenSaverTimeout, | 
| kSettingProxyEverywhere, | 
| kSignedDataRoamingEnabled, | 
| kStatsReportingPref, | 
| @@ -277,9 +280,14 @@ void DeviceSettingsProvider::SetInPolicy() { | 
| // The remaining settings don't support Set(), since they are not | 
| // intended to be customizable by the user: | 
| //   kAppPack | 
| +    //   kIdleLogoutTimeout, | 
| +    //   kIdleLogoutWarningDuration, | 
| //   kReportDeviceVersionInfo | 
| //   kReportDeviceActivityTimes | 
| //   kReportDeviceBootMode | 
| +    //   kScreenSaverExtensionId, | 
| +    //   kScreenSaverTimeout, | 
| + | 
| NOTREACHED(); | 
| } | 
| data.set_policy_value(pol.SerializeAsString()); | 
| @@ -322,112 +330,95 @@ void DeviceSettingsProvider::FinishSetInPolicy( | 
| SetInPolicy(); | 
| } | 
|  | 
| -void DeviceSettingsProvider::UpdateValuesCache() { | 
| -  const em::PolicyData data = policy(); | 
| -  PrefValueMap new_values_cache; | 
| - | 
| -  if (data.has_username() && !data.has_request_token()) | 
| -    new_values_cache.SetString(kDeviceOwner, data.username()); | 
| - | 
| -  em::ChromeDeviceSettingsProto pol; | 
| -  pol.ParseFromString(data.policy_value()); | 
| - | 
| +void DeviceSettingsProvider::DecodeLoginPolicies( | 
| +    const em::ChromeDeviceSettingsProto& policy, | 
| +    PrefValueMap* new_values_cache) const { | 
| // For all our boolean settings the following is applicable: | 
| // true is default permissive value and false is safe prohibitive value. | 
| // Exceptions: | 
| //   kSignedDataRoamingEnabled has a default value of false. | 
| //   kAccountsPrefEphemeralUsersEnabled has a default value of false. | 
| -  if (pol.has_allow_new_users() && | 
| -      pol.allow_new_users().has_allow_new_users() && | 
| -      pol.allow_new_users().allow_new_users()) { | 
| +  if (policy.has_allow_new_users() && | 
| +      policy.allow_new_users().has_allow_new_users() && | 
| +      policy.allow_new_users().allow_new_users()) { | 
| // New users allowed, user_whitelist() ignored. | 
| -    new_values_cache.SetBoolean(kAccountsPrefAllowNewUser, true); | 
| -  } else if (!pol.has_user_whitelist()) { | 
| +    new_values_cache->SetBoolean(kAccountsPrefAllowNewUser, true); | 
| +  } else if (!policy.has_user_whitelist()) { | 
| // If we have the allow_new_users bool, and it is true, we honor that above. | 
| // In all other cases (don't have it, have it and it is set to false, etc), | 
| // We will honor the user_whitelist() if it is there and populated. | 
| // Otherwise we default to allowing new users. | 
| -    new_values_cache.SetBoolean(kAccountsPrefAllowNewUser, true); | 
| +    new_values_cache->SetBoolean(kAccountsPrefAllowNewUser, true); | 
| } else { | 
| -    new_values_cache.SetBoolean( | 
| +    new_values_cache->SetBoolean( | 
| kAccountsPrefAllowNewUser, | 
| -        pol.user_whitelist().user_whitelist_size() == 0); | 
| +        policy.user_whitelist().user_whitelist_size() == 0); | 
| } | 
|  | 
| -  new_values_cache.SetBoolean( | 
| +  new_values_cache->SetBoolean( | 
| kAccountsPrefAllowGuest, | 
| -      !pol.has_guest_mode_enabled() || | 
| -      !pol.guest_mode_enabled().has_guest_mode_enabled() || | 
| -      pol.guest_mode_enabled().guest_mode_enabled()); | 
| +      !policy.has_guest_mode_enabled() || | 
| +      !policy.guest_mode_enabled().has_guest_mode_enabled() || | 
| +      policy.guest_mode_enabled().guest_mode_enabled()); | 
|  | 
| -  new_values_cache.SetBoolean( | 
| +  new_values_cache->SetBoolean( | 
| kAccountsPrefShowUserNamesOnSignIn, | 
| -      !pol.has_show_user_names() || | 
| -      !pol.show_user_names().has_show_user_names() || | 
| -      pol.show_user_names().show_user_names()); | 
| - | 
| -  new_values_cache.SetBoolean( | 
| -      kSignedDataRoamingEnabled, | 
| -      pol.has_data_roaming_enabled() && | 
| -      pol.data_roaming_enabled().has_data_roaming_enabled() && | 
| -      pol.data_roaming_enabled().data_roaming_enabled()); | 
| +      !policy.has_show_user_names() || | 
| +      !policy.show_user_names().has_show_user_names() || | 
| +      policy.show_user_names().show_user_names()); | 
|  | 
| -  new_values_cache.SetBoolean( | 
| +  new_values_cache->SetBoolean( | 
| kAccountsPrefEphemeralUsersEnabled, | 
| -      pol.has_ephemeral_users_enabled() && | 
| -      pol.ephemeral_users_enabled().has_ephemeral_users_enabled() && | 
| -      pol.ephemeral_users_enabled().ephemeral_users_enabled()); | 
| - | 
| -  // TODO(cmasone): NOTIMPLEMENTED() once http://crosbug.com/13052 is fixed. | 
| -  std::string serialized; | 
| -  if (pol.has_device_proxy_settings() && | 
| -      pol.device_proxy_settings().SerializeToString(&serialized)) { | 
| -    new_values_cache.SetString(kSettingProxyEverywhere, serialized); | 
| -  } | 
| - | 
| -  if (!pol.has_release_channel() || | 
| -      !pol.release_channel().has_release_channel()) { | 
| -    // Default to an invalid channel (will be ignored). | 
| -    new_values_cache.SetString(kReleaseChannel, ""); | 
| -  } else { | 
| -    new_values_cache.SetString(kReleaseChannel, | 
| -                               pol.release_channel().release_channel()); | 
| -  } | 
| - | 
| -  if (pol.has_metrics_enabled()) { | 
| -    new_values_cache.SetBoolean(kStatsReportingPref, | 
| -                                pol.metrics_enabled().metrics_enabled()); | 
| -  } else { | 
| -    new_values_cache.SetBoolean(kStatsReportingPref, HasOldMetricsFile()); | 
| -  } | 
| +      policy.has_ephemeral_users_enabled() && | 
| +      policy.ephemeral_users_enabled().has_ephemeral_users_enabled() && | 
| +      policy.ephemeral_users_enabled().ephemeral_users_enabled()); | 
|  | 
| base::ListValue* list = new base::ListValue(); | 
| -  const em::UserWhitelistProto& whitelist_proto = pol.user_whitelist(); | 
| +  const em::UserWhitelistProto& whitelist_proto = policy.user_whitelist(); | 
| const RepeatedPtrField<std::string>& whitelist = | 
| whitelist_proto.user_whitelist(); | 
| for (RepeatedPtrField<std::string>::const_iterator it = whitelist.begin(); | 
| it != whitelist.end(); ++it) { | 
| list->Append(base::Value::CreateStringValue(*it)); | 
| } | 
| -  new_values_cache.SetValue(kAccountsPrefUsers, list); | 
| +  new_values_cache->SetValue(kAccountsPrefUsers, list); | 
| +} | 
|  | 
| -  if (pol.has_device_reporting()) { | 
| -    if (pol.device_reporting().has_report_version_info()) { | 
| -      new_values_cache.SetBoolean(kReportDeviceVersionInfo, | 
| -          pol.device_reporting().report_version_info()); | 
| +void DeviceSettingsProvider::DecodeKioskPolicies( | 
| +    const em::ChromeDeviceSettingsProto& policy, | 
| +    PrefValueMap* new_values_cache) const { | 
| +  if (policy.has_forced_logout_timeouts()) { | 
| +    if (policy.forced_logout_timeouts().has_idle_logout_timeout()) { | 
| +      new_values_cache->SetInteger( | 
| +          kIdleLogoutTimeout, | 
| +          policy.forced_logout_timeouts().idle_logout_timeout()); | 
| } | 
| -    // TODO(dubroy): Re-add device activity time policy here when the UI | 
| -    // to notify the user has been implemented (http://crosbug.com/26252). | 
| -    if (pol.device_reporting().has_report_boot_mode()) { | 
| -      new_values_cache.SetBoolean(kReportDeviceBootMode, | 
| -          pol.device_reporting().report_boot_mode()); | 
| + | 
| +    if (policy.forced_logout_timeouts().has_idle_logout_warning_duration()) { | 
| +      new_values_cache->SetInteger( | 
| +          kIdleLogoutWarningDuration, | 
| +          policy.forced_logout_timeouts().idle_logout_warning_duration()); | 
| +    } | 
| +  } | 
| + | 
| +  if (policy.has_login_screen_saver()) { | 
| +    if (policy.login_screen_saver().has_screen_saver_timeout()) { | 
| +      new_values_cache->SetInteger( | 
| +          kScreenSaverTimeout, | 
| +          policy.login_screen_saver().screen_saver_timeout()); | 
| +    } | 
| + | 
| +    if (policy.login_screen_saver().has_screen_saver_extension_id()) { | 
| +      new_values_cache->SetString( | 
| +          kScreenSaverExtensionId, | 
| +          policy.login_screen_saver().screen_saver_extension_id()); | 
| } | 
| } | 
|  | 
| -  if (pol.has_app_pack()) { | 
| +  if (policy.has_app_pack()) { | 
| typedef RepeatedPtrField<em::AppPackEntryProto> proto_type; | 
| base::ListValue* list = new base::ListValue; | 
| -    const proto_type& app_pack = pol.app_pack().app_pack(); | 
| +    const proto_type& app_pack = policy.app_pack().app_pack(); | 
| for (proto_type::const_iterator it = app_pack.begin(); | 
| it != app_pack.end(); ++it) { | 
| base::DictionaryValue* entry = new base::DictionaryValue; | 
| @@ -443,8 +434,81 @@ void DeviceSettingsProvider::UpdateValuesCache() { | 
| } | 
| list->Append(entry); | 
| } | 
| -    new_values_cache.SetValue(kAppPack, list); | 
| +    new_values_cache->SetValue(kAppPack, list); | 
| } | 
| +} | 
| + | 
| +void DeviceSettingsProvider::DecodeNetworkPolicies( | 
| +    const em::ChromeDeviceSettingsProto& policy, | 
| +    PrefValueMap* new_values_cache) const { | 
| +  new_values_cache->SetBoolean( | 
| +      kSignedDataRoamingEnabled, | 
| +      policy.has_data_roaming_enabled() && | 
| +      policy.data_roaming_enabled().has_data_roaming_enabled() && | 
| +      policy.data_roaming_enabled().data_roaming_enabled()); | 
| + | 
| +  // TODO(cmasone): NOTIMPLEMENTED() once http://crosbug.com/13052 is fixed. | 
| +  std::string serialized; | 
| +  if (policy.has_device_proxy_settings() && | 
| +      policy.device_proxy_settings().SerializeToString(&serialized)) { | 
| +    new_values_cache->SetString(kSettingProxyEverywhere, serialized); | 
| +  } | 
| +} | 
| + | 
| +void DeviceSettingsProvider::DecodeReportingPolicies( | 
| +    const em::ChromeDeviceSettingsProto& policy, | 
| +    PrefValueMap* new_values_cache) const { | 
| +  if (policy.has_device_reporting()) { | 
| +    if (policy.device_reporting().has_report_version_info()) { | 
| +      new_values_cache->SetBoolean( | 
| +          kReportDeviceVersionInfo, | 
| +          policy.device_reporting().report_version_info()); | 
| +    } | 
| +    // TODO(dubroy): Re-add device activity time policy here when the UI | 
| +    // to notify the user has been implemented (http://crosbug.com/26252). | 
| +    if (policy.device_reporting().has_report_boot_mode()) { | 
| +      new_values_cache->SetBoolean( | 
| +          kReportDeviceBootMode, | 
| +          policy.device_reporting().report_boot_mode()); | 
| +    } | 
| +  } | 
| +} | 
| + | 
| +void DeviceSettingsProvider::DecodeGenericPolicies( | 
| +    const em::ChromeDeviceSettingsProto& policy, | 
| +    PrefValueMap* new_values_cache) const { | 
| +  if (policy.has_metrics_enabled()) { | 
| +    new_values_cache->SetBoolean(kStatsReportingPref, | 
| +                                 policy.metrics_enabled().metrics_enabled()); | 
| +  } else { | 
| +    new_values_cache->SetBoolean(kStatsReportingPref, HasOldMetricsFile()); | 
| +  } | 
| + | 
| +  if (!policy.has_release_channel() || | 
| +      !policy.release_channel().has_release_channel()) { | 
| +    // Default to an invalid channel (will be ignored). | 
| +    new_values_cache->SetString(kReleaseChannel, ""); | 
| +  } else { | 
| +    new_values_cache->SetString(kReleaseChannel, | 
| +                                policy.release_channel().release_channel()); | 
| +  } | 
| +} | 
| + | 
| +void DeviceSettingsProvider::UpdateValuesCache() { | 
| +  const em::PolicyData data = policy(); | 
| +  PrefValueMap new_values_cache; | 
| + | 
| +  if (data.has_username() && !data.has_request_token()) | 
| +    new_values_cache.SetString(kDeviceOwner, data.username()); | 
| + | 
| +  em::ChromeDeviceSettingsProto pol; | 
| +  pol.ParseFromString(data.policy_value()); | 
| + | 
| +  DecodeLoginPolicies(pol, &new_values_cache); | 
| +  DecodeKioskPolicies(pol, &new_values_cache); | 
| +  DecodeNetworkPolicies(pol, &new_values_cache); | 
| +  DecodeReportingPolicies(pol, &new_values_cache); | 
| +  DecodeGenericPolicies(pol, &new_values_cache); | 
|  | 
| // Collect all notifications but send them only after we have swapped the | 
| // cache so that if somebody actually reads the cache will be already valid. | 
|  |