| 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 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 70 #endif | 70 #endif |
| 71 | 71 |
| 72 #if defined(USE_OZONE) | 72 #if defined(USE_OZONE) |
| 73 #include "ui/ozone/public/ozone_switches.h" | 73 #include "ui/ozone/public/ozone_switches.h" |
| 74 #endif | 74 #endif |
| 75 | 75 |
| 76 namespace about_flags { | 76 namespace about_flags { |
| 77 | 77 |
| 78 // Macros to simplify specifying the type. | 78 // Macros to simplify specifying the type. |
| 79 #define SINGLE_VALUE_TYPE_AND_VALUE(command_line_switch, switch_value) \ | 79 #define SINGLE_VALUE_TYPE_AND_VALUE(command_line_switch, switch_value) \ |
| 80 Experiment::SINGLE_VALUE, \ | 80 Entry::SINGLE_VALUE, \ |
| 81 command_line_switch, switch_value, NULL, NULL, NULL, 0 | 81 command_line_switch, switch_value, NULL, NULL, NULL, 0 |
| 82 #define SINGLE_VALUE_TYPE(command_line_switch) \ | 82 #define SINGLE_VALUE_TYPE(command_line_switch) \ |
| 83 SINGLE_VALUE_TYPE_AND_VALUE(command_line_switch, "") | 83 SINGLE_VALUE_TYPE_AND_VALUE(command_line_switch, "") |
| 84 #define ENABLE_DISABLE_VALUE_TYPE_AND_VALUE(enable_switch, enable_value, \ | 84 #define ENABLE_DISABLE_VALUE_TYPE_AND_VALUE(enable_switch, enable_value, \ |
| 85 disable_switch, disable_value) \ | 85 disable_switch, disable_value) \ |
| 86 Experiment::ENABLE_DISABLE_VALUE, enable_switch, enable_value, \ | 86 Entry::ENABLE_DISABLE_VALUE, enable_switch, enable_value, \ |
| 87 disable_switch, disable_value, NULL, 3 | 87 disable_switch, disable_value, NULL, 3 |
| 88 #define ENABLE_DISABLE_VALUE_TYPE(enable_switch, disable_switch) \ | 88 #define ENABLE_DISABLE_VALUE_TYPE(enable_switch, disable_switch) \ |
| 89 ENABLE_DISABLE_VALUE_TYPE_AND_VALUE(enable_switch, "", disable_switch, "") | 89 ENABLE_DISABLE_VALUE_TYPE_AND_VALUE(enable_switch, "", disable_switch, "") |
| 90 #define MULTI_VALUE_TYPE(choices) \ | 90 #define MULTI_VALUE_TYPE(choices) \ |
| 91 Experiment::MULTI_VALUE, NULL, NULL, NULL, NULL, choices, arraysize(choices) | 91 Entry::MULTI_VALUE, NULL, NULL, NULL, NULL, choices, arraysize(choices) |
| 92 | 92 |
| 93 namespace { | 93 namespace { |
| 94 | 94 |
| 95 // Enumeration of OSs. | 95 // Enumeration of OSs. |
| 96 enum { | 96 enum { |
| 97 kOsMac = 1 << 0, | 97 kOsMac = 1 << 0, |
| 98 kOsWin = 1 << 1, | 98 kOsWin = 1 << 1, |
| 99 kOsLinux = 1 << 2, | 99 kOsLinux = 1 << 2, |
| 100 kOsCrOS = 1 << 3, | 100 kOsCrOS = 1 << 3, |
| 101 kOsAndroid = 1 << 4, | 101 kOsAndroid = 1 << 4, |
| 102 kOsCrOSOwnerOnly = 1 << 5 | 102 kOsCrOSOwnerOnly = 1 << 5 |
| 103 }; | 103 }; |
| 104 | 104 |
| 105 const unsigned kOsAll = kOsMac | kOsWin | kOsLinux | kOsCrOS | kOsAndroid; | 105 const unsigned kOsAll = kOsMac | kOsWin | kOsLinux | kOsCrOS | kOsAndroid; |
| 106 const unsigned kOsDesktop = kOsMac | kOsWin | kOsLinux | kOsCrOS; | 106 const unsigned kOsDesktop = kOsMac | kOsWin | kOsLinux | kOsCrOS; |
| 107 | 107 |
| 108 // Adds a |StringValue| to |list| for each platform where |bitmask| indicates | 108 // Adds a |StringValue| to |list| for each platform where |bitmask| indicates |
| 109 // whether the experiment is available on that platform. | 109 // whether the entry is available on that platform. |
| 110 void AddOsStrings(unsigned bitmask, base::ListValue* list) { | 110 void AddOsStrings(unsigned bitmask, base::ListValue* list) { |
| 111 struct { | 111 struct { |
| 112 unsigned bit; | 112 unsigned bit; |
| 113 const char* const name; | 113 const char* const name; |
| 114 } kBitsToOs[] = { | 114 } kBitsToOs[] = { |
| 115 {kOsMac, "Mac"}, | 115 {kOsMac, "Mac"}, |
| 116 {kOsWin, "Windows"}, | 116 {kOsWin, "Windows"}, |
| 117 {kOsLinux, "Linux"}, | 117 {kOsLinux, "Linux"}, |
| 118 {kOsCrOS, "Chrome OS"}, | 118 {kOsCrOS, "Chrome OS"}, |
| 119 {kOsAndroid, "Android"}, | 119 {kOsAndroid, "Android"}, |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 151 first = std::find(cmdline.argv().begin(), cmdline.argv().end(), | 151 first = std::find(cmdline.argv().begin(), cmdline.argv().end(), |
| 152 GetSwitchString(chromeos::switches::kPolicySwitchesBegin)); | 152 GetSwitchString(chromeos::switches::kPolicySwitchesBegin)); |
| 153 last = std::find(cmdline.argv().begin(), cmdline.argv().end(), | 153 last = std::find(cmdline.argv().begin(), cmdline.argv().end(), |
| 154 GetSwitchString(chromeos::switches::kPolicySwitchesEnd)); | 154 GetSwitchString(chromeos::switches::kPolicySwitchesEnd)); |
| 155 if (first != cmdline.argv().end() && last != cmdline.argv().end()) | 155 if (first != cmdline.argv().end() && last != cmdline.argv().end()) |
| 156 flags.insert(first + 1, last); | 156 flags.insert(first + 1, last); |
| 157 #endif | 157 #endif |
| 158 return flags; | 158 return flags; |
| 159 } | 159 } |
| 160 | 160 |
| 161 const Experiment::Choice kTouchEventsChoices[] = { | 161 const Entry::Choice kTouchEventsChoices[] = { |
| 162 { IDS_GENERIC_EXPERIMENT_CHOICE_AUTOMATIC, "", "" }, | 162 { IDS_GENERIC_EXPERIMENT_CHOICE_AUTOMATIC, "", "" }, |
| 163 { IDS_GENERIC_EXPERIMENT_CHOICE_ENABLED, | 163 { IDS_GENERIC_EXPERIMENT_CHOICE_ENABLED, |
| 164 switches::kTouchEvents, | 164 switches::kTouchEvents, |
| 165 switches::kTouchEventsEnabled }, | 165 switches::kTouchEventsEnabled }, |
| 166 { IDS_GENERIC_EXPERIMENT_CHOICE_DISABLED, | 166 { IDS_GENERIC_EXPERIMENT_CHOICE_DISABLED, |
| 167 switches::kTouchEvents, | 167 switches::kTouchEvents, |
| 168 switches::kTouchEventsDisabled } | 168 switches::kTouchEventsDisabled } |
| 169 }; | 169 }; |
| 170 | 170 |
| 171 #if defined(USE_AURA) | 171 #if defined(USE_AURA) |
| 172 const Experiment::Choice kOverscrollHistoryNavigationChoices[] = { | 172 const Entry::Choice kOverscrollHistoryNavigationChoices[] = { |
| 173 { IDS_GENERIC_EXPERIMENT_CHOICE_ENABLED, "", "" }, | 173 { IDS_GENERIC_EXPERIMENT_CHOICE_ENABLED, "", "" }, |
| 174 { IDS_GENERIC_EXPERIMENT_CHOICE_DISABLED, | 174 { IDS_GENERIC_EXPERIMENT_CHOICE_DISABLED, |
| 175 switches::kOverscrollHistoryNavigation, | 175 switches::kOverscrollHistoryNavigation, |
| 176 "0" }, | 176 "0" }, |
| 177 { IDS_OVERSCROLL_HISTORY_NAVIGATION_SIMPLE_UI, | 177 { IDS_OVERSCROLL_HISTORY_NAVIGATION_SIMPLE_UI, |
| 178 switches::kOverscrollHistoryNavigation, | 178 switches::kOverscrollHistoryNavigation, |
| 179 "2" } | 179 "2" } |
| 180 }; | 180 }; |
| 181 #endif | 181 #endif |
| 182 | 182 |
| 183 const Experiment::Choice kTouchTextSelectionStrategyChoices[] = { | 183 const Entry::Choice kTouchTextSelectionStrategyChoices[] = { |
| 184 { IDS_GENERIC_EXPERIMENT_CHOICE_DEFAULT, "", "" }, | 184 { IDS_GENERIC_EXPERIMENT_CHOICE_DEFAULT, "", "" }, |
| 185 { IDS_TOUCH_SELECTION_STRATEGY_CHARACTER, | 185 { IDS_TOUCH_SELECTION_STRATEGY_CHARACTER, |
| 186 switches::kTouchTextSelectionStrategy, | 186 switches::kTouchTextSelectionStrategy, |
| 187 "character" }, | 187 "character" }, |
| 188 { IDS_TOUCH_SELECTION_STRATEGY_DIRECTION, | 188 { IDS_TOUCH_SELECTION_STRATEGY_DIRECTION, |
| 189 switches::kTouchTextSelectionStrategy, | 189 switches::kTouchTextSelectionStrategy, |
| 190 "direction" } | 190 "direction" } |
| 191 }; | 191 }; |
| 192 | 192 |
| 193 #if !defined(DISABLE_NACL) | 193 #if !defined(DISABLE_NACL) |
| 194 const Experiment::Choice kNaClDebugMaskChoices[] = { | 194 const Entry::Choice kNaClDebugMaskChoices[] = { |
| 195 // Secure shell can be used on ChromeOS for forwarding the TCP port opened by | 195 // Secure shell can be used on ChromeOS for forwarding the TCP port opened by |
| 196 // debug stub to a remote machine. Since secure shell uses NaCl, we usually | 196 // debug stub to a remote machine. Since secure shell uses NaCl, we usually |
| 197 // want to avoid debugging that. The PNaCl translator is also a NaCl module, | 197 // want to avoid debugging that. The PNaCl translator is also a NaCl module, |
| 198 // so by default we want to avoid debugging that. | 198 // so by default we want to avoid debugging that. |
| 199 // NOTE: As the default value must be the empty string, the mask excluding | 199 // NOTE: As the default value must be the empty string, the mask excluding |
| 200 // the PNaCl translator and secure shell is substituted elsewhere. | 200 // the PNaCl translator and secure shell is substituted elsewhere. |
| 201 { IDS_NACL_DEBUG_MASK_CHOICE_EXCLUDE_UTILS_PNACL, "", "" }, | 201 { IDS_NACL_DEBUG_MASK_CHOICE_EXCLUDE_UTILS_PNACL, "", "" }, |
| 202 { IDS_NACL_DEBUG_MASK_CHOICE_DEBUG_ALL, switches::kNaClDebugMask, "*://*" }, | 202 { IDS_NACL_DEBUG_MASK_CHOICE_DEBUG_ALL, switches::kNaClDebugMask, "*://*" }, |
| 203 { IDS_NACL_DEBUG_MASK_CHOICE_INCLUDE_DEBUG, | 203 { IDS_NACL_DEBUG_MASK_CHOICE_INCLUDE_DEBUG, |
| 204 switches::kNaClDebugMask, "*://*/*debug.nmf" } | 204 switches::kNaClDebugMask, "*://*/*debug.nmf" } |
| 205 }; | 205 }; |
| 206 #endif | 206 #endif |
| 207 | 207 |
| 208 const Experiment::Choice kMarkNonSecureAsChoices[] = { | 208 const Entry::Choice kMarkNonSecureAsChoices[] = { |
| 209 { IDS_GENERIC_EXPERIMENT_CHOICE_DEFAULT, "", "" }, | 209 { IDS_GENERIC_EXPERIMENT_CHOICE_DEFAULT, "", "" }, |
| 210 { IDS_MARK_NON_SECURE_AS_NEUTRAL, | 210 { IDS_MARK_NON_SECURE_AS_NEUTRAL, |
| 211 switches::kMarkNonSecureAs, switches::kMarkNonSecureAsNeutral}, | 211 switches::kMarkNonSecureAs, switches::kMarkNonSecureAsNeutral}, |
| 212 { IDS_MARK_NON_SECURE_AS_NON_SECURE, | 212 { IDS_MARK_NON_SECURE_AS_NON_SECURE, |
| 213 switches::kMarkNonSecureAs, switches::kMarkNonSecureAsNonSecure}, | 213 switches::kMarkNonSecureAs, switches::kMarkNonSecureAsNonSecure}, |
| 214 { IDS_MARK_NON_SECURE_AS_DUBIOUS, | 214 { IDS_MARK_NON_SECURE_AS_DUBIOUS, |
| 215 switches::kMarkNonSecureAs, switches::kMarkNonSecureAsDubious} | 215 switches::kMarkNonSecureAs, switches::kMarkNonSecureAsDubious} |
| 216 }; | 216 }; |
| 217 | 217 |
| 218 const Experiment::Choice kShowSavedCopyChoices[] = { | 218 const Entry::Choice kShowSavedCopyChoices[] = { |
| 219 { IDS_GENERIC_EXPERIMENT_CHOICE_DEFAULT, "", "" }, | 219 { IDS_GENERIC_EXPERIMENT_CHOICE_DEFAULT, "", "" }, |
| 220 { IDS_FLAGS_ENABLE_SHOW_SAVED_COPY_PRIMARY, | 220 { IDS_FLAGS_ENABLE_SHOW_SAVED_COPY_PRIMARY, |
| 221 switches::kShowSavedCopy, switches::kEnableShowSavedCopyPrimary }, | 221 switches::kShowSavedCopy, switches::kEnableShowSavedCopyPrimary }, |
| 222 { IDS_FLAGS_ENABLE_SHOW_SAVED_COPY_SECONDARY, | 222 { IDS_FLAGS_ENABLE_SHOW_SAVED_COPY_SECONDARY, |
| 223 switches::kShowSavedCopy, switches::kEnableShowSavedCopySecondary }, | 223 switches::kShowSavedCopy, switches::kEnableShowSavedCopySecondary }, |
| 224 { IDS_FLAGS_DISABLE_SHOW_SAVED_COPY, | 224 { IDS_FLAGS_DISABLE_SHOW_SAVED_COPY, |
| 225 switches::kShowSavedCopy, switches::kDisableShowSavedCopy } | 225 switches::kShowSavedCopy, switches::kDisableShowSavedCopy } |
| 226 }; | 226 }; |
| 227 | 227 |
| 228 const Experiment::Choice kDefaultTileWidthChoices[] = { | 228 const Entry::Choice kDefaultTileWidthChoices[] = { |
| 229 { IDS_GENERIC_EXPERIMENT_CHOICE_DEFAULT, "", "" }, | 229 { IDS_GENERIC_EXPERIMENT_CHOICE_DEFAULT, "", "" }, |
| 230 { IDS_FLAGS_DEFAULT_TILE_WIDTH_SHORT, | 230 { IDS_FLAGS_DEFAULT_TILE_WIDTH_SHORT, |
| 231 switches::kDefaultTileWidth, "128"}, | 231 switches::kDefaultTileWidth, "128"}, |
| 232 { IDS_FLAGS_DEFAULT_TILE_WIDTH_TALL, | 232 { IDS_FLAGS_DEFAULT_TILE_WIDTH_TALL, |
| 233 switches::kDefaultTileWidth, "256"}, | 233 switches::kDefaultTileWidth, "256"}, |
| 234 { IDS_FLAGS_DEFAULT_TILE_WIDTH_GRANDE, | 234 { IDS_FLAGS_DEFAULT_TILE_WIDTH_GRANDE, |
| 235 switches::kDefaultTileWidth, "512"}, | 235 switches::kDefaultTileWidth, "512"}, |
| 236 { IDS_FLAGS_DEFAULT_TILE_WIDTH_VENTI, | 236 { IDS_FLAGS_DEFAULT_TILE_WIDTH_VENTI, |
| 237 switches::kDefaultTileWidth, "1024"} | 237 switches::kDefaultTileWidth, "1024"} |
| 238 }; | 238 }; |
| 239 | 239 |
| 240 const Experiment::Choice kDefaultTileHeightChoices[] = { | 240 const Entry::Choice kDefaultTileHeightChoices[] = { |
| 241 { IDS_GENERIC_EXPERIMENT_CHOICE_DEFAULT, "", "" }, | 241 { IDS_GENERIC_EXPERIMENT_CHOICE_DEFAULT, "", "" }, |
| 242 { IDS_FLAGS_DEFAULT_TILE_HEIGHT_SHORT, | 242 { IDS_FLAGS_DEFAULT_TILE_HEIGHT_SHORT, |
| 243 switches::kDefaultTileHeight, "128"}, | 243 switches::kDefaultTileHeight, "128"}, |
| 244 { IDS_FLAGS_DEFAULT_TILE_HEIGHT_TALL, | 244 { IDS_FLAGS_DEFAULT_TILE_HEIGHT_TALL, |
| 245 switches::kDefaultTileHeight, "256"}, | 245 switches::kDefaultTileHeight, "256"}, |
| 246 { IDS_FLAGS_DEFAULT_TILE_HEIGHT_GRANDE, | 246 { IDS_FLAGS_DEFAULT_TILE_HEIGHT_GRANDE, |
| 247 switches::kDefaultTileHeight, "512"}, | 247 switches::kDefaultTileHeight, "512"}, |
| 248 { IDS_FLAGS_DEFAULT_TILE_HEIGHT_VENTI, | 248 { IDS_FLAGS_DEFAULT_TILE_HEIGHT_VENTI, |
| 249 switches::kDefaultTileHeight, "1024"} | 249 switches::kDefaultTileHeight, "1024"} |
| 250 }; | 250 }; |
| 251 | 251 |
| 252 const Experiment::Choice kSimpleCacheBackendChoices[] = { | 252 const Entry::Choice kSimpleCacheBackendChoices[] = { |
| 253 { IDS_GENERIC_EXPERIMENT_CHOICE_DEFAULT, "", "" }, | 253 { IDS_GENERIC_EXPERIMENT_CHOICE_DEFAULT, "", "" }, |
| 254 { IDS_GENERIC_EXPERIMENT_CHOICE_DISABLED, | 254 { IDS_GENERIC_EXPERIMENT_CHOICE_DISABLED, |
| 255 switches::kUseSimpleCacheBackend, "off" }, | 255 switches::kUseSimpleCacheBackend, "off" }, |
| 256 { IDS_GENERIC_EXPERIMENT_CHOICE_ENABLED, | 256 { IDS_GENERIC_EXPERIMENT_CHOICE_ENABLED, |
| 257 switches::kUseSimpleCacheBackend, "on"} | 257 switches::kUseSimpleCacheBackend, "on"} |
| 258 }; | 258 }; |
| 259 | 259 |
| 260 #if defined(USE_AURA) | 260 #if defined(USE_AURA) |
| 261 const Experiment::Choice kTabCaptureUpscaleQualityChoices[] = { | 261 const Entry::Choice kTabCaptureUpscaleQualityChoices[] = { |
| 262 { IDS_GENERIC_EXPERIMENT_CHOICE_DEFAULT, "", "" }, | 262 { IDS_GENERIC_EXPERIMENT_CHOICE_DEFAULT, "", "" }, |
| 263 { IDS_FLAGS_TAB_CAPTURE_SCALE_QUALITY_FAST, | 263 { IDS_FLAGS_TAB_CAPTURE_SCALE_QUALITY_FAST, |
| 264 switches::kTabCaptureUpscaleQuality, "fast" }, | 264 switches::kTabCaptureUpscaleQuality, "fast" }, |
| 265 { IDS_FLAGS_TAB_CAPTURE_SCALE_QUALITY_GOOD, | 265 { IDS_FLAGS_TAB_CAPTURE_SCALE_QUALITY_GOOD, |
| 266 switches::kTabCaptureUpscaleQuality, "good" }, | 266 switches::kTabCaptureUpscaleQuality, "good" }, |
| 267 { IDS_FLAGS_TAB_CAPTURE_SCALE_QUALITY_BEST, | 267 { IDS_FLAGS_TAB_CAPTURE_SCALE_QUALITY_BEST, |
| 268 switches::kTabCaptureUpscaleQuality, "best" }, | 268 switches::kTabCaptureUpscaleQuality, "best" }, |
| 269 }; | 269 }; |
| 270 | 270 |
| 271 const Experiment::Choice kTabCaptureDownscaleQualityChoices[] = { | 271 const Entry::Choice kTabCaptureDownscaleQualityChoices[] = { |
| 272 { IDS_GENERIC_EXPERIMENT_CHOICE_DEFAULT, "", "" }, | 272 { IDS_GENERIC_EXPERIMENT_CHOICE_DEFAULT, "", "" }, |
| 273 { IDS_FLAGS_TAB_CAPTURE_SCALE_QUALITY_FAST, | 273 { IDS_FLAGS_TAB_CAPTURE_SCALE_QUALITY_FAST, |
| 274 switches::kTabCaptureDownscaleQuality, "fast" }, | 274 switches::kTabCaptureDownscaleQuality, "fast" }, |
| 275 { IDS_FLAGS_TAB_CAPTURE_SCALE_QUALITY_GOOD, | 275 { IDS_FLAGS_TAB_CAPTURE_SCALE_QUALITY_GOOD, |
| 276 switches::kTabCaptureDownscaleQuality, "good" }, | 276 switches::kTabCaptureDownscaleQuality, "good" }, |
| 277 { IDS_FLAGS_TAB_CAPTURE_SCALE_QUALITY_BEST, | 277 { IDS_FLAGS_TAB_CAPTURE_SCALE_QUALITY_BEST, |
| 278 switches::kTabCaptureDownscaleQuality, "best" }, | 278 switches::kTabCaptureDownscaleQuality, "best" }, |
| 279 }; | 279 }; |
| 280 #endif | 280 #endif |
| 281 | 281 |
| 282 #if defined(OS_ANDROID) | 282 #if defined(OS_ANDROID) |
| 283 const Experiment::Choice kZeroSuggestExperimentsChoices[] = { | 283 const Entry::Choice kZeroSuggestExperimentsChoices[] = { |
| 284 { IDS_GENERIC_EXPERIMENT_CHOICE_DEFAULT, "", "" }, | 284 { IDS_GENERIC_EXPERIMENT_CHOICE_DEFAULT, "", "" }, |
| 285 { IDS_FLAGS_ZERO_SUGGEST_MOST_VISITED, | 285 { IDS_FLAGS_ZERO_SUGGEST_MOST_VISITED, |
| 286 switches::kEnableZeroSuggestMostVisited, ""}, | 286 switches::kEnableZeroSuggestMostVisited, ""}, |
| 287 { IDS_FLAGS_ZERO_SUGGEST_MOST_VISITED_WITHOUT_SERP, | 287 { IDS_FLAGS_ZERO_SUGGEST_MOST_VISITED_WITHOUT_SERP, |
| 288 switches::kEnableZeroSuggestMostVisitedWithoutSerp, ""}, | 288 switches::kEnableZeroSuggestMostVisitedWithoutSerp, ""}, |
| 289 { IDS_GENERIC_EXPERIMENT_CHOICE_DISABLED, | 289 { IDS_GENERIC_EXPERIMENT_CHOICE_DISABLED, |
| 290 switches::kDisableZeroSuggest, ""} | 290 switches::kDisableZeroSuggest, ""} |
| 291 }; | 291 }; |
| 292 | 292 |
| 293 const Experiment::Choice kReaderModeHeuristicsChoices[] = { | 293 const Entry::Choice kReaderModeHeuristicsChoices[] = { |
| 294 { IDS_GENERIC_EXPERIMENT_CHOICE_DEFAULT, "", ""}, | 294 { IDS_GENERIC_EXPERIMENT_CHOICE_DEFAULT, "", ""}, |
| 295 { IDS_FLAGS_READER_MODE_HEURISTICS_MARKUP, | 295 { IDS_FLAGS_READER_MODE_HEURISTICS_MARKUP, |
| 296 switches::kReaderModeHeuristics, | 296 switches::kReaderModeHeuristics, |
| 297 switches::reader_mode_heuristics::kOGArticle }, | 297 switches::reader_mode_heuristics::kOGArticle }, |
| 298 { IDS_FLAGS_READER_MODE_HEURISTICS_ADABOOST, | 298 { IDS_FLAGS_READER_MODE_HEURISTICS_ADABOOST, |
| 299 switches::kReaderModeHeuristics, | 299 switches::kReaderModeHeuristics, |
| 300 switches::reader_mode_heuristics::kAdaBoost }, | 300 switches::reader_mode_heuristics::kAdaBoost }, |
| 301 { IDS_FLAGS_READER_MODE_HEURISTICS_ALWAYS_ON, | 301 { IDS_FLAGS_READER_MODE_HEURISTICS_ALWAYS_ON, |
| 302 switches::kReaderModeHeuristics, | 302 switches::kReaderModeHeuristics, |
| 303 switches::reader_mode_heuristics::kAlwaysTrue }, | 303 switches::reader_mode_heuristics::kAlwaysTrue }, |
| 304 { IDS_FLAGS_READER_MODE_HEURISTICS_ALWAYS_OFF, | 304 { IDS_FLAGS_READER_MODE_HEURISTICS_ALWAYS_OFF, |
| 305 switches::kReaderModeHeuristics, | 305 switches::kReaderModeHeuristics, |
| 306 switches::reader_mode_heuristics::kNone }, | 306 switches::reader_mode_heuristics::kNone }, |
| 307 }; | 307 }; |
| 308 #endif | 308 #endif |
| 309 | 309 |
| 310 const Experiment::Choice kNumRasterThreadsChoices[] = { | 310 const Entry::Choice kNumRasterThreadsChoices[] = { |
| 311 { IDS_GENERIC_EXPERIMENT_CHOICE_DEFAULT, "", "" }, | 311 { IDS_GENERIC_EXPERIMENT_CHOICE_DEFAULT, "", "" }, |
| 312 { IDS_FLAGS_NUM_RASTER_THREADS_ONE, switches::kNumRasterThreads, "1" }, | 312 { IDS_FLAGS_NUM_RASTER_THREADS_ONE, switches::kNumRasterThreads, "1" }, |
| 313 { IDS_FLAGS_NUM_RASTER_THREADS_TWO, switches::kNumRasterThreads, "2" }, | 313 { IDS_FLAGS_NUM_RASTER_THREADS_TWO, switches::kNumRasterThreads, "2" }, |
| 314 { IDS_FLAGS_NUM_RASTER_THREADS_THREE, switches::kNumRasterThreads, "3" }, | 314 { IDS_FLAGS_NUM_RASTER_THREADS_THREE, switches::kNumRasterThreads, "3" }, |
| 315 { IDS_FLAGS_NUM_RASTER_THREADS_FOUR, switches::kNumRasterThreads, "4" } | 315 { IDS_FLAGS_NUM_RASTER_THREADS_FOUR, switches::kNumRasterThreads, "4" } |
| 316 }; | 316 }; |
| 317 | 317 |
| 318 const Experiment::Choice kGpuRasterizationMSAASampleCountChoices[] = { | 318 const Entry::Choice kGpuRasterizationMSAASampleCountChoices[] = { |
| 319 { IDS_GENERIC_EXPERIMENT_CHOICE_DEFAULT, | 319 { IDS_GENERIC_EXPERIMENT_CHOICE_DEFAULT, |
| 320 "", | 320 "", |
| 321 "" }, | 321 "" }, |
| 322 { IDS_FLAGS_GPU_RASTERIZATION_MSAA_SAMPLE_COUNT_ZERO, | 322 { IDS_FLAGS_GPU_RASTERIZATION_MSAA_SAMPLE_COUNT_ZERO, |
| 323 switches::kGpuRasterizationMSAASampleCount, "0" }, | 323 switches::kGpuRasterizationMSAASampleCount, "0" }, |
| 324 { IDS_FLAGS_GPU_RASTERIZATION_MSAA_SAMPLE_COUNT_TWO, | 324 { IDS_FLAGS_GPU_RASTERIZATION_MSAA_SAMPLE_COUNT_TWO, |
| 325 switches::kGpuRasterizationMSAASampleCount, "2" }, | 325 switches::kGpuRasterizationMSAASampleCount, "2" }, |
| 326 { IDS_FLAGS_GPU_RASTERIZATION_MSAA_SAMPLE_COUNT_FOUR, | 326 { IDS_FLAGS_GPU_RASTERIZATION_MSAA_SAMPLE_COUNT_FOUR, |
| 327 switches::kGpuRasterizationMSAASampleCount, "4" }, | 327 switches::kGpuRasterizationMSAASampleCount, "4" }, |
| 328 { IDS_FLAGS_GPU_RASTERIZATION_MSAA_SAMPLE_COUNT_EIGHT, | 328 { IDS_FLAGS_GPU_RASTERIZATION_MSAA_SAMPLE_COUNT_EIGHT, |
| 329 switches::kGpuRasterizationMSAASampleCount, "8" }, | 329 switches::kGpuRasterizationMSAASampleCount, "8" }, |
| 330 { IDS_FLAGS_GPU_RASTERIZATION_MSAA_SAMPLE_COUNT_SIXTEEN, | 330 { IDS_FLAGS_GPU_RASTERIZATION_MSAA_SAMPLE_COUNT_SIXTEEN, |
| 331 switches::kGpuRasterizationMSAASampleCount, "16" }, | 331 switches::kGpuRasterizationMSAASampleCount, "16" }, |
| 332 }; | 332 }; |
| 333 | 333 |
| 334 const Experiment::Choice kEnableGpuRasterizationChoices[] = { | 334 const Entry::Choice kEnableGpuRasterizationChoices[] = { |
| 335 { IDS_GENERIC_EXPERIMENT_CHOICE_DEFAULT, "", "" }, | 335 { IDS_GENERIC_EXPERIMENT_CHOICE_DEFAULT, "", "" }, |
| 336 { IDS_GENERIC_EXPERIMENT_CHOICE_ENABLED, | 336 { IDS_GENERIC_EXPERIMENT_CHOICE_ENABLED, |
| 337 switches::kEnableGpuRasterization, "" }, | 337 switches::kEnableGpuRasterization, "" }, |
| 338 { IDS_GENERIC_EXPERIMENT_CHOICE_DISABLED, | 338 { IDS_GENERIC_EXPERIMENT_CHOICE_DISABLED, |
| 339 switches::kDisableGpuRasterization, "" }, | 339 switches::kDisableGpuRasterization, "" }, |
| 340 { IDS_FLAGS_FORCE_GPU_RASTERIZATION, | 340 { IDS_FLAGS_FORCE_GPU_RASTERIZATION, |
| 341 switches::kForceGpuRasterization, "" }, | 341 switches::kForceGpuRasterization, "" }, |
| 342 }; | 342 }; |
| 343 | 343 |
| 344 #if defined(OS_CHROMEOS) | 344 #if defined(OS_CHROMEOS) |
| 345 const Experiment::Choice kMemoryPressureThresholdChoices[] = { | 345 const Entry::Choice kMemoryPressureThresholdChoices[] = { |
| 346 { IDS_GENERIC_EXPERIMENT_CHOICE_DEFAULT, "", "" }, | 346 { IDS_GENERIC_EXPERIMENT_CHOICE_DEFAULT, "", "" }, |
| 347 { IDS_FLAGS_CONSERVATIVE_THRESHOLDS, | 347 { IDS_FLAGS_CONSERVATIVE_THRESHOLDS, |
| 348 chromeos::switches::kMemoryPressureThresholds, | 348 chromeos::switches::kMemoryPressureThresholds, |
| 349 chromeos::switches::kConservativeThreshold }, | 349 chromeos::switches::kConservativeThreshold }, |
| 350 { IDS_FLAGS_AGGRESSIVE_CACHE_DISCARD_THRESHOLDS, | 350 { IDS_FLAGS_AGGRESSIVE_CACHE_DISCARD_THRESHOLDS, |
| 351 chromeos::switches::kMemoryPressureThresholds, | 351 chromeos::switches::kMemoryPressureThresholds, |
| 352 chromeos::switches::kAggressiveCacheDiscardThreshold }, | 352 chromeos::switches::kAggressiveCacheDiscardThreshold }, |
| 353 { IDS_FLAGS_AGGRESSIVE_TAB_DISCARD_THRESHOLDS, | 353 { IDS_FLAGS_AGGRESSIVE_TAB_DISCARD_THRESHOLDS, |
| 354 chromeos::switches::kMemoryPressureThresholds, | 354 chromeos::switches::kMemoryPressureThresholds, |
| 355 chromeos::switches::kAggressiveTabDiscardThreshold }, | 355 chromeos::switches::kAggressiveTabDiscardThreshold }, |
| 356 { IDS_FLAGS_AGGRESSIVE_THRESHOLDS, | 356 { IDS_FLAGS_AGGRESSIVE_THRESHOLDS, |
| 357 chromeos::switches::kMemoryPressureThresholds, | 357 chromeos::switches::kMemoryPressureThresholds, |
| 358 chromeos::switches::kAggressiveThreshold }, | 358 chromeos::switches::kAggressiveThreshold }, |
| 359 }; | 359 }; |
| 360 #endif | 360 #endif |
| 361 | 361 |
| 362 const Experiment::Choice kExtensionContentVerificationChoices[] = { | 362 const Entry::Choice kExtensionContentVerificationChoices[] = { |
| 363 { IDS_GENERIC_EXPERIMENT_CHOICE_DEFAULT, "", "" }, | 363 { IDS_GENERIC_EXPERIMENT_CHOICE_DEFAULT, "", "" }, |
| 364 { IDS_FLAGS_EXTENSION_CONTENT_VERIFICATION_BOOTSTRAP, | 364 { IDS_FLAGS_EXTENSION_CONTENT_VERIFICATION_BOOTSTRAP, |
| 365 switches::kExtensionContentVerification, | 365 switches::kExtensionContentVerification, |
| 366 switches::kExtensionContentVerificationBootstrap }, | 366 switches::kExtensionContentVerificationBootstrap }, |
| 367 { IDS_FLAGS_EXTENSION_CONTENT_VERIFICATION_ENFORCE, | 367 { IDS_FLAGS_EXTENSION_CONTENT_VERIFICATION_ENFORCE, |
| 368 switches::kExtensionContentVerification, | 368 switches::kExtensionContentVerification, |
| 369 switches::kExtensionContentVerificationEnforce }, | 369 switches::kExtensionContentVerificationEnforce }, |
| 370 { IDS_FLAGS_EXTENSION_CONTENT_VERIFICATION_ENFORCE_STRICT, | 370 { IDS_FLAGS_EXTENSION_CONTENT_VERIFICATION_ENFORCE_STRICT, |
| 371 switches::kExtensionContentVerification, | 371 switches::kExtensionContentVerification, |
| 372 switches::kExtensionContentVerificationEnforceStrict }, | 372 switches::kExtensionContentVerificationEnforceStrict }, |
| 373 }; | 373 }; |
| 374 | 374 |
| 375 // Note that the value is specified in seconds (where 0 is equivalent to | 375 // Note that the value is specified in seconds (where 0 is equivalent to |
| 376 // disabled). | 376 // disabled). |
| 377 const Experiment::Choice kRememberCertificateErrorDecisionsChoices[] = { | 377 const Entry::Choice kRememberCertificateErrorDecisionsChoices[] = { |
| 378 { IDS_GENERIC_EXPERIMENT_CHOICE_DEFAULT, "", "" }, | 378 { IDS_GENERIC_EXPERIMENT_CHOICE_DEFAULT, "", "" }, |
| 379 { IDS_GENERIC_EXPERIMENT_CHOICE_DISABLED, | 379 { IDS_GENERIC_EXPERIMENT_CHOICE_DISABLED, |
| 380 switches::kRememberCertErrorDecisions, | 380 switches::kRememberCertErrorDecisions, |
| 381 "-1" }, | 381 "-1" }, |
| 382 { IDS_REMEMBER_CERTIFICATE_ERROR_DECISION_CHOICE_ONE_DAY, | 382 { IDS_REMEMBER_CERTIFICATE_ERROR_DECISION_CHOICE_ONE_DAY, |
| 383 switches::kRememberCertErrorDecisions, | 383 switches::kRememberCertErrorDecisions, |
| 384 "86400" }, | 384 "86400" }, |
| 385 { IDS_REMEMBER_CERTIFICATE_ERROR_DECISION_CHOICE_THREE_DAYS, | 385 { IDS_REMEMBER_CERTIFICATE_ERROR_DECISION_CHOICE_THREE_DAYS, |
| 386 switches::kRememberCertErrorDecisions, | 386 switches::kRememberCertErrorDecisions, |
| 387 "259200" }, | 387 "259200" }, |
| 388 { IDS_REMEMBER_CERTIFICATE_ERROR_DECISION_CHOICE_ONE_WEEK, | 388 { IDS_REMEMBER_CERTIFICATE_ERROR_DECISION_CHOICE_ONE_WEEK, |
| 389 switches::kRememberCertErrorDecisions, | 389 switches::kRememberCertErrorDecisions, |
| 390 "604800" }, | 390 "604800" }, |
| 391 { IDS_REMEMBER_CERTIFICATE_ERROR_DECISION_CHOICE_ONE_MONTH, | 391 { IDS_REMEMBER_CERTIFICATE_ERROR_DECISION_CHOICE_ONE_MONTH, |
| 392 switches::kRememberCertErrorDecisions, | 392 switches::kRememberCertErrorDecisions, |
| 393 "2592000" }, | 393 "2592000" }, |
| 394 { IDS_REMEMBER_CERTIFICATE_ERROR_DECISION_CHOICE_THREE_MONTHS, | 394 { IDS_REMEMBER_CERTIFICATE_ERROR_DECISION_CHOICE_THREE_MONTHS, |
| 395 switches::kRememberCertErrorDecisions, | 395 switches::kRememberCertErrorDecisions, |
| 396 "7776000" }, | 396 "7776000" }, |
| 397 }; | 397 }; |
| 398 | 398 |
| 399 const Experiment::Choice kAutofillSyncCredentialChoices[] = { | 399 const Entry::Choice kAutofillSyncCredentialChoices[] = { |
| 400 { IDS_GENERIC_EXPERIMENT_CHOICE_DEFAULT, "", ""}, | 400 { IDS_GENERIC_EXPERIMENT_CHOICE_DEFAULT, "", ""}, |
| 401 { IDS_ALLOW_AUTOFILL_SYNC_CREDENTIAL, | 401 { IDS_ALLOW_AUTOFILL_SYNC_CREDENTIAL, |
| 402 password_manager::switches::kAllowAutofillSyncCredential, ""}, | 402 password_manager::switches::kAllowAutofillSyncCredential, ""}, |
| 403 { IDS_DISALLOW_AUTOFILL_SYNC_CREDENTIAL_FOR_REAUTH, | 403 { IDS_DISALLOW_AUTOFILL_SYNC_CREDENTIAL_FOR_REAUTH, |
| 404 password_manager::switches::kDisallowAutofillSyncCredentialForReauth, ""}, | 404 password_manager::switches::kDisallowAutofillSyncCredentialForReauth, ""}, |
| 405 { IDS_DISALLOW_AUTOFILL_SYNC_CREDENTIAL, | 405 { IDS_DISALLOW_AUTOFILL_SYNC_CREDENTIAL, |
| 406 password_manager::switches::kDisallowAutofillSyncCredential, ""}, | 406 password_manager::switches::kDisallowAutofillSyncCredential, ""}, |
| 407 }; | 407 }; |
| 408 | 408 |
| 409 const Experiment::Choice kSSLVersionMinChoices[] = { | 409 const Entry::Choice kSSLVersionMinChoices[] = { |
| 410 { IDS_FLAGS_SSL_VERSION_DEFAULT, "", "" }, | 410 { IDS_FLAGS_SSL_VERSION_DEFAULT, "", "" }, |
| 411 { IDS_FLAGS_SSL_VERSION_TLSV1, switches::kSSLVersionMin, | 411 { IDS_FLAGS_SSL_VERSION_TLSV1, switches::kSSLVersionMin, |
| 412 switches::kSSLVersionTLSv1 }, | 412 switches::kSSLVersionTLSv1 }, |
| 413 { IDS_FLAGS_SSL_VERSION_TLSV11, switches::kSSLVersionMin, | 413 { IDS_FLAGS_SSL_VERSION_TLSV11, switches::kSSLVersionMin, |
| 414 switches::kSSLVersionTLSv11 }, | 414 switches::kSSLVersionTLSv11 }, |
| 415 { IDS_FLAGS_SSL_VERSION_TLSV12, switches::kSSLVersionMin, | 415 { IDS_FLAGS_SSL_VERSION_TLSV12, switches::kSSLVersionMin, |
| 416 switches::kSSLVersionTLSv12 }, | 416 switches::kSSLVersionTLSv12 }, |
| 417 }; | 417 }; |
| 418 | 418 |
| 419 const Experiment::Choice kFillOnAccountSelectChoices[] = { | 419 const Entry::Choice kFillOnAccountSelectChoices[] = { |
| 420 { IDS_GENERIC_EXPERIMENT_CHOICE_DEFAULT, "", "" }, | 420 { IDS_GENERIC_EXPERIMENT_CHOICE_DEFAULT, "", "" }, |
| 421 { IDS_GENERIC_EXPERIMENT_CHOICE_DISABLED, | 421 { IDS_GENERIC_EXPERIMENT_CHOICE_DISABLED, |
| 422 autofill::switches::kDisableFillOnAccountSelect, "" }, | 422 autofill::switches::kDisableFillOnAccountSelect, "" }, |
| 423 { IDS_FLAGS_FILL_ON_ACCOUNT_SELECT_ENABLE_HIGHLIGHTING, | 423 { IDS_FLAGS_FILL_ON_ACCOUNT_SELECT_ENABLE_HIGHLIGHTING, |
| 424 autofill::switches::kEnableFillOnAccountSelect, "" }, | 424 autofill::switches::kEnableFillOnAccountSelect, "" }, |
| 425 { IDS_FLAGS_FILL_ON_ACCOUNT_SELECT_ENABLE_NO_HIGHLIGHTING, | 425 { IDS_FLAGS_FILL_ON_ACCOUNT_SELECT_ENABLE_NO_HIGHLIGHTING, |
| 426 autofill::switches::kEnableFillOnAccountSelectNoHighlighting, "" }, | 426 autofill::switches::kEnableFillOnAccountSelectNoHighlighting, "" }, |
| 427 }; | 427 }; |
| 428 | 428 |
| 429 #if defined(USE_ASH) | 429 #if defined(USE_ASH) |
| 430 const Experiment::Choice kAshScreenRotationAnimationChoices[] = { | 430 const Entry::Choice kAshScreenRotationAnimationChoices[] = { |
| 431 { IDS_GENERIC_EXPERIMENT_CHOICE_DEFAULT, "", "" }, | 431 { IDS_GENERIC_EXPERIMENT_CHOICE_DEFAULT, "", "" }, |
| 432 { IDS_GENERIC_EXPERIMENT_CHOICE_DISABLED, | 432 { IDS_GENERIC_EXPERIMENT_CHOICE_DISABLED, |
| 433 ash::switches::kAshEnableScreenRotationAnimation, | 433 ash::switches::kAshEnableScreenRotationAnimation, |
| 434 "none" }, | 434 "none" }, |
| 435 { IDS_ASH_SCREEN_ROTATION_ANIMATION_PARTIAL_ROTATION, | 435 { IDS_ASH_SCREEN_ROTATION_ANIMATION_PARTIAL_ROTATION, |
| 436 ash::switches::kAshEnableScreenRotationAnimation, | 436 ash::switches::kAshEnableScreenRotationAnimation, |
| 437 "partial-rotation" }, | 437 "partial-rotation" }, |
| 438 { IDS_ASH_SCREEN_ROTATION_ANIMATION_FULL_ROTATION, | 438 { IDS_ASH_SCREEN_ROTATION_ANIMATION_FULL_ROTATION, |
| 439 ash::switches::kAshEnableScreenRotationAnimation, | 439 ash::switches::kAshEnableScreenRotationAnimation, |
| 440 "full-rotation" } | 440 "full-rotation" } |
| 441 }; | 441 }; |
| 442 #endif | 442 #endif |
| 443 | 443 |
| 444 #if defined(OS_CHROMEOS) | 444 #if defined(OS_CHROMEOS) |
| 445 const Experiment::Choice kDataSaverPromptChoices[] = { | 445 const Entry::Choice kDataSaverPromptChoices[] = { |
| 446 { IDS_GENERIC_EXPERIMENT_CHOICE_DEFAULT, "", "" }, | 446 { IDS_GENERIC_EXPERIMENT_CHOICE_DEFAULT, "", "" }, |
| 447 { IDS_GENERIC_EXPERIMENT_CHOICE_DISABLED, | 447 { IDS_GENERIC_EXPERIMENT_CHOICE_DISABLED, |
| 448 chromeos::switches::kDisableDataSaverPrompt, "" }, | 448 chromeos::switches::kDisableDataSaverPrompt, "" }, |
| 449 { IDS_GENERIC_EXPERIMENT_CHOICE_ENABLED, | 449 { IDS_GENERIC_EXPERIMENT_CHOICE_ENABLED, |
| 450 chromeos::switches::kEnableDataSaverPrompt, "" }, | 450 chromeos::switches::kEnableDataSaverPrompt, "" }, |
| 451 { IDS_FLAGS_DATASAVER_PROMPT_DEMO_MODE, | 451 { IDS_FLAGS_DATASAVER_PROMPT_DEMO_MODE, |
| 452 chromeos::switches::kEnableDataSaverPrompt, | 452 chromeos::switches::kEnableDataSaverPrompt, |
| 453 chromeos::switches::kDataSaverPromptDemoMode }, | 453 chromeos::switches::kDataSaverPromptDemoMode }, |
| 454 }; | 454 }; |
| 455 | 455 |
| 456 const Experiment::Choice kFloatingVirtualKeyboardChoices[] = { | 456 const Entry::Choice kFloatingVirtualKeyboardChoices[] = { |
| 457 { IDS_GENERIC_EXPERIMENT_CHOICE_DEFAULT, "", "" }, | 457 { IDS_GENERIC_EXPERIMENT_CHOICE_DEFAULT, "", "" }, |
| 458 { IDS_GENERIC_EXPERIMENT_CHOICE_DISABLED, | 458 { IDS_GENERIC_EXPERIMENT_CHOICE_DISABLED, |
| 459 keyboard::switches::kFloatingVirtualKeyboard, | 459 keyboard::switches::kFloatingVirtualKeyboard, |
| 460 keyboard::switches::kFloatingVirtualKeyboardDisabled}, | 460 keyboard::switches::kFloatingVirtualKeyboardDisabled}, |
| 461 { IDS_GENERIC_EXPERIMENT_CHOICE_ENABLED, | 461 { IDS_GENERIC_EXPERIMENT_CHOICE_ENABLED, |
| 462 keyboard::switches::kFloatingVirtualKeyboard, | 462 keyboard::switches::kFloatingVirtualKeyboard, |
| 463 keyboard::switches::kFloatingVirtualKeyboardEnabled}, | 463 keyboard::switches::kFloatingVirtualKeyboardEnabled}, |
| 464 }; | 464 }; |
| 465 | 465 |
| 466 const Experiment::Choice kGestureTypingChoices[] = { | 466 const Entry::Choice kGestureTypingChoices[] = { |
| 467 { IDS_GENERIC_EXPERIMENT_CHOICE_DEFAULT, "", "" }, | 467 { IDS_GENERIC_EXPERIMENT_CHOICE_DEFAULT, "", "" }, |
| 468 { IDS_GENERIC_EXPERIMENT_CHOICE_DISABLED, | 468 { IDS_GENERIC_EXPERIMENT_CHOICE_DISABLED, |
| 469 keyboard::switches::kGestureTyping, | 469 keyboard::switches::kGestureTyping, |
| 470 keyboard::switches::kGestureTypingDisabled}, | 470 keyboard::switches::kGestureTypingDisabled}, |
| 471 { IDS_GENERIC_EXPERIMENT_CHOICE_ENABLED, | 471 { IDS_GENERIC_EXPERIMENT_CHOICE_ENABLED, |
| 472 keyboard::switches::kGestureTyping, | 472 keyboard::switches::kGestureTyping, |
| 473 keyboard::switches::kGestureTypingEnabled}, | 473 keyboard::switches::kGestureTypingEnabled}, |
| 474 }; | 474 }; |
| 475 | 475 |
| 476 const Experiment::Choice kGestureEditingChoices[] = { | 476 const Entry::Choice kGestureEditingChoices[] = { |
| 477 { IDS_GENERIC_EXPERIMENT_CHOICE_DEFAULT, "", "" }, | 477 { IDS_GENERIC_EXPERIMENT_CHOICE_DEFAULT, "", "" }, |
| 478 { IDS_GENERIC_EXPERIMENT_CHOICE_DISABLED, | 478 { IDS_GENERIC_EXPERIMENT_CHOICE_DISABLED, |
| 479 keyboard::switches::kGestureEditing, | 479 keyboard::switches::kGestureEditing, |
| 480 keyboard::switches::kGestureEditingDisabled}, | 480 keyboard::switches::kGestureEditingDisabled}, |
| 481 { IDS_GENERIC_EXPERIMENT_CHOICE_ENABLED, | 481 { IDS_GENERIC_EXPERIMENT_CHOICE_ENABLED, |
| 482 keyboard::switches::kGestureEditing, | 482 keyboard::switches::kGestureEditing, |
| 483 keyboard::switches::kGestureEditingEnabled}, | 483 keyboard::switches::kGestureEditingEnabled}, |
| 484 }; | 484 }; |
| 485 #endif | 485 #endif |
| 486 | 486 |
| 487 const Experiment::Choice kSupervisedUserSafeSitesChoices[] = { | 487 const Entry::Choice kSupervisedUserSafeSitesChoices[] = { |
| 488 { IDS_GENERIC_EXPERIMENT_CHOICE_DEFAULT, "", "" }, | 488 { IDS_GENERIC_EXPERIMENT_CHOICE_DEFAULT, "", "" }, |
| 489 { IDS_GENERIC_EXPERIMENT_CHOICE_ENABLED, | 489 { IDS_GENERIC_EXPERIMENT_CHOICE_ENABLED, |
| 490 switches::kSupervisedUserSafeSites, | 490 switches::kSupervisedUserSafeSites, |
| 491 "enabled" }, | 491 "enabled" }, |
| 492 { IDS_GENERIC_EXPERIMENT_CHOICE_DISABLED, | 492 { IDS_GENERIC_EXPERIMENT_CHOICE_DISABLED, |
| 493 switches::kSupervisedUserSafeSites, | 493 switches::kSupervisedUserSafeSites, |
| 494 "disabled" }, | 494 "disabled" }, |
| 495 { IDS_SUPERVISED_USER_SAFESITES_BLACKLIST_ONLY, | 495 { IDS_SUPERVISED_USER_SAFESITES_BLACKLIST_ONLY, |
| 496 switches::kSupervisedUserSafeSites, | 496 switches::kSupervisedUserSafeSites, |
| 497 "blacklist-only" }, | 497 "blacklist-only" }, |
| 498 { IDS_SUPERVISED_USER_SAFESITES_ONLINE_CHECK_ONLY, | 498 { IDS_SUPERVISED_USER_SAFESITES_ONLINE_CHECK_ONLY, |
| 499 switches::kSupervisedUserSafeSites, | 499 switches::kSupervisedUserSafeSites, |
| 500 "online-check-only" } | 500 "online-check-only" } |
| 501 }; | 501 }; |
| 502 | 502 |
| 503 // RECORDING USER METRICS FOR FLAGS: | 503 // RECORDING USER METRICS FOR FLAGS: |
| 504 // ----------------------------------------------------------------------------- | 504 // ----------------------------------------------------------------------------- |
| 505 // The first line of the experiment is the internal name. If you'd like to | 505 // The first line of the entry is the internal name. If you'd like to gather |
| 506 // gather statistics about the usage of your flag, you should append a marker | 506 // statistics about the usage of your flag, you should append a marker comment |
| 507 // comment to the end of the feature name, like so: | 507 // to the end of the feature name, like so: |
| 508 // "my-special-feature", // FLAGS:RECORD_UMA | 508 // "my-special-feature", // FLAGS:RECORD_UMA |
| 509 // | 509 // |
| 510 // After doing that, run | 510 // After doing that, run |
| 511 // tools/metrics/actions/extract_actions.py | 511 // tools/metrics/actions/extract_actions.py |
| 512 // to add the metric to actions.xml (which will enable UMA to record your | 512 // to add the metric to actions.xml (which will enable UMA to record your |
| 513 // feature flag), then update the <owner>s and <description> sections. Make sure | 513 // feature flag), then update the <owner>s and <description> sections. Make sure |
| 514 // to include the actions.xml file when you upload your code for review! | 514 // to include the actions.xml file when you upload your code for review! |
| 515 // | 515 // |
| 516 // After your feature has shipped under a flag, you can locate the metrics under | 516 // After your feature has shipped under a flag, you can locate the metrics under |
| 517 // the action name AboutFlags_internal-action-name. Actions are recorded once | 517 // the action name AboutFlags_internal-action-name. Actions are recorded once |
| 518 // per startup, so you should divide this number by AboutFlags_StartupTick to | 518 // per startup, so you should divide this number by AboutFlags_StartupTick to |
| 519 // get a sense of usage. Note that this will not be the same as number of users | 519 // get a sense of usage. Note that this will not be the same as number of users |
| 520 // with a given feature enabled because users can quit and relaunch the | 520 // with a given feature enabled because users can quit and relaunch the |
| 521 // application multiple times over a given time interval. The dashboard also | 521 // application multiple times over a given time interval. The dashboard also |
| 522 // shows you how many (metrics reporting) users have enabled the flag over the | 522 // shows you how many (metrics reporting) users have enabled the flag over the |
| 523 // last seven days. However, note that this is not the same as the number of | 523 // last seven days. However, note that this is not the same as the number of |
| 524 // users who have the flag enabled, since enabling the flag happens once, | 524 // users who have the flag enabled, since enabling the flag happens once, |
| 525 // whereas running with the flag enabled happens until the user flips the flag | 525 // whereas running with the flag enabled happens until the user flips the flag |
| 526 // again. | 526 // again. |
| 527 | 527 |
| 528 // To add a new experiment add to the end of kExperiments. There are two | 528 // To add a new entry, add to the end of kEntries. There are two |
| 529 // distinct types of experiments: | 529 // distinct types of entries: |
| 530 // . SINGLE_VALUE: experiment is either on or off. Use the SINGLE_VALUE_TYPE | 530 // . SINGLE_VALUE: entry is either on or off. Use the SINGLE_VALUE_TYPE |
| 531 // macro for this type supplying the command line to the macro. | 531 // macro for this type supplying the command line to the macro. |
| 532 // . MULTI_VALUE: a list of choices, the first of which should correspond to a | 532 // . MULTI_VALUE: a list of choices, the first of which should correspond to a |
| 533 // deactivated state for this lab (i.e. no command line option). To specify | 533 // deactivated state for this lab (i.e. no command line option). To specify |
| 534 // this type of experiment use the macro MULTI_VALUE_TYPE supplying it the | 534 // this type of entry use the macro MULTI_VALUE_TYPE supplying it the |
| 535 // array of choices. | 535 // array of choices. |
| 536 // See the documentation of Experiment for details on the fields. | 536 // See the documentation of Entry for details on the fields. |
| 537 // | 537 // |
| 538 // Command-line switches must have entries in enum "LoginCustomFlags" in | 538 // Command-line switches must have entries in enum "LoginCustomFlags" in |
| 539 // histograms.xml. See note in histograms.xml and don't forget to run | 539 // histograms.xml. See note in histograms.xml and don't forget to run |
| 540 // AboutFlagsHistogramTest unit test to calculate and verify checksum. | 540 // AboutFlagsHistogramTest unit test to calculate and verify checksum. |
| 541 // | 541 // |
| 542 // When adding a new choice, add it to the end of the list. | 542 // When adding a new choice, add it to the end of the list. |
| 543 const Experiment kExperiments[] = { | 543 const Entry kEntries[] = { |
| 544 { | 544 { |
| 545 "ignore-gpu-blacklist", | 545 "ignore-gpu-blacklist", |
| 546 IDS_FLAGS_IGNORE_GPU_BLACKLIST_NAME, | 546 IDS_FLAGS_IGNORE_GPU_BLACKLIST_NAME, |
| 547 IDS_FLAGS_IGNORE_GPU_BLACKLIST_DESCRIPTION, | 547 IDS_FLAGS_IGNORE_GPU_BLACKLIST_DESCRIPTION, |
| 548 kOsAll, | 548 kOsAll, |
| 549 SINGLE_VALUE_TYPE(switches::kIgnoreGpuBlacklist) | 549 SINGLE_VALUE_TYPE(switches::kIgnoreGpuBlacklist) |
| 550 }, | 550 }, |
| 551 #if defined(OS_WIN) | 551 #if defined(OS_WIN) |
| 552 { | 552 { |
| 553 "disable-direct-write", | 553 "disable-direct-write", |
| (...skipping 1896 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2450 IDS_FLAGS_EMPHASIZE_TITLES_IN_OMNIBOX_DROPDOWN_NAME, | 2450 IDS_FLAGS_EMPHASIZE_TITLES_IN_OMNIBOX_DROPDOWN_NAME, |
| 2451 IDS_FLAGS_EMPHASIZE_TITLES_IN_OMNIBOX_DROPDOWN_DESCRIPTION, | 2451 IDS_FLAGS_EMPHASIZE_TITLES_IN_OMNIBOX_DROPDOWN_DESCRIPTION, |
| 2452 kOsAll, | 2452 kOsAll, |
| 2453 SINGLE_VALUE_TYPE(switches::kEmphasizeTitlesInOmniboxDropdown) | 2453 SINGLE_VALUE_TYPE(switches::kEmphasizeTitlesInOmniboxDropdown) |
| 2454 }, | 2454 }, |
| 2455 // NOTE: Adding new command-line switches requires adding corresponding | 2455 // NOTE: Adding new command-line switches requires adding corresponding |
| 2456 // entries to enum "LoginCustomFlags" in histograms.xml. See note in | 2456 // entries to enum "LoginCustomFlags" in histograms.xml. See note in |
| 2457 // histograms.xml and don't forget to run AboutFlagsHistogramTest unit test. | 2457 // histograms.xml and don't forget to run AboutFlagsHistogramTest unit test. |
| 2458 }; | 2458 }; |
| 2459 | 2459 |
| 2460 const Experiment* experiments = kExperiments; | 2460 const Entry* entries = kEntries; |
| 2461 size_t num_experiments = arraysize(kExperiments); | 2461 size_t num_entries = arraysize(kEntries); |
| 2462 | 2462 |
| 2463 // Stores and encapsulates the little state that about:flags has. | 2463 // Stores and encapsulates the little state that about:flags has. |
| 2464 class FlagsState { | 2464 class FlagsState { |
| 2465 public: | 2465 public: |
| 2466 FlagsState() : needs_restart_(false) {} | 2466 FlagsState() : needs_restart_(false) {} |
| 2467 void ConvertFlagsToSwitches(FlagsStorage* flags_storage, | 2467 void ConvertFlagsToSwitches(FlagsStorage* flags_storage, |
| 2468 base::CommandLine* command_line, | 2468 base::CommandLine* command_line, |
| 2469 SentinelsMode sentinels); | 2469 SentinelsMode sentinels); |
| 2470 bool IsRestartNeededToCommitChanges(); | 2470 bool IsRestartNeededToCommitChanges(); |
| 2471 void SetExperimentEnabled( | 2471 void SetEntryEnabled( |
| 2472 FlagsStorage* flags_storage, | 2472 FlagsStorage* flags_storage, |
| 2473 const std::string& internal_name, | 2473 const std::string& internal_name, |
| 2474 bool enable); | 2474 bool enable); |
| 2475 void RemoveFlagsSwitches( | 2475 void RemoveFlagsSwitches( |
| 2476 std::map<std::string, base::CommandLine::StringType>* switch_list); | 2476 std::map<std::string, base::CommandLine::StringType>* switch_list); |
| 2477 void ResetAllFlags(FlagsStorage* flags_storage); | 2477 void ResetAllFlags(FlagsStorage* flags_storage); |
| 2478 void reset(); | 2478 void reset(); |
| 2479 | 2479 |
| 2480 // Returns the singleton instance of this class | 2480 // Returns the singleton instance of this class |
| 2481 static FlagsState* GetInstance() { | 2481 static FlagsState* GetInstance() { |
| 2482 return Singleton<FlagsState>::get(); | 2482 return Singleton<FlagsState>::get(); |
| 2483 } | 2483 } |
| 2484 | 2484 |
| 2485 private: | 2485 private: |
| 2486 bool needs_restart_; | 2486 bool needs_restart_; |
| 2487 std::map<std::string, std::string> flags_switches_; | 2487 std::map<std::string, std::string> flags_switches_; |
| 2488 | 2488 |
| 2489 DISALLOW_COPY_AND_ASSIGN(FlagsState); | 2489 DISALLOW_COPY_AND_ASSIGN(FlagsState); |
| 2490 }; | 2490 }; |
| 2491 | 2491 |
| 2492 // Adds the internal names for the specified experiment to |names|. | 2492 // Adds the internal names for the specified entry to |names|. |
| 2493 void AddInternalName(const Experiment& e, std::set<std::string>* names) { | 2493 void AddInternalName(const Entry& e, std::set<std::string>* names) { |
| 2494 if (e.type == Experiment::SINGLE_VALUE) { | 2494 if (e.type == Entry::SINGLE_VALUE) { |
| 2495 names->insert(e.internal_name); | 2495 names->insert(e.internal_name); |
| 2496 } else { | 2496 } else { |
| 2497 DCHECK(e.type == Experiment::MULTI_VALUE || | 2497 DCHECK(e.type == Entry::MULTI_VALUE || |
| 2498 e.type == Experiment::ENABLE_DISABLE_VALUE); | 2498 e.type == Entry::ENABLE_DISABLE_VALUE); |
| 2499 for (int i = 0; i < e.num_choices; ++i) | 2499 for (int i = 0; i < e.num_choices; ++i) |
| 2500 names->insert(e.NameForChoice(i)); | 2500 names->insert(e.NameForChoice(i)); |
| 2501 } | 2501 } |
| 2502 } | 2502 } |
| 2503 | 2503 |
| 2504 // Confirms that an experiment is valid, used in a DCHECK in | 2504 // Confirms that an entry is valid, used in a DCHECK in SanitizeList below. |
| 2505 // SanitizeList below. | 2505 bool ValidateEntry(const Entry& e) { |
| 2506 bool ValidateExperiment(const Experiment& e) { | |
| 2507 switch (e.type) { | 2506 switch (e.type) { |
| 2508 case Experiment::SINGLE_VALUE: | 2507 case Entry::SINGLE_VALUE: |
| 2509 DCHECK_EQ(0, e.num_choices); | 2508 DCHECK_EQ(0, e.num_choices); |
| 2510 DCHECK(!e.choices); | 2509 DCHECK(!e.choices); |
| 2511 break; | 2510 break; |
| 2512 case Experiment::MULTI_VALUE: | 2511 case Entry::MULTI_VALUE: |
| 2513 DCHECK_GT(e.num_choices, 0); | 2512 DCHECK_GT(e.num_choices, 0); |
| 2514 DCHECK(e.choices); | 2513 DCHECK(e.choices); |
| 2515 DCHECK(e.choices[0].command_line_switch); | 2514 DCHECK(e.choices[0].command_line_switch); |
| 2516 DCHECK_EQ('\0', e.choices[0].command_line_switch[0]); | 2515 DCHECK_EQ('\0', e.choices[0].command_line_switch[0]); |
| 2517 break; | 2516 break; |
| 2518 case Experiment::ENABLE_DISABLE_VALUE: | 2517 case Entry::ENABLE_DISABLE_VALUE: |
| 2519 DCHECK_EQ(3, e.num_choices); | 2518 DCHECK_EQ(3, e.num_choices); |
| 2520 DCHECK(!e.choices); | 2519 DCHECK(!e.choices); |
| 2521 DCHECK(e.command_line_switch); | 2520 DCHECK(e.command_line_switch); |
| 2522 DCHECK(e.command_line_value); | 2521 DCHECK(e.command_line_value); |
| 2523 DCHECK(e.disable_command_line_switch); | 2522 DCHECK(e.disable_command_line_switch); |
| 2524 DCHECK(e.disable_command_line_value); | 2523 DCHECK(e.disable_command_line_value); |
| 2525 break; | 2524 break; |
| 2526 default: | 2525 default: |
| 2527 NOTREACHED(); | 2526 NOTREACHED(); |
| 2528 } | 2527 } |
| 2529 return true; | 2528 return true; |
| 2530 } | 2529 } |
| 2531 | 2530 |
| 2532 // Removes all experiments from prefs::kEnabledLabsExperiments that are | 2531 // Removes all entries from prefs::kEnabledLabsExperiments that are unknown, to |
| 2533 // unknown, to prevent this list to become very long as experiments are added | 2532 // prevent this list to become very long as entries are added and removed. |
| 2534 // and removed. | |
| 2535 void SanitizeList(FlagsStorage* flags_storage) { | 2533 void SanitizeList(FlagsStorage* flags_storage) { |
| 2536 std::set<std::string> known_experiments; | 2534 std::set<std::string> known_entries; |
| 2537 for (size_t i = 0; i < num_experiments; ++i) { | 2535 for (size_t i = 0; i < num_entries; ++i) { |
| 2538 DCHECK(ValidateExperiment(experiments[i])); | 2536 DCHECK(ValidateEntry(entries[i])); |
| 2539 AddInternalName(experiments[i], &known_experiments); | 2537 AddInternalName(entries[i], &known_entries); |
| 2540 } | 2538 } |
| 2541 | 2539 |
| 2542 std::set<std::string> enabled_experiments = flags_storage->GetFlags(); | 2540 std::set<std::string> enabled_entries = flags_storage->GetFlags(); |
| 2543 | 2541 |
| 2544 std::set<std::string> new_enabled_experiments = | 2542 std::set<std::string> new_enabled_entries = |
| 2545 base::STLSetIntersection<std::set<std::string> >( | 2543 base::STLSetIntersection<std::set<std::string> >( |
| 2546 known_experiments, enabled_experiments); | 2544 known_entries, enabled_entries); |
| 2547 | 2545 |
| 2548 if (new_enabled_experiments != enabled_experiments) | 2546 if (new_enabled_entries != enabled_entries) |
| 2549 flags_storage->SetFlags(new_enabled_experiments); | 2547 flags_storage->SetFlags(new_enabled_entries); |
| 2550 } | 2548 } |
| 2551 | 2549 |
| 2552 void GetSanitizedEnabledFlags( | 2550 void GetSanitizedEnabledFlags(FlagsStorage* flags_storage, |
| 2553 FlagsStorage* flags_storage, std::set<std::string>* result) { | 2551 std::set<std::string>* result) { |
| 2554 SanitizeList(flags_storage); | 2552 SanitizeList(flags_storage); |
| 2555 *result = flags_storage->GetFlags(); | 2553 *result = flags_storage->GetFlags(); |
| 2556 } | 2554 } |
| 2557 | 2555 |
| 2558 bool SkipConditionalExperiment(const Experiment& experiment, | 2556 bool SkipConditionalEntry(const Entry& entry, FlagsStorage* flags_storage) { |
| 2559 FlagsStorage* flags_storage) { | |
| 2560 #if defined(OS_ANDROID) || defined(ENABLE_DATA_REDUCTION_PROXY_DEBUGGING) | 2557 #if defined(OS_ANDROID) || defined(ENABLE_DATA_REDUCTION_PROXY_DEBUGGING) |
| 2561 chrome::VersionInfo::Channel channel = chrome::VersionInfo::GetChannel(); | 2558 chrome::VersionInfo::Channel channel = chrome::VersionInfo::GetChannel(); |
| 2562 #endif | 2559 #endif |
| 2563 | 2560 |
| 2564 #if defined(OS_ANDROID) | 2561 #if defined(OS_ANDROID) |
| 2565 // enable-data-reduction-proxy-dev is only available for the Dev/Beta channel. | 2562 // enable-data-reduction-proxy-dev is only available for the Dev/Beta channel. |
| 2566 if (!strcmp("enable-data-reduction-proxy-dev", experiment.internal_name) && | 2563 if (!strcmp("enable-data-reduction-proxy-dev", entry.internal_name) && |
| 2567 channel != chrome::VersionInfo::CHANNEL_BETA && | 2564 channel != chrome::VersionInfo::CHANNEL_BETA && |
| 2568 channel != chrome::VersionInfo::CHANNEL_DEV) { | 2565 channel != chrome::VersionInfo::CHANNEL_DEV) { |
| 2569 return true; | 2566 return true; |
| 2570 } | 2567 } |
| 2571 // enable-data-reduction-proxy-alt is only available for the Dev channel. | 2568 // enable-data-reduction-proxy-alt is only available for the Dev channel. |
| 2572 if (!strcmp("enable-data-reduction-proxy-alt", experiment.internal_name) && | 2569 if (!strcmp("enable-data-reduction-proxy-alt", entry.internal_name) && |
| 2573 channel != chrome::VersionInfo::CHANNEL_DEV) { | 2570 channel != chrome::VersionInfo::CHANNEL_DEV) { |
| 2574 return true; | 2571 return true; |
| 2575 } | 2572 } |
| 2576 // enable-data-reduction-proxy-lo-fi is only available for Chromium builds and | 2573 // enable-data-reduction-proxy-lo-fi is only available for Chromium builds and |
| 2577 // the Canary/Dev channel. | 2574 // the Canary/Dev channel. |
| 2578 if (!strcmp("enable-data-reduction-proxy-lo-fi", experiment.internal_name) && | 2575 if (!strcmp("enable-data-reduction-proxy-lo-fi", entry.internal_name) && |
| 2579 channel != chrome::VersionInfo::CHANNEL_DEV && | 2576 channel != chrome::VersionInfo::CHANNEL_DEV && |
| 2580 channel != chrome::VersionInfo::CHANNEL_CANARY && | 2577 channel != chrome::VersionInfo::CHANNEL_CANARY && |
| 2581 channel != chrome::VersionInfo::CHANNEL_UNKNOWN) { | 2578 channel != chrome::VersionInfo::CHANNEL_UNKNOWN) { |
| 2582 return true; | 2579 return true; |
| 2583 } | 2580 } |
| 2584 #endif | 2581 #endif |
| 2585 | 2582 |
| 2586 #if defined(ENABLE_DATA_REDUCTION_PROXY_DEBUGGING) | 2583 #if defined(ENABLE_DATA_REDUCTION_PROXY_DEBUGGING) |
| 2587 // enable-data-reduction-proxy-bypass-warning is only available for Chromium | 2584 // enable-data-reduction-proxy-bypass-warning is only available for Chromium |
| 2588 // builds and Canary/Dev channel. | 2585 // builds and Canary/Dev channel. |
| 2589 if (!strcmp("enable-data-reduction-proxy-bypass-warnings", | 2586 if (!strcmp("enable-data-reduction-proxy-bypass-warnings", |
| 2590 experiment.internal_name) && | 2587 entry.internal_name) && |
| 2591 channel != chrome::VersionInfo::CHANNEL_UNKNOWN && | 2588 channel != chrome::VersionInfo::CHANNEL_UNKNOWN && |
| 2592 channel != chrome::VersionInfo::CHANNEL_CANARY && | 2589 channel != chrome::VersionInfo::CHANNEL_CANARY && |
| 2593 channel != chrome::VersionInfo::CHANNEL_DEV) { | 2590 channel != chrome::VersionInfo::CHANNEL_DEV) { |
| 2594 return true; | 2591 return true; |
| 2595 } | 2592 } |
| 2596 #endif | 2593 #endif |
| 2597 | 2594 |
| 2598 return false; | 2595 return false; |
| 2599 } | 2596 } |
| 2600 | 2597 |
| 2601 | 2598 |
| 2602 // Variant of GetSanitizedEnabledFlags that also removes any flags that aren't | 2599 // Variant of GetSanitizedEnabledFlags that also removes any flags that aren't |
| 2603 // enabled on the current platform. | 2600 // enabled on the current platform. |
| 2604 void GetSanitizedEnabledFlagsForCurrentPlatform( | 2601 void GetSanitizedEnabledFlagsForCurrentPlatform( |
| 2605 FlagsStorage* flags_storage, std::set<std::string>* result) { | 2602 FlagsStorage* flags_storage, std::set<std::string>* result) { |
| 2606 GetSanitizedEnabledFlags(flags_storage, result); | 2603 GetSanitizedEnabledFlags(flags_storage, result); |
| 2607 | 2604 |
| 2608 // Filter out any experiments that aren't enabled on the current platform. We | 2605 // Filter out any entries that aren't enabled on the current platform. We |
| 2609 // don't remove these from prefs else syncing to a platform with a different | 2606 // don't remove these from prefs else syncing to a platform with a different |
| 2610 // set of experiments would be lossy. | 2607 // set of entries would be lossy. |
| 2611 std::set<std::string> platform_experiments; | 2608 std::set<std::string> platform_entries; |
| 2612 int current_platform = GetCurrentPlatform(); | 2609 int current_platform = GetCurrentPlatform(); |
| 2613 for (size_t i = 0; i < num_experiments; ++i) { | 2610 for (size_t i = 0; i < num_entries; ++i) { |
| 2614 if (experiments[i].supported_platforms & current_platform) | 2611 if (entries[i].supported_platforms & current_platform) |
| 2615 AddInternalName(experiments[i], &platform_experiments); | 2612 AddInternalName(entries[i], &platform_entries); |
| 2616 #if defined(OS_CHROMEOS) | 2613 #if defined(OS_CHROMEOS) |
| 2617 if (experiments[i].supported_platforms & kOsCrOSOwnerOnly) | 2614 if (entries[i].supported_platforms & kOsCrOSOwnerOnly) |
| 2618 AddInternalName(experiments[i], &platform_experiments); | 2615 AddInternalName(entries[i], &platform_entries); |
| 2619 #endif | 2616 #endif |
| 2620 } | 2617 } |
| 2621 | 2618 |
| 2622 std::set<std::string> new_enabled_experiments = | 2619 std::set<std::string> new_enabled_entries = |
| 2623 base::STLSetIntersection<std::set<std::string> >( | 2620 base::STLSetIntersection<std::set<std::string> >( |
| 2624 platform_experiments, *result); | 2621 platform_entries, *result); |
| 2625 | 2622 |
| 2626 result->swap(new_enabled_experiments); | 2623 result->swap(new_enabled_entries); |
| 2627 } | 2624 } |
| 2628 | 2625 |
| 2629 // Returns the Value representing the choice data in the specified experiment. | 2626 // Returns the Value representing the choice data in the specified entry. |
| 2630 base::Value* CreateChoiceData( | 2627 base::Value* CreateChoiceData( |
| 2631 const Experiment& experiment, | 2628 const Entry& entry, |
| 2632 const std::set<std::string>& enabled_experiments) { | 2629 const std::set<std::string>& enabled_entries) { |
| 2633 DCHECK(experiment.type == Experiment::MULTI_VALUE || | 2630 DCHECK(entry.type == Entry::MULTI_VALUE || |
| 2634 experiment.type == Experiment::ENABLE_DISABLE_VALUE); | 2631 entry.type == Entry::ENABLE_DISABLE_VALUE); |
| 2635 base::ListValue* result = new base::ListValue; | 2632 base::ListValue* result = new base::ListValue; |
| 2636 for (int i = 0; i < experiment.num_choices; ++i) { | 2633 for (int i = 0; i < entry.num_choices; ++i) { |
| 2637 base::DictionaryValue* value = new base::DictionaryValue; | 2634 base::DictionaryValue* value = new base::DictionaryValue; |
| 2638 const std::string name = experiment.NameForChoice(i); | 2635 const std::string name = entry.NameForChoice(i); |
| 2639 value->SetString("internal_name", name); | 2636 value->SetString("internal_name", name); |
| 2640 value->SetString("description", experiment.DescriptionForChoice(i)); | 2637 value->SetString("description", entry.DescriptionForChoice(i)); |
| 2641 value->SetBoolean("selected", enabled_experiments.count(name) > 0); | 2638 value->SetBoolean("selected", enabled_entries.count(name) > 0); |
| 2642 result->Append(value); | 2639 result->Append(value); |
| 2643 } | 2640 } |
| 2644 return result; | 2641 return result; |
| 2645 } | 2642 } |
| 2646 | 2643 |
| 2647 } // namespace | 2644 } // namespace |
| 2648 | 2645 |
| 2649 std::string Experiment::NameForChoice(int index) const { | 2646 std::string Entry::NameForChoice(int index) const { |
| 2650 DCHECK(type == Experiment::MULTI_VALUE || | 2647 DCHECK(type == Entry::MULTI_VALUE || |
| 2651 type == Experiment::ENABLE_DISABLE_VALUE); | 2648 type == Entry::ENABLE_DISABLE_VALUE); |
| 2652 DCHECK_LT(index, num_choices); | 2649 DCHECK_LT(index, num_choices); |
| 2653 return std::string(internal_name) + testing::kMultiSeparator + | 2650 return std::string(internal_name) + testing::kMultiSeparator + |
| 2654 base::IntToString(index); | 2651 base::IntToString(index); |
| 2655 } | 2652 } |
| 2656 | 2653 |
| 2657 base::string16 Experiment::DescriptionForChoice(int index) const { | 2654 base::string16 Entry::DescriptionForChoice(int index) const { |
| 2658 DCHECK(type == Experiment::MULTI_VALUE || | 2655 DCHECK(type == Entry::MULTI_VALUE || |
| 2659 type == Experiment::ENABLE_DISABLE_VALUE); | 2656 type == Entry::ENABLE_DISABLE_VALUE); |
| 2660 DCHECK_LT(index, num_choices); | 2657 DCHECK_LT(index, num_choices); |
| 2661 int description_id; | 2658 int description_id; |
| 2662 if (type == Experiment::ENABLE_DISABLE_VALUE) { | 2659 if (type == Entry::ENABLE_DISABLE_VALUE) { |
| 2663 const int kEnableDisableDescriptionIds[] = { | 2660 const int kEnableDisableDescriptionIds[] = { |
| 2664 IDS_GENERIC_EXPERIMENT_CHOICE_DEFAULT, | 2661 IDS_GENERIC_EXPERIMENT_CHOICE_DEFAULT, |
| 2665 IDS_GENERIC_EXPERIMENT_CHOICE_ENABLED, | 2662 IDS_GENERIC_EXPERIMENT_CHOICE_ENABLED, |
| 2666 IDS_GENERIC_EXPERIMENT_CHOICE_DISABLED, | 2663 IDS_GENERIC_EXPERIMENT_CHOICE_DISABLED, |
| 2667 }; | 2664 }; |
| 2668 description_id = kEnableDisableDescriptionIds[index]; | 2665 description_id = kEnableDisableDescriptionIds[index]; |
| 2669 } else { | 2666 } else { |
| 2670 description_id = choices[index].description_id; | 2667 description_id = choices[index].description_id; |
| 2671 } | 2668 } |
| 2672 return l10n_util::GetStringUTF16(description_id); | 2669 return l10n_util::GetStringUTF16(description_id); |
| (...skipping 28 matching lines...) Expand all Loading... |
| 2701 new_flags.begin(), | 2698 new_flags.begin(), |
| 2702 new_flags.end(), | 2699 new_flags.end(), |
| 2703 active_flags.begin(), | 2700 active_flags.begin(), |
| 2704 active_flags.end(), | 2701 active_flags.end(), |
| 2705 std::inserter(*out_difference, out_difference->begin())); | 2702 std::inserter(*out_difference, out_difference->begin())); |
| 2706 } | 2703 } |
| 2707 | 2704 |
| 2708 return result; | 2705 return result; |
| 2709 } | 2706 } |
| 2710 | 2707 |
| 2711 void GetFlagsExperimentsData(FlagsStorage* flags_storage, | 2708 void GetFlagsEntryData(FlagsStorage* flags_storage, |
| 2712 FlagAccess access, | 2709 FlagAccess access, |
| 2713 base::ListValue* supported_experiments, | 2710 base::ListValue* supported_entries, |
| 2714 base::ListValue* unsupported_experiments) { | 2711 base::ListValue* unsupported_entries) { |
| 2715 std::set<std::string> enabled_experiments; | 2712 std::set<std::string> enabled_entries; |
| 2716 GetSanitizedEnabledFlags(flags_storage, &enabled_experiments); | 2713 GetSanitizedEnabledFlags(flags_storage, &enabled_entries); |
| 2717 | 2714 |
| 2718 int current_platform = GetCurrentPlatform(); | 2715 int current_platform = GetCurrentPlatform(); |
| 2719 | 2716 |
| 2720 for (size_t i = 0; i < num_experiments; ++i) { | 2717 for (size_t i = 0; i < num_entries; ++i) { |
| 2721 const Experiment& experiment = experiments[i]; | 2718 const Entry& entry = entries[i]; |
| 2722 if (SkipConditionalExperiment(experiment, flags_storage)) | 2719 if (SkipConditionalEntry(entry, flags_storage)) |
| 2723 continue; | 2720 continue; |
| 2724 | 2721 |
| 2725 base::DictionaryValue* data = new base::DictionaryValue(); | 2722 base::DictionaryValue* data = new base::DictionaryValue(); |
| 2726 data->SetString("internal_name", experiment.internal_name); | 2723 data->SetString("internal_name", entry.internal_name); |
| 2727 data->SetString("name", | 2724 data->SetString("name", |
| 2728 l10n_util::GetStringUTF16(experiment.visible_name_id)); | 2725 l10n_util::GetStringUTF16(entry.visible_name_id)); |
| 2729 data->SetString("description", | 2726 data->SetString("description", |
| 2730 l10n_util::GetStringUTF16( | 2727 l10n_util::GetStringUTF16(entry.visible_description_id)); |
| 2731 experiment.visible_description_id)); | |
| 2732 | 2728 |
| 2733 base::ListValue* supported_platforms = new base::ListValue(); | 2729 base::ListValue* supported_platforms = new base::ListValue(); |
| 2734 AddOsStrings(experiment.supported_platforms, supported_platforms); | 2730 AddOsStrings(entry.supported_platforms, supported_platforms); |
| 2735 data->Set("supported_platforms", supported_platforms); | 2731 data->Set("supported_platforms", supported_platforms); |
| 2736 | 2732 |
| 2737 switch (experiment.type) { | 2733 switch (entry.type) { |
| 2738 case Experiment::SINGLE_VALUE: | 2734 case Entry::SINGLE_VALUE: |
| 2739 data->SetBoolean( | 2735 data->SetBoolean("enabled", |
| 2740 "enabled", | 2736 enabled_entries.count(entry.internal_name) > 0); |
| 2741 enabled_experiments.count(experiment.internal_name) > 0); | |
| 2742 break; | 2737 break; |
| 2743 case Experiment::MULTI_VALUE: | 2738 case Entry::MULTI_VALUE: |
| 2744 case Experiment::ENABLE_DISABLE_VALUE: | 2739 case Entry::ENABLE_DISABLE_VALUE: |
| 2745 data->Set("choices", CreateChoiceData(experiment, enabled_experiments)); | 2740 data->Set("choices", CreateChoiceData(entry, enabled_entries)); |
| 2746 break; | 2741 break; |
| 2747 default: | 2742 default: |
| 2748 NOTREACHED(); | 2743 NOTREACHED(); |
| 2749 } | 2744 } |
| 2750 | 2745 |
| 2751 bool supported = (experiment.supported_platforms & current_platform) != 0; | 2746 bool supported = (entry.supported_platforms & current_platform) != 0; |
| 2752 #if defined(OS_CHROMEOS) | 2747 #if defined(OS_CHROMEOS) |
| 2753 if (access == kOwnerAccessToFlags && | 2748 if (access == kOwnerAccessToFlags && |
| 2754 (experiment.supported_platforms & kOsCrOSOwnerOnly) != 0) { | 2749 (entry.supported_platforms & kOsCrOSOwnerOnly) != 0) { |
| 2755 supported = true; | 2750 supported = true; |
| 2756 } | 2751 } |
| 2757 #endif | 2752 #endif |
| 2758 if (supported) | 2753 if (supported) |
| 2759 supported_experiments->Append(data); | 2754 supported_entries->Append(data); |
| 2760 else | 2755 else |
| 2761 unsupported_experiments->Append(data); | 2756 unsupported_entries->Append(data); |
| 2762 } | 2757 } |
| 2763 } | 2758 } |
| 2764 | 2759 |
| 2765 bool IsRestartNeededToCommitChanges() { | 2760 bool IsRestartNeededToCommitChanges() { |
| 2766 return FlagsState::GetInstance()->IsRestartNeededToCommitChanges(); | 2761 return FlagsState::GetInstance()->IsRestartNeededToCommitChanges(); |
| 2767 } | 2762 } |
| 2768 | 2763 |
| 2769 void SetExperimentEnabled(FlagsStorage* flags_storage, | 2764 void SetEntryEnabled(FlagsStorage* flags_storage, |
| 2770 const std::string& internal_name, | 2765 const std::string& internal_name, |
| 2771 bool enable) { | 2766 bool enable) { |
| 2772 FlagsState::GetInstance()->SetExperimentEnabled(flags_storage, | 2767 FlagsState::GetInstance()->SetEntryEnabled(flags_storage, internal_name, |
| 2773 internal_name, enable); | 2768 enable); |
| 2774 } | 2769 } |
| 2775 | 2770 |
| 2776 void RemoveFlagsSwitches( | 2771 void RemoveFlagsSwitches( |
| 2777 std::map<std::string, base::CommandLine::StringType>* switch_list) { | 2772 std::map<std::string, base::CommandLine::StringType>* switch_list) { |
| 2778 FlagsState::GetInstance()->RemoveFlagsSwitches(switch_list); | 2773 FlagsState::GetInstance()->RemoveFlagsSwitches(switch_list); |
| 2779 } | 2774 } |
| 2780 | 2775 |
| 2781 void ResetAllFlags(FlagsStorage* flags_storage) { | 2776 void ResetAllFlags(FlagsStorage* flags_storage) { |
| 2782 FlagsState::GetInstance()->ResetAllFlags(flags_storage); | 2777 FlagsState::GetInstance()->ResetAllFlags(flags_storage); |
| 2783 } | 2778 } |
| (...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2859 DCHECK(name_to_switch_map->end() == name_to_switch_map->find(key)); | 2854 DCHECK(name_to_switch_map->end() == name_to_switch_map->find(key)); |
| 2860 (*name_to_switch_map)[key] = std::make_pair(switch_name, switch_value); | 2855 (*name_to_switch_map)[key] = std::make_pair(switch_name, switch_value); |
| 2861 } | 2856 } |
| 2862 | 2857 |
| 2863 void FlagsState::ConvertFlagsToSwitches(FlagsStorage* flags_storage, | 2858 void FlagsState::ConvertFlagsToSwitches(FlagsStorage* flags_storage, |
| 2864 base::CommandLine* command_line, | 2859 base::CommandLine* command_line, |
| 2865 SentinelsMode sentinels) { | 2860 SentinelsMode sentinels) { |
| 2866 if (command_line->HasSwitch(switches::kNoExperiments)) | 2861 if (command_line->HasSwitch(switches::kNoExperiments)) |
| 2867 return; | 2862 return; |
| 2868 | 2863 |
| 2869 std::set<std::string> enabled_experiments; | 2864 std::set<std::string> enabled_entries; |
| 2870 | 2865 |
| 2871 GetSanitizedEnabledFlagsForCurrentPlatform(flags_storage, | 2866 GetSanitizedEnabledFlagsForCurrentPlatform(flags_storage, |
| 2872 &enabled_experiments); | 2867 &enabled_entries); |
| 2873 | 2868 |
| 2874 NameToSwitchAndValueMap name_to_switch_map; | 2869 NameToSwitchAndValueMap name_to_switch_map; |
| 2875 for (size_t i = 0; i < num_experiments; ++i) { | 2870 for (size_t i = 0; i < num_entries; ++i) { |
| 2876 const Experiment& e = experiments[i]; | 2871 const Entry& e = entries[i]; |
| 2877 if (e.type == Experiment::SINGLE_VALUE) { | 2872 if (e.type == Entry::SINGLE_VALUE) { |
| 2878 SetFlagToSwitchMapping(e.internal_name, e.command_line_switch, | 2873 SetFlagToSwitchMapping(e.internal_name, e.command_line_switch, |
| 2879 e.command_line_value, &name_to_switch_map); | 2874 e.command_line_value, &name_to_switch_map); |
| 2880 } else if (e.type == Experiment::MULTI_VALUE) { | 2875 } else if (e.type == Entry::MULTI_VALUE) { |
| 2881 for (int j = 0; j < e.num_choices; ++j) { | 2876 for (int j = 0; j < e.num_choices; ++j) { |
| 2882 SetFlagToSwitchMapping(e.NameForChoice(j), | 2877 SetFlagToSwitchMapping(e.NameForChoice(j), |
| 2883 e.choices[j].command_line_switch, | 2878 e.choices[j].command_line_switch, |
| 2884 e.choices[j].command_line_value, | 2879 e.choices[j].command_line_value, |
| 2885 &name_to_switch_map); | 2880 &name_to_switch_map); |
| 2886 } | 2881 } |
| 2887 } else { | 2882 } else { |
| 2888 DCHECK_EQ(e.type, Experiment::ENABLE_DISABLE_VALUE); | 2883 DCHECK_EQ(e.type, Entry::ENABLE_DISABLE_VALUE); |
| 2889 SetFlagToSwitchMapping(e.NameForChoice(0), std::string(), std::string(), | 2884 SetFlagToSwitchMapping(e.NameForChoice(0), std::string(), std::string(), |
| 2890 &name_to_switch_map); | 2885 &name_to_switch_map); |
| 2891 SetFlagToSwitchMapping(e.NameForChoice(1), e.command_line_switch, | 2886 SetFlagToSwitchMapping(e.NameForChoice(1), e.command_line_switch, |
| 2892 e.command_line_value, &name_to_switch_map); | 2887 e.command_line_value, &name_to_switch_map); |
| 2893 SetFlagToSwitchMapping(e.NameForChoice(2), e.disable_command_line_switch, | 2888 SetFlagToSwitchMapping(e.NameForChoice(2), e.disable_command_line_switch, |
| 2894 e.disable_command_line_value, &name_to_switch_map); | 2889 e.disable_command_line_value, &name_to_switch_map); |
| 2895 } | 2890 } |
| 2896 } | 2891 } |
| 2897 | 2892 |
| 2898 if (sentinels == kAddSentinels) { | 2893 if (sentinels == kAddSentinels) { |
| 2899 command_line->AppendSwitch(switches::kFlagSwitchesBegin); | 2894 command_line->AppendSwitch(switches::kFlagSwitchesBegin); |
| 2900 flags_switches_.insert( | 2895 flags_switches_.insert( |
| 2901 std::pair<std::string, std::string>(switches::kFlagSwitchesBegin, | 2896 std::pair<std::string, std::string>(switches::kFlagSwitchesBegin, |
| 2902 std::string())); | 2897 std::string())); |
| 2903 } | 2898 } |
| 2904 for (const std::string& experiment_name : enabled_experiments) { | 2899 for (const std::string& entry_name : enabled_entries) { |
| 2905 NameToSwitchAndValueMap::const_iterator name_to_switch_it = | 2900 NameToSwitchAndValueMap::const_iterator name_to_switch_it = |
| 2906 name_to_switch_map.find(experiment_name); | 2901 name_to_switch_map.find(entry_name); |
| 2907 if (name_to_switch_it == name_to_switch_map.end()) { | 2902 if (name_to_switch_it == name_to_switch_map.end()) { |
| 2908 NOTREACHED(); | 2903 NOTREACHED(); |
| 2909 continue; | 2904 continue; |
| 2910 } | 2905 } |
| 2911 | 2906 |
| 2912 const std::pair<std::string, std::string>& | 2907 const std::pair<std::string, std::string>& |
| 2913 switch_and_value_pair = name_to_switch_it->second; | 2908 switch_and_value_pair = name_to_switch_it->second; |
| 2914 | 2909 |
| 2915 CHECK(!switch_and_value_pair.first.empty()); | 2910 CHECK(!switch_and_value_pair.first.empty()); |
| 2916 command_line->AppendSwitchASCII(switch_and_value_pair.first, | 2911 command_line->AppendSwitchASCII(switch_and_value_pair.first, |
| 2917 switch_and_value_pair.second); | 2912 switch_and_value_pair.second); |
| 2918 flags_switches_[switch_and_value_pair.first] = switch_and_value_pair.second; | 2913 flags_switches_[switch_and_value_pair.first] = switch_and_value_pair.second; |
| 2919 } | 2914 } |
| 2920 if (sentinels == kAddSentinels) { | 2915 if (sentinels == kAddSentinels) { |
| 2921 command_line->AppendSwitch(switches::kFlagSwitchesEnd); | 2916 command_line->AppendSwitch(switches::kFlagSwitchesEnd); |
| 2922 flags_switches_.insert( | 2917 flags_switches_.insert( |
| 2923 std::pair<std::string, std::string>(switches::kFlagSwitchesEnd, | 2918 std::pair<std::string, std::string>(switches::kFlagSwitchesEnd, |
| 2924 std::string())); | 2919 std::string())); |
| 2925 } | 2920 } |
| 2926 } | 2921 } |
| 2927 | 2922 |
| 2928 bool FlagsState::IsRestartNeededToCommitChanges() { | 2923 bool FlagsState::IsRestartNeededToCommitChanges() { |
| 2929 return needs_restart_; | 2924 return needs_restart_; |
| 2930 } | 2925 } |
| 2931 | 2926 |
| 2932 void FlagsState::SetExperimentEnabled(FlagsStorage* flags_storage, | 2927 void FlagsState::SetEntryEnabled(FlagsStorage* flags_storage, |
| 2933 const std::string& internal_name, | 2928 const std::string& internal_name, |
| 2934 bool enable) { | 2929 bool enable) { |
| 2935 size_t at_index = internal_name.find(testing::kMultiSeparator); | 2930 size_t at_index = internal_name.find(testing::kMultiSeparator); |
| 2936 if (at_index != std::string::npos) { | 2931 if (at_index != std::string::npos) { |
| 2937 DCHECK(enable); | 2932 DCHECK(enable); |
| 2938 // We're being asked to enable a multi-choice experiment. Disable the | 2933 // We're being asked to enable a multi-choice entry. Disable the currently |
| 2939 // currently selected choice. | 2934 // selected choice. |
| 2940 DCHECK_NE(at_index, 0u); | 2935 DCHECK_NE(at_index, 0u); |
| 2941 const std::string experiment_name = internal_name.substr(0, at_index); | 2936 const std::string entry_name = internal_name.substr(0, at_index); |
| 2942 SetExperimentEnabled(flags_storage, experiment_name, false); | 2937 SetEntryEnabled(flags_storage, entry_name, false); |
| 2943 | 2938 |
| 2944 // And enable the new choice, if it is not the default first choice. | 2939 // And enable the new choice, if it is not the default first choice. |
| 2945 if (internal_name != experiment_name + "@0") { | 2940 if (internal_name != entry_name + "@0") { |
| 2946 std::set<std::string> enabled_experiments; | 2941 std::set<std::string> enabled_entries; |
| 2947 GetSanitizedEnabledFlags(flags_storage, &enabled_experiments); | 2942 GetSanitizedEnabledFlags(flags_storage, &enabled_entries); |
| 2948 needs_restart_ |= enabled_experiments.insert(internal_name).second; | 2943 needs_restart_ |= enabled_entries.insert(internal_name).second; |
| 2949 flags_storage->SetFlags(enabled_experiments); | 2944 flags_storage->SetFlags(enabled_entries); |
| 2950 } | 2945 } |
| 2951 return; | 2946 return; |
| 2952 } | 2947 } |
| 2953 | 2948 |
| 2954 std::set<std::string> enabled_experiments; | 2949 std::set<std::string> enabled_entries; |
| 2955 GetSanitizedEnabledFlags(flags_storage, &enabled_experiments); | 2950 GetSanitizedEnabledFlags(flags_storage, &enabled_entries); |
| 2956 | 2951 |
| 2957 const Experiment* e = NULL; | 2952 const Entry* e = NULL; |
| 2958 for (size_t i = 0; i < num_experiments; ++i) { | 2953 for (size_t i = 0; i < num_entries; ++i) { |
| 2959 if (experiments[i].internal_name == internal_name) { | 2954 if (entries[i].internal_name == internal_name) { |
| 2960 e = experiments + i; | 2955 e = entries + i; |
| 2961 break; | 2956 break; |
| 2962 } | 2957 } |
| 2963 } | 2958 } |
| 2964 DCHECK(e); | 2959 DCHECK(e); |
| 2965 | 2960 |
| 2966 if (e->type == Experiment::SINGLE_VALUE) { | 2961 if (e->type == Entry::SINGLE_VALUE) { |
| 2967 if (enable) | 2962 if (enable) |
| 2968 needs_restart_ |= enabled_experiments.insert(internal_name).second; | 2963 needs_restart_ |= enabled_entries.insert(internal_name).second; |
| 2969 else | 2964 else |
| 2970 needs_restart_ |= (enabled_experiments.erase(internal_name) > 0); | 2965 needs_restart_ |= (enabled_entries.erase(internal_name) > 0); |
| 2971 } else { | 2966 } else { |
| 2972 if (enable) { | 2967 if (enable) { |
| 2973 // Enable the first choice. | 2968 // Enable the first choice. |
| 2974 needs_restart_ |= enabled_experiments.insert(e->NameForChoice(0)).second; | 2969 needs_restart_ |= enabled_entries.insert(e->NameForChoice(0)).second; |
| 2975 } else { | 2970 } else { |
| 2976 // Find the currently enabled choice and disable it. | 2971 // Find the currently enabled choice and disable it. |
| 2977 for (int i = 0; i < e->num_choices; ++i) { | 2972 for (int i = 0; i < e->num_choices; ++i) { |
| 2978 std::string choice_name = e->NameForChoice(i); | 2973 std::string choice_name = e->NameForChoice(i); |
| 2979 if (enabled_experiments.find(choice_name) != | 2974 if (enabled_entries.find(choice_name) != enabled_entries.end()) { |
| 2980 enabled_experiments.end()) { | |
| 2981 needs_restart_ = true; | 2975 needs_restart_ = true; |
| 2982 enabled_experiments.erase(choice_name); | 2976 enabled_entries.erase(choice_name); |
| 2983 // Continue on just in case there's a bug and more than one | 2977 // Continue on just in case there's a bug and more than one entry for |
| 2984 // experiment for this choice was enabled. | 2978 // this choice was enabled. |
| 2985 } | 2979 } |
| 2986 } | 2980 } |
| 2987 } | 2981 } |
| 2988 } | 2982 } |
| 2989 | 2983 |
| 2990 flags_storage->SetFlags(enabled_experiments); | 2984 flags_storage->SetFlags(enabled_entries); |
| 2991 } | 2985 } |
| 2992 | 2986 |
| 2993 void FlagsState::RemoveFlagsSwitches( | 2987 void FlagsState::RemoveFlagsSwitches( |
| 2994 std::map<std::string, base::CommandLine::StringType>* switch_list) { | 2988 std::map<std::string, base::CommandLine::StringType>* switch_list) { |
| 2995 for (const auto& entry : flags_switches_) | 2989 for (const auto& entry : flags_switches_) |
| 2996 switch_list->erase(entry.first); | 2990 switch_list->erase(entry.first); |
| 2997 } | 2991 } |
| 2998 | 2992 |
| 2999 void FlagsState::ResetAllFlags(FlagsStorage* flags_storage) { | 2993 void FlagsState::ResetAllFlags(FlagsStorage* flags_storage) { |
| 3000 needs_restart_ = true; | 2994 needs_restart_ = true; |
| 3001 | 2995 |
| 3002 std::set<std::string> no_experiments; | 2996 std::set<std::string> no_entries; |
| 3003 flags_storage->SetFlags(no_experiments); | 2997 flags_storage->SetFlags(no_entries); |
| 3004 } | 2998 } |
| 3005 | 2999 |
| 3006 void FlagsState::reset() { | 3000 void FlagsState::reset() { |
| 3007 needs_restart_ = false; | 3001 needs_restart_ = false; |
| 3008 flags_switches_.clear(); | 3002 flags_switches_.clear(); |
| 3009 } | 3003 } |
| 3010 | 3004 |
| 3011 } // namespace | 3005 } // namespace |
| 3012 | 3006 |
| 3013 namespace testing { | 3007 namespace testing { |
| 3014 | 3008 |
| 3015 // WARNING: '@' is also used in the html file. If you update this constant you | 3009 // WARNING: '@' is also used in the html file. If you update this constant you |
| 3016 // also need to update the html file. | 3010 // also need to update the html file. |
| 3017 const char kMultiSeparator[] = "@"; | 3011 const char kMultiSeparator[] = "@"; |
| 3018 | 3012 |
| 3019 const base::HistogramBase::Sample kBadSwitchFormatHistogramId = 0; | 3013 const base::HistogramBase::Sample kBadSwitchFormatHistogramId = 0; |
| 3020 | 3014 |
| 3021 void ClearState() { | 3015 void ClearState() { |
| 3022 FlagsState::GetInstance()->reset(); | 3016 FlagsState::GetInstance()->reset(); |
| 3023 } | 3017 } |
| 3024 | 3018 |
| 3025 void SetExperiments(const Experiment* e, size_t count) { | 3019 void SetEntries(const Entry* e, size_t count) { |
| 3026 if (!e) { | 3020 if (!e) { |
| 3027 experiments = kExperiments; | 3021 entries = kEntries; |
| 3028 num_experiments = arraysize(kExperiments); | 3022 num_entries = arraysize(kEntries); |
| 3029 } else { | 3023 } else { |
| 3030 experiments = e; | 3024 entries = e; |
| 3031 num_experiments = count; | 3025 num_entries = count; |
| 3032 } | 3026 } |
| 3033 } | 3027 } |
| 3034 | 3028 |
| 3035 const Experiment* GetExperiments(size_t* count) { | 3029 const Entry* GetEntries(size_t* count) { |
| 3036 *count = num_experiments; | 3030 *count = num_entries; |
| 3037 return experiments; | 3031 return entries; |
| 3038 } | 3032 } |
| 3039 | 3033 |
| 3040 } // namespace testing | 3034 } // namespace testing |
| 3041 | 3035 |
| 3042 } // namespace about_flags | 3036 } // namespace about_flags |
| OLD | NEW |