Index: chrome/browser/about_flags.cc |
diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc |
index 9ef2d43cd91047a8c4bfc52bf2edce44eaf0b06d..be3512c995a2a92a8ce5121ec8f37baae1d3441f 100644 |
--- a/chrome/browser/about_flags.cc |
+++ b/chrome/browser/about_flags.cc |
@@ -43,6 +43,8 @@ |
#endif |
#if defined(OS_CHROMEOS) |
+#include "chrome/browser/chromeos/settings/cros_settings.h" |
+#include "chrome/browser/chromeos/settings/cros_settings_names.h" |
#include "chromeos/chromeos_switches.h" |
#endif |
@@ -1317,9 +1319,58 @@ class FlagsState { |
DISALLOW_COPY_AND_ASSIGN(FlagsState); |
}; |
+#if defined(OS_CHROMEOS) |
+// Extracts the list of enabled lab experiments from device settings and stores |
+// them in a set. |
+void GetEnabledFlagsFromDeviceSettings(std::set<std::string>* result) { |
+ const ListValue* enabled_experiments; |
+ if (!chromeos::CrosSettings::Get()->GetList(chromeos::kStartUpFlags, |
+ &enabled_experiments)) { |
+ return; |
+ } |
+ |
+ for (ListValue::const_iterator it = enabled_experiments->begin(); |
+ it != enabled_experiments->end(); |
+ ++it) { |
+ std::string experiment_name; |
+ if (!(*it)->GetAsString(&experiment_name)) { |
+ LOG(WARNING) << "Invalid entry in " << chromeos::kStartUpFlags; |
+ continue; |
+ } |
+ result->insert(experiment_name); |
+ } |
+} |
+ |
+// Takes a set of enabled lab experiments and saves it into the device settings |
+// storage on ChromeOS. |
+void SetEnabledFlagsToDeviceSettings( |
+ const std::set<std::string>& enabled_experiments) { |
+ scoped_ptr<base::ListValue> experiments_list(new base::ListValue()); |
+ |
+ for (std::set<std::string>::const_iterator it = enabled_experiments.begin(); |
+ it != enabled_experiments.end(); |
+ ++it) { |
+ experiments_list->Append(new StringValue(*it)); |
+ } |
+ chromeos::CrosSettings::Get()->Set(chromeos::kStartUpFlags, |
+ *experiments_list); |
+} |
+#endif |
+ |
// Extracts the list of enabled lab experiments from preferences and stores them |
-// in a set. |
+// in a set. On ChromeOS |prefs| can be NULL when reading machine level flags. |
void GetEnabledFlags(const PrefService* prefs, std::set<std::string>* result) { |
+#if defined(OS_CHROMEOS) |
+ // On ChromeOS flags are stored in the device settings blob. |
+ if (!prefs) { |
+ GetEnabledFlagsFromDeviceSettings(result); |
+ return; |
+ } |
+#else |
+ // Never allow |prefs| to be NULL on other platforms. |
+ CHECK(prefs); |
+#endif |
+ |
const ListValue* enabled_experiments = prefs->GetList( |
prefs::kEnabledLabsExperiments); |
if (!enabled_experiments) |
@@ -1337,9 +1388,21 @@ void GetEnabledFlags(const PrefService* prefs, std::set<std::string>* result) { |
} |
} |
-// Takes a set of enabled lab experiments |
+// Takes a set of enabled lab experiments. On ChromeOS |prefs| can be NULL when |
+// setting machine level flags. |
void SetEnabledFlags( |
PrefService* prefs, const std::set<std::string>& enabled_experiments) { |
+#if defined(OS_CHROMEOS) |
+ // On ChromeOS flags are stored in the device settings blob. |
+ if (!prefs) { |
+ SetEnabledFlagsToDeviceSettings(enabled_experiments); |
+ return; |
+ } |
+#else |
+ // Never allow |prefs| to be NULL on other platforms. |
+ CHECK(prefs); |
+#endif |
+ |
ListPrefUpdate update(prefs, prefs::kEnabledLabsExperiments); |
ListValue* experiments_list = update.Get(); |