1731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// Copyright (c) 2010 The Chromium Authors. All rights reserved.
2731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// Use of this source code is governed by a BSD-style license that can be
3731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// found in the LICENSE file.
4731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
5731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#ifndef CHROME_BROWSER_ABOUT_FLAGS_H_
6731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#define CHROME_BROWSER_ABOUT_FLAGS_H_
7731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#pragma once
8731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
9731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include <map>
10731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include <string>
11731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
12731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "base/command_line.h"
13731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
14731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickclass ListValue;
15731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickclass PrefService;
16731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
17731df977c0511bca2206b5f333555b1205ff1f43Iain Merricknamespace about_flags {
18731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
19513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch// Enumeration of OSs.
20513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch// This is exposed only for testing.
21513209b27ff55e2841eac0e4120199c23acce758Ben Murdochenum { kOsMac = 1 << 0, kOsWin = 1 << 1, kOsLinux = 1 << 2 , kOsCrOS = 1 << 3 };
22513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
23513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch// Experiment is used internally by about_flags to describe an experiment (and
24513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch// for testing).
25513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch// This is exposed only for testing.
26513209b27ff55e2841eac0e4120199c23acce758Ben Murdochstruct Experiment {
2721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  enum Type {
2821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    // An experiment with a single value. This is typically what you want.
2921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    SINGLE_VALUE,
3021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
3121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    // The experiment has multiple values only one of which is ever enabled.
3272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    // The first of the values should correspond to a deactivated state for this
3372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    // lab (i.e. no command line option). For MULTI_VALUE experiments the
3472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    // command_line of the Experiment is not used. If the experiment is enabled
3572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    // the command line of the selected Choice is enabled.
3621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    MULTI_VALUE,
3721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  };
3821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
3921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  // Used for MULTI_VALUE types to describe one of the possible values the user
4021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  // can select.
4121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  struct Choice {
4221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    // ID of the message containing the choice name.
4321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    int description_id;
4421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
4572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    // Command line switch and value to enabled for this choice.
4672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    const char* command_line_switch;
4772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    // Simple switches that have no value should use "" for command_line_value.
4872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    const char* command_line_value;
4921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  };
5021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
51513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // The internal name of the experiment. This is never shown to the user.
52513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // It _is_ however stored in the prefs file, so you shouldn't change the
53513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // name of existing flags.
54513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  const char* internal_name;
55513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
56513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // String id of the message containing the experiment's name.
57513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  int visible_name_id;
58513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
59513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // String id of the message containing the experiment's description.
60513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  int visible_description_id;
61513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
62513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // The platforms the experiment is available on
63513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // Needs to be more than a compile-time #ifdef because of profile sync.
64513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  unsigned supported_platforms;  // bitmask
65513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
6621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  // Type of experiment.
6721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  Type type;
6821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
6972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // The commandline switch and value that are added when this lab is active.
7072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // This is different from |internal_name| so that the commandline flag can be
71513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // renamed without breaking the prefs file.
7221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  // This is used if type is SINGLE_VALUE.
7372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  const char* command_line_switch;
7472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // Simple switches that have no value should use "" for command_line_value.
7572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  const char* command_line_value;
7621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
7721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  // This is used if type is MULTI_VALUE.
7821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  const Choice* choices;
7921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
8021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  // Number of |choices|.
8121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  // This is used if type is MULTI_VALUE.
8221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  int num_choices;
83513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch};
84513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
85731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// Reads the Labs |prefs| (called "Labs" for historical reasons) and adds the
86731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// commandline flags belonging to the active experiments to |command_line|.
87731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid ConvertFlagsToSwitches(PrefService* prefs, CommandLine* command_line);
88731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
89731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// Get a list of all available experiments. The caller owns the result.
90731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickListValue* GetFlagsExperimentsData(PrefService* prefs);
91731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
92731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// Returns true if one of the experiment flags has been flipped since startup.
93731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickbool IsRestartNeededToCommitChanges();
94731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
95731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// Enables or disables the experiment with id |internal_name|.
96731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid SetExperimentEnabled(
97731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    PrefService* prefs, const std::string& internal_name, bool enable);
98731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
99731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// Removes all switches that were added to a command line by a previous call to
100731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// |ConvertFlagsToSwitches()|.
101731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid RemoveFlagsSwitches(
102731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    std::map<std::string, CommandLine::StringType>* switch_list);
103731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
104513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch// Returns the value for the current platform. This is one of the values defined
105513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch// by the OS enum above.
106513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch// This is exposed only for testing.
107513209b27ff55e2841eac0e4120199c23acce758Ben Murdochint GetCurrentPlatform();
108513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
109201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch// Sends UMA stats about experimental flag usage. This should be called once per
110201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch// startup.
111201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochvoid RecordUMAStatistics(const PrefService* prefs);
112201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
113731df977c0511bca2206b5f333555b1205ff1f43Iain Merricknamespace testing {
114731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// Clears internal global state, for unit tests.
115731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid ClearState();
116513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
117513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch// Sets the list of experiments. Pass in NULL to use the default set. This does
118513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch// NOT take ownership of the supplied Experiments.
119513209b27ff55e2841eac0e4120199c23acce758Ben Murdochvoid SetExperiments(const Experiment* e, size_t count);
12021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
12121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen// Returns the current set of experiments.
12221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsenconst Experiment* GetExperiments(size_t* count);
12321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
12421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen// Separator used for multi values. Multi values are represented in prefs as
12521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen// name-of-experiment + kMultiSeparator + selected_index.
12621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsenextern const char kMultiSeparator[];
12721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
128731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}  // namespace testing
129731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
130731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}  // namespace about_flags
131731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
132731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#endif  // CHROME_BROWSER_ABOUT_FLAGS_H_
133