15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef CHROME_BROWSER_ABOUT_FLAGS_H_
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CHROME_BROWSER_ABOUT_FLAGS_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
86e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include <stdint.h>
96e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <map>
116e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include <set>
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/command_line.h"
151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/metrics/histogram_base.h"
16868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string16.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class PrefService;
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace base {
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ListValue;
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace about_flags {
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
267d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)class FlagsStorage;
277d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
286e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)// This value is reported as switch histogram ID if switch name has unknown
296e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)// format.
301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciextern const base::HistogramBase::Sample kBadSwitchFormatHistogramId;
316e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Enumeration of OSs.
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This is exposed only for testing.
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)enum { kOsMac = 1 << 0, kOsWin = 1 << 1, kOsLinux = 1 << 2 , kOsCrOS = 1 << 3,
35c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)       kOsAndroid = 1 << 4, kOsCrOSOwnerOnly = 1 << 5 };
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Experiment is used internally by about_flags to describe an experiment (and
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// for testing).
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This is exposed only for testing.
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct Experiment {
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  enum Type {
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // An experiment with a single value. This is typically what you want.
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SINGLE_VALUE,
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // The experiment has multiple values only one of which is ever enabled.
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // The first of the values should correspond to a deactivated state for this
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // lab (i.e. no command line option). For MULTI_VALUE experiments the
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // command_line of the Experiment is not used. If the experiment is enabled
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // the command line of the selected Choice is enabled.
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    MULTI_VALUE,
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // The experiment has three possible values: Default, Enabled and Disabled.
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // This should be used for experiments that may have their own logic to
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // decide if the feature should be on when not explicitly specified via
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // about flags - for example via FieldTrials.
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ENABLE_DISABLE_VALUE,
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Used for MULTI_VALUE types to describe one of the possible values the user
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // can select.
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  struct Choice {
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // ID of the message containing the choice name.
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int description_id;
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Command line switch and value to enabled for this choice.
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const char* command_line_switch;
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Simple switches that have no value should use "" for command_line_value.
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const char* command_line_value;
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The internal name of the experiment. This is never shown to the user.
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // It _is_ however stored in the prefs file, so you shouldn't change the
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // name of existing flags.
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char* internal_name;
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // String id of the message containing the experiment's name.
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int visible_name_id;
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // String id of the message containing the experiment's description.
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int visible_description_id;
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The platforms the experiment is available on
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Needs to be more than a compile-time #ifdef because of profile sync.
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  unsigned supported_platforms;  // bitmask
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Type of experiment.
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Type type;
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The commandline switch and value that are added when this flag is active.
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This is different from |internal_name| so that the commandline flag can be
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // renamed without breaking the prefs file.
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // This is used if type is SINGLE_VALUE or ENABLE_DISABLE_VALUE.
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char* command_line_switch;
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Simple switches that have no value should use "" for command_line_value.
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char* command_line_value;
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // For ENABLE_DISABLE_VALUE, the command line switch and value to explictly
982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // disable the feature.
992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const char* disable_command_line_switch;
1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const char* disable_command_line_value;
1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This is used if type is MULTI_VALUE.
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const Choice* choices;
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Number of |choices|.
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This is used if type is MULTI_VALUE.
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int num_choices;
1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Returns the name used in prefs for the choice at the specified |index|.
1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string NameForChoice(int index) const;
1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Returns the human readable description for the choice at |index|.
113a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  base::string16 DescriptionForChoice(int index) const;
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
116d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)// A flag controlling the behavior of the |ConvertFlagsToSwitches| function -
117d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)// whether it should add the sentinel switches around flags.
118d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)enum SentinelsMode { kNoSentinels, kAddSentinels };
119d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Reads the Labs |prefs| (called "Labs" for historical reasons) and adds the
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// commandline flags belonging to the active experiments to |command_line|.
1227d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)void ConvertFlagsToSwitches(FlagsStorage* flags_storage,
123a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                            base::CommandLine* command_line,
124d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                            SentinelsMode sentinels);
1257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1267d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// Compares a set of switches of the two provided command line objects and
1277d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// returns true if they are the same and false otherwise.
1286e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)// If |out_difference| is not NULL, it's filled with set_symmetric_difference
1296e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)// between sets.
1307d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)bool AreSwitchesIdenticalToCurrentCommandLine(
131a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    const base::CommandLine& new_cmdline,
1326e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    const base::CommandLine& active_cmdline,
1336e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    std::set<CommandLine::StringType>* out_difference);
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
135c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Differentiate between generic flags available on a per session base and flags
136c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// that influence the whole machine and can be said by the admin only. This flag
137c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// is relevant for ChromeOS for now only and dictates whether entries marked
138c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// with the |kOsCrOSOwnerOnly| label should be enabled in the UI or not.
139c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)enum FlagAccess { kGeneralAccessFlagsOnly, kOwnerAccessToFlags };
140c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
14190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// Get the list of experiments. Experiments that are available on the current
14290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// platform are appended to |supported_experiments|; all other experiments are
14390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// appended to |unsupported_experiments|.
1447d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)void GetFlagsExperimentsData(FlagsStorage* flags_storage,
14590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                             FlagAccess access,
14690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                             base::ListValue* supported_experiments,
14790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                             base::ListValue* unsupported_experiments);
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Returns true if one of the experiment flags has been flipped since startup.
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool IsRestartNeededToCommitChanges();
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Enables or disables the experiment with id |internal_name|.
1537d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)void SetExperimentEnabled(FlagsStorage* flags_storage,
1547d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                          const std::string& internal_name,
1557d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                          bool enable);
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Removes all switches that were added to a command line by a previous call to
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// |ConvertFlagsToSwitches()|.
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RemoveFlagsSwitches(
160a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    std::map<std::string, base::CommandLine::StringType>* switch_list);
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Reset all flags to the default state by clearing all flags.
1637d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)void ResetAllFlags(FlagsStorage* flags_storage);
1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Returns the value for the current platform. This is one of the values defined
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// by the OS enum above.
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This is exposed only for testing.
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int GetCurrentPlatform();
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Sends UMA stats about experimental flag usage. This should be called once per
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// startup.
1727d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)void RecordUMAStatistics(FlagsStorage* flags_storage);
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1746e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)// Returns the UMA id for the specified switch name.
1751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccibase::HistogramBase::Sample GetSwitchUMAId(const std::string& switch_name);
1766e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
1776e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)// Sends stats (as UMA histogram) about command_line_difference.
1786e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)// This is used on ChromeOS to report flags that lead to browser restart.
1796e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)// |command_line_difference| is the result of
1806e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)// AreSwitchesIdenticalToCurrentCommandLine().
1816e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)void ReportCustomFlags(const std::string& uma_histogram_hame,
1826e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                       const std::set<std::string>& command_line_difference);
1836e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace testing {
1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Clears internal global state, for unit tests.
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ClearState();
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Sets the list of experiments. Pass in NULL to use the default set. This does
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// NOT take ownership of the supplied Experiments.
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SetExperiments(const Experiment* e, size_t count);
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Returns the current set of experiments.
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const Experiment* GetExperiments(size_t* count);
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Separator used for multi values. Multi values are represented in prefs as
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// name-of-experiment + kMultiSeparator + selected_index.
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)extern const char kMultiSeparator[];
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace testing
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace about_flags
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // CHROME_BROWSER_ABOUT_FLAGS_H_
205