Index: chrome/browser/chromeos/settings/device_settings_provider.cc |
diff --git a/chrome/browser/chromeos/settings/device_settings_provider.cc b/chrome/browser/chromeos/settings/device_settings_provider.cc |
index 44a253483f2d3526fcd75a3ebf92865684ebd655..e150055854177d46198b822819e80f7df07a92b5 100644 |
--- a/chrome/browser/chromeos/settings/device_settings_provider.cc |
+++ b/chrome/browser/chromeos/settings/device_settings_provider.cc |
@@ -10,6 +10,7 @@ |
#include "base/command_line.h" |
#include "base/file_util.h" |
#include "base/logging.h" |
+#include "base/metrics/histogram.h" |
#include "base/prefs/pref_service.h" |
#include "base/string_util.h" |
#include "base/threading/thread_restrictions.h" |
@@ -26,6 +27,7 @@ |
#include "chrome/browser/policy/proto/device_management_backend.pb.h" |
#include "chrome/browser/ui/options/options_util.h" |
#include "chrome/common/chrome_switches.h" |
+#include "chrome/common/pref_names.h" |
#include "chrome/installer/util/google_update_settings.h" |
using google::protobuf::RepeatedPtrField; |
@@ -63,6 +65,7 @@ const char* kKnownSettings[] = { |
kStartUpUrls, |
kStatsReportingPref, |
kSystemTimezonePolicy, |
+ kStartUpFlags, |
}; |
// Legacy policy file location. Used to detect migration from pre v12 ChromeOS. |
@@ -274,12 +277,14 @@ void DeviceSettingsProvider::SetInPolicy() { |
em::UserWhitelistProto* whitelist_proto = |
device_settings_.mutable_user_whitelist(); |
whitelist_proto->clear_user_whitelist(); |
- base::ListValue& users = static_cast<base::ListValue&>(*value); |
- for (base::ListValue::const_iterator i = users.begin(); |
- i != users.end(); ++i) { |
- std::string email; |
- if ((*i)->GetAsString(&email)) |
- whitelist_proto->add_user_whitelist(email.c_str()); |
+ const base::ListValue* users; |
+ if (value->GetAsList(&users)) { |
+ for (base::ListValue::const_iterator i = users->begin(); |
+ i != users->end(); ++i) { |
+ std::string email; |
+ if ((*i)->GetAsString(&email)) |
+ whitelist_proto->add_user_whitelist(email); |
+ } |
} |
} else if (prop == kAccountsPrefEphemeralUsersEnabled) { |
em::EphemeralUsersEnabledProto* ephemeral_users_enabled = |
@@ -301,6 +306,19 @@ void DeviceSettingsProvider::SetInPolicy() { |
} else { |
NOTREACHED(); |
} |
+ } else if (prop == kStartUpFlags) { |
+ em::StartUpFlagsProto* flags_proto = |
+ device_settings_.mutable_start_up_flags(); |
+ flags_proto->Clear(); |
+ const base::ListValue* flags; |
+ if (value->GetAsList(&flags)) { |
+ for (base::ListValue::const_iterator i = flags->begin(); |
+ i != flags->end(); ++i) { |
+ std::string flag; |
+ if ((*i)->GetAsString(&flag)) |
+ flags_proto->add_flags(flag); |
+ } |
+ } |
} else { |
// The remaining settings don't support Set(), since they are not |
// intended to be customizable by the user: |
@@ -406,6 +424,17 @@ void DeviceSettingsProvider::DecodeLoginPolicies( |
} |
} |
new_values_cache->SetValue(kAccountsPrefDeviceLocalAccounts, account_list); |
+ |
+ if (policy.has_start_up_flags()) { |
+ base::ListValue* list = new base::ListValue(); |
+ const em::StartUpFlagsProto& flags_proto = policy.start_up_flags(); |
+ const RepeatedPtrField<std::string>& flags = flags_proto.flags(); |
+ for (RepeatedPtrField<std::string>::const_iterator it = flags.begin(); |
+ it != flags.end(); ++it) { |
+ list->Append(new base::StringValue(*it)); |
+ } |
+ new_values_cache->SetValue(kStartUpFlags, list); |
+ } |
} |
void DeviceSettingsProvider::DecodeKioskPolicies( |
@@ -604,6 +633,7 @@ void DeviceSettingsProvider::ApplyMetricsSetting(bool use_file, |
// TODO(pastarmovj): Remove this once migration is not needed anymore. |
// If the value is not set we should try to migrate legacy consent file. |
if (use_file) { |
+ UMA_HISTOGRAM_COUNTS("DeviceSettings.MetricsMigrated", 1); |
new_value = HasOldMetricsFile(); |
// Make sure the values will get eventually written to the policy file. |
migration_values_.SetValue(kStatsReportingPref, |
@@ -643,6 +673,24 @@ void DeviceSettingsProvider::ApplySideEffects( |
else |
ApplyMetricsSetting(true, false); |
+ // TODO(pastarmovj): Remove this after we don't need it anymore. |
+ // See: http://crosbug.com/39553 |
+ // Migrate flags to device settings. |
+ PrefService* local_state = g_browser_process->local_state(); |
+ if (local_state->HasPrefPath(prefs::kEnabledLabsExperiments)) { |
+ if (!settings.has_start_up_flags()) { |
+ const base::ListValue* flags = |
+ local_state->GetList(prefs::kEnabledLabsExperiments); |
+ migration_values_.SetValue(kStartUpFlags, flags->DeepCopy()); |
+ AttemptMigration(); |
+ } else { |
+ // Either it has been properly migrated or the user already specified new |
+ // flags in the device policy. |
+ UMA_HISTOGRAM_COUNTS("DeviceSettings.FlagsMigrated", 1); |
+ local_state->ClearPref(prefs::kEnabledLabsExperiments); |
+ } |
+ } |
+ |
// Next set the roaming setting as needed. |
ApplyRoamingSetting( |
settings.has_data_roaming_enabled() ? |