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