| 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();
 | 
|  
 | 
| 
 |