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