| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/browser/about_flags.h" | 5 #include "chrome/browser/about_flags.h" |
| 6 | 6 |
| 7 #include <iterator> | 7 #include <iterator> |
| 8 #include <map> | 8 #include <map> |
| 9 #include <set> | 9 #include <set> |
| 10 #include <utility> | 10 #include <utility> |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 48 #include "ui/base/l10n/l10n_util.h" | 48 #include "ui/base/l10n/l10n_util.h" |
| 49 #include "ui/base/ui_base_switches.h" | 49 #include "ui/base/ui_base_switches.h" |
| 50 #include "ui/display/display_switches.h" | 50 #include "ui/display/display_switches.h" |
| 51 #include "ui/events/event_switches.h" | 51 #include "ui/events/event_switches.h" |
| 52 #include "ui/gfx/switches.h" | 52 #include "ui/gfx/switches.h" |
| 53 #include "ui/gl/gl_switches.h" | 53 #include "ui/gl/gl_switches.h" |
| 54 #include "ui/keyboard/keyboard_switches.h" | 54 #include "ui/keyboard/keyboard_switches.h" |
| 55 #include "ui/native_theme/native_theme_switches.h" | 55 #include "ui/native_theme/native_theme_switches.h" |
| 56 #include "ui/views/views_switches.h" | 56 #include "ui/views/views_switches.h" |
| 57 | 57 |
| 58 #if defined(OS_ANDROID) | 58 #if !defined(OS_ANDROID) |
| 59 #include "components/data_reduction_proxy/core/common/data_reduction_proxy_switc
hes.h" | |
| 60 #else | |
| 61 #include "ui/message_center/message_center_switches.h" | 59 #include "ui/message_center/message_center_switches.h" |
| 62 #endif | 60 #endif |
| 63 | 61 |
| 64 #if defined(USE_ASH) | 62 #if defined(USE_ASH) |
| 65 #include "ash/ash_switches.h" | 63 #include "ash/ash_switches.h" |
| 66 #endif | 64 #endif |
| 67 | 65 |
| 68 #if defined(OS_CHROMEOS) | 66 #if defined(OS_CHROMEOS) |
| 69 #include "chromeos/chromeos_switches.h" | 67 #include "chromeos/chromeos_switches.h" |
| 70 #include "third_party/cros_system_api/switches/chrome_switches.h" | 68 #include "third_party/cros_system_api/switches/chrome_switches.h" |
| 71 #endif | 69 #endif |
| 72 | 70 |
| 73 #if defined(ENABLE_APP_LIST) | 71 #if defined(ENABLE_APP_LIST) |
| 74 #include "ui/app_list/app_list_switches.h" | 72 #include "ui/app_list/app_list_switches.h" |
| 75 #endif | 73 #endif |
| 76 | 74 |
| 77 #if defined(ENABLE_EXTENSIONS) | 75 #if defined(ENABLE_EXTENSIONS) |
| 78 #include "extensions/common/switches.h" | 76 #include "extensions/common/switches.h" |
| 79 #endif | 77 #endif |
| 80 | 78 |
| 81 #if defined(USE_OZONE) | 79 #if defined(USE_OZONE) |
| 82 #include "ui/ozone/public/ozone_switches.h" | 80 #include "ui/ozone/public/ozone_switches.h" |
| 83 #endif | 81 #endif |
| 84 | 82 |
| 85 namespace about_flags { | 83 namespace about_flags { |
| 86 | 84 |
| 87 // Macros to simplify specifying the type. | 85 // Macros to simplify specifying the type. |
| 88 #define SINGLE_VALUE_TYPE_AND_VALUE(command_line_switch, switch_value) \ | 86 #define SINGLE_VALUE_TYPE_AND_VALUE(command_line_switch, switch_value) \ |
| 89 Experiment::SINGLE_VALUE, \ | 87 FeatureEntry::SINGLE_VALUE, \ |
| 90 command_line_switch, switch_value, NULL, NULL, NULL, 0 | 88 command_line_switch, switch_value, NULL, NULL, NULL, 0 |
| 91 #define SINGLE_VALUE_TYPE(command_line_switch) \ | 89 #define SINGLE_VALUE_TYPE(command_line_switch) \ |
| 92 SINGLE_VALUE_TYPE_AND_VALUE(command_line_switch, "") | 90 SINGLE_VALUE_TYPE_AND_VALUE(command_line_switch, "") |
| 93 #define SINGLE_DISABLE_VALUE_TYPE_AND_VALUE(command_line_switch, switch_value) \ | 91 #define SINGLE_DISABLE_VALUE_TYPE_AND_VALUE(command_line_switch, switch_value) \ |
| 94 Experiment::SINGLE_DISABLE_VALUE, \ | 92 FeatureEntry::SINGLE_DISABLE_VALUE, \ |
| 95 command_line_switch, switch_value, NULL, NULL, NULL, 0 | 93 command_line_switch, switch_value, NULL, NULL, NULL, 0 |
| 96 #define SINGLE_DISABLE_VALUE_TYPE(command_line_switch) \ | 94 #define SINGLE_DISABLE_VALUE_TYPE(command_line_switch) \ |
| 97 SINGLE_DISABLE_VALUE_TYPE_AND_VALUE(command_line_switch, "") | 95 SINGLE_DISABLE_VALUE_TYPE_AND_VALUE(command_line_switch, "") |
| 98 #define ENABLE_DISABLE_VALUE_TYPE_AND_VALUE(enable_switch, enable_value, \ | 96 #define ENABLE_DISABLE_VALUE_TYPE_AND_VALUE(enable_switch, enable_value, \ |
| 99 disable_switch, disable_value) \ | 97 disable_switch, disable_value) \ |
| 100 Experiment::ENABLE_DISABLE_VALUE, enable_switch, enable_value, \ | 98 FeatureEntry::ENABLE_DISABLE_VALUE, enable_switch, enable_value, \ |
| 101 disable_switch, disable_value, NULL, 3 | 99 disable_switch, disable_value, NULL, 3 |
| 102 #define ENABLE_DISABLE_VALUE_TYPE(enable_switch, disable_switch) \ | 100 #define ENABLE_DISABLE_VALUE_TYPE(enable_switch, disable_switch) \ |
| 103 ENABLE_DISABLE_VALUE_TYPE_AND_VALUE(enable_switch, "", disable_switch, "") | 101 ENABLE_DISABLE_VALUE_TYPE_AND_VALUE(enable_switch, "", disable_switch, "") |
| 104 #define MULTI_VALUE_TYPE(choices) \ | 102 #define MULTI_VALUE_TYPE(choices) \ |
| 105 Experiment::MULTI_VALUE, NULL, NULL, NULL, NULL, choices, arraysize(choices) | 103 FeatureEntry::MULTI_VALUE, NULL, NULL, NULL, NULL, choices, \ |
| 104 arraysize(choices) |
| 106 | 105 |
| 107 namespace { | 106 namespace { |
| 108 | 107 |
| 109 // Enumeration of OSs. | 108 // Enumeration of OSs. |
| 110 enum { | 109 enum { |
| 111 kOsMac = 1 << 0, | 110 kOsMac = 1 << 0, |
| 112 kOsWin = 1 << 1, | 111 kOsWin = 1 << 1, |
| 113 kOsLinux = 1 << 2, | 112 kOsLinux = 1 << 2, |
| 114 kOsCrOS = 1 << 3, | 113 kOsCrOS = 1 << 3, |
| 115 kOsAndroid = 1 << 4, | 114 kOsAndroid = 1 << 4, |
| 116 kOsCrOSOwnerOnly = 1 << 5 | 115 kOsCrOSOwnerOnly = 1 << 5 |
| 117 }; | 116 }; |
| 118 | 117 |
| 119 const unsigned kOsAll = kOsMac | kOsWin | kOsLinux | kOsCrOS | kOsAndroid; | 118 const unsigned kOsAll = kOsMac | kOsWin | kOsLinux | kOsCrOS | kOsAndroid; |
| 120 const unsigned kOsDesktop = kOsMac | kOsWin | kOsLinux | kOsCrOS; | 119 const unsigned kOsDesktop = kOsMac | kOsWin | kOsLinux | kOsCrOS; |
| 121 | 120 |
| 122 // Adds a |StringValue| to |list| for each platform where |bitmask| indicates | 121 // Adds a |StringValue| to |list| for each platform where |bitmask| indicates |
| 123 // whether the experiment is available on that platform. | 122 // whether the entry is available on that platform. |
| 124 void AddOsStrings(unsigned bitmask, base::ListValue* list) { | 123 void AddOsStrings(unsigned bitmask, base::ListValue* list) { |
| 125 struct { | 124 struct { |
| 126 unsigned bit; | 125 unsigned bit; |
| 127 const char* const name; | 126 const char* const name; |
| 128 } kBitsToOs[] = { | 127 } kBitsToOs[] = { |
| 129 {kOsMac, "Mac"}, | 128 {kOsMac, "Mac"}, |
| 130 {kOsWin, "Windows"}, | 129 {kOsWin, "Windows"}, |
| 131 {kOsLinux, "Linux"}, | 130 {kOsLinux, "Linux"}, |
| 132 {kOsCrOS, "Chrome OS"}, | 131 {kOsCrOS, "Chrome OS"}, |
| 133 {kOsAndroid, "Android"}, | 132 {kOsAndroid, "Android"}, |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 165 first = std::find(cmdline.argv().begin(), cmdline.argv().end(), | 164 first = std::find(cmdline.argv().begin(), cmdline.argv().end(), |
| 166 GetSwitchString(chromeos::switches::kPolicySwitchesBegin)); | 165 GetSwitchString(chromeos::switches::kPolicySwitchesBegin)); |
| 167 last = std::find(cmdline.argv().begin(), cmdline.argv().end(), | 166 last = std::find(cmdline.argv().begin(), cmdline.argv().end(), |
| 168 GetSwitchString(chromeos::switches::kPolicySwitchesEnd)); | 167 GetSwitchString(chromeos::switches::kPolicySwitchesEnd)); |
| 169 if (first != cmdline.argv().end() && last != cmdline.argv().end()) | 168 if (first != cmdline.argv().end() && last != cmdline.argv().end()) |
| 170 flags.insert(first + 1, last); | 169 flags.insert(first + 1, last); |
| 171 #endif | 170 #endif |
| 172 return flags; | 171 return flags; |
| 173 } | 172 } |
| 174 | 173 |
| 175 const Experiment::Choice kTouchEventsChoices[] = { | 174 const FeatureEntry::Choice kTouchEventsChoices[] = { |
| 176 { IDS_GENERIC_EXPERIMENT_CHOICE_AUTOMATIC, "", "" }, | 175 { IDS_GENERIC_EXPERIMENT_CHOICE_AUTOMATIC, "", "" }, |
| 177 { IDS_GENERIC_EXPERIMENT_CHOICE_ENABLED, | 176 { IDS_GENERIC_EXPERIMENT_CHOICE_ENABLED, |
| 178 switches::kTouchEvents, | 177 switches::kTouchEvents, |
| 179 switches::kTouchEventsEnabled }, | 178 switches::kTouchEventsEnabled }, |
| 180 { IDS_GENERIC_EXPERIMENT_CHOICE_DISABLED, | 179 { IDS_GENERIC_EXPERIMENT_CHOICE_DISABLED, |
| 181 switches::kTouchEvents, | 180 switches::kTouchEvents, |
| 182 switches::kTouchEventsDisabled } | 181 switches::kTouchEventsDisabled } |
| 183 }; | 182 }; |
| 184 | 183 |
| 185 #if defined(USE_AURA) | 184 #if defined(USE_AURA) |
| 186 const Experiment::Choice kOverscrollHistoryNavigationChoices[] = { | 185 const FeatureEntry::Choice kOverscrollHistoryNavigationChoices[] = { |
| 187 { IDS_GENERIC_EXPERIMENT_CHOICE_ENABLED, "", "" }, | 186 { IDS_GENERIC_EXPERIMENT_CHOICE_ENABLED, "", "" }, |
| 188 { IDS_GENERIC_EXPERIMENT_CHOICE_DISABLED, | 187 { IDS_GENERIC_EXPERIMENT_CHOICE_DISABLED, |
| 189 switches::kOverscrollHistoryNavigation, | 188 switches::kOverscrollHistoryNavigation, |
| 190 "0" }, | 189 "0" }, |
| 191 { IDS_OVERSCROLL_HISTORY_NAVIGATION_SIMPLE_UI, | 190 { IDS_OVERSCROLL_HISTORY_NAVIGATION_SIMPLE_UI, |
| 192 switches::kOverscrollHistoryNavigation, | 191 switches::kOverscrollHistoryNavigation, |
| 193 "2" } | 192 "2" } |
| 194 }; | 193 }; |
| 195 #endif | 194 #endif |
| 196 | 195 |
| 197 const Experiment::Choice kTouchTextSelectionStrategyChoices[] = { | 196 const FeatureEntry::Choice kTouchTextSelectionStrategyChoices[] = { |
| 198 { IDS_GENERIC_EXPERIMENT_CHOICE_DEFAULT, "", "" }, | 197 { IDS_GENERIC_EXPERIMENT_CHOICE_DEFAULT, "", "" }, |
| 199 { IDS_TOUCH_SELECTION_STRATEGY_CHARACTER, | 198 { IDS_TOUCH_SELECTION_STRATEGY_CHARACTER, |
| 200 switches::kTouchTextSelectionStrategy, | 199 switches::kTouchTextSelectionStrategy, |
| 201 "character" }, | 200 "character" }, |
| 202 { IDS_TOUCH_SELECTION_STRATEGY_DIRECTION, | 201 { IDS_TOUCH_SELECTION_STRATEGY_DIRECTION, |
| 203 switches::kTouchTextSelectionStrategy, | 202 switches::kTouchTextSelectionStrategy, |
| 204 "direction" } | 203 "direction" } |
| 205 }; | 204 }; |
| 206 | 205 |
| 207 const Experiment::Choice kTraceUploadURL[] = { | 206 const FeatureEntry::Choice kTraceUploadURL[] = { |
| 208 { IDS_GENERIC_EXPERIMENT_CHOICE_DISABLED, "", "" }, | 207 { IDS_GENERIC_EXPERIMENT_CHOICE_DISABLED, "", "" }, |
| 209 { IDS_TRACE_UPLOAD_URL_CHOICE_OTHER, switches::kTraceUploadURL, | 208 { IDS_TRACE_UPLOAD_URL_CHOICE_OTHER, switches::kTraceUploadURL, |
| 210 "https://performance-insights.appspot.com/upload?tags=flags,Other"}, | 209 "https://performance-insights.appspot.com/upload?tags=flags,Other"}, |
| 211 { IDS_TRACE_UPLOAD_URL_CHOICE_EMLOADING, switches::kTraceUploadURL, | 210 { IDS_TRACE_UPLOAD_URL_CHOICE_EMLOADING, switches::kTraceUploadURL, |
| 212 "https://performance-insights.appspot.com/upload?tags=flags,emloading" }, | 211 "https://performance-insights.appspot.com/upload?tags=flags,emloading" }, |
| 213 { IDS_TRACE_UPLOAD_URL_CHOICE_QA, switches::kTraceUploadURL, | 212 { IDS_TRACE_UPLOAD_URL_CHOICE_QA, switches::kTraceUploadURL, |
| 214 "https://performance-insights.appspot.com/upload?tags=flags,QA" }, | 213 "https://performance-insights.appspot.com/upload?tags=flags,QA" }, |
| 215 { IDS_TRACE_UPLOAD_URL_CHOICE_TESTING, switches::kTraceUploadURL, | 214 { IDS_TRACE_UPLOAD_URL_CHOICE_TESTING, switches::kTraceUploadURL, |
| 216 "https://performance-insights.appspot.com/upload?tags=flags,TestingTeam" } | 215 "https://performance-insights.appspot.com/upload?tags=flags,TestingTeam" } |
| 217 }; | 216 }; |
| 218 | 217 |
| 219 #if !defined(DISABLE_NACL) | 218 #if !defined(DISABLE_NACL) |
| 220 const Experiment::Choice kNaClDebugMaskChoices[] = { | 219 const FeatureEntry::Choice kNaClDebugMaskChoices[] = { |
| 221 // Secure shell can be used on ChromeOS for forwarding the TCP port opened by | 220 // Secure shell can be used on ChromeOS for forwarding the TCP port opened by |
| 222 // debug stub to a remote machine. Since secure shell uses NaCl, we usually | 221 // debug stub to a remote machine. Since secure shell uses NaCl, we usually |
| 223 // want to avoid debugging that. The PNaCl translator is also a NaCl module, | 222 // want to avoid debugging that. The PNaCl translator is also a NaCl module, |
| 224 // so by default we want to avoid debugging that. | 223 // so by default we want to avoid debugging that. |
| 225 // NOTE: As the default value must be the empty string, the mask excluding | 224 // NOTE: As the default value must be the empty string, the mask excluding |
| 226 // the PNaCl translator and secure shell is substituted elsewhere. | 225 // the PNaCl translator and secure shell is substituted elsewhere. |
| 227 { IDS_NACL_DEBUG_MASK_CHOICE_EXCLUDE_UTILS_PNACL, "", "" }, | 226 { IDS_NACL_DEBUG_MASK_CHOICE_EXCLUDE_UTILS_PNACL, "", "" }, |
| 228 { IDS_NACL_DEBUG_MASK_CHOICE_DEBUG_ALL, switches::kNaClDebugMask, "*://*" }, | 227 { IDS_NACL_DEBUG_MASK_CHOICE_DEBUG_ALL, switches::kNaClDebugMask, "*://*" }, |
| 229 { IDS_NACL_DEBUG_MASK_CHOICE_INCLUDE_DEBUG, | 228 { IDS_NACL_DEBUG_MASK_CHOICE_INCLUDE_DEBUG, |
| 230 switches::kNaClDebugMask, "*://*/*debug.nmf" } | 229 switches::kNaClDebugMask, "*://*/*debug.nmf" } |
| 231 }; | 230 }; |
| 232 #endif | 231 #endif |
| 233 | 232 |
| 234 const Experiment::Choice kMarkNonSecureAsChoices[] = { | 233 const FeatureEntry::Choice kMarkNonSecureAsChoices[] = { |
| 235 { IDS_GENERIC_EXPERIMENT_CHOICE_DEFAULT, "", "" }, | 234 { IDS_GENERIC_EXPERIMENT_CHOICE_DEFAULT, "", "" }, |
| 236 { IDS_MARK_NON_SECURE_AS_NEUTRAL, | 235 { IDS_MARK_NON_SECURE_AS_NEUTRAL, |
| 237 switches::kMarkNonSecureAs, switches::kMarkNonSecureAsNeutral}, | 236 switches::kMarkNonSecureAs, switches::kMarkNonSecureAsNeutral}, |
| 238 { IDS_MARK_NON_SECURE_AS_NON_SECURE, | 237 { IDS_MARK_NON_SECURE_AS_NON_SECURE, |
| 239 switches::kMarkNonSecureAs, switches::kMarkNonSecureAsNonSecure} | 238 switches::kMarkNonSecureAs, switches::kMarkNonSecureAsNonSecure} |
| 240 }; | 239 }; |
| 241 | 240 |
| 242 const Experiment::Choice kDataReductionProxyLoFiChoices[] = { | 241 const FeatureEntry::Choice kDataReductionProxyLoFiChoices[] = { |
| 243 { IDS_GENERIC_EXPERIMENT_CHOICE_DEFAULT, "", "" }, | 242 { IDS_GENERIC_EXPERIMENT_CHOICE_DEFAULT, "", "" }, |
| 244 { IDS_FLAGS_DATA_REDUCTION_PROXY_LO_FI_ALWAYS_ON, | 243 { IDS_FLAGS_DATA_REDUCTION_PROXY_LO_FI_ALWAYS_ON, |
| 245 data_reduction_proxy::switches::kDataReductionProxyLoFi, | 244 data_reduction_proxy::switches::kDataReductionProxyLoFi, |
| 246 data_reduction_proxy::switches::kDataReductionProxyLoFiValueAlwaysOn}, | 245 data_reduction_proxy::switches::kDataReductionProxyLoFiValueAlwaysOn}, |
| 247 { IDS_FLAGS_DATA_REDUCTION_PROXY_LO_FI_CELLULAR_ONLY, | 246 { IDS_FLAGS_DATA_REDUCTION_PROXY_LO_FI_CELLULAR_ONLY, |
| 248 data_reduction_proxy::switches::kDataReductionProxyLoFi, | 247 data_reduction_proxy::switches::kDataReductionProxyLoFi, |
| 249 data_reduction_proxy::switches:: | 248 data_reduction_proxy::switches:: |
| 250 kDataReductionProxyLoFiValueCellularOnly}, | 249 kDataReductionProxyLoFiValueCellularOnly}, |
| 251 { IDS_FLAGS_DATA_REDUCTION_PROXY_LO_FI_DISABLED, | 250 { IDS_FLAGS_DATA_REDUCTION_PROXY_LO_FI_DISABLED, |
| 252 data_reduction_proxy::switches::kDataReductionProxyLoFi, | 251 data_reduction_proxy::switches::kDataReductionProxyLoFi, |
| 253 data_reduction_proxy::switches::kDataReductionProxyLoFiValueDisabled}, | 252 data_reduction_proxy::switches::kDataReductionProxyLoFiValueDisabled}, |
| 254 { IDS_FLAGS_DATA_REDUCTION_PROXY_LO_FI_SLOW_CONNECTIONS_ONLY, | 253 { IDS_FLAGS_DATA_REDUCTION_PROXY_LO_FI_SLOW_CONNECTIONS_ONLY, |
| 255 data_reduction_proxy::switches::kDataReductionProxyLoFi, | 254 data_reduction_proxy::switches::kDataReductionProxyLoFi, |
| 256 data_reduction_proxy::switches:: | 255 data_reduction_proxy::switches:: |
| 257 kDataReductionProxyLoFiValueSlowConnectionsOnly} | 256 kDataReductionProxyLoFiValueSlowConnectionsOnly} |
| 258 }; | 257 }; |
| 259 | 258 |
| 260 const Experiment::Choice kShowSavedCopyChoices[] = { | 259 const FeatureEntry::Choice kShowSavedCopyChoices[] = { |
| 261 { IDS_GENERIC_EXPERIMENT_CHOICE_DEFAULT, "", "" }, | 260 { IDS_GENERIC_EXPERIMENT_CHOICE_DEFAULT, "", "" }, |
| 262 { IDS_FLAGS_ENABLE_SHOW_SAVED_COPY_PRIMARY, | 261 { IDS_FLAGS_ENABLE_SHOW_SAVED_COPY_PRIMARY, |
| 263 switches::kShowSavedCopy, switches::kEnableShowSavedCopyPrimary }, | 262 switches::kShowSavedCopy, switches::kEnableShowSavedCopyPrimary }, |
| 264 { IDS_FLAGS_ENABLE_SHOW_SAVED_COPY_SECONDARY, | 263 { IDS_FLAGS_ENABLE_SHOW_SAVED_COPY_SECONDARY, |
| 265 switches::kShowSavedCopy, switches::kEnableShowSavedCopySecondary }, | 264 switches::kShowSavedCopy, switches::kEnableShowSavedCopySecondary }, |
| 266 { IDS_FLAGS_DISABLE_SHOW_SAVED_COPY, | 265 { IDS_FLAGS_DISABLE_SHOW_SAVED_COPY, |
| 267 switches::kShowSavedCopy, switches::kDisableShowSavedCopy } | 266 switches::kShowSavedCopy, switches::kDisableShowSavedCopy } |
| 268 }; | 267 }; |
| 269 | 268 |
| 270 const Experiment::Choice kDefaultTileWidthChoices[] = { | 269 const FeatureEntry::Choice kDefaultTileWidthChoices[] = { |
| 271 { IDS_GENERIC_EXPERIMENT_CHOICE_DEFAULT, "", "" }, | 270 { IDS_GENERIC_EXPERIMENT_CHOICE_DEFAULT, "", "" }, |
| 272 { IDS_FLAGS_DEFAULT_TILE_WIDTH_SHORT, | 271 { IDS_FLAGS_DEFAULT_TILE_WIDTH_SHORT, |
| 273 switches::kDefaultTileWidth, "128"}, | 272 switches::kDefaultTileWidth, "128"}, |
| 274 { IDS_FLAGS_DEFAULT_TILE_WIDTH_TALL, | 273 { IDS_FLAGS_DEFAULT_TILE_WIDTH_TALL, |
| 275 switches::kDefaultTileWidth, "256"}, | 274 switches::kDefaultTileWidth, "256"}, |
| 276 { IDS_FLAGS_DEFAULT_TILE_WIDTH_GRANDE, | 275 { IDS_FLAGS_DEFAULT_TILE_WIDTH_GRANDE, |
| 277 switches::kDefaultTileWidth, "512"}, | 276 switches::kDefaultTileWidth, "512"}, |
| 278 { IDS_FLAGS_DEFAULT_TILE_WIDTH_VENTI, | 277 { IDS_FLAGS_DEFAULT_TILE_WIDTH_VENTI, |
| 279 switches::kDefaultTileWidth, "1024"} | 278 switches::kDefaultTileWidth, "1024"} |
| 280 }; | 279 }; |
| 281 | 280 |
| 282 const Experiment::Choice kDefaultTileHeightChoices[] = { | 281 const FeatureEntry::Choice kDefaultTileHeightChoices[] = { |
| 283 { IDS_GENERIC_EXPERIMENT_CHOICE_DEFAULT, "", "" }, | 282 { IDS_GENERIC_EXPERIMENT_CHOICE_DEFAULT, "", "" }, |
| 284 { IDS_FLAGS_DEFAULT_TILE_HEIGHT_SHORT, | 283 { IDS_FLAGS_DEFAULT_TILE_HEIGHT_SHORT, |
| 285 switches::kDefaultTileHeight, "128"}, | 284 switches::kDefaultTileHeight, "128"}, |
| 286 { IDS_FLAGS_DEFAULT_TILE_HEIGHT_TALL, | 285 { IDS_FLAGS_DEFAULT_TILE_HEIGHT_TALL, |
| 287 switches::kDefaultTileHeight, "256"}, | 286 switches::kDefaultTileHeight, "256"}, |
| 288 { IDS_FLAGS_DEFAULT_TILE_HEIGHT_GRANDE, | 287 { IDS_FLAGS_DEFAULT_TILE_HEIGHT_GRANDE, |
| 289 switches::kDefaultTileHeight, "512"}, | 288 switches::kDefaultTileHeight, "512"}, |
| 290 { IDS_FLAGS_DEFAULT_TILE_HEIGHT_VENTI, | 289 { IDS_FLAGS_DEFAULT_TILE_HEIGHT_VENTI, |
| 291 switches::kDefaultTileHeight, "1024"} | 290 switches::kDefaultTileHeight, "1024"} |
| 292 }; | 291 }; |
| 293 | 292 |
| 294 const Experiment::Choice kSimpleCacheBackendChoices[] = { | 293 const FeatureEntry::Choice kSimpleCacheBackendChoices[] = { |
| 295 { IDS_GENERIC_EXPERIMENT_CHOICE_DEFAULT, "", "" }, | 294 { IDS_GENERIC_EXPERIMENT_CHOICE_DEFAULT, "", "" }, |
| 296 { IDS_GENERIC_EXPERIMENT_CHOICE_DISABLED, | 295 { IDS_GENERIC_EXPERIMENT_CHOICE_DISABLED, |
| 297 switches::kUseSimpleCacheBackend, "off" }, | 296 switches::kUseSimpleCacheBackend, "off" }, |
| 298 { IDS_GENERIC_EXPERIMENT_CHOICE_ENABLED, | 297 { IDS_GENERIC_EXPERIMENT_CHOICE_ENABLED, |
| 299 switches::kUseSimpleCacheBackend, "on"} | 298 switches::kUseSimpleCacheBackend, "on"} |
| 300 }; | 299 }; |
| 301 | 300 |
| 302 #if defined(USE_AURA) | 301 #if defined(USE_AURA) |
| 303 const Experiment::Choice kTabCaptureUpscaleQualityChoices[] = { | 302 const FeatureEntry::Choice kTabCaptureUpscaleQualityChoices[] = { |
| 304 { IDS_GENERIC_EXPERIMENT_CHOICE_DEFAULT, "", "" }, | 303 { IDS_GENERIC_EXPERIMENT_CHOICE_DEFAULT, "", "" }, |
| 305 { IDS_FLAGS_TAB_CAPTURE_SCALE_QUALITY_FAST, | 304 { IDS_FLAGS_TAB_CAPTURE_SCALE_QUALITY_FAST, |
| 306 switches::kTabCaptureUpscaleQuality, "fast" }, | 305 switches::kTabCaptureUpscaleQuality, "fast" }, |
| 307 { IDS_FLAGS_TAB_CAPTURE_SCALE_QUALITY_GOOD, | 306 { IDS_FLAGS_TAB_CAPTURE_SCALE_QUALITY_GOOD, |
| 308 switches::kTabCaptureUpscaleQuality, "good" }, | 307 switches::kTabCaptureUpscaleQuality, "good" }, |
| 309 { IDS_FLAGS_TAB_CAPTURE_SCALE_QUALITY_BEST, | 308 { IDS_FLAGS_TAB_CAPTURE_SCALE_QUALITY_BEST, |
| 310 switches::kTabCaptureUpscaleQuality, "best" }, | 309 switches::kTabCaptureUpscaleQuality, "best" }, |
| 311 }; | 310 }; |
| 312 | 311 |
| 313 const Experiment::Choice kTabCaptureDownscaleQualityChoices[] = { | 312 const FeatureEntry::Choice kTabCaptureDownscaleQualityChoices[] = { |
| 314 { IDS_GENERIC_EXPERIMENT_CHOICE_DEFAULT, "", "" }, | 313 { IDS_GENERIC_EXPERIMENT_CHOICE_DEFAULT, "", "" }, |
| 315 { IDS_FLAGS_TAB_CAPTURE_SCALE_QUALITY_FAST, | 314 { IDS_FLAGS_TAB_CAPTURE_SCALE_QUALITY_FAST, |
| 316 switches::kTabCaptureDownscaleQuality, "fast" }, | 315 switches::kTabCaptureDownscaleQuality, "fast" }, |
| 317 { IDS_FLAGS_TAB_CAPTURE_SCALE_QUALITY_GOOD, | 316 { IDS_FLAGS_TAB_CAPTURE_SCALE_QUALITY_GOOD, |
| 318 switches::kTabCaptureDownscaleQuality, "good" }, | 317 switches::kTabCaptureDownscaleQuality, "good" }, |
| 319 { IDS_FLAGS_TAB_CAPTURE_SCALE_QUALITY_BEST, | 318 { IDS_FLAGS_TAB_CAPTURE_SCALE_QUALITY_BEST, |
| 320 switches::kTabCaptureDownscaleQuality, "best" }, | 319 switches::kTabCaptureDownscaleQuality, "best" }, |
| 321 }; | 320 }; |
| 322 #endif | 321 #endif |
| 323 | 322 |
| 324 #if defined(OS_ANDROID) | 323 #if defined(OS_ANDROID) |
| 325 const Experiment::Choice kReaderModeHeuristicsChoices[] = { | 324 const FeatureEntry::Choice kReaderModeHeuristicsChoices[] = { |
| 326 { IDS_GENERIC_EXPERIMENT_CHOICE_DEFAULT, "", ""}, | 325 { IDS_GENERIC_EXPERIMENT_CHOICE_DEFAULT, "", ""}, |
| 327 { IDS_FLAGS_READER_MODE_HEURISTICS_MARKUP, | 326 { IDS_FLAGS_READER_MODE_HEURISTICS_MARKUP, |
| 328 switches::kReaderModeHeuristics, | 327 switches::kReaderModeHeuristics, |
| 329 switches::reader_mode_heuristics::kOGArticle }, | 328 switches::reader_mode_heuristics::kOGArticle }, |
| 330 { IDS_FLAGS_READER_MODE_HEURISTICS_ADABOOST, | 329 { IDS_FLAGS_READER_MODE_HEURISTICS_ADABOOST, |
| 331 switches::kReaderModeHeuristics, | 330 switches::kReaderModeHeuristics, |
| 332 switches::reader_mode_heuristics::kAdaBoost }, | 331 switches::reader_mode_heuristics::kAdaBoost }, |
| 333 { IDS_FLAGS_READER_MODE_HEURISTICS_ALWAYS_ON, | 332 { IDS_FLAGS_READER_MODE_HEURISTICS_ALWAYS_ON, |
| 334 switches::kReaderModeHeuristics, | 333 switches::kReaderModeHeuristics, |
| 335 switches::reader_mode_heuristics::kAlwaysTrue }, | 334 switches::reader_mode_heuristics::kAlwaysTrue }, |
| 336 { IDS_FLAGS_READER_MODE_HEURISTICS_ALWAYS_OFF, | 335 { IDS_FLAGS_READER_MODE_HEURISTICS_ALWAYS_OFF, |
| 337 switches::kReaderModeHeuristics, | 336 switches::kReaderModeHeuristics, |
| 338 switches::reader_mode_heuristics::kNone }, | 337 switches::reader_mode_heuristics::kNone }, |
| 339 }; | 338 }; |
| 340 #endif | 339 #endif |
| 341 | 340 |
| 342 const Experiment::Choice kNumRasterThreadsChoices[] = { | 341 const FeatureEntry::Choice kNumRasterThreadsChoices[] = { |
| 343 { IDS_GENERIC_EXPERIMENT_CHOICE_DEFAULT, "", "" }, | 342 { IDS_GENERIC_EXPERIMENT_CHOICE_DEFAULT, "", "" }, |
| 344 { IDS_FLAGS_NUM_RASTER_THREADS_ONE, switches::kNumRasterThreads, "1" }, | 343 { IDS_FLAGS_NUM_RASTER_THREADS_ONE, switches::kNumRasterThreads, "1" }, |
| 345 { IDS_FLAGS_NUM_RASTER_THREADS_TWO, switches::kNumRasterThreads, "2" }, | 344 { IDS_FLAGS_NUM_RASTER_THREADS_TWO, switches::kNumRasterThreads, "2" }, |
| 346 { IDS_FLAGS_NUM_RASTER_THREADS_THREE, switches::kNumRasterThreads, "3" }, | 345 { IDS_FLAGS_NUM_RASTER_THREADS_THREE, switches::kNumRasterThreads, "3" }, |
| 347 { IDS_FLAGS_NUM_RASTER_THREADS_FOUR, switches::kNumRasterThreads, "4" } | 346 { IDS_FLAGS_NUM_RASTER_THREADS_FOUR, switches::kNumRasterThreads, "4" } |
| 348 }; | 347 }; |
| 349 | 348 |
| 350 const Experiment::Choice kGpuRasterizationMSAASampleCountChoices[] = { | 349 const FeatureEntry::Choice kGpuRasterizationMSAASampleCountChoices[] = { |
| 351 { IDS_GENERIC_EXPERIMENT_CHOICE_DEFAULT, | 350 { IDS_GENERIC_EXPERIMENT_CHOICE_DEFAULT, |
| 352 "", | 351 "", |
| 353 "" }, | 352 "" }, |
| 354 { IDS_FLAGS_GPU_RASTERIZATION_MSAA_SAMPLE_COUNT_ZERO, | 353 { IDS_FLAGS_GPU_RASTERIZATION_MSAA_SAMPLE_COUNT_ZERO, |
| 355 switches::kGpuRasterizationMSAASampleCount, "0" }, | 354 switches::kGpuRasterizationMSAASampleCount, "0" }, |
| 356 { IDS_FLAGS_GPU_RASTERIZATION_MSAA_SAMPLE_COUNT_TWO, | 355 { IDS_FLAGS_GPU_RASTERIZATION_MSAA_SAMPLE_COUNT_TWO, |
| 357 switches::kGpuRasterizationMSAASampleCount, "2" }, | 356 switches::kGpuRasterizationMSAASampleCount, "2" }, |
| 358 { IDS_FLAGS_GPU_RASTERIZATION_MSAA_SAMPLE_COUNT_FOUR, | 357 { IDS_FLAGS_GPU_RASTERIZATION_MSAA_SAMPLE_COUNT_FOUR, |
| 359 switches::kGpuRasterizationMSAASampleCount, "4" }, | 358 switches::kGpuRasterizationMSAASampleCount, "4" }, |
| 360 { IDS_FLAGS_GPU_RASTERIZATION_MSAA_SAMPLE_COUNT_EIGHT, | 359 { IDS_FLAGS_GPU_RASTERIZATION_MSAA_SAMPLE_COUNT_EIGHT, |
| 361 switches::kGpuRasterizationMSAASampleCount, "8" }, | 360 switches::kGpuRasterizationMSAASampleCount, "8" }, |
| 362 { IDS_FLAGS_GPU_RASTERIZATION_MSAA_SAMPLE_COUNT_SIXTEEN, | 361 { IDS_FLAGS_GPU_RASTERIZATION_MSAA_SAMPLE_COUNT_SIXTEEN, |
| 363 switches::kGpuRasterizationMSAASampleCount, "16" }, | 362 switches::kGpuRasterizationMSAASampleCount, "16" }, |
| 364 }; | 363 }; |
| 365 | 364 |
| 366 const Experiment::Choice kEnableGpuRasterizationChoices[] = { | 365 const FeatureEntry::Choice kEnableGpuRasterizationChoices[] = { |
| 367 { IDS_GENERIC_EXPERIMENT_CHOICE_DEFAULT, "", "" }, | 366 { IDS_GENERIC_EXPERIMENT_CHOICE_DEFAULT, "", "" }, |
| 368 { IDS_GENERIC_EXPERIMENT_CHOICE_ENABLED, | 367 { IDS_GENERIC_EXPERIMENT_CHOICE_ENABLED, |
| 369 switches::kEnableGpuRasterization, "" }, | 368 switches::kEnableGpuRasterization, "" }, |
| 370 { IDS_GENERIC_EXPERIMENT_CHOICE_DISABLED, | 369 { IDS_GENERIC_EXPERIMENT_CHOICE_DISABLED, |
| 371 switches::kDisableGpuRasterization, "" }, | 370 switches::kDisableGpuRasterization, "" }, |
| 372 { IDS_FLAGS_FORCE_GPU_RASTERIZATION, | 371 { IDS_FLAGS_FORCE_GPU_RASTERIZATION, |
| 373 switches::kForceGpuRasterization, "" }, | 372 switches::kForceGpuRasterization, "" }, |
| 374 }; | 373 }; |
| 375 | 374 |
| 376 #if defined(OS_CHROMEOS) | 375 #if defined(OS_CHROMEOS) |
| 377 const Experiment::Choice kMemoryPressureThresholdChoices[] = { | 376 const FeatureEntry::Choice kMemoryPressureThresholdChoices[] = { |
| 378 { IDS_GENERIC_EXPERIMENT_CHOICE_DEFAULT, "", "" }, | 377 { IDS_GENERIC_EXPERIMENT_CHOICE_DEFAULT, "", "" }, |
| 379 { IDS_FLAGS_CONSERVATIVE_THRESHOLDS, | 378 { IDS_FLAGS_CONSERVATIVE_THRESHOLDS, |
| 380 chromeos::switches::kMemoryPressureThresholds, | 379 chromeos::switches::kMemoryPressureThresholds, |
| 381 chromeos::switches::kConservativeThreshold }, | 380 chromeos::switches::kConservativeThreshold }, |
| 382 { IDS_FLAGS_AGGRESSIVE_CACHE_DISCARD_THRESHOLDS, | 381 { IDS_FLAGS_AGGRESSIVE_CACHE_DISCARD_THRESHOLDS, |
| 383 chromeos::switches::kMemoryPressureThresholds, | 382 chromeos::switches::kMemoryPressureThresholds, |
| 384 chromeos::switches::kAggressiveCacheDiscardThreshold }, | 383 chromeos::switches::kAggressiveCacheDiscardThreshold }, |
| 385 { IDS_FLAGS_AGGRESSIVE_TAB_DISCARD_THRESHOLDS, | 384 { IDS_FLAGS_AGGRESSIVE_TAB_DISCARD_THRESHOLDS, |
| 386 chromeos::switches::kMemoryPressureThresholds, | 385 chromeos::switches::kMemoryPressureThresholds, |
| 387 chromeos::switches::kAggressiveTabDiscardThreshold }, | 386 chromeos::switches::kAggressiveTabDiscardThreshold }, |
| 388 { IDS_FLAGS_AGGRESSIVE_THRESHOLDS, | 387 { IDS_FLAGS_AGGRESSIVE_THRESHOLDS, |
| 389 chromeos::switches::kMemoryPressureThresholds, | 388 chromeos::switches::kMemoryPressureThresholds, |
| 390 chromeos::switches::kAggressiveThreshold }, | 389 chromeos::switches::kAggressiveThreshold }, |
| 391 }; | 390 }; |
| 392 #endif | 391 #endif |
| 393 | 392 |
| 394 const Experiment::Choice kExtensionContentVerificationChoices[] = { | 393 const FeatureEntry::Choice kExtensionContentVerificationChoices[] = { |
| 395 { IDS_GENERIC_EXPERIMENT_CHOICE_DEFAULT, "", "" }, | 394 { IDS_GENERIC_EXPERIMENT_CHOICE_DEFAULT, "", "" }, |
| 396 { IDS_FLAGS_EXTENSION_CONTENT_VERIFICATION_BOOTSTRAP, | 395 { IDS_FLAGS_EXTENSION_CONTENT_VERIFICATION_BOOTSTRAP, |
| 397 switches::kExtensionContentVerification, | 396 switches::kExtensionContentVerification, |
| 398 switches::kExtensionContentVerificationBootstrap }, | 397 switches::kExtensionContentVerificationBootstrap }, |
| 399 { IDS_FLAGS_EXTENSION_CONTENT_VERIFICATION_ENFORCE, | 398 { IDS_FLAGS_EXTENSION_CONTENT_VERIFICATION_ENFORCE, |
| 400 switches::kExtensionContentVerification, | 399 switches::kExtensionContentVerification, |
| 401 switches::kExtensionContentVerificationEnforce }, | 400 switches::kExtensionContentVerificationEnforce }, |
| 402 { IDS_FLAGS_EXTENSION_CONTENT_VERIFICATION_ENFORCE_STRICT, | 401 { IDS_FLAGS_EXTENSION_CONTENT_VERIFICATION_ENFORCE_STRICT, |
| 403 switches::kExtensionContentVerification, | 402 switches::kExtensionContentVerification, |
| 404 switches::kExtensionContentVerificationEnforceStrict }, | 403 switches::kExtensionContentVerificationEnforceStrict }, |
| 405 }; | 404 }; |
| 406 | 405 |
| 407 const Experiment::Choice kAutofillSyncCredentialChoices[] = { | 406 const FeatureEntry::Choice kAutofillSyncCredentialChoices[] = { |
| 408 { IDS_GENERIC_EXPERIMENT_CHOICE_DEFAULT, "", ""}, | 407 { IDS_GENERIC_EXPERIMENT_CHOICE_DEFAULT, "", ""}, |
| 409 { IDS_ALLOW_AUTOFILL_SYNC_CREDENTIAL, | 408 { IDS_ALLOW_AUTOFILL_SYNC_CREDENTIAL, |
| 410 password_manager::switches::kAllowAutofillSyncCredential, ""}, | 409 password_manager::switches::kAllowAutofillSyncCredential, ""}, |
| 411 { IDS_DISALLOW_AUTOFILL_SYNC_CREDENTIAL_FOR_REAUTH, | 410 { IDS_DISALLOW_AUTOFILL_SYNC_CREDENTIAL_FOR_REAUTH, |
| 412 password_manager::switches::kDisallowAutofillSyncCredentialForReauth, ""}, | 411 password_manager::switches::kDisallowAutofillSyncCredentialForReauth, ""}, |
| 413 { IDS_DISALLOW_AUTOFILL_SYNC_CREDENTIAL, | 412 { IDS_DISALLOW_AUTOFILL_SYNC_CREDENTIAL, |
| 414 password_manager::switches::kDisallowAutofillSyncCredential, ""}, | 413 password_manager::switches::kDisallowAutofillSyncCredential, ""}, |
| 415 }; | 414 }; |
| 416 | 415 |
| 417 const Experiment::Choice kFillOnAccountSelectChoices[] = { | 416 const FeatureEntry::Choice kFillOnAccountSelectChoices[] = { |
| 418 { IDS_GENERIC_EXPERIMENT_CHOICE_DEFAULT, "", "" }, | 417 { IDS_GENERIC_EXPERIMENT_CHOICE_DEFAULT, "", "" }, |
| 419 { IDS_GENERIC_EXPERIMENT_CHOICE_DISABLED, | 418 { IDS_GENERIC_EXPERIMENT_CHOICE_DISABLED, |
| 420 autofill::switches::kDisableFillOnAccountSelect, "" }, | 419 autofill::switches::kDisableFillOnAccountSelect, "" }, |
| 421 { IDS_FLAGS_FILL_ON_ACCOUNT_SELECT_ENABLE_HIGHLIGHTING, | 420 { IDS_FLAGS_FILL_ON_ACCOUNT_SELECT_ENABLE_HIGHLIGHTING, |
| 422 autofill::switches::kEnableFillOnAccountSelect, "" }, | 421 autofill::switches::kEnableFillOnAccountSelect, "" }, |
| 423 { IDS_FLAGS_FILL_ON_ACCOUNT_SELECT_ENABLE_NO_HIGHLIGHTING, | 422 { IDS_FLAGS_FILL_ON_ACCOUNT_SELECT_ENABLE_NO_HIGHLIGHTING, |
| 424 autofill::switches::kEnableFillOnAccountSelectNoHighlighting, "" }, | 423 autofill::switches::kEnableFillOnAccountSelectNoHighlighting, "" }, |
| 425 }; | 424 }; |
| 426 | 425 |
| 427 #if defined(ENABLE_TOPCHROME_MD) | 426 #if defined(ENABLE_TOPCHROME_MD) |
| 428 const Experiment::Choice kTopChromeMaterialDesignChoices[] = { | 427 const FeatureEntry::Choice kTopChromeMaterialDesignChoices[] = { |
| 429 {IDS_FLAGS_TOP_CHROME_MD_NON_MATERIAL, "", ""}, | 428 {IDS_FLAGS_TOP_CHROME_MD_NON_MATERIAL, "", ""}, |
| 430 {IDS_FLAGS_TOP_CHROME_MD_MATERIAL, | 429 {IDS_FLAGS_TOP_CHROME_MD_MATERIAL, |
| 431 switches::kTopChromeMD, | 430 switches::kTopChromeMD, |
| 432 switches::kTopChromeMDMaterial}, | 431 switches::kTopChromeMDMaterial}, |
| 433 {IDS_FLAGS_TOP_CHROME_MD_MATERIAL_HYBRID, | 432 {IDS_FLAGS_TOP_CHROME_MD_MATERIAL_HYBRID, |
| 434 switches::kTopChromeMD, | 433 switches::kTopChromeMD, |
| 435 switches::kTopChromeMDMaterialHybrid}}; | 434 switches::kTopChromeMDMaterialHybrid}}; |
| 436 #endif | 435 #endif |
| 437 | 436 |
| 438 #if defined(OS_CHROMEOS) | 437 #if defined(OS_CHROMEOS) |
| 439 const Experiment::Choice kAshMaterialDesignInkDropAnimationSpeed[] = { | 438 const FeatureEntry::Choice kAshMaterialDesignInkDropAnimationSpeed[] = { |
| 440 {IDS_GENERIC_EXPERIMENT_CHOICE_DEFAULT, "", ""}, | 439 {IDS_GENERIC_EXPERIMENT_CHOICE_DEFAULT, "", ""}, |
| 441 {IDS_FLAGS_MATERIAL_DESIGN_INK_DROP_ANIMATION_FAST, | 440 {IDS_FLAGS_MATERIAL_DESIGN_INK_DROP_ANIMATION_FAST, |
| 442 switches::kMaterialDesignInkDropAnimationSpeed, | 441 switches::kMaterialDesignInkDropAnimationSpeed, |
| 443 switches::kMaterialDesignInkDropAnimationSpeedFast}, | 442 switches::kMaterialDesignInkDropAnimationSpeedFast}, |
| 444 {IDS_FLAGS_MATERIAL_DESIGN_INK_DROP_ANIMATION_SLOW, | 443 {IDS_FLAGS_MATERIAL_DESIGN_INK_DROP_ANIMATION_SLOW, |
| 445 switches::kMaterialDesignInkDropAnimationSpeed, | 444 switches::kMaterialDesignInkDropAnimationSpeed, |
| 446 switches::kMaterialDesignInkDropAnimationSpeedSlow}}; | 445 switches::kMaterialDesignInkDropAnimationSpeedSlow}}; |
| 447 | 446 |
| 448 const Experiment::Choice kDataSaverPromptChoices[] = { | 447 const FeatureEntry::Choice kDataSaverPromptChoices[] = { |
| 449 { IDS_GENERIC_EXPERIMENT_CHOICE_DEFAULT, "", "" }, | 448 { IDS_GENERIC_EXPERIMENT_CHOICE_DEFAULT, "", "" }, |
| 450 { IDS_GENERIC_EXPERIMENT_CHOICE_ENABLED, | 449 { IDS_GENERIC_EXPERIMENT_CHOICE_ENABLED, |
| 451 chromeos::switches::kEnableDataSaverPrompt, "" }, | 450 chromeos::switches::kEnableDataSaverPrompt, "" }, |
| 452 { IDS_GENERIC_EXPERIMENT_CHOICE_DISABLED, | 451 { IDS_GENERIC_EXPERIMENT_CHOICE_DISABLED, |
| 453 chromeos::switches::kDisableDataSaverPrompt, "" }, | 452 chromeos::switches::kDisableDataSaverPrompt, "" }, |
| 454 { IDS_FLAGS_DATASAVER_PROMPT_DEMO_MODE, | 453 { IDS_FLAGS_DATASAVER_PROMPT_DEMO_MODE, |
| 455 chromeos::switches::kEnableDataSaverPrompt, | 454 chromeos::switches::kEnableDataSaverPrompt, |
| 456 chromeos::switches::kDataSaverPromptDemoMode }, | 455 chromeos::switches::kDataSaverPromptDemoMode }, |
| 457 }; | 456 }; |
| 458 | 457 |
| 459 const Experiment::Choice kFloatingVirtualKeyboardChoices[] = { | 458 const FeatureEntry::Choice kFloatingVirtualKeyboardChoices[] = { |
| 460 { IDS_GENERIC_EXPERIMENT_CHOICE_DEFAULT, "", "" }, | 459 { IDS_GENERIC_EXPERIMENT_CHOICE_DEFAULT, "", "" }, |
| 461 { IDS_GENERIC_EXPERIMENT_CHOICE_DISABLED, | 460 { IDS_GENERIC_EXPERIMENT_CHOICE_DISABLED, |
| 462 keyboard::switches::kFloatingVirtualKeyboard, | 461 keyboard::switches::kFloatingVirtualKeyboard, |
| 463 keyboard::switches::kFloatingVirtualKeyboardDisabled}, | 462 keyboard::switches::kFloatingVirtualKeyboardDisabled}, |
| 464 { IDS_GENERIC_EXPERIMENT_CHOICE_ENABLED, | 463 { IDS_GENERIC_EXPERIMENT_CHOICE_ENABLED, |
| 465 keyboard::switches::kFloatingVirtualKeyboard, | 464 keyboard::switches::kFloatingVirtualKeyboard, |
| 466 keyboard::switches::kFloatingVirtualKeyboardEnabled}, | 465 keyboard::switches::kFloatingVirtualKeyboardEnabled}, |
| 467 }; | 466 }; |
| 468 | 467 |
| 469 const Experiment::Choice kSmartVirtualKeyboardChoices[] = { | 468 const FeatureEntry::Choice kSmartVirtualKeyboardChoices[] = { |
| 470 { IDS_GENERIC_EXPERIMENT_CHOICE_DEFAULT, "", "" }, | 469 { IDS_GENERIC_EXPERIMENT_CHOICE_DEFAULT, "", "" }, |
| 471 { IDS_GENERIC_EXPERIMENT_CHOICE_DISABLED, | 470 { IDS_GENERIC_EXPERIMENT_CHOICE_DISABLED, |
| 472 keyboard::switches::kSmartVirtualKeyboard, | 471 keyboard::switches::kSmartVirtualKeyboard, |
| 473 keyboard::switches::kSmartVirtualKeyboardDisabled}, | 472 keyboard::switches::kSmartVirtualKeyboardDisabled}, |
| 474 { IDS_GENERIC_EXPERIMENT_CHOICE_ENABLED, | 473 { IDS_GENERIC_EXPERIMENT_CHOICE_ENABLED, |
| 475 keyboard::switches::kSmartVirtualKeyboard, | 474 keyboard::switches::kSmartVirtualKeyboard, |
| 476 keyboard::switches::kSmartVirtualKeyboardEnabled}, | 475 keyboard::switches::kSmartVirtualKeyboardEnabled}, |
| 477 }; | 476 }; |
| 478 | 477 |
| 479 const Experiment::Choice kGestureTypingChoices[] = { | 478 const FeatureEntry::Choice kGestureTypingChoices[] = { |
| 480 { IDS_GENERIC_EXPERIMENT_CHOICE_DEFAULT, "", "" }, | 479 { IDS_GENERIC_EXPERIMENT_CHOICE_DEFAULT, "", "" }, |
| 481 { IDS_GENERIC_EXPERIMENT_CHOICE_DISABLED, | 480 { IDS_GENERIC_EXPERIMENT_CHOICE_DISABLED, |
| 482 keyboard::switches::kGestureTyping, | 481 keyboard::switches::kGestureTyping, |
| 483 keyboard::switches::kGestureTypingDisabled}, | 482 keyboard::switches::kGestureTypingDisabled}, |
| 484 { IDS_GENERIC_EXPERIMENT_CHOICE_ENABLED, | 483 { IDS_GENERIC_EXPERIMENT_CHOICE_ENABLED, |
| 485 keyboard::switches::kGestureTyping, | 484 keyboard::switches::kGestureTyping, |
| 486 keyboard::switches::kGestureTypingEnabled}, | 485 keyboard::switches::kGestureTypingEnabled}, |
| 487 }; | 486 }; |
| 488 | 487 |
| 489 const Experiment::Choice kGestureEditingChoices[] = { | 488 const FeatureEntry::Choice kGestureEditingChoices[] = { |
| 490 { IDS_GENERIC_EXPERIMENT_CHOICE_DEFAULT, "", "" }, | 489 { IDS_GENERIC_EXPERIMENT_CHOICE_DEFAULT, "", "" }, |
| 491 { IDS_GENERIC_EXPERIMENT_CHOICE_DISABLED, | 490 { IDS_GENERIC_EXPERIMENT_CHOICE_DISABLED, |
| 492 keyboard::switches::kGestureEditing, | 491 keyboard::switches::kGestureEditing, |
| 493 keyboard::switches::kGestureEditingDisabled}, | 492 keyboard::switches::kGestureEditingDisabled}, |
| 494 { IDS_GENERIC_EXPERIMENT_CHOICE_ENABLED, | 493 { IDS_GENERIC_EXPERIMENT_CHOICE_ENABLED, |
| 495 keyboard::switches::kGestureEditing, | 494 keyboard::switches::kGestureEditing, |
| 496 keyboard::switches::kGestureEditingEnabled}, | 495 keyboard::switches::kGestureEditingEnabled}, |
| 497 }; | 496 }; |
| 498 | 497 |
| 499 const Experiment::Choice kDownloadNotificationChoices[] = { | 498 const FeatureEntry::Choice kDownloadNotificationChoices[] = { |
| 500 { IDS_GENERIC_EXPERIMENT_CHOICE_DEFAULT, "", "" }, | 499 { IDS_GENERIC_EXPERIMENT_CHOICE_DEFAULT, "", "" }, |
| 501 { IDS_GENERIC_EXPERIMENT_CHOICE_ENABLED, | 500 { IDS_GENERIC_EXPERIMENT_CHOICE_ENABLED, |
| 502 switches::kEnableDownloadNotification, | 501 switches::kEnableDownloadNotification, |
| 503 "enabled" }, | 502 "enabled" }, |
| 504 { IDS_GENERIC_EXPERIMENT_CHOICE_DISABLED, | 503 { IDS_GENERIC_EXPERIMENT_CHOICE_DISABLED, |
| 505 switches::kEnableDownloadNotification, | 504 switches::kEnableDownloadNotification, |
| 506 "disabled" } | 505 "disabled" } |
| 507 }; | 506 }; |
| 508 #endif | 507 #endif |
| 509 | 508 |
| 510 const Experiment::Choice kSupervisedUserSafeSitesChoices[] = { | 509 const FeatureEntry::Choice kSupervisedUserSafeSitesChoices[] = { |
| 511 { IDS_GENERIC_EXPERIMENT_CHOICE_DEFAULT, "", "" }, | 510 { IDS_GENERIC_EXPERIMENT_CHOICE_DEFAULT, "", "" }, |
| 512 { IDS_GENERIC_EXPERIMENT_CHOICE_ENABLED, | 511 { IDS_GENERIC_EXPERIMENT_CHOICE_ENABLED, |
| 513 switches::kSupervisedUserSafeSites, | 512 switches::kSupervisedUserSafeSites, |
| 514 "enabled" }, | 513 "enabled" }, |
| 515 { IDS_GENERIC_EXPERIMENT_CHOICE_DISABLED, | 514 { IDS_GENERIC_EXPERIMENT_CHOICE_DISABLED, |
| 516 switches::kSupervisedUserSafeSites, | 515 switches::kSupervisedUserSafeSites, |
| 517 "disabled" }, | 516 "disabled" }, |
| 518 { IDS_SUPERVISED_USER_SAFESITES_BLACKLIST_ONLY, | 517 { IDS_SUPERVISED_USER_SAFESITES_BLACKLIST_ONLY, |
| 519 switches::kSupervisedUserSafeSites, | 518 switches::kSupervisedUserSafeSites, |
| 520 "blacklist-only" }, | 519 "blacklist-only" }, |
| 521 { IDS_SUPERVISED_USER_SAFESITES_ONLINE_CHECK_ONLY, | 520 { IDS_SUPERVISED_USER_SAFESITES_ONLINE_CHECK_ONLY, |
| 522 switches::kSupervisedUserSafeSites, | 521 switches::kSupervisedUserSafeSites, |
| 523 "online-check-only" } | 522 "online-check-only" } |
| 524 }; | 523 }; |
| 525 | 524 |
| 526 const Experiment::Choice kV8CacheOptionsChoices[] = { | 525 const FeatureEntry::Choice kV8CacheOptionsChoices[] = { |
| 527 { IDS_GENERIC_EXPERIMENT_CHOICE_DEFAULT, "", "" }, | 526 { IDS_GENERIC_EXPERIMENT_CHOICE_DEFAULT, "", "" }, |
| 528 { IDS_GENERIC_EXPERIMENT_CHOICE_DISABLED, switches::kV8CacheOptions, "none" }, | 527 { IDS_GENERIC_EXPERIMENT_CHOICE_DISABLED, switches::kV8CacheOptions, "none" }, |
| 529 { IDS_FLAGS_V8_CACHE_OPTIONS_PARSE, switches::kV8CacheOptions, "parse" }, | 528 { IDS_FLAGS_V8_CACHE_OPTIONS_PARSE, switches::kV8CacheOptions, "parse" }, |
| 530 { IDS_FLAGS_V8_CACHE_OPTIONS_CODE, switches::kV8CacheOptions, "code" }, | 529 { IDS_FLAGS_V8_CACHE_OPTIONS_CODE, switches::kV8CacheOptions, "code" }, |
| 531 }; | 530 }; |
| 532 | 531 |
| 533 #if defined(OS_ANDROID) | 532 #if defined(OS_ANDROID) |
| 534 const Experiment::Choice kProgressBarAnimationChoices[] = { | 533 const FeatureEntry::Choice kProgressBarAnimationChoices[] = { |
| 535 { IDS_GENERIC_EXPERIMENT_CHOICE_DEFAULT, "", "" }, | 534 { IDS_GENERIC_EXPERIMENT_CHOICE_DEFAULT, "", "" }, |
| 536 { IDS_GENERIC_EXPERIMENT_CHOICE_DISABLED, | 535 { IDS_GENERIC_EXPERIMENT_CHOICE_DISABLED, |
| 537 switches::kProgressBarAnimation, "disabled" }, | 536 switches::kProgressBarAnimation, "disabled" }, |
| 538 { IDS_FLAGS_PROGRESS_BAR_ANIMATION_LINEAR, | 537 { IDS_FLAGS_PROGRESS_BAR_ANIMATION_LINEAR, |
| 539 switches::kProgressBarAnimation, "linear" }, | 538 switches::kProgressBarAnimation, "linear" }, |
| 540 { IDS_FLAGS_PROGRESS_BAR_ANIMATION_SMOOTH, | 539 { IDS_FLAGS_PROGRESS_BAR_ANIMATION_SMOOTH, |
| 541 switches::kProgressBarAnimation, "smooth" }, | 540 switches::kProgressBarAnimation, "smooth" }, |
| 542 { IDS_FLAGS_PROGRESS_BAR_ANIMATION_FAST_START, | 541 { IDS_FLAGS_PROGRESS_BAR_ANIMATION_FAST_START, |
| 543 switches::kProgressBarAnimation, "fast-start" }, | 542 switches::kProgressBarAnimation, "fast-start" }, |
| 544 }; | 543 }; |
| 545 #endif // defined(OS_ANDROID) | 544 #endif // defined(OS_ANDROID) |
| 546 | 545 |
| 547 #if defined(OS_CHROMEOS) | 546 #if defined(OS_CHROMEOS) |
| 548 const Experiment::Choice kCrosRegionsModeChoices[] = { | 547 const FeatureEntry::Choice kCrosRegionsModeChoices[] = { |
| 549 { IDS_FLAGS_CROS_REGIONS_MODE_DEFAULT, "", "" }, | 548 { IDS_FLAGS_CROS_REGIONS_MODE_DEFAULT, "", "" }, |
| 550 { IDS_FLAGS_CROS_REGIONS_MODE_OVERRIDE, chromeos::switches::kCrosRegionsMode, | 549 { IDS_FLAGS_CROS_REGIONS_MODE_OVERRIDE, chromeos::switches::kCrosRegionsMode, |
| 551 chromeos::switches::kCrosRegionsModeOverride }, | 550 chromeos::switches::kCrosRegionsModeOverride }, |
| 552 { IDS_FLAGS_CROS_REGIONS_MODE_HIDE, chromeos::switches::kCrosRegionsMode, | 551 { IDS_FLAGS_CROS_REGIONS_MODE_HIDE, chromeos::switches::kCrosRegionsMode, |
| 553 chromeos::switches::kCrosRegionsModeHide }, | 552 chromeos::switches::kCrosRegionsModeHide }, |
| 554 }; | 553 }; |
| 555 #endif // defined(OS_CHROMEOS) | 554 #endif // defined(OS_CHROMEOS) |
| 556 | 555 |
| 557 #if defined(OS_WIN) | 556 #if defined(OS_WIN) |
| 558 const Experiment::Choice kPpapiWin32kLockdown[] = { | 557 const FeatureEntry::Choice kPpapiWin32kLockdown[] = { |
| 559 {IDS_GENERIC_EXPERIMENT_CHOICE_DEFAULT, "", ""}, | 558 {IDS_GENERIC_EXPERIMENT_CHOICE_DEFAULT, "", ""}, |
| 560 {IDS_GENERIC_EXPERIMENT_CHOICE_DISABLED, | 559 {IDS_GENERIC_EXPERIMENT_CHOICE_DISABLED, |
| 561 switches::kEnableWin32kLockDownMimeTypes, ""}, | 560 switches::kEnableWin32kLockDownMimeTypes, ""}, |
| 562 {IDS_FLAGS_PPAPI_WIN32K_LOCKDOWN_FLASH_ONLY, | 561 {IDS_FLAGS_PPAPI_WIN32K_LOCKDOWN_FLASH_ONLY, |
| 563 switches::kEnableWin32kLockDownMimeTypes, | 562 switches::kEnableWin32kLockDownMimeTypes, |
| 564 "application/x-shockwave-flash,application/futuresplash"}, | 563 "application/x-shockwave-flash,application/futuresplash"}, |
| 565 {IDS_FLAGS_PPAPI_WIN32K_LOCKDOWN_PDF_ONLY, | 564 {IDS_FLAGS_PPAPI_WIN32K_LOCKDOWN_PDF_ONLY, |
| 566 switches::kEnableWin32kLockDownMimeTypes, | 565 switches::kEnableWin32kLockDownMimeTypes, |
| 567 "application/x-google-chrome-pdf,application/pdf"}, | 566 "application/x-google-chrome-pdf,application/pdf"}, |
| 568 {IDS_FLAGS_PPAPI_WIN32K_LOCKDOWN_FLASH_AND_PDF, | 567 {IDS_FLAGS_PPAPI_WIN32K_LOCKDOWN_FLASH_AND_PDF, |
| 569 switches::kEnableWin32kLockDownMimeTypes, | 568 switches::kEnableWin32kLockDownMimeTypes, |
| 570 "application/x-shockwave-flash,application/futuresplash," | 569 "application/x-shockwave-flash,application/futuresplash," |
| 571 "application/x-google-chrome-pdf,application/pdf"}, | 570 "application/x-google-chrome-pdf,application/pdf"}, |
| 572 {IDS_FLAGS_PPAPI_WIN32K_LOCKDOWN_ALL, | 571 {IDS_FLAGS_PPAPI_WIN32K_LOCKDOWN_ALL, |
| 573 switches::kEnableWin32kLockDownMimeTypes, "*"}, | 572 switches::kEnableWin32kLockDownMimeTypes, "*"}, |
| 574 }; | 573 }; |
| 575 #endif // defined(OS_WIN) | 574 #endif // defined(OS_WIN) |
| 576 | 575 |
| 577 // RECORDING USER METRICS FOR FLAGS: | 576 // RECORDING USER METRICS FOR FLAGS: |
| 578 // ----------------------------------------------------------------------------- | 577 // ----------------------------------------------------------------------------- |
| 579 // The first line of the experiment is the internal name. If you'd like to | 578 // The first line of the entry is the internal name. If you'd like to gather |
| 580 // gather statistics about the usage of your flag, you should append a marker | 579 // statistics about the usage of your flag, you should append a marker comment |
| 581 // comment to the end of the feature name, like so: | 580 // to the end of the feature name, like so: |
| 582 // "my-special-feature", // FLAGS:RECORD_UMA | 581 // "my-special-feature", // FLAGS:RECORD_UMA |
| 583 // | 582 // |
| 584 // After doing that, run | 583 // After doing that, run |
| 585 // tools/metrics/actions/extract_actions.py | 584 // tools/metrics/actions/extract_actions.py |
| 586 // to add the metric to actions.xml (which will enable UMA to record your | 585 // to add the metric to actions.xml (which will enable UMA to record your |
| 587 // feature flag), then update the <owner>s and <description> sections. Make sure | 586 // feature flag), then update the <owner>s and <description> sections. Make sure |
| 588 // to include the actions.xml file when you upload your code for review! | 587 // to include the actions.xml file when you upload your code for review! |
| 589 // | 588 // |
| 590 // After your feature has shipped under a flag, you can locate the metrics under | 589 // After your feature has shipped under a flag, you can locate the metrics under |
| 591 // the action name AboutFlags_internal-action-name. Actions are recorded once | 590 // the action name AboutFlags_internal-action-name. Actions are recorded once |
| 592 // per startup, so you should divide this number by AboutFlags_StartupTick to | 591 // per startup, so you should divide this number by AboutFlags_StartupTick to |
| 593 // get a sense of usage. Note that this will not be the same as number of users | 592 // get a sense of usage. Note that this will not be the same as number of users |
| 594 // with a given feature enabled because users can quit and relaunch the | 593 // with a given feature enabled because users can quit and relaunch the |
| 595 // application multiple times over a given time interval. The dashboard also | 594 // application multiple times over a given time interval. The dashboard also |
| 596 // shows you how many (metrics reporting) users have enabled the flag over the | 595 // shows you how many (metrics reporting) users have enabled the flag over the |
| 597 // last seven days. However, note that this is not the same as the number of | 596 // last seven days. However, note that this is not the same as the number of |
| 598 // users who have the flag enabled, since enabling the flag happens once, | 597 // users who have the flag enabled, since enabling the flag happens once, |
| 599 // whereas running with the flag enabled happens until the user flips the flag | 598 // whereas running with the flag enabled happens until the user flips the flag |
| 600 // again. | 599 // again. |
| 601 | 600 |
| 602 // To add a new experiment add to the end of kExperiments. There are two | 601 // To add a new entry, add to the end of kFeatureEntries. There are two |
| 603 // distinct types of experiments: | 602 // distinct types of entries: |
| 604 // . SINGLE_VALUE: experiment is either on or off. Use the SINGLE_VALUE_TYPE | 603 // . SINGLE_VALUE: entry is either on or off. Use the SINGLE_VALUE_TYPE |
| 605 // macro for this type supplying the command line to the macro. | 604 // macro for this type supplying the command line to the macro. |
| 606 // . MULTI_VALUE: a list of choices, the first of which should correspond to a | 605 // . MULTI_VALUE: a list of choices, the first of which should correspond to a |
| 607 // deactivated state for this lab (i.e. no command line option). To specify | 606 // deactivated state for this lab (i.e. no command line option). To specify |
| 608 // this type of experiment use the macro MULTI_VALUE_TYPE supplying it the | 607 // this type of entry use the macro MULTI_VALUE_TYPE supplying it the |
| 609 // array of choices. | 608 // array of choices. |
| 610 // See the documentation of Experiment for details on the fields. | 609 // See the documentation of FeatureEntry for details on the fields. |
| 611 // | 610 // |
| 612 // Command-line switches must have entries in enum "LoginCustomFlags" in | 611 // Command-line switches must have entries in enum "LoginCustomFlags" in |
| 613 // histograms.xml. See note in histograms.xml and don't forget to run | 612 // histograms.xml. See note in histograms.xml and don't forget to run |
| 614 // AboutFlagsHistogramTest unit test to calculate and verify checksum. | 613 // AboutFlagsHistogramTest unit test to calculate and verify checksum. |
| 615 // | 614 // |
| 616 // When adding a new choice, add it to the end of the list. | 615 // When adding a new choice, add it to the end of the list. |
| 617 const Experiment kExperiments[] = { | 616 const FeatureEntry kFeatureEntries[] = { |
| 618 {"ignore-gpu-blacklist", | 617 {"ignore-gpu-blacklist", |
| 619 IDS_FLAGS_IGNORE_GPU_BLACKLIST_NAME, | 618 IDS_FLAGS_IGNORE_GPU_BLACKLIST_NAME, |
| 620 IDS_FLAGS_IGNORE_GPU_BLACKLIST_DESCRIPTION, | 619 IDS_FLAGS_IGNORE_GPU_BLACKLIST_DESCRIPTION, |
| 621 kOsAll, | 620 kOsAll, |
| 622 SINGLE_VALUE_TYPE(switches::kIgnoreGpuBlacklist)}, | 621 SINGLE_VALUE_TYPE(switches::kIgnoreGpuBlacklist)}, |
| 623 #if defined(OS_WIN) | 622 #if defined(OS_WIN) |
| 624 {"disable-direct-write", | 623 {"disable-direct-write", |
| 625 IDS_FLAGS_DISABLE_DIRECT_WRITE_NAME, | 624 IDS_FLAGS_DISABLE_DIRECT_WRITE_NAME, |
| 626 IDS_FLAGS_DISABLE_DIRECT_WRITE_DESCRIPTION, | 625 IDS_FLAGS_DISABLE_DIRECT_WRITE_DESCRIPTION, |
| 627 kOsWin, | 626 kOsWin, |
| (...skipping 1495 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2123 {"enable-ppapi-win32k-lockdown", | 2122 {"enable-ppapi-win32k-lockdown", |
| 2124 IDS_FLAGS_PPAPI_WIN32K_LOCKDOWN_NAME, | 2123 IDS_FLAGS_PPAPI_WIN32K_LOCKDOWN_NAME, |
| 2125 IDS_FLAGS_PPAPI_WIN32K_LOCKDOWN_DESCRIPTION, kOsWin, | 2124 IDS_FLAGS_PPAPI_WIN32K_LOCKDOWN_DESCRIPTION, kOsWin, |
| 2126 MULTI_VALUE_TYPE(kPpapiWin32kLockdown)}, | 2125 MULTI_VALUE_TYPE(kPpapiWin32kLockdown)}, |
| 2127 #endif // defined(OS_WIN) | 2126 #endif // defined(OS_WIN) |
| 2128 // NOTE: Adding new command-line switches requires adding corresponding | 2127 // NOTE: Adding new command-line switches requires adding corresponding |
| 2129 // entries to enum "LoginCustomFlags" in histograms.xml. See note in | 2128 // entries to enum "LoginCustomFlags" in histograms.xml. See note in |
| 2130 // histograms.xml and don't forget to run AboutFlagsHistogramTest unit test. | 2129 // histograms.xml and don't forget to run AboutFlagsHistogramTest unit test. |
| 2131 }; | 2130 }; |
| 2132 | 2131 |
| 2133 const Experiment* experiments = kExperiments; | 2132 const FeatureEntry* g_entries = kFeatureEntries; |
| 2134 size_t num_experiments = arraysize(kExperiments); | 2133 size_t g_num_entries = arraysize(kFeatureEntries); |
| 2135 | 2134 |
| 2136 // Stores and encapsulates the little state that about:flags has. | 2135 // Stores and encapsulates the little state that about:flags has. |
| 2137 class FlagsState { | 2136 class FlagsState { |
| 2138 public: | 2137 public: |
| 2139 FlagsState() : needs_restart_(false) {} | 2138 FlagsState() : needs_restart_(false) {} |
| 2140 void ConvertFlagsToSwitches(flags_ui::FlagsStorage* flags_storage, | 2139 void ConvertFlagsToSwitches(flags_ui::FlagsStorage* flags_storage, |
| 2141 base::CommandLine* command_line, | 2140 base::CommandLine* command_line, |
| 2142 SentinelsMode sentinels); | 2141 SentinelsMode sentinels); |
| 2143 bool IsRestartNeededToCommitChanges(); | 2142 bool IsRestartNeededToCommitChanges(); |
| 2144 void SetExperimentEnabled(flags_ui::FlagsStorage* flags_storage, | 2143 void SetFeatureEntryEnabled(flags_ui::FlagsStorage* flags_storage, |
| 2145 const std::string& internal_name, | 2144 const std::string& internal_name, |
| 2146 bool enable); | 2145 bool enable); |
| 2147 void RemoveFlagsSwitches( | 2146 void RemoveFlagsSwitches( |
| 2148 std::map<std::string, base::CommandLine::StringType>* switch_list); | 2147 std::map<std::string, base::CommandLine::StringType>* switch_list); |
| 2149 void ResetAllFlags(flags_ui::FlagsStorage* flags_storage); | 2148 void ResetAllFlags(flags_ui::FlagsStorage* flags_storage); |
| 2150 void reset(); | 2149 void reset(); |
| 2151 | 2150 |
| 2152 // Returns the singleton instance of this class | 2151 // Returns the singleton instance of this class |
| 2153 static FlagsState* GetInstance() { | 2152 static FlagsState* GetInstance() { |
| 2154 return base::Singleton<FlagsState>::get(); | 2153 return base::Singleton<FlagsState>::get(); |
| 2155 } | 2154 } |
| 2156 | 2155 |
| 2157 private: | 2156 private: |
| 2158 bool needs_restart_; | 2157 bool needs_restart_; |
| 2159 std::map<std::string, std::string> flags_switches_; | 2158 std::map<std::string, std::string> flags_switches_; |
| 2160 | 2159 |
| 2161 DISALLOW_COPY_AND_ASSIGN(FlagsState); | 2160 DISALLOW_COPY_AND_ASSIGN(FlagsState); |
| 2162 }; | 2161 }; |
| 2163 | 2162 |
| 2164 // Adds the internal names for the specified experiment to |names|. | 2163 // Adds the internal names for the specified entry to |names|. |
| 2165 void AddInternalName(const Experiment& e, std::set<std::string>* names) { | 2164 void AddInternalName(const FeatureEntry& e, std::set<std::string>* names) { |
| 2166 if (e.type == Experiment::SINGLE_VALUE || | 2165 if (e.type == FeatureEntry::SINGLE_VALUE || |
| 2167 e.type == Experiment::SINGLE_DISABLE_VALUE) { | 2166 e.type == FeatureEntry::SINGLE_DISABLE_VALUE) { |
| 2168 names->insert(e.internal_name); | 2167 names->insert(e.internal_name); |
| 2169 } else { | 2168 } else { |
| 2170 DCHECK(e.type == Experiment::MULTI_VALUE || | 2169 DCHECK(e.type == FeatureEntry::MULTI_VALUE || |
| 2171 e.type == Experiment::ENABLE_DISABLE_VALUE); | 2170 e.type == FeatureEntry::ENABLE_DISABLE_VALUE); |
| 2172 for (int i = 0; i < e.num_choices; ++i) | 2171 for (int i = 0; i < e.num_choices; ++i) |
| 2173 names->insert(e.NameForChoice(i)); | 2172 names->insert(e.NameForChoice(i)); |
| 2174 } | 2173 } |
| 2175 } | 2174 } |
| 2176 | 2175 |
| 2177 // Confirms that an experiment is valid, used in a DCHECK in | 2176 // Confirms that an entry is valid, used in a DCHECK in |
| 2178 // SanitizeList below. | 2177 // SanitizeList below. |
| 2179 bool ValidateExperiment(const Experiment& e) { | 2178 bool ValidateFeatureEntry(const FeatureEntry& e) { |
| 2180 switch (e.type) { | 2179 switch (e.type) { |
| 2181 case Experiment::SINGLE_VALUE: | 2180 case FeatureEntry::SINGLE_VALUE: |
| 2182 case Experiment::SINGLE_DISABLE_VALUE: | 2181 case FeatureEntry::SINGLE_DISABLE_VALUE: |
| 2183 DCHECK_EQ(0, e.num_choices); | 2182 DCHECK_EQ(0, e.num_choices); |
| 2184 DCHECK(!e.choices); | 2183 DCHECK(!e.choices); |
| 2185 break; | 2184 break; |
| 2186 case Experiment::MULTI_VALUE: | 2185 case FeatureEntry::MULTI_VALUE: |
| 2187 DCHECK_GT(e.num_choices, 0); | 2186 DCHECK_GT(e.num_choices, 0); |
| 2188 DCHECK(e.choices); | 2187 DCHECK(e.choices); |
| 2189 DCHECK(e.choices[0].command_line_switch); | 2188 DCHECK(e.choices[0].command_line_switch); |
| 2190 DCHECK_EQ('\0', e.choices[0].command_line_switch[0]); | 2189 DCHECK_EQ('\0', e.choices[0].command_line_switch[0]); |
| 2191 break; | 2190 break; |
| 2192 case Experiment::ENABLE_DISABLE_VALUE: | 2191 case FeatureEntry::ENABLE_DISABLE_VALUE: |
| 2193 DCHECK_EQ(3, e.num_choices); | 2192 DCHECK_EQ(3, e.num_choices); |
| 2194 DCHECK(!e.choices); | 2193 DCHECK(!e.choices); |
| 2195 DCHECK(e.command_line_switch); | 2194 DCHECK(e.command_line_switch); |
| 2196 DCHECK(e.command_line_value); | 2195 DCHECK(e.command_line_value); |
| 2197 DCHECK(e.disable_command_line_switch); | 2196 DCHECK(e.disable_command_line_switch); |
| 2198 DCHECK(e.disable_command_line_value); | 2197 DCHECK(e.disable_command_line_value); |
| 2199 break; | 2198 break; |
| 2200 default: | 2199 default: |
| 2201 NOTREACHED(); | 2200 NOTREACHED(); |
| 2202 } | 2201 } |
| 2203 return true; | 2202 return true; |
| 2204 } | 2203 } |
| 2205 | 2204 |
| 2206 // Removes all experiments from prefs::kEnabledLabsExperiments that are | 2205 // Removes all entries from prefs::kEnabledLabsExperiments that are |
| 2207 // unknown, to prevent this list to become very long as experiments are added | 2206 // unknown, to prevent this list to become very long as entries are added |
| 2208 // and removed. | 2207 // and removed. |
| 2209 void SanitizeList(flags_ui::FlagsStorage* flags_storage) { | 2208 void SanitizeList(flags_ui::FlagsStorage* flags_storage) { |
| 2210 std::set<std::string> known_experiments; | 2209 std::set<std::string> known_entries; |
| 2211 for (size_t i = 0; i < num_experiments; ++i) { | 2210 for (size_t i = 0; i < g_num_entries; ++i) { |
| 2212 DCHECK(ValidateExperiment(experiments[i])); | 2211 DCHECK(ValidateFeatureEntry(g_entries[i])); |
| 2213 AddInternalName(experiments[i], &known_experiments); | 2212 AddInternalName(g_entries[i], &known_entries); |
| 2214 } | 2213 } |
| 2215 | 2214 |
| 2216 std::set<std::string> enabled_experiments = flags_storage->GetFlags(); | 2215 std::set<std::string> enabled_entries = flags_storage->GetFlags(); |
| 2217 | 2216 |
| 2218 std::set<std::string> new_enabled_experiments = | 2217 std::set<std::string> new_enabled_entries = |
| 2219 base::STLSetIntersection<std::set<std::string> >( | 2218 base::STLSetIntersection<std::set<std::string> >( |
| 2220 known_experiments, enabled_experiments); | 2219 known_entries, enabled_entries); |
| 2221 | 2220 |
| 2222 if (new_enabled_experiments != enabled_experiments) | 2221 if (new_enabled_entries != enabled_entries) |
| 2223 flags_storage->SetFlags(new_enabled_experiments); | 2222 flags_storage->SetFlags(new_enabled_entries); |
| 2224 } | 2223 } |
| 2225 | 2224 |
| 2226 void GetSanitizedEnabledFlags(flags_ui::FlagsStorage* flags_storage, | 2225 void GetSanitizedEnabledFlags(flags_ui::FlagsStorage* flags_storage, |
| 2227 std::set<std::string>* result) { | 2226 std::set<std::string>* result) { |
| 2228 SanitizeList(flags_storage); | 2227 SanitizeList(flags_storage); |
| 2229 *result = flags_storage->GetFlags(); | 2228 *result = flags_storage->GetFlags(); |
| 2230 } | 2229 } |
| 2231 | 2230 |
| 2232 bool SkipConditionalExperiment(const Experiment& experiment) { | 2231 bool SkipConditionalFeatureEntry(const FeatureEntry& entry) { |
| 2233 version_info::Channel channel = chrome::GetChannel(); | 2232 version_info::Channel channel = chrome::GetChannel(); |
| 2234 | 2233 |
| 2235 #if defined(OS_ANDROID) | 2234 #if defined(OS_ANDROID) |
| 2236 // enable-data-reduction-proxy-dev is only available for the Dev/Beta channel. | 2235 // enable-data-reduction-proxy-dev is only available for the Dev/Beta channel. |
| 2237 if (!strcmp("enable-data-reduction-proxy-dev", experiment.internal_name) && | 2236 if (!strcmp("enable-data-reduction-proxy-dev", entry.internal_name) && |
| 2238 channel != version_info::Channel::BETA && | 2237 channel != version_info::Channel::BETA && |
| 2239 channel != version_info::Channel::DEV) { | 2238 channel != version_info::Channel::DEV) { |
| 2240 return true; | 2239 return true; |
| 2241 } | 2240 } |
| 2242 // enable-data-reduction-proxy-alt is only available for the Dev channel. | 2241 // enable-data-reduction-proxy-alt is only available for the Dev channel. |
| 2243 if (!strcmp("enable-data-reduction-proxy-alt", experiment.internal_name) && | 2242 if (!strcmp("enable-data-reduction-proxy-alt", entry.internal_name) && |
| 2244 channel != version_info::Channel::DEV) { | 2243 channel != version_info::Channel::DEV) { |
| 2245 return true; | 2244 return true; |
| 2246 } | 2245 } |
| 2247 // enable-data-reduction-proxy-carrier-test is only available for Chromium | 2246 // enable-data-reduction-proxy-carrier-test is only available for Chromium |
| 2248 // builds and the Canary/Dev channel. | 2247 // builds and the Canary/Dev channel. |
| 2249 if (!strcmp("enable-data-reduction-proxy-carrier-test", | 2248 if (!strcmp("enable-data-reduction-proxy-carrier-test", |
| 2250 experiment.internal_name) && | 2249 entry.internal_name) && |
| 2251 channel != version_info::Channel::DEV && | 2250 channel != version_info::Channel::DEV && |
| 2252 channel != version_info::Channel::CANARY && | 2251 channel != version_info::Channel::CANARY && |
| 2253 channel != version_info::Channel::UNKNOWN) { | 2252 channel != version_info::Channel::UNKNOWN) { |
| 2254 return true; | 2253 return true; |
| 2255 } | 2254 } |
| 2256 #endif | 2255 #endif |
| 2257 | 2256 |
| 2258 // data-reduction-proxy-lo-fi is only available for Chromium builds and | 2257 // data-reduction-proxy-lo-fi is only available for Chromium builds and |
| 2259 // the Canary/Dev/Beta channels. | 2258 // the Canary/Dev/Beta channels. |
| 2260 if (!strcmp("data-reduction-proxy-lo-fi", experiment.internal_name) && | 2259 if (!strcmp("data-reduction-proxy-lo-fi", entry.internal_name) && |
| 2261 channel != version_info::Channel::BETA && | 2260 channel != version_info::Channel::BETA && |
| 2262 channel != version_info::Channel::DEV && | 2261 channel != version_info::Channel::DEV && |
| 2263 channel != version_info::Channel::CANARY && | 2262 channel != version_info::Channel::CANARY && |
| 2264 channel != version_info::Channel::UNKNOWN) { | 2263 channel != version_info::Channel::UNKNOWN) { |
| 2265 return true; | 2264 return true; |
| 2266 } | 2265 } |
| 2267 | 2266 |
| 2268 // enable-data-reduction-proxy-config-client is only available for Chromium | 2267 // enable-data-reduction-proxy-config-client is only available for Chromium |
| 2269 // builds and the Canary/Dev channels. | 2268 // builds and the Canary/Dev channels. |
| 2270 if (!strcmp("enable-data-reduction-proxy-config-client", | 2269 if (!strcmp("enable-data-reduction-proxy-config-client", |
| 2271 experiment.internal_name) && | 2270 entry.internal_name) && |
| 2272 channel != version_info::Channel::DEV && | 2271 channel != version_info::Channel::DEV && |
| 2273 channel != version_info::Channel::CANARY && | 2272 channel != version_info::Channel::CANARY && |
| 2274 channel != version_info::Channel::UNKNOWN) { | 2273 channel != version_info::Channel::UNKNOWN) { |
| 2275 return true; | 2274 return true; |
| 2276 } | 2275 } |
| 2277 | 2276 |
| 2278 #if defined(ENABLE_DATA_REDUCTION_PROXY_DEBUGGING) | 2277 #if defined(ENABLE_DATA_REDUCTION_PROXY_DEBUGGING) |
| 2279 // enable-data-reduction-proxy-bypass-warning is only available for Chromium | 2278 // enable-data-reduction-proxy-bypass-warning is only available for Chromium |
| 2280 // builds and Canary/Dev channel. | 2279 // builds and Canary/Dev channel. |
| 2281 if (!strcmp("enable-data-reduction-proxy-bypass-warnings", | 2280 if (!strcmp("enable-data-reduction-proxy-bypass-warnings", |
| 2282 experiment.internal_name) && | 2281 entry.internal_name) && |
| 2283 channel != version_info::Channel::UNKNOWN && | 2282 channel != version_info::Channel::UNKNOWN && |
| 2284 channel != version_info::Channel::CANARY && | 2283 channel != version_info::Channel::CANARY && |
| 2285 channel != version_info::Channel::DEV) { | 2284 channel != version_info::Channel::DEV) { |
| 2286 return true; | 2285 return true; |
| 2287 } | 2286 } |
| 2288 #endif | 2287 #endif |
| 2289 | 2288 |
| 2290 return false; | 2289 return false; |
| 2291 } | 2290 } |
| 2292 | 2291 |
| 2293 | 2292 |
| 2294 // Variant of GetSanitizedEnabledFlags that also removes any flags that aren't | 2293 // Variant of GetSanitizedEnabledFlags that also removes any flags that aren't |
| 2295 // enabled on the current platform. | 2294 // enabled on the current platform. |
| 2296 void GetSanitizedEnabledFlagsForCurrentPlatform( | 2295 void GetSanitizedEnabledFlagsForCurrentPlatform( |
| 2297 flags_ui::FlagsStorage* flags_storage, | 2296 flags_ui::FlagsStorage* flags_storage, |
| 2298 std::set<std::string>* result) { | 2297 std::set<std::string>* result) { |
| 2299 GetSanitizedEnabledFlags(flags_storage, result); | 2298 GetSanitizedEnabledFlags(flags_storage, result); |
| 2300 | 2299 |
| 2301 // Filter out any experiments that aren't enabled on the current platform. We | 2300 // Filter out any entries that aren't enabled on the current platform. We |
| 2302 // don't remove these from prefs else syncing to a platform with a different | 2301 // don't remove these from prefs else syncing to a platform with a different |
| 2303 // set of experiments would be lossy. | 2302 // set of entries would be lossy. |
| 2304 std::set<std::string> platform_experiments; | 2303 std::set<std::string> platform_entries; |
| 2305 int current_platform = GetCurrentPlatform(); | 2304 int current_platform = GetCurrentPlatform(); |
| 2306 for (size_t i = 0; i < num_experiments; ++i) { | 2305 for (size_t i = 0; i < g_num_entries; ++i) { |
| 2307 if (experiments[i].supported_platforms & current_platform) | 2306 const FeatureEntry& entry = g_entries[i]; |
| 2308 AddInternalName(experiments[i], &platform_experiments); | 2307 if (entry.supported_platforms & current_platform) |
| 2308 AddInternalName(entry, &platform_entries); |
| 2309 #if defined(OS_CHROMEOS) | 2309 #if defined(OS_CHROMEOS) |
| 2310 if (experiments[i].supported_platforms & kOsCrOSOwnerOnly) | 2310 if (g_entries[i].supported_platforms & kOsCrOSOwnerOnly) |
| 2311 AddInternalName(experiments[i], &platform_experiments); | 2311 AddInternalName(entry, &platform_entries); |
| 2312 #endif | 2312 #endif |
| 2313 } | 2313 } |
| 2314 | 2314 |
| 2315 std::set<std::string> new_enabled_experiments = | 2315 std::set<std::string> new_enabled_entries = |
| 2316 base::STLSetIntersection<std::set<std::string> >( | 2316 base::STLSetIntersection<std::set<std::string> >( |
| 2317 platform_experiments, *result); | 2317 platform_entries, *result); |
| 2318 | 2318 |
| 2319 result->swap(new_enabled_experiments); | 2319 result->swap(new_enabled_entries); |
| 2320 } | 2320 } |
| 2321 | 2321 |
| 2322 // Returns true if none of this experiment's options have been enabled. | 2322 // Returns true if none of this entry's options have been enabled. |
| 2323 bool IsDefaultValue( | 2323 bool IsDefaultValue( |
| 2324 const Experiment& experiment, | 2324 const FeatureEntry& entry, |
| 2325 const std::set<std::string>& enabled_experiments) { | 2325 const std::set<std::string>& enabled_entries) { |
| 2326 switch (experiment.type) { | 2326 switch (entry.type) { |
| 2327 case Experiment::SINGLE_VALUE: | 2327 case FeatureEntry::SINGLE_VALUE: |
| 2328 case Experiment::SINGLE_DISABLE_VALUE: | 2328 case FeatureEntry::SINGLE_DISABLE_VALUE: |
| 2329 return enabled_experiments.count(experiment.internal_name) == 0; | 2329 return enabled_entries.count(entry.internal_name) == 0; |
| 2330 case Experiment::MULTI_VALUE: | 2330 case FeatureEntry::MULTI_VALUE: |
| 2331 case Experiment::ENABLE_DISABLE_VALUE: | 2331 case FeatureEntry::ENABLE_DISABLE_VALUE: |
| 2332 for (int i = 0; i < experiment.num_choices; ++i) { | 2332 for (int i = 0; i < entry.num_choices; ++i) { |
| 2333 if (enabled_experiments.count(experiment.NameForChoice(i)) > 0) | 2333 if (enabled_entries.count(entry.NameForChoice(i)) > 0) |
| 2334 return false; | 2334 return false; |
| 2335 } | 2335 } |
| 2336 break; | 2336 break; |
| 2337 default: | 2337 default: |
| 2338 NOTREACHED(); | 2338 NOTREACHED(); |
| 2339 } | 2339 } |
| 2340 return true; | 2340 return true; |
| 2341 } | 2341 } |
| 2342 | 2342 |
| 2343 // Returns the Value representing the choice data in the specified experiment. | 2343 // Returns the Value representing the choice data in the specified entry. |
| 2344 base::Value* CreateChoiceData( | 2344 base::Value* CreateChoiceData( |
| 2345 const Experiment& experiment, | 2345 const FeatureEntry& entry, |
| 2346 const std::set<std::string>& enabled_experiments) { | 2346 const std::set<std::string>& enabled_entries) { |
| 2347 DCHECK(experiment.type == Experiment::MULTI_VALUE || | 2347 DCHECK(entry.type == FeatureEntry::MULTI_VALUE || |
| 2348 experiment.type == Experiment::ENABLE_DISABLE_VALUE); | 2348 entry.type == FeatureEntry::ENABLE_DISABLE_VALUE); |
| 2349 base::ListValue* result = new base::ListValue; | 2349 base::ListValue* result = new base::ListValue; |
| 2350 for (int i = 0; i < experiment.num_choices; ++i) { | 2350 for (int i = 0; i < entry.num_choices; ++i) { |
| 2351 base::DictionaryValue* value = new base::DictionaryValue; | 2351 base::DictionaryValue* value = new base::DictionaryValue; |
| 2352 const std::string name = experiment.NameForChoice(i); | 2352 const std::string name = entry.NameForChoice(i); |
| 2353 value->SetString("internal_name", name); | 2353 value->SetString("internal_name", name); |
| 2354 value->SetString("description", experiment.DescriptionForChoice(i)); | 2354 value->SetString("description", entry.DescriptionForChoice(i)); |
| 2355 value->SetBoolean("selected", enabled_experiments.count(name) > 0); | 2355 value->SetBoolean("selected", enabled_entries.count(name) > 0); |
| 2356 result->Append(value); | 2356 result->Append(value); |
| 2357 } | 2357 } |
| 2358 return result; | 2358 return result; |
| 2359 } | 2359 } |
| 2360 | 2360 |
| 2361 } // namespace | 2361 } // namespace |
| 2362 | 2362 |
| 2363 std::string Experiment::NameForChoice(int index) const { | 2363 std::string FeatureEntry::NameForChoice(int index) const { |
| 2364 DCHECK(type == Experiment::MULTI_VALUE || | 2364 DCHECK(type == FeatureEntry::MULTI_VALUE || |
| 2365 type == Experiment::ENABLE_DISABLE_VALUE); | 2365 type == FeatureEntry::ENABLE_DISABLE_VALUE); |
| 2366 DCHECK_LT(index, num_choices); | 2366 DCHECK_LT(index, num_choices); |
| 2367 return std::string(internal_name) + testing::kMultiSeparator + | 2367 return std::string(internal_name) + testing::kMultiSeparator + |
| 2368 base::IntToString(index); | 2368 base::IntToString(index); |
| 2369 } | 2369 } |
| 2370 | 2370 |
| 2371 base::string16 Experiment::DescriptionForChoice(int index) const { | 2371 base::string16 FeatureEntry::DescriptionForChoice(int index) const { |
| 2372 DCHECK(type == Experiment::MULTI_VALUE || | 2372 DCHECK(type == FeatureEntry::MULTI_VALUE || |
| 2373 type == Experiment::ENABLE_DISABLE_VALUE); | 2373 type == FeatureEntry::ENABLE_DISABLE_VALUE); |
| 2374 DCHECK_LT(index, num_choices); | 2374 DCHECK_LT(index, num_choices); |
| 2375 int description_id; | 2375 int description_id; |
| 2376 if (type == Experiment::ENABLE_DISABLE_VALUE) { | 2376 if (type == FeatureEntry::ENABLE_DISABLE_VALUE) { |
| 2377 const int kEnableDisableDescriptionIds[] = { | 2377 const int kEnableDisableDescriptionIds[] = { |
| 2378 IDS_GENERIC_EXPERIMENT_CHOICE_DEFAULT, | 2378 IDS_GENERIC_EXPERIMENT_CHOICE_DEFAULT, |
| 2379 IDS_GENERIC_EXPERIMENT_CHOICE_ENABLED, | 2379 IDS_GENERIC_EXPERIMENT_CHOICE_ENABLED, |
| 2380 IDS_GENERIC_EXPERIMENT_CHOICE_DISABLED, | 2380 IDS_GENERIC_EXPERIMENT_CHOICE_DISABLED, |
| 2381 }; | 2381 }; |
| 2382 description_id = kEnableDisableDescriptionIds[index]; | 2382 description_id = kEnableDisableDescriptionIds[index]; |
| 2383 } else { | 2383 } else { |
| 2384 description_id = choices[index].description_id; | 2384 description_id = choices[index].description_id; |
| 2385 } | 2385 } |
| 2386 return l10n_util::GetStringUTF16(description_id); | 2386 return l10n_util::GetStringUTF16(description_id); |
| (...skipping 28 matching lines...) Expand all Loading... |
| 2415 new_flags.begin(), | 2415 new_flags.begin(), |
| 2416 new_flags.end(), | 2416 new_flags.end(), |
| 2417 active_flags.begin(), | 2417 active_flags.begin(), |
| 2418 active_flags.end(), | 2418 active_flags.end(), |
| 2419 std::inserter(*out_difference, out_difference->begin())); | 2419 std::inserter(*out_difference, out_difference->begin())); |
| 2420 } | 2420 } |
| 2421 | 2421 |
| 2422 return result; | 2422 return result; |
| 2423 } | 2423 } |
| 2424 | 2424 |
| 2425 void GetFlagsExperimentsData(flags_ui::FlagsStorage* flags_storage, | 2425 void GetFlagFeatureEntries(flags_ui::FlagsStorage* flags_storage, |
| 2426 FlagAccess access, | 2426 FlagAccess access, |
| 2427 base::ListValue* supported_experiments, | 2427 base::ListValue* supported_entries, |
| 2428 base::ListValue* unsupported_experiments) { | 2428 base::ListValue* unsupported_entries) { |
| 2429 std::set<std::string> enabled_experiments; | 2429 std::set<std::string> enabled_entries; |
| 2430 GetSanitizedEnabledFlags(flags_storage, &enabled_experiments); | 2430 GetSanitizedEnabledFlags(flags_storage, &enabled_entries); |
| 2431 | 2431 |
| 2432 int current_platform = GetCurrentPlatform(); | 2432 int current_platform = GetCurrentPlatform(); |
| 2433 | 2433 |
| 2434 for (size_t i = 0; i < num_experiments; ++i) { | 2434 for (size_t i = 0; i < g_num_entries; ++i) { |
| 2435 const Experiment& experiment = experiments[i]; | 2435 const FeatureEntry& entry = g_entries[i]; |
| 2436 if (SkipConditionalExperiment(experiment)) | 2436 if (SkipConditionalFeatureEntry(entry)) |
| 2437 continue; | 2437 continue; |
| 2438 | 2438 |
| 2439 base::DictionaryValue* data = new base::DictionaryValue(); | 2439 base::DictionaryValue* data = new base::DictionaryValue(); |
| 2440 data->SetString("internal_name", experiment.internal_name); | 2440 data->SetString("internal_name", entry.internal_name); |
| 2441 data->SetString("name", | 2441 data->SetString("name", |
| 2442 l10n_util::GetStringUTF16(experiment.visible_name_id)); | 2442 l10n_util::GetStringUTF16(entry.visible_name_id)); |
| 2443 data->SetString("description", | 2443 data->SetString("description", |
| 2444 l10n_util::GetStringUTF16( | 2444 l10n_util::GetStringUTF16( |
| 2445 experiment.visible_description_id)); | 2445 entry.visible_description_id)); |
| 2446 | 2446 |
| 2447 base::ListValue* supported_platforms = new base::ListValue(); | 2447 base::ListValue* supported_platforms = new base::ListValue(); |
| 2448 AddOsStrings(experiment.supported_platforms, supported_platforms); | 2448 AddOsStrings(entry.supported_platforms, supported_platforms); |
| 2449 data->Set("supported_platforms", supported_platforms); | 2449 data->Set("supported_platforms", supported_platforms); |
| 2450 // True if the switch is not currently passed. | 2450 // True if the switch is not currently passed. |
| 2451 bool is_default_value = IsDefaultValue(experiment, enabled_experiments); | 2451 bool is_default_value = IsDefaultValue(entry, enabled_entries); |
| 2452 data->SetBoolean("is_default", is_default_value); | 2452 data->SetBoolean("is_default", is_default_value); |
| 2453 | 2453 |
| 2454 switch (experiment.type) { | 2454 switch (entry.type) { |
| 2455 case Experiment::SINGLE_VALUE: | 2455 case FeatureEntry::SINGLE_VALUE: |
| 2456 case Experiment::SINGLE_DISABLE_VALUE: | 2456 case FeatureEntry::SINGLE_DISABLE_VALUE: |
| 2457 data->SetBoolean( | 2457 data->SetBoolean( |
| 2458 "enabled", | 2458 "enabled", |
| 2459 (!is_default_value && | 2459 (!is_default_value && |
| 2460 experiment.type == Experiment::SINGLE_VALUE) || | 2460 entry.type == FeatureEntry::SINGLE_VALUE) || |
| 2461 (is_default_value && | 2461 (is_default_value && |
| 2462 experiment.type == Experiment::SINGLE_DISABLE_VALUE)); | 2462 entry.type == FeatureEntry::SINGLE_DISABLE_VALUE)); |
| 2463 break; | 2463 break; |
| 2464 case Experiment::MULTI_VALUE: | 2464 case FeatureEntry::MULTI_VALUE: |
| 2465 case Experiment::ENABLE_DISABLE_VALUE: | 2465 case FeatureEntry::ENABLE_DISABLE_VALUE: |
| 2466 data->Set("choices", CreateChoiceData(experiment, enabled_experiments)); | 2466 data->Set("choices", CreateChoiceData(entry, enabled_entries)); |
| 2467 break; | 2467 break; |
| 2468 default: | 2468 default: |
| 2469 NOTREACHED(); | 2469 NOTREACHED(); |
| 2470 } | 2470 } |
| 2471 | 2471 |
| 2472 bool supported = (experiment.supported_platforms & current_platform) != 0; | 2472 bool supported = (entry.supported_platforms & current_platform) != 0; |
| 2473 #if defined(OS_CHROMEOS) | 2473 #if defined(OS_CHROMEOS) |
| 2474 if (access == kOwnerAccessToFlags && | 2474 if (access == kOwnerAccessToFlags && |
| 2475 (experiment.supported_platforms & kOsCrOSOwnerOnly) != 0) { | 2475 (entry.supported_platforms & kOsCrOSOwnerOnly) != 0) { |
| 2476 supported = true; | 2476 supported = true; |
| 2477 } | 2477 } |
| 2478 #endif | 2478 #endif |
| 2479 if (supported) | 2479 if (supported) |
| 2480 supported_experiments->Append(data); | 2480 supported_entries->Append(data); |
| 2481 else | 2481 else |
| 2482 unsupported_experiments->Append(data); | 2482 unsupported_entries->Append(data); |
| 2483 } | 2483 } |
| 2484 } | 2484 } |
| 2485 | 2485 |
| 2486 bool IsRestartNeededToCommitChanges() { | 2486 bool IsRestartNeededToCommitChanges() { |
| 2487 return FlagsState::GetInstance()->IsRestartNeededToCommitChanges(); | 2487 return FlagsState::GetInstance()->IsRestartNeededToCommitChanges(); |
| 2488 } | 2488 } |
| 2489 | 2489 |
| 2490 void SetExperimentEnabled(flags_ui::FlagsStorage* flags_storage, | 2490 void SetFeatureEntryEnabled(flags_ui::FlagsStorage* flags_storage, |
| 2491 const std::string& internal_name, | 2491 const std::string& internal_name, |
| 2492 bool enable) { | 2492 bool enable) { |
| 2493 FlagsState::GetInstance()->SetExperimentEnabled(flags_storage, | 2493 FlagsState::GetInstance()->SetFeatureEntryEnabled(flags_storage, |
| 2494 internal_name, enable); | 2494 internal_name, enable); |
| 2495 } | 2495 } |
| 2496 | 2496 |
| 2497 void RemoveFlagsSwitches( | 2497 void RemoveFlagsSwitches( |
| 2498 std::map<std::string, base::CommandLine::StringType>* switch_list) { | 2498 std::map<std::string, base::CommandLine::StringType>* switch_list) { |
| 2499 FlagsState::GetInstance()->RemoveFlagsSwitches(switch_list); | 2499 FlagsState::GetInstance()->RemoveFlagsSwitches(switch_list); |
| 2500 } | 2500 } |
| 2501 | 2501 |
| 2502 void ResetAllFlags(flags_ui::FlagsStorage* flags_storage) { | 2502 void ResetAllFlags(flags_ui::FlagsStorage* flags_storage) { |
| 2503 FlagsState::GetInstance()->ResetAllFlags(flags_storage); | 2503 FlagsState::GetInstance()->ResetAllFlags(flags_storage); |
| (...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2580 DCHECK(name_to_switch_map->end() == name_to_switch_map->find(key)); | 2580 DCHECK(name_to_switch_map->end() == name_to_switch_map->find(key)); |
| 2581 (*name_to_switch_map)[key] = std::make_pair(switch_name, switch_value); | 2581 (*name_to_switch_map)[key] = std::make_pair(switch_name, switch_value); |
| 2582 } | 2582 } |
| 2583 | 2583 |
| 2584 void FlagsState::ConvertFlagsToSwitches(flags_ui::FlagsStorage* flags_storage, | 2584 void FlagsState::ConvertFlagsToSwitches(flags_ui::FlagsStorage* flags_storage, |
| 2585 base::CommandLine* command_line, | 2585 base::CommandLine* command_line, |
| 2586 SentinelsMode sentinels) { | 2586 SentinelsMode sentinels) { |
| 2587 if (command_line->HasSwitch(switches::kNoExperiments)) | 2587 if (command_line->HasSwitch(switches::kNoExperiments)) |
| 2588 return; | 2588 return; |
| 2589 | 2589 |
| 2590 std::set<std::string> enabled_experiments; | 2590 std::set<std::string> enabled_entries; |
| 2591 | 2591 |
| 2592 GetSanitizedEnabledFlagsForCurrentPlatform(flags_storage, | 2592 GetSanitizedEnabledFlagsForCurrentPlatform(flags_storage, |
| 2593 &enabled_experiments); | 2593 &enabled_entries); |
| 2594 | 2594 |
| 2595 NameToSwitchAndValueMap name_to_switch_map; | 2595 NameToSwitchAndValueMap name_to_switch_map; |
| 2596 for (size_t i = 0; i < num_experiments; ++i) { | 2596 for (size_t i = 0; i < g_num_entries; ++i) { |
| 2597 const Experiment& e = experiments[i]; | 2597 const FeatureEntry& e = g_entries[i]; |
| 2598 if (e.type == Experiment::SINGLE_VALUE || | 2598 if (e.type == FeatureEntry::SINGLE_VALUE || |
| 2599 e.type == Experiment::SINGLE_DISABLE_VALUE) { | 2599 e.type == FeatureEntry::SINGLE_DISABLE_VALUE) { |
| 2600 SetFlagToSwitchMapping(e.internal_name, e.command_line_switch, | 2600 SetFlagToSwitchMapping(e.internal_name, e.command_line_switch, |
| 2601 e.command_line_value, &name_to_switch_map); | 2601 e.command_line_value, &name_to_switch_map); |
| 2602 } else if (e.type == Experiment::MULTI_VALUE) { | 2602 } else if (e.type == FeatureEntry::MULTI_VALUE) { |
| 2603 for (int j = 0; j < e.num_choices; ++j) { | 2603 for (int j = 0; j < e.num_choices; ++j) { |
| 2604 SetFlagToSwitchMapping(e.NameForChoice(j), | 2604 SetFlagToSwitchMapping(e.NameForChoice(j), |
| 2605 e.choices[j].command_line_switch, | 2605 e.choices[j].command_line_switch, |
| 2606 e.choices[j].command_line_value, | 2606 e.choices[j].command_line_value, |
| 2607 &name_to_switch_map); | 2607 &name_to_switch_map); |
| 2608 } | 2608 } |
| 2609 } else { | 2609 } else { |
| 2610 DCHECK_EQ(e.type, Experiment::ENABLE_DISABLE_VALUE); | 2610 DCHECK_EQ(e.type, FeatureEntry::ENABLE_DISABLE_VALUE); |
| 2611 SetFlagToSwitchMapping(e.NameForChoice(0), std::string(), std::string(), | 2611 SetFlagToSwitchMapping(e.NameForChoice(0), std::string(), std::string(), |
| 2612 &name_to_switch_map); | 2612 &name_to_switch_map); |
| 2613 SetFlagToSwitchMapping(e.NameForChoice(1), e.command_line_switch, | 2613 SetFlagToSwitchMapping(e.NameForChoice(1), e.command_line_switch, |
| 2614 e.command_line_value, &name_to_switch_map); | 2614 e.command_line_value, &name_to_switch_map); |
| 2615 SetFlagToSwitchMapping(e.NameForChoice(2), e.disable_command_line_switch, | 2615 SetFlagToSwitchMapping(e.NameForChoice(2), e.disable_command_line_switch, |
| 2616 e.disable_command_line_value, &name_to_switch_map); | 2616 e.disable_command_line_value, &name_to_switch_map); |
| 2617 } | 2617 } |
| 2618 } | 2618 } |
| 2619 | 2619 |
| 2620 if (sentinels == kAddSentinels) { | 2620 if (sentinels == kAddSentinels) { |
| 2621 command_line->AppendSwitch(switches::kFlagSwitchesBegin); | 2621 command_line->AppendSwitch(switches::kFlagSwitchesBegin); |
| 2622 flags_switches_.insert( | 2622 flags_switches_.insert( |
| 2623 std::pair<std::string, std::string>(switches::kFlagSwitchesBegin, | 2623 std::pair<std::string, std::string>(switches::kFlagSwitchesBegin, |
| 2624 std::string())); | 2624 std::string())); |
| 2625 } | 2625 } |
| 2626 for (const std::string& experiment_name : enabled_experiments) { | 2626 for (const std::string& entry_name : enabled_entries) { |
| 2627 NameToSwitchAndValueMap::const_iterator name_to_switch_it = | 2627 NameToSwitchAndValueMap::const_iterator name_to_switch_it = |
| 2628 name_to_switch_map.find(experiment_name); | 2628 name_to_switch_map.find(entry_name); |
| 2629 if (name_to_switch_it == name_to_switch_map.end()) { | 2629 if (name_to_switch_it == name_to_switch_map.end()) { |
| 2630 NOTREACHED(); | 2630 NOTREACHED(); |
| 2631 continue; | 2631 continue; |
| 2632 } | 2632 } |
| 2633 | 2633 |
| 2634 const std::pair<std::string, std::string>& | 2634 const std::pair<std::string, std::string>& |
| 2635 switch_and_value_pair = name_to_switch_it->second; | 2635 switch_and_value_pair = name_to_switch_it->second; |
| 2636 | 2636 |
| 2637 CHECK(!switch_and_value_pair.first.empty()); | 2637 CHECK(!switch_and_value_pair.first.empty()); |
| 2638 command_line->AppendSwitchASCII(switch_and_value_pair.first, | 2638 command_line->AppendSwitchASCII(switch_and_value_pair.first, |
| 2639 switch_and_value_pair.second); | 2639 switch_and_value_pair.second); |
| 2640 flags_switches_[switch_and_value_pair.first] = switch_and_value_pair.second; | 2640 flags_switches_[switch_and_value_pair.first] = switch_and_value_pair.second; |
| 2641 } | 2641 } |
| 2642 if (sentinels == kAddSentinels) { | 2642 if (sentinels == kAddSentinels) { |
| 2643 command_line->AppendSwitch(switches::kFlagSwitchesEnd); | 2643 command_line->AppendSwitch(switches::kFlagSwitchesEnd); |
| 2644 flags_switches_.insert( | 2644 flags_switches_.insert( |
| 2645 std::pair<std::string, std::string>(switches::kFlagSwitchesEnd, | 2645 std::pair<std::string, std::string>(switches::kFlagSwitchesEnd, |
| 2646 std::string())); | 2646 std::string())); |
| 2647 } | 2647 } |
| 2648 } | 2648 } |
| 2649 | 2649 |
| 2650 bool FlagsState::IsRestartNeededToCommitChanges() { | 2650 bool FlagsState::IsRestartNeededToCommitChanges() { |
| 2651 return needs_restart_; | 2651 return needs_restart_; |
| 2652 } | 2652 } |
| 2653 | 2653 |
| 2654 void FlagsState::SetExperimentEnabled(flags_ui::FlagsStorage* flags_storage, | 2654 void FlagsState::SetFeatureEntryEnabled(flags_ui::FlagsStorage* flags_storage, |
| 2655 const std::string& internal_name, | 2655 const std::string& internal_name, |
| 2656 bool enable) { | 2656 bool enable) { |
| 2657 size_t at_index = internal_name.find(testing::kMultiSeparator); | 2657 size_t at_index = internal_name.find(testing::kMultiSeparator); |
| 2658 if (at_index != std::string::npos) { | 2658 if (at_index != std::string::npos) { |
| 2659 DCHECK(enable); | 2659 DCHECK(enable); |
| 2660 // We're being asked to enable a multi-choice experiment. Disable the | 2660 // We're being asked to enable a multi-choice entry. Disable the |
| 2661 // currently selected choice. | 2661 // currently selected choice. |
| 2662 DCHECK_NE(at_index, 0u); | 2662 DCHECK_NE(at_index, 0u); |
| 2663 const std::string experiment_name = internal_name.substr(0, at_index); | 2663 const std::string entry_name = internal_name.substr(0, at_index); |
| 2664 SetExperimentEnabled(flags_storage, experiment_name, false); | 2664 SetFeatureEntryEnabled(flags_storage, entry_name, false); |
| 2665 | 2665 |
| 2666 // And enable the new choice, if it is not the default first choice. | 2666 // And enable the new choice, if it is not the default first choice. |
| 2667 if (internal_name != experiment_name + "@0") { | 2667 if (internal_name != entry_name + "@0") { |
| 2668 std::set<std::string> enabled_experiments; | 2668 std::set<std::string> enabled_entries; |
| 2669 GetSanitizedEnabledFlags(flags_storage, &enabled_experiments); | 2669 GetSanitizedEnabledFlags(flags_storage, &enabled_entries); |
| 2670 needs_restart_ |= enabled_experiments.insert(internal_name).second; | 2670 needs_restart_ |= enabled_entries.insert(internal_name).second; |
| 2671 flags_storage->SetFlags(enabled_experiments); | 2671 flags_storage->SetFlags(enabled_entries); |
| 2672 } | 2672 } |
| 2673 return; | 2673 return; |
| 2674 } | 2674 } |
| 2675 | 2675 |
| 2676 std::set<std::string> enabled_experiments; | 2676 std::set<std::string> enabled_entries; |
| 2677 GetSanitizedEnabledFlags(flags_storage, &enabled_experiments); | 2677 GetSanitizedEnabledFlags(flags_storage, &enabled_entries); |
| 2678 | 2678 |
| 2679 const Experiment* e = NULL; | 2679 const FeatureEntry* e = NULL; |
| 2680 for (size_t i = 0; i < num_experiments; ++i) { | 2680 for (size_t i = 0; i < g_num_entries; ++i) { |
| 2681 if (experiments[i].internal_name == internal_name) { | 2681 if (g_entries[i].internal_name == internal_name) { |
| 2682 e = experiments + i; | 2682 e = g_entries + i; |
| 2683 break; | 2683 break; |
| 2684 } | 2684 } |
| 2685 } | 2685 } |
| 2686 DCHECK(e); | 2686 DCHECK(e); |
| 2687 | 2687 |
| 2688 if (e->type == Experiment::SINGLE_VALUE) { | 2688 if (e->type == FeatureEntry::SINGLE_VALUE) { |
| 2689 if (enable) | 2689 if (enable) |
| 2690 needs_restart_ |= enabled_experiments.insert(internal_name).second; | 2690 needs_restart_ |= enabled_entries.insert(internal_name).second; |
| 2691 else | 2691 else |
| 2692 needs_restart_ |= (enabled_experiments.erase(internal_name) > 0); | 2692 needs_restart_ |= (enabled_entries.erase(internal_name) > 0); |
| 2693 } else if (e->type == Experiment::SINGLE_DISABLE_VALUE) { | 2693 } else if (e->type == FeatureEntry::SINGLE_DISABLE_VALUE) { |
| 2694 if (!enable) | 2694 if (!enable) |
| 2695 needs_restart_ |= enabled_experiments.insert(internal_name).second; | 2695 needs_restart_ |= enabled_entries.insert(internal_name).second; |
| 2696 else | 2696 else |
| 2697 needs_restart_ |= (enabled_experiments.erase(internal_name) > 0); | 2697 needs_restart_ |= (enabled_entries.erase(internal_name) > 0); |
| 2698 } else { | 2698 } else { |
| 2699 if (enable) { | 2699 if (enable) { |
| 2700 // Enable the first choice. | 2700 // Enable the first choice. |
| 2701 needs_restart_ |= enabled_experiments.insert(e->NameForChoice(0)).second; | 2701 needs_restart_ |= enabled_entries.insert(e->NameForChoice(0)).second; |
| 2702 } else { | 2702 } else { |
| 2703 // Find the currently enabled choice and disable it. | 2703 // Find the currently enabled choice and disable it. |
| 2704 for (int i = 0; i < e->num_choices; ++i) { | 2704 for (int i = 0; i < e->num_choices; ++i) { |
| 2705 std::string choice_name = e->NameForChoice(i); | 2705 std::string choice_name = e->NameForChoice(i); |
| 2706 if (enabled_experiments.find(choice_name) != | 2706 if (enabled_entries.find(choice_name) != |
| 2707 enabled_experiments.end()) { | 2707 enabled_entries.end()) { |
| 2708 needs_restart_ = true; | 2708 needs_restart_ = true; |
| 2709 enabled_experiments.erase(choice_name); | 2709 enabled_entries.erase(choice_name); |
| 2710 // Continue on just in case there's a bug and more than one | 2710 // Continue on just in case there's a bug and more than one |
| 2711 // experiment for this choice was enabled. | 2711 // entry for this choice was enabled. |
| 2712 } | 2712 } |
| 2713 } | 2713 } |
| 2714 } | 2714 } |
| 2715 } | 2715 } |
| 2716 | 2716 |
| 2717 flags_storage->SetFlags(enabled_experiments); | 2717 flags_storage->SetFlags(enabled_entries); |
| 2718 } | 2718 } |
| 2719 | 2719 |
| 2720 void FlagsState::RemoveFlagsSwitches( | 2720 void FlagsState::RemoveFlagsSwitches( |
| 2721 std::map<std::string, base::CommandLine::StringType>* switch_list) { | 2721 std::map<std::string, base::CommandLine::StringType>* switch_list) { |
| 2722 for (const auto& entry : flags_switches_) | 2722 for (const auto& entry : flags_switches_) |
| 2723 switch_list->erase(entry.first); | 2723 switch_list->erase(entry.first); |
| 2724 } | 2724 } |
| 2725 | 2725 |
| 2726 void FlagsState::ResetAllFlags(flags_ui::FlagsStorage* flags_storage) { | 2726 void FlagsState::ResetAllFlags(flags_ui::FlagsStorage* flags_storage) { |
| 2727 needs_restart_ = true; | 2727 needs_restart_ = true; |
| 2728 | 2728 |
| 2729 std::set<std::string> no_experiments; | 2729 std::set<std::string> no_entries; |
| 2730 flags_storage->SetFlags(no_experiments); | 2730 flags_storage->SetFlags(no_entries); |
| 2731 } | 2731 } |
| 2732 | 2732 |
| 2733 void FlagsState::reset() { | 2733 void FlagsState::reset() { |
| 2734 needs_restart_ = false; | 2734 needs_restart_ = false; |
| 2735 flags_switches_.clear(); | 2735 flags_switches_.clear(); |
| 2736 } | 2736 } |
| 2737 | 2737 |
| 2738 } // namespace | 2738 } // namespace |
| 2739 | 2739 |
| 2740 namespace testing { | 2740 namespace testing { |
| 2741 | 2741 |
| 2742 // WARNING: '@' is also used in the html file. If you update this constant you | 2742 // WARNING: '@' is also used in the html file. If you update this constant you |
| 2743 // also need to update the html file. | 2743 // also need to update the html file. |
| 2744 const char kMultiSeparator[] = "@"; | 2744 const char kMultiSeparator[] = "@"; |
| 2745 | 2745 |
| 2746 const base::HistogramBase::Sample kBadSwitchFormatHistogramId = 0; | 2746 const base::HistogramBase::Sample kBadSwitchFormatHistogramId = 0; |
| 2747 | 2747 |
| 2748 void ClearState() { | 2748 void ClearState() { |
| 2749 FlagsState::GetInstance()->reset(); | 2749 FlagsState::GetInstance()->reset(); |
| 2750 } | 2750 } |
| 2751 | 2751 |
| 2752 void SetExperiments(const Experiment* e, size_t count) { | 2752 void SetFeatureEntries(const FeatureEntry* entries, size_t count) { |
| 2753 if (!e) { | 2753 if (!entries) { |
| 2754 experiments = kExperiments; | 2754 g_entries = kFeatureEntries; |
| 2755 num_experiments = arraysize(kExperiments); | 2755 g_num_entries = arraysize(kFeatureEntries); |
| 2756 } else { | 2756 } else { |
| 2757 experiments = e; | 2757 g_entries = entries; |
| 2758 num_experiments = count; | 2758 g_num_entries = count; |
| 2759 } | 2759 } |
| 2760 } | 2760 } |
| 2761 | 2761 |
| 2762 const Experiment* GetExperiments(size_t* count) { | 2762 const FeatureEntry* GetFeatureEntries(size_t* count) { |
| 2763 *count = num_experiments; | 2763 *count = g_num_entries; |
| 2764 return experiments; | 2764 return g_entries; |
| 2765 } | 2765 } |
| 2766 | 2766 |
| 2767 } // namespace testing | 2767 } // namespace testing |
| 2768 | 2768 |
| 2769 } // namespace about_flags | 2769 } // namespace about_flags |
| OLD | NEW |