Refactor the storage layer out of about_flags.

This step is a preparation for moving owner flags storage from local state to
signed settings.

BUG=221353
TEST=existing about_flags tests still pass.

Review URL: https://chromiumcodereview.appspot.com/16542004

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@205854 0039d316-1c4b-4281-b951-d872f2087c98
diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc
index 10c2540..834073d 100644
--- a/chrome/browser/about_flags.cc
+++ b/chrome/browser/about_flags.cc
@@ -12,15 +12,13 @@
 
 #include "base/command_line.h"
 #include "base/memory/singleton.h"
-#include "base/prefs/pref_service.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/utf_string_conversions.h"
 #include "base/values.h"
 #include "cc/base/switches.h"
-#include "chrome/browser/prefs/scoped_user_pref_update.h"
+#include "chrome/browser/flags_storage.h"
 #include "chrome/common/chrome_content_client.h"
 #include "chrome/common/chrome_switches.h"
-#include "chrome/common/pref_names.h"
 #include "content/public/browser/user_metrics.h"
 #include "grit/chromium_strings.h"
 #include "grit/generated_resources.h"
@@ -1556,13 +1554,16 @@
 class FlagsState {
  public:
   FlagsState() : needs_restart_(false) {}
-  void ConvertFlagsToSwitches(PrefService* prefs, CommandLine* command_line);
+  void ConvertFlagsToSwitches(FlagsStorage* flags_storage,
+                              CommandLine* command_line);
   bool IsRestartNeededToCommitChanges();
   void SetExperimentEnabled(
-      PrefService* prefs, const std::string& internal_name, bool enable);
+      FlagsStorage* flags_storage,
+      const std::string& internal_name,
+      bool enable);
   void RemoveFlagsSwitches(
       std::map<std::string, CommandLine::StringType>* switch_list);
-  void ResetAllFlags(PrefService* prefs);
+  void ResetAllFlags(FlagsStorage* flags_storage);
   void reset();
 
   // Returns the singleton instance of this class
@@ -1577,40 +1578,6 @@
   DISALLOW_COPY_AND_ASSIGN(FlagsState);
 };
 
-// Extracts the list of enabled lab experiments from preferences and stores them
-// in a set.
-void GetEnabledFlags(const PrefService* prefs, std::set<std::string>* result) {
-  const ListValue* enabled_experiments = prefs->GetList(
-      prefs::kEnabledLabsExperiments);
-  if (!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 " << prefs::kEnabledLabsExperiments;
-      continue;
-    }
-    result->insert(experiment_name);
-  }
-}
-
-// Takes a set of enabled lab experiments
-void SetEnabledFlags(
-    PrefService* prefs, const std::set<std::string>& enabled_experiments) {
-  ListPrefUpdate update(prefs, prefs::kEnabledLabsExperiments);
-  ListValue* experiments_list = update.Get();
-
-  experiments_list->Clear();
-  for (std::set<std::string>::const_iterator it = enabled_experiments.begin();
-       it != enabled_experiments.end();
-       ++it) {
-    experiments_list->Append(new StringValue(*it));
-  }
-}
-
 // Adds the internal names for the specified experiment to |names|.
 void AddInternalName(const Experiment& e, std::set<std::string>* names) {
   if (e.type == Experiment::SINGLE_VALUE) {
@@ -1654,15 +1621,14 @@
 // Removes all experiments from prefs::kEnabledLabsExperiments that are
 // unknown, to prevent this list to become very long as experiments are added
 // and removed.
-void SanitizeList(PrefService* prefs) {
+void SanitizeList(FlagsStorage* flags_storage) {
   std::set<std::string> known_experiments;
   for (size_t i = 0; i < num_experiments; ++i) {
     DCHECK(ValidateExperiment(experiments[i]));
     AddInternalName(experiments[i], &known_experiments);
   }
 
-  std::set<std::string> enabled_experiments;
-  GetEnabledFlags(prefs, &enabled_experiments);
+  std::set<std::string> enabled_experiments = flags_storage->GetFlags();
 
   std::set<std::string> new_enabled_experiments;
   std::set_intersection(
@@ -1671,20 +1637,20 @@
       std::inserter(new_enabled_experiments, new_enabled_experiments.begin()));
 
   if (new_enabled_experiments != enabled_experiments)
-    SetEnabledFlags(prefs, new_enabled_experiments);
+    flags_storage->SetFlags(new_enabled_experiments);
 }
 
 void GetSanitizedEnabledFlags(
-    PrefService* prefs, std::set<std::string>* result) {
-  SanitizeList(prefs);
-  GetEnabledFlags(prefs, result);
+    FlagsStorage* flags_storage, std::set<std::string>* result) {
+  SanitizeList(flags_storage);
+  *result = flags_storage->GetFlags();
 }
 
 // Variant of GetSanitizedEnabledFlags that also removes any flags that aren't
 // enabled on the current platform.
 void GetSanitizedEnabledFlagsForCurrentPlatform(
-    PrefService* prefs, std::set<std::string>* result) {
-  GetSanitizedEnabledFlags(prefs, result);
+    FlagsStorage* flags_storage, std::set<std::string>* result) {
+  GetSanitizedEnabledFlags(flags_storage, result);
 
   // Filter out any experiments that aren't enabled on the current platform.  We
   // don't remove these from prefs else syncing to a platform with a different
@@ -1754,16 +1720,18 @@
   return l10n_util::GetStringUTF16(description_id);
 }
 
-void ConvertFlagsToSwitches(PrefService* prefs, CommandLine* command_line) {
-  FlagsState::GetInstance()->ConvertFlagsToSwitches(prefs, command_line);
+void ConvertFlagsToSwitches(FlagsStorage* flags_storage,
+                            CommandLine* command_line) {
+  FlagsState::GetInstance()->ConvertFlagsToSwitches(flags_storage,
+                                                    command_line);
 }
 
-void GetFlagsExperimentsData(PrefService* prefs,
+void GetFlagsExperimentsData(FlagsStorage* flags_storage,
                              FlagAccess access,
                              base::ListValue* supported_experiments,
                              base::ListValue* unsupported_experiments) {
   std::set<std::string> enabled_experiments;
-  GetSanitizedEnabledFlags(prefs, &enabled_experiments);
+  GetSanitizedEnabledFlags(flags_storage, &enabled_experiments);
 
   int current_platform = GetCurrentPlatform();
 
@@ -1814,9 +1782,11 @@
   return FlagsState::GetInstance()->IsRestartNeededToCommitChanges();
 }
 
-void SetExperimentEnabled(
-    PrefService* prefs, const std::string& internal_name, bool enable) {
-  FlagsState::GetInstance()->SetExperimentEnabled(prefs, internal_name, enable);
+void SetExperimentEnabled(FlagsStorage* flags_storage,
+                          const std::string& internal_name,
+                          bool enable) {
+  FlagsState::GetInstance()->SetExperimentEnabled(flags_storage,
+                                                  internal_name, enable);
 }
 
 void RemoveFlagsSwitches(
@@ -1824,8 +1794,8 @@
   FlagsState::GetInstance()->RemoveFlagsSwitches(switch_list);
 }
 
-void ResetAllFlags(PrefService* prefs) {
-  FlagsState::GetInstance()->ResetAllFlags(prefs);
+void ResetAllFlags(FlagsStorage* flags_storage) {
+  FlagsState::GetInstance()->ResetAllFlags(flags_storage);
 }
 
 int GetCurrentPlatform() {
@@ -1844,9 +1814,8 @@
 #endif
 }
 
-void RecordUMAStatistics(const PrefService* prefs) {
-  std::set<std::string> flags;
-  GetEnabledFlags(prefs, &flags);
+void RecordUMAStatistics(FlagsStorage* flags_storage) {
+  std::set<std::string> flags = flags_storage->GetFlags();
   for (std::set<std::string>::iterator it = flags.begin(); it != flags.end();
        ++it) {
     std::string action("AboutFlags_");
@@ -1877,13 +1846,14 @@
 }
 
 void FlagsState::ConvertFlagsToSwitches(
-    PrefService* prefs, CommandLine* command_line) {
+    FlagsStorage* flags_storage, CommandLine* command_line) {
   if (command_line->HasSwitch(switches::kNoExperiments))
     return;
 
   std::set<std::string> enabled_experiments;
 
-  GetSanitizedEnabledFlagsForCurrentPlatform(prefs, &enabled_experiments);
+  GetSanitizedEnabledFlagsForCurrentPlatform(flags_storage,
+                                             &enabled_experiments);
 
   NameToSwitchAndValueMap name_to_switch_map;
   for (size_t i = 0; i < num_experiments; ++i) {
@@ -1941,8 +1911,9 @@
   return needs_restart_;
 }
 
-void FlagsState::SetExperimentEnabled(
-    PrefService* prefs, const std::string& internal_name, bool enable) {
+void FlagsState::SetExperimentEnabled(FlagsStorage* flags_storage,
+                                      const std::string& internal_name,
+                                      bool enable) {
   size_t at_index = internal_name.find(testing::kMultiSeparator);
   if (at_index != std::string::npos) {
     DCHECK(enable);
@@ -1950,20 +1921,20 @@
     // currently selected choice.
     DCHECK_NE(at_index, 0u);
     const std::string experiment_name = internal_name.substr(0, at_index);
-    SetExperimentEnabled(prefs, experiment_name, false);
+    SetExperimentEnabled(flags_storage, experiment_name, false);
 
     // And enable the new choice, if it is not the default first choice.
     if (internal_name != experiment_name + "@0") {
       std::set<std::string> enabled_experiments;
-      GetSanitizedEnabledFlags(prefs, &enabled_experiments);
+      GetSanitizedEnabledFlags(flags_storage, &enabled_experiments);
       needs_restart_ |= enabled_experiments.insert(internal_name).second;
-      SetEnabledFlags(prefs, enabled_experiments);
+      flags_storage->SetFlags(enabled_experiments);
     }
     return;
   }
 
   std::set<std::string> enabled_experiments;
-  GetSanitizedEnabledFlags(prefs, &enabled_experiments);
+  GetSanitizedEnabledFlags(flags_storage, &enabled_experiments);
 
   const Experiment* e = NULL;
   for (size_t i = 0; i < num_experiments; ++i) {
@@ -1998,7 +1969,7 @@
     }
   }
 
-  SetEnabledFlags(prefs, enabled_experiments);
+  flags_storage->SetFlags(enabled_experiments);
 }
 
 void FlagsState::RemoveFlagsSwitches(
@@ -2009,11 +1980,11 @@
   }
 }
 
-void FlagsState::ResetAllFlags(PrefService* prefs) {
+void FlagsState::ResetAllFlags(FlagsStorage* flags_storage) {
   needs_restart_ = true;
 
   std::set<std::string> no_experiments;
-  SetEnabledFlags(prefs, no_experiments);
+  flags_storage->SetFlags(no_experiments);
 }
 
 void FlagsState::reset() {