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/pref_service_flags_storage.cc b/chrome/browser/pref_service_flags_storage.cc
new file mode 100644
index 0000000..7cc1f5b
--- /dev/null
+++ b/chrome/browser/pref_service_flags_storage.cc
@@ -0,0 +1,49 @@
+// Copyright 2013 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/pref_service_flags_storage.h"
+
+#include "base/prefs/pref_service.h"
+#include "base/values.h"
+#include "chrome/browser/prefs/scoped_user_pref_update.h"
+#include "chrome/common/pref_names.h"
+
+namespace about_flags {
+
+PrefServiceFlagsStorage::PrefServiceFlagsStorage(
+    PrefService *prefs) : prefs_(prefs) {}
+
+PrefServiceFlagsStorage::~PrefServiceFlagsStorage() {}
+
+std::set<std::string> PrefServiceFlagsStorage::GetFlags() {
+  const ListValue* enabled_experiments = prefs_->GetList(
+      prefs::kEnabledLabsExperiments);
+  std::set<std::string> flags;
+  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;
+    }
+    flags.insert(experiment_name);
+  }
+  return flags;
+}
+
+bool PrefServiceFlagsStorage::SetFlags(std::set<std::string> flags) {
+  ListPrefUpdate update(prefs_, prefs::kEnabledLabsExperiments);
+  ListValue* experiments_list = update.Get();
+
+  experiments_list->Clear();
+  for (std::set<std::string>::const_iterator it = flags.begin();
+       it != flags.end(); ++it) {
+    experiments_list->Append(new StringValue(*it));
+  }
+
+  return true;
+}
+
+}  // namespace about_flags