[Android] Enable the autofill dialog flag.
[chromium-blink-merge.git] / chrome / browser / about_flags.cc
blobd44265f46a5499ae8fa4e84c7ccb1290024d2990
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
3 // found in the LICENSE file.
5 #include "chrome/browser/about_flags.h"
7 #include <algorithm>
8 #include <iterator>
9 #include <map>
10 #include <set>
11 #include <utility>
13 #include "ash/ash_switches.h"
14 #include "base/command_line.h"
15 #include "base/memory/singleton.h"
16 #include "base/strings/string_number_conversions.h"
17 #include "base/strings/utf_string_conversions.h"
18 #include "base/values.h"
19 #include "cc/base/switches.h"
20 #include "chrome/browser/flags_storage.h"
21 #include "chrome/common/chrome_content_client.h"
22 #include "chrome/common/chrome_switches.h"
23 #include "components/nacl/common/nacl_switches.h"
24 #include "content/public/browser/user_metrics.h"
25 #include "extensions/common/switches.h"
26 #include "grit/chromium_strings.h"
27 #include "grit/generated_resources.h"
28 #include "grit/google_chrome_strings.h"
29 #include "media/base/media_switches.h"
30 #include "ui/base/l10n/l10n_util.h"
31 #include "ui/base/ui_base_switches.h"
32 #include "ui/gfx/switches.h"
33 #include "ui/gl/gl_switches.h"
34 #include "ui/keyboard/keyboard_switches.h"
35 #include "ui/message_center/message_center_switches.h"
36 #include "ui/surface/surface_switches.h"
38 #if defined(USE_ASH)
39 #include "ash/ash_switches.h"
40 #endif
42 #if defined(OS_CHROMEOS)
43 #include "chromeos/chromeos_switches.h"
44 #include "third_party/cros_system_api/switches/chrome_switches.h"
45 #endif
47 using content::UserMetricsAction;
49 namespace about_flags {
51 // Macros to simplify specifying the type.
52 #define SINGLE_VALUE_TYPE_AND_VALUE(command_line_switch, switch_value) \
53 Experiment::SINGLE_VALUE, \
54 command_line_switch, switch_value, NULL, NULL, NULL, 0
55 #define SINGLE_VALUE_TYPE(command_line_switch) \
56 SINGLE_VALUE_TYPE_AND_VALUE(command_line_switch, "")
57 #define ENABLE_DISABLE_VALUE_TYPE_AND_VALUE(enable_switch, enable_value, \
58 disable_switch, disable_value) \
59 Experiment::ENABLE_DISABLE_VALUE, enable_switch, enable_value, \
60 disable_switch, disable_value, NULL, 3
61 #define ENABLE_DISABLE_VALUE_TYPE(enable_switch, disable_switch) \
62 ENABLE_DISABLE_VALUE_TYPE_AND_VALUE(enable_switch, "", disable_switch, "")
63 #define MULTI_VALUE_TYPE(choices) \
64 Experiment::MULTI_VALUE, NULL, NULL, NULL, NULL, choices, arraysize(choices)
66 namespace {
68 const unsigned kOsAll = kOsMac | kOsWin | kOsLinux | kOsCrOS | kOsAndroid;
69 const unsigned kOsDesktop = kOsMac | kOsWin | kOsLinux | kOsCrOS;
71 // Adds a |StringValue| to |list| for each platform where |bitmask| indicates
72 // whether the experiment is available on that platform.
73 void AddOsStrings(unsigned bitmask, ListValue* list) {
74 struct {
75 unsigned bit;
76 const char* const name;
77 } kBitsToOs[] = {
78 {kOsMac, "Mac"},
79 {kOsWin, "Windows"},
80 {kOsLinux, "Linux"},
81 {kOsCrOS, "Chrome OS"},
82 {kOsAndroid, "Android"},
83 {kOsCrOSOwnerOnly, "Chrome OS (owner only)"},
85 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(kBitsToOs); ++i)
86 if (bitmask & kBitsToOs[i].bit)
87 list->Append(new StringValue(kBitsToOs[i].name));
90 // Convert switch constants to proper CommandLine::StringType strings.
91 CommandLine::StringType GetSwitchString(const std::string& flag) {
92 CommandLine cmd_line(CommandLine::NO_PROGRAM);
93 cmd_line.AppendSwitch(flag);
94 DCHECK(cmd_line.argv().size() == 2);
95 return cmd_line.argv()[1];
98 // Scoops flags from a command line.
99 std::set<CommandLine::StringType> ExtractFlagsFromCommandLine(
100 const CommandLine& cmdline) {
101 std::set<CommandLine::StringType> flags;
102 // First do the ones between --flag-switches-begin and --flag-switches-end.
103 CommandLine::StringVector::const_iterator first =
104 std::find(cmdline.argv().begin(), cmdline.argv().end(),
105 GetSwitchString(switches::kFlagSwitchesBegin));
106 CommandLine::StringVector::const_iterator last =
107 std::find(cmdline.argv().begin(), cmdline.argv().end(),
108 GetSwitchString(switches::kFlagSwitchesEnd));
109 if (first != cmdline.argv().end() && last != cmdline.argv().end())
110 flags.insert(first + 1, last);
111 #if defined(OS_CHROMEOS)
112 // Then add those between --policy-switches-begin and --policy-switches-end.
113 first = std::find(cmdline.argv().begin(), cmdline.argv().end(),
114 GetSwitchString(chromeos::switches::kPolicySwitchesBegin));
115 last = std::find(cmdline.argv().begin(), cmdline.argv().end(),
116 GetSwitchString(chromeos::switches::kPolicySwitchesEnd));
117 if (first != cmdline.argv().end() && last != cmdline.argv().end())
118 flags.insert(first + 1, last);
119 #endif
120 return flags;
123 const Experiment::Choice kEnableCompositingForFixedPositionChoices[] = {
124 { IDS_GENERIC_EXPERIMENT_CHOICE_DEFAULT, "", "" },
125 { IDS_GENERIC_EXPERIMENT_CHOICE_ENABLED,
126 switches::kEnableCompositingForFixedPosition, ""},
127 { IDS_GENERIC_EXPERIMENT_CHOICE_DISABLED,
128 switches::kDisableCompositingForFixedPosition, ""},
129 { IDS_FLAGS_COMPOSITING_FOR_FIXED_POSITION_HIGH_DPI,
130 switches::kEnableHighDpiCompositingForFixedPosition, ""}
133 const Experiment::Choice kEnableCompositingForTransitionChoices[] = {
134 { IDS_GENERIC_EXPERIMENT_CHOICE_DEFAULT, "", "" },
135 { IDS_GENERIC_EXPERIMENT_CHOICE_ENABLED,
136 switches::kEnableCompositingForTransition, ""},
137 { IDS_GENERIC_EXPERIMENT_CHOICE_DISABLED,
138 switches::kDisableCompositingForTransition, ""},
141 const Experiment::Choice kEnableAcceleratedFixedRootBackgroundChoices[] = {
142 { IDS_GENERIC_EXPERIMENT_CHOICE_DEFAULT, "", "" },
143 { IDS_GENERIC_EXPERIMENT_CHOICE_ENABLED,
144 switches::kEnableAcceleratedFixedRootBackground, ""},
145 { IDS_GENERIC_EXPERIMENT_CHOICE_DISABLED,
146 switches::kDisableAcceleratedFixedRootBackground, ""},
149 const Experiment::Choice kGDIPresentChoices[] = {
150 { IDS_GENERIC_EXPERIMENT_CHOICE_DEFAULT, "", "" },
151 { IDS_FLAGS_PRESENT_WITH_GDI_FIRST_SHOW,
152 switches::kDoFirstShowPresentWithGDI, ""},
153 { IDS_FLAGS_PRESENT_WITH_GDI_ALL_SHOW,
154 switches::kDoAllShowPresentWithGDI, ""}
157 const Experiment::Choice kTouchEventsChoices[] = {
158 { IDS_GENERIC_EXPERIMENT_CHOICE_AUTOMATIC, "", "" },
159 { IDS_GENERIC_EXPERIMENT_CHOICE_ENABLED,
160 switches::kTouchEvents,
161 switches::kTouchEventsEnabled },
162 { IDS_GENERIC_EXPERIMENT_CHOICE_DISABLED,
163 switches::kTouchEvents,
164 switches::kTouchEventsDisabled }
167 const Experiment::Choice kTouchOptimizedUIChoices[] = {
168 { IDS_GENERIC_EXPERIMENT_CHOICE_AUTOMATIC, "", "" },
169 { IDS_GENERIC_EXPERIMENT_CHOICE_ENABLED,
170 switches::kTouchOptimizedUI,
171 switches::kTouchOptimizedUIEnabled },
172 { IDS_GENERIC_EXPERIMENT_CHOICE_DISABLED,
173 switches::kTouchOptimizedUI,
174 switches::kTouchOptimizedUIDisabled }
177 const Experiment::Choice kNaClDebugMaskChoices[] = {
178 { IDS_GENERIC_EXPERIMENT_CHOICE_DEFAULT, "", "" },
179 // Secure shell can be used on ChromeOS for forwarding the TCP port opened by
180 // debug stub to a remote machine. Since secure shell uses NaCl, we provide
181 // an option to switch off its debugging.
182 { IDS_NACL_DEBUG_MASK_CHOICE_EXCLUDE_UTILS,
183 switches::kNaClDebugMask, "!*://*/*ssh_client.nmf" },
184 { IDS_NACL_DEBUG_MASK_CHOICE_INCLUDE_DEBUG,
185 switches::kNaClDebugMask, "*://*/*debug.nmf" }
188 #if defined(OS_CHROMEOS)
190 const Experiment::Choice kChromeCaptivePortalDetectionChoices[] = {
191 { IDS_GENERIC_EXPERIMENT_CHOICE_DEFAULT, "", "" },
192 { IDS_FLAGS_CHROME_CAPTIVE_PORTAL_DETECTOR,
193 chromeos::switches::kEnableChromeCaptivePortalDetector, "" },
194 { IDS_FLAGS_SHILL_CAPTIVE_PORTAL_DETECTOR,
195 chromeos::switches::kDisableChromeCaptivePortalDetector, "" }
198 #endif
200 const Experiment::Choice kImplSidePaintingChoices[] = {
201 { IDS_GENERIC_EXPERIMENT_CHOICE_DEFAULT, "", "" },
202 { IDS_GENERIC_EXPERIMENT_CHOICE_ENABLED,
203 cc::switches::kEnableImplSidePainting, ""},
204 { IDS_GENERIC_EXPERIMENT_CHOICE_DISABLED,
205 cc::switches::kDisableImplSidePainting, ""}
208 const Experiment::Choice kDelegatedRendererChoices[] = {
209 { IDS_GENERIC_EXPERIMENT_CHOICE_DEFAULT, "", "" },
210 { IDS_GENERIC_EXPERIMENT_CHOICE_ENABLED,
211 switches::kEnableDelegatedRenderer, ""},
212 { IDS_GENERIC_EXPERIMENT_CHOICE_DISABLED,
213 switches::kDisableDelegatedRenderer, ""}
216 const Experiment::Choice kMaxTilesForInterestAreaChoices[] = {
217 { IDS_GENERIC_EXPERIMENT_CHOICE_DEFAULT, "", "" },
218 { IDS_FLAGS_MAX_TILES_FOR_INTEREST_AREA_SHORT,
219 cc::switches::kMaxTilesForInterestArea, "64"},
220 { IDS_FLAGS_MAX_TILES_FOR_INTEREST_AREA_TALL,
221 cc::switches::kMaxTilesForInterestArea, "128"},
222 { IDS_FLAGS_MAX_TILES_FOR_INTEREST_AREA_GRANDE,
223 cc::switches::kMaxTilesForInterestArea, "256"},
224 { IDS_FLAGS_MAX_TILES_FOR_INTEREST_AREA_VENTI,
225 cc::switches::kMaxTilesForInterestArea, "512"}
228 const Experiment::Choice kDefaultTileWidthChoices[] = {
229 { IDS_GENERIC_EXPERIMENT_CHOICE_DEFAULT, "", "" },
230 { IDS_FLAGS_DEFAULT_TILE_WIDTH_SHORT,
231 switches::kDefaultTileWidth, "128"},
232 { IDS_FLAGS_DEFAULT_TILE_WIDTH_TALL,
233 switches::kDefaultTileWidth, "256"},
234 { IDS_FLAGS_DEFAULT_TILE_WIDTH_GRANDE,
235 switches::kDefaultTileWidth, "512"},
236 { IDS_FLAGS_DEFAULT_TILE_WIDTH_VENTI,
237 switches::kDefaultTileWidth, "1024"}
240 const Experiment::Choice kDefaultTileHeightChoices[] = {
241 { IDS_GENERIC_EXPERIMENT_CHOICE_DEFAULT, "", "" },
242 { IDS_FLAGS_DEFAULT_TILE_HEIGHT_SHORT,
243 switches::kDefaultTileHeight, "128"},
244 { IDS_FLAGS_DEFAULT_TILE_HEIGHT_TALL,
245 switches::kDefaultTileHeight, "256"},
246 { IDS_FLAGS_DEFAULT_TILE_HEIGHT_GRANDE,
247 switches::kDefaultTileHeight, "512"},
248 { IDS_FLAGS_DEFAULT_TILE_HEIGHT_VENTI,
249 switches::kDefaultTileHeight, "1024"}
252 const Experiment::Choice kSimpleCacheBackendChoices[] = {
253 { IDS_GENERIC_EXPERIMENT_CHOICE_DEFAULT, "", "" },
254 { IDS_GENERIC_EXPERIMENT_CHOICE_DISABLED,
255 switches::kUseSimpleCacheBackend, "off" },
256 { IDS_GENERIC_EXPERIMENT_CHOICE_ENABLED,
257 switches::kUseSimpleCacheBackend, "on"}
260 const Experiment::Choice kTabCaptureUpscaleQualityChoices[] = {
261 { IDS_GENERIC_EXPERIMENT_CHOICE_DEFAULT, "", "" },
262 { IDS_FLAGS_TAB_CAPTURE_SCALE_QUALITY_FAST,
263 switches::kTabCaptureUpscaleQuality, "fast" },
264 { IDS_FLAGS_TAB_CAPTURE_SCALE_QUALITY_GOOD,
265 switches::kTabCaptureUpscaleQuality, "good" },
266 { IDS_FLAGS_TAB_CAPTURE_SCALE_QUALITY_BEST,
267 switches::kTabCaptureUpscaleQuality, "best" },
270 const Experiment::Choice kTabCaptureDownscaleQualityChoices[] = {
271 { IDS_GENERIC_EXPERIMENT_CHOICE_DEFAULT, "", "" },
272 { IDS_FLAGS_TAB_CAPTURE_SCALE_QUALITY_FAST,
273 switches::kTabCaptureDownscaleQuality, "fast" },
274 { IDS_FLAGS_TAB_CAPTURE_SCALE_QUALITY_GOOD,
275 switches::kTabCaptureDownscaleQuality, "good" },
276 { IDS_FLAGS_TAB_CAPTURE_SCALE_QUALITY_BEST,
277 switches::kTabCaptureDownscaleQuality, "best" },
280 // RECORDING USER METRICS FOR FLAGS:
281 // -----------------------------------------------------------------------------
282 // The first line of the experiment is the internal name. If you'd like to
283 // gather statistics about the usage of your flag, you should append a marker
284 // comment to the end of the feature name, like so:
285 // "my-special-feature", // FLAGS:RECORD_UMA
287 // After doing that, run //chrome/tools/extract_actions.py (see instructions at
288 // the top of that file for details) to update the chromeactions.txt file, which
289 // will enable UMA to record your feature flag.
291 // After your feature has shipped under a flag, you can locate the metrics under
292 // the action name AboutFlags_internal-action-name. Actions are recorded once
293 // per startup, so you should divide this number by AboutFlags_StartupTick to
294 // get a sense of usage. Note that this will not be the same as number of users
295 // with a given feature enabled because users can quit and relaunch the
296 // application multiple times over a given time interval. The dashboard also
297 // shows you how many (metrics reporting) users have enabled the flag over the
298 // last seven days. However, note that this is not the same as the number of
299 // users who have the flag enabled, since enabling the flag happens once,
300 // whereas running with the flag enabled happens until the user flips the flag
301 // again.
303 // To add a new experiment add to the end of kExperiments. There are two
304 // distinct types of experiments:
305 // . SINGLE_VALUE: experiment is either on or off. Use the SINGLE_VALUE_TYPE
306 // macro for this type supplying the command line to the macro.
307 // . MULTI_VALUE: a list of choices, the first of which should correspond to a
308 // deactivated state for this lab (i.e. no command line option). To specify
309 // this type of experiment use the macro MULTI_VALUE_TYPE supplying it the
310 // array of choices.
311 // See the documentation of Experiment for details on the fields.
313 // When adding a new choice, add it to the end of the list.
314 const Experiment kExperiments[] = {
316 "expose-for-tabs", // FLAGS:RECORD_UMA
317 IDS_FLAGS_TABPOSE_NAME,
318 IDS_FLAGS_TABPOSE_DESCRIPTION,
319 kOsMac,
320 #if defined(OS_MACOSX)
321 // The switch exists only on OS X.
322 SINGLE_VALUE_TYPE(switches::kEnableExposeForTabs)
323 #else
324 SINGLE_VALUE_TYPE("")
325 #endif
328 "conflicting-modules-check", // FLAGS:RECORD_UMA
329 IDS_FLAGS_CONFLICTS_CHECK_NAME,
330 IDS_FLAGS_CONFLICTS_CHECK_DESCRIPTION,
331 kOsWin,
332 SINGLE_VALUE_TYPE(switches::kConflictingModulesCheck)
335 "ignore-gpu-blacklist",
336 IDS_FLAGS_IGNORE_GPU_BLACKLIST_NAME,
337 IDS_FLAGS_IGNORE_GPU_BLACKLIST_DESCRIPTION,
338 kOsAll,
339 SINGLE_VALUE_TYPE(switches::kIgnoreGpuBlacklist)
342 "force-compositing-mode-2",
343 IDS_FLAGS_FORCE_COMPOSITING_MODE_NAME,
344 IDS_FLAGS_FORCE_COMPOSITING_MODE_DESCRIPTION,
345 kOsMac | kOsWin | kOsLinux,
346 ENABLE_DISABLE_VALUE_TYPE(switches::kForceCompositingMode,
347 switches::kDisableForceCompositingMode)
350 "threaded-compositing-mode",
351 IDS_FLAGS_THREADED_COMPOSITING_MODE_NAME,
352 IDS_FLAGS_THREADED_COMPOSITING_MODE_DESCRIPTION,
353 kOsMac | kOsWin | kOsLinux,
354 ENABLE_DISABLE_VALUE_TYPE(switches::kEnableThreadedCompositing,
355 switches::kDisableThreadedCompositing)
358 "force-accelerated-composited-scrolling",
359 IDS_FLAGS_FORCE_ACCELERATED_OVERFLOW_SCROLL_MODE_NAME,
360 IDS_FLAGS_FORCE_ACCELERATED_OVERFLOW_SCROLL_MODE_DESCRIPTION,
361 kOsAll,
362 ENABLE_DISABLE_VALUE_TYPE(switches::kEnableAcceleratedOverflowScroll,
363 switches::kDisableAcceleratedOverflowScroll)
366 "present-with-GDI",
367 IDS_FLAGS_PRESENT_WITH_GDI_NAME,
368 IDS_FLAGS_PRESENT_WITH_GDI_DESCRIPTION,
369 kOsWin,
370 MULTI_VALUE_TYPE(kGDIPresentChoices)
373 "enable-experimental-canvas-features",
374 IDS_FLAGS_ENABLE_EXPERIMENTAL_CANVAS_FEATURES_NAME,
375 IDS_FLAGS_ENABLE_EXPERIMENTAL_CANVAS_FEATURES_DESCRIPTION,
376 kOsAll,
377 SINGLE_VALUE_TYPE(switches::kEnableExperimentalCanvasFeatures)
380 "disable-accelerated-2d-canvas",
381 IDS_FLAGS_DISABLE_ACCELERATED_2D_CANVAS_NAME,
382 IDS_FLAGS_DISABLE_ACCELERATED_2D_CANVAS_DESCRIPTION,
383 kOsAll,
384 SINGLE_VALUE_TYPE(switches::kDisableAccelerated2dCanvas)
387 "disable-threaded-animation",
388 IDS_FLAGS_DISABLE_THREADED_ANIMATION_NAME,
389 IDS_FLAGS_DISABLE_THREADED_ANIMATION_DESCRIPTION,
390 kOsAll,
391 SINGLE_VALUE_TYPE(cc::switches::kDisableThreadedAnimation)
394 "composited-layer-borders",
395 IDS_FLAGS_COMPOSITED_LAYER_BORDERS,
396 IDS_FLAGS_COMPOSITED_LAYER_BORDERS_DESCRIPTION,
397 kOsAll,
398 SINGLE_VALUE_TYPE(cc::switches::kShowCompositedLayerBorders)
401 "show-fps-counter",
402 IDS_FLAGS_SHOW_FPS_COUNTER,
403 IDS_FLAGS_SHOW_FPS_COUNTER_DESCRIPTION,
404 kOsAll,
405 SINGLE_VALUE_TYPE(cc::switches::kShowFPSCounter)
408 "accelerated-filters",
409 IDS_FLAGS_ACCELERATED_FILTERS,
410 IDS_FLAGS_ACCELERATED_FILTERS_DESCRIPTION,
411 kOsAll,
412 SINGLE_VALUE_TYPE(switches::kEnableAcceleratedFilters)
415 "disable-gpu-vsync",
416 IDS_FLAGS_DISABLE_GPU_VSYNC_NAME,
417 IDS_FLAGS_DISABLE_GPU_VSYNC_DESCRIPTION,
418 kOsDesktop,
419 SINGLE_VALUE_TYPE(switches::kDisableGpuVsync)
422 "disable-webgl",
423 IDS_FLAGS_DISABLE_WEBGL_NAME,
424 IDS_FLAGS_DISABLE_WEBGL_DESCRIPTION,
425 kOsAll,
426 SINGLE_VALUE_TYPE(switches::kDisableExperimentalWebGL)
429 "disable-webrtc",
430 IDS_FLAGS_DISABLE_WEBRTC_NAME,
431 IDS_FLAGS_DISABLE_WEBRTC_DESCRIPTION,
432 kOsAndroid,
433 #if defined(OS_ANDROID)
434 SINGLE_VALUE_TYPE(switches::kDisableWebRTC)
435 #else
436 SINGLE_VALUE_TYPE("")
437 #endif
439 #if defined(ENABLE_WEBRTC)
441 "enable-sctp-data-channels",
442 IDS_FLAGS_ENABLE_SCTP_DATA_CHANNELS_NAME,
443 IDS_FLAGS_ENABLE_SCTP_DATA_CHANNELS_DESCRIPTION,
444 kOsAll,
445 SINGLE_VALUE_TYPE(switches::kEnableSCTPDataChannels)
448 "disable-device-enumeration",
449 IDS_FLAGS_DISABLE_DEVICE_ENUMERATION_NAME,
450 IDS_FLAGS_DISABLE_DEVICE_ENUMERATION_DESCRIPTION,
451 kOsAll,
452 SINGLE_VALUE_TYPE(switches::kDisableDeviceEnumeration)
454 #endif
455 #if defined(OS_ANDROID)
457 "disable-webaudio",
458 IDS_FLAGS_DISABLE_WEBAUDIO_NAME,
459 IDS_FLAGS_DISABLE_WEBAUDIO_DESCRIPTION,
460 kOsAndroid,
461 SINGLE_VALUE_TYPE(switches::kDisableWebAudio)
463 #endif
465 "fixed-position-creates-stacking-context",
466 IDS_FLAGS_FIXED_POSITION_CREATES_STACKING_CONTEXT_NAME,
467 IDS_FLAGS_FIXED_POSITION_CREATES_STACKING_CONTEXT_DESCRIPTION,
468 kOsAll,
469 ENABLE_DISABLE_VALUE_TYPE(
470 switches::kEnableFixedPositionCreatesStackingContext,
471 switches::kDisableFixedPositionCreatesStackingContext)
474 "enable-compositing-for-fixed-position",
475 IDS_FLAGS_COMPOSITING_FOR_FIXED_POSITION_NAME,
476 IDS_FLAGS_COMPOSITING_FOR_FIXED_POSITION_DESCRIPTION,
477 kOsAll,
478 MULTI_VALUE_TYPE(kEnableCompositingForFixedPositionChoices)
481 "enable-compositing-for-transition",
482 IDS_FLAGS_COMPOSITING_FOR_TRANSITION_NAME,
483 IDS_FLAGS_COMPOSITING_FOR_TRANSITION_DESCRIPTION,
484 kOsAll,
485 MULTI_VALUE_TYPE(kEnableCompositingForTransitionChoices)
488 "enable-accelerated-fixed-root-background",
489 IDS_FLAGS_ACCELERATED_FIXED_ROOT_BACKGROUND_NAME,
490 IDS_FLAGS_ACCELERATED_FIXED_ROOT_BACKGROUND_DESCRIPTION,
491 kOsAll,
492 MULTI_VALUE_TYPE(kEnableAcceleratedFixedRootBackgroundChoices)
494 // TODO(bbudge): When NaCl is on by default, remove this flag entry.
496 "enable-nacl", // FLAGS:RECORD_UMA
497 IDS_FLAGS_ENABLE_NACL_NAME,
498 IDS_FLAGS_ENABLE_NACL_DESCRIPTION,
499 kOsDesktop,
500 SINGLE_VALUE_TYPE(switches::kEnableNaCl)
503 "enable-nacl-debug", // FLAGS:RECORD_UMA
504 IDS_FLAGS_ENABLE_NACL_DEBUG_NAME,
505 IDS_FLAGS_ENABLE_NACL_DEBUG_DESCRIPTION,
506 kOsDesktop,
507 SINGLE_VALUE_TYPE(switches::kEnableNaClDebug)
510 "nacl-debug-mask", // FLAGS:RECORD_UMA
511 IDS_FLAGS_NACL_DEBUG_MASK_NAME,
512 IDS_FLAGS_NACL_DEBUG_MASK_DESCRIPTION,
513 kOsDesktop,
514 MULTI_VALUE_TYPE(kNaClDebugMaskChoices)
517 "enable-pnacl", // FLAGS:RECORD_UMA
518 IDS_FLAGS_ENABLE_PNACL_NAME,
519 IDS_FLAGS_ENABLE_PNACL_DESCRIPTION,
520 kOsDesktop,
521 SINGLE_VALUE_TYPE(switches::kEnablePnacl)
524 "extension-apis", // FLAGS:RECORD_UMA
525 IDS_FLAGS_EXPERIMENTAL_EXTENSION_APIS_NAME,
526 IDS_FLAGS_EXPERIMENTAL_EXTENSION_APIS_DESCRIPTION,
527 kOsDesktop,
528 SINGLE_VALUE_TYPE(extensions::switches::kEnableExperimentalExtensionApis)
531 "extensions-on-chrome-urls",
532 IDS_FLAGS_EXTENSIONS_ON_CHROME_URLS_NAME,
533 IDS_FLAGS_EXTENSIONS_ON_CHROME_URLS_DESCRIPTION,
534 kOsAll,
535 SINGLE_VALUE_TYPE(extensions::switches::kExtensionsOnChromeURLs)
538 "enable-fast-unload",
539 IDS_FLAGS_ENABLE_FAST_UNLOAD_NAME,
540 IDS_FLAGS_ENABLE_FAST_UNLOAD_DESCRIPTION,
541 kOsAll,
542 SINGLE_VALUE_TYPE(switches::kEnableFastUnload)
545 "enable-adview",
546 IDS_FLAGS_ENABLE_ADVIEW_NAME,
547 IDS_FLAGS_ENABLE_ADVIEW_DESCRIPTION,
548 kOsDesktop,
549 SINGLE_VALUE_TYPE(switches::kEnableAdview)
552 "enable-adview-src-attribute",
553 IDS_FLAGS_ENABLE_ADVIEW_SRC_ATTRIBUTE_NAME,
554 IDS_FLAGS_ENABLE_ADVIEW_SRC_ATTRIBUTE_DESCRIPTION,
555 kOsDesktop,
556 SINGLE_VALUE_TYPE(switches::kEnableAdviewSrcAttribute)
559 "enable-app-window-controls",
560 IDS_FLAGS_ENABLE_APP_WINDOW_CONTROLS_NAME,
561 IDS_FLAGS_ENABLE_APP_WINDOW_CONTROLS_DESCRIPTION,
562 kOsDesktop,
563 SINGLE_VALUE_TYPE(switches::kEnableAppWindowControls)
566 "script-badges",
567 IDS_FLAGS_SCRIPT_BADGES_NAME,
568 IDS_FLAGS_SCRIPT_BADGES_DESCRIPTION,
569 kOsDesktop,
570 SINGLE_VALUE_TYPE(switches::kScriptBadges)
573 "script-bubble",
574 IDS_FLAGS_SCRIPT_BUBBLE_NAME,
575 IDS_FLAGS_SCRIPT_BUBBLE_DESCRIPTION,
576 kOsDesktop,
577 ENABLE_DISABLE_VALUE_TYPE_AND_VALUE(switches::kScriptBubble, "1",
578 switches::kScriptBubble, "0")
581 "apps-new-install-bubble",
582 IDS_FLAGS_APPS_NEW_INSTALL_BUBBLE_NAME,
583 IDS_FLAGS_APPS_NEW_INSTALL_BUBBLE_DESCRIPTION,
584 kOsDesktop,
585 SINGLE_VALUE_TYPE(switches::kAppsNewInstallBubble)
588 "disable-hyperlink-auditing",
589 IDS_FLAGS_DISABLE_HYPERLINK_AUDITING_NAME,
590 IDS_FLAGS_DISABLE_HYPERLINK_AUDITING_DESCRIPTION,
591 kOsAll,
592 SINGLE_VALUE_TYPE(switches::kNoPings)
595 "tab-groups-context-menu",
596 IDS_FLAGS_TAB_GROUPS_CONTEXT_MENU_NAME,
597 IDS_FLAGS_TAB_GROUPS_CONTEXT_MENU_DESCRIPTION,
598 kOsWin,
599 SINGLE_VALUE_TYPE(switches::kEnableTabGroupsContextMenu)
602 "enable-instant-extended-api",
603 IDS_FLAGS_ENABLE_INSTANT_EXTENDED_API,
604 IDS_FLAGS_ENABLE_INSTANT_EXTENDED_API_DESCRIPTION,
605 kOsMac | kOsWin | kOsCrOS,
606 ENABLE_DISABLE_VALUE_TYPE(switches::kEnableInstantExtendedAPI,
607 switches::kDisableInstantExtendedAPI)
610 "enable-local-first-load-ntp",
611 IDS_FLAGS_ENABLE_LOCAL_FIRST_LOAD_NTP,
612 IDS_FLAGS_ENABLE_LOCAL_FIRST_LOAD_NTP_DESCRIPTION,
613 kOsMac | kOsWin | kOsCrOS,
614 ENABLE_DISABLE_VALUE_TYPE(switches::kEnableLocalFirstLoadNTP,
615 switches::kDisableLocalFirstLoadNTP)
617 #if defined(OS_ANDROID)
619 "enable-new-ntp",
620 IDS_FLAGS_ENABLE_NEW_NTP,
621 IDS_FLAGS_ENABLE_NEW_NTP_DESCRIPTION,
622 kOsAndroid,
623 SINGLE_VALUE_TYPE(switches::kEnableNewNTP)
625 #endif
627 "static-ip-config",
628 IDS_FLAGS_STATIC_IP_CONFIG_NAME,
629 IDS_FLAGS_STATIC_IP_CONFIG_DESCRIPTION,
630 kOsCrOS,
631 #if defined(OS_CHROMEOS)
632 // This switch exists only on Chrome OS.
633 SINGLE_VALUE_TYPE(chromeos::switches::kEnableStaticIPConfig)
634 #else
635 SINGLE_VALUE_TYPE("")
636 #endif
639 "show-autofill-type-predictions",
640 IDS_FLAGS_SHOW_AUTOFILL_TYPE_PREDICTIONS_NAME,
641 IDS_FLAGS_SHOW_AUTOFILL_TYPE_PREDICTIONS_DESCRIPTION,
642 kOsAll,
643 SINGLE_VALUE_TYPE(autofill::switches::kShowAutofillTypePredictions)
646 "enable-gesture-tap-highlight",
647 IDS_FLAGS_ENABLE_GESTURE_TAP_HIGHLIGHTING_NAME,
648 IDS_FLAGS_ENABLE_GESTURE_TAP_HIGHLIGHTING_DESCRIPTION,
649 kOsLinux | kOsCrOS,
650 ENABLE_DISABLE_VALUE_TYPE(switches::kEnableGestureTapHighlight,
651 switches::kDisableGestureTapHighlight)
654 "enable-smooth-scrolling", // FLAGS:RECORD_UMA
655 IDS_FLAGS_ENABLE_SMOOTH_SCROLLING_NAME,
656 IDS_FLAGS_ENABLE_SMOOTH_SCROLLING_DESCRIPTION,
657 // Can't expose the switch unless the code is compiled in.
658 // On by default for the Mac (different implementation in WebKit).
659 kOsWin | kOsLinux,
660 SINGLE_VALUE_TYPE(switches::kEnableSmoothScrolling)
663 "enable-panels",
664 IDS_FLAGS_ENABLE_PANELS_NAME,
665 IDS_FLAGS_ENABLE_PANELS_DESCRIPTION,
666 kOsDesktop,
667 SINGLE_VALUE_TYPE(switches::kEnablePanels)
670 // See http://crbug.com/120416 for how to remove this flag.
671 "save-page-as-mhtml", // FLAGS:RECORD_UMA
672 IDS_FLAGS_SAVE_PAGE_AS_MHTML_NAME,
673 IDS_FLAGS_SAVE_PAGE_AS_MHTML_DESCRIPTION,
674 kOsMac | kOsWin | kOsLinux,
675 SINGLE_VALUE_TYPE(switches::kSavePageAsMHTML)
678 "enable-autologin",
679 IDS_FLAGS_ENABLE_AUTOLOGIN_NAME,
680 IDS_FLAGS_ENABLE_AUTOLOGIN_DESCRIPTION,
681 kOsMac | kOsWin | kOsLinux,
682 SINGLE_VALUE_TYPE(switches::kEnableAutologin)
685 "enable-quic",
686 IDS_FLAGS_ENABLE_QUIC_NAME,
687 IDS_FLAGS_ENABLE_QUIC_DESCRIPTION,
688 kOsAll,
689 ENABLE_DISABLE_VALUE_TYPE(switches::kEnableQuic,
690 switches::kDisableQuic)
693 "enable-quic-https",
694 IDS_FLAGS_ENABLE_QUIC_HTTPS_NAME,
695 IDS_FLAGS_ENABLE_QUIC_HTTPS_DESCRIPTION,
696 kOsAll,
697 ENABLE_DISABLE_VALUE_TYPE(switches::kEnableQuicHttps,
698 switches::kDisableQuicHttps)
701 "enable-spdy4a2",
702 IDS_FLAGS_ENABLE_SPDY4A2_NAME,
703 IDS_FLAGS_ENABLE_SPDY4A2_DESCRIPTION,
704 kOsAll,
705 SINGLE_VALUE_TYPE(switches::kEnableSpdy4a2)
708 "enable-http2-draft-04",
709 IDS_FLAGS_ENABLE_HTTP2_DRAFT_04_NAME,
710 IDS_FLAGS_ENABLE_HTTP2_DRAFT_04_DESCRIPTION,
711 kOsAll,
712 SINGLE_VALUE_TYPE(switches::kEnableHttp2Draft04)
715 "enable-async-dns",
716 IDS_FLAGS_ENABLE_ASYNC_DNS_NAME,
717 IDS_FLAGS_ENABLE_ASYNC_DNS_DESCRIPTION,
718 kOsWin | kOsMac | kOsLinux | kOsCrOS,
719 ENABLE_DISABLE_VALUE_TYPE(switches::kEnableAsyncDns,
720 switches::kDisableAsyncDns)
723 "disable-media-source",
724 IDS_FLAGS_DISABLE_WEBKIT_MEDIA_SOURCE_NAME,
725 IDS_FLAGS_DISABLE_WEBKIT_MEDIA_SOURCE_DESCRIPTION,
726 kOsAll,
727 SINGLE_VALUE_TYPE(switches::kDisableWebKitMediaSource)
730 "enable-encrypted-media",
731 IDS_FLAGS_ENABLE_ENCRYPTED_MEDIA_NAME,
732 IDS_FLAGS_ENABLE_ENCRYPTED_MEDIA_DESCRIPTION,
733 kOsAll,
734 SINGLE_VALUE_TYPE(switches::kEnableEncryptedMedia)
737 "disable-encrypted-media",
738 IDS_FLAGS_DISABLE_PREFIXED_ENCRYPTED_MEDIA_NAME,
739 IDS_FLAGS_DISABLE_PREFIXED_ENCRYPTED_MEDIA_DESCRIPTION,
740 kOsAll,
741 SINGLE_VALUE_TYPE(switches::kDisableLegacyEncryptedMedia)
744 "override-encrypted-media-canplaytype",
745 IDS_FLAGS_ENCRYPTED_MEDIA_CANPLAYTYPE_OVERRIDE_NAME,
746 IDS_FLAGS_ENCRYPTED_MEDIA_CANPLAYTYPE_OVERRIDE_DESCRIPTION,
747 kOsMac | kOsWin,
748 SINGLE_VALUE_TYPE(switches::kOverrideEncryptedMediaCanPlayType)
751 "enable-opus-playback",
752 IDS_FLAGS_ENABLE_OPUS_PLAYBACK_NAME,
753 IDS_FLAGS_ENABLE_OPUS_PLAYBACK_DESCRIPTION,
754 kOsDesktop,
755 SINGLE_VALUE_TYPE(switches::kEnableOpusPlayback)
758 "enable-vp8-alpha-playback",
759 IDS_FLAGS_ENABLE_VP8_ALPHA_PLAYBACK_NAME,
760 IDS_FLAGS_ENABLE_VP8_ALPHA_PLAYBACK_DESCRIPTION,
761 kOsDesktop,
762 SINGLE_VALUE_TYPE(switches::kEnableVp8AlphaPlayback)
765 "enable-managed-users",
766 IDS_FLAGS_ENABLE_LOCALLY_MANAGED_USERS_NAME,
767 IDS_FLAGS_ENABLE_LOCALLY_MANAGED_USERS_DESCRIPTION,
768 kOsMac | kOsWin | kOsLinux | kOsCrOSOwnerOnly,
769 SINGLE_VALUE_TYPE(switches::kEnableManagedUsers)
771 #if defined(USE_ASH)
773 "ash-disable-auto-maximizing",
774 IDS_FLAGS_ASH_AUTO_MAXIMIZING_NAME,
775 IDS_FLAGS_ASH_AUTO_MAXIMIZING_DESCRIPTION,
776 kOsWin | kOsLinux | kOsCrOS,
777 SINGLE_VALUE_TYPE(ash::switches::kAshDisableAutoMaximizing)
780 "ash-disable-auto-window-placement",
781 IDS_FLAGS_ASH_AUTO_WINDOW_PLACEMENT_NAME,
782 IDS_FLAGS_ASH_AUTO_WINDOW_PLACEMENT_DESCRIPTION,
783 kOsWin | kOsLinux | kOsCrOS,
784 SINGLE_VALUE_TYPE(ash::switches::kAshDisableAutoWindowPlacement)
787 "ash-disable-per-app-launcher",
788 IDS_FLAGS_ASH_DISABLE_PER_APP_LAUNCHER_NAME,
789 IDS_FLAGS_ASH_DISABLE_PER_APP_LAUNCHER_DESCRIPTION,
790 kOsWin | kOsLinux | kOsCrOS,
791 SINGLE_VALUE_TYPE(ash::switches::kAshDisablePerAppLauncher)
793 #endif
795 "per-tile-painting",
796 IDS_FLAGS_PER_TILE_PAINTING_NAME,
797 IDS_FLAGS_PER_TILE_PAINTING_DESCRIPTION,
798 kOsMac | kOsLinux | kOsCrOS,
799 SINGLE_VALUE_TYPE(cc::switches::kEnablePerTilePainting)
802 "enable-javascript-harmony",
803 IDS_FLAGS_ENABLE_JAVASCRIPT_HARMONY_NAME,
804 IDS_FLAGS_ENABLE_JAVASCRIPT_HARMONY_DESCRIPTION,
805 kOsAll,
806 SINGLE_VALUE_TYPE_AND_VALUE(switches::kJavaScriptFlags, "--harmony")
809 "enable-tab-browser-dragging",
810 IDS_FLAGS_ENABLE_TAB_BROWSER_DRAGGING_NAME,
811 IDS_FLAGS_ENABLE_TAB_BROWSER_DRAGGING_DESCRIPTION,
812 kOsWin,
813 SINGLE_VALUE_TYPE(switches::kTabBrowserDragging)
816 "disable-restore-session-state",
817 IDS_FLAGS_DISABLE_RESTORE_SESSION_STATE_NAME,
818 IDS_FLAGS_DISABLE_RESTORE_SESSION_STATE_DESCRIPTION,
819 kOsAll,
820 SINGLE_VALUE_TYPE(switches::kDisableRestoreSessionState)
823 "disable-software-rasterizer",
824 IDS_FLAGS_DISABLE_SOFTWARE_RASTERIZER_NAME,
825 IDS_FLAGS_DISABLE_SOFTWARE_RASTERIZER_DESCRIPTION,
826 #if defined(ENABLE_SWIFTSHADER)
827 kOsAll,
828 #else
830 #endif
831 SINGLE_VALUE_TYPE(switches::kDisableSoftwareRasterizer)
834 "enable-experimental-web-platform-features",
835 IDS_FLAGS_EXPERIMENTAL_WEB_PLATFORM_FEATURES_NAME,
836 IDS_FLAGS_EXPERIMENTAL_WEB_PLATFORM_FEATURES_DESCRIPTION,
837 kOsAll,
838 SINGLE_VALUE_TYPE(switches::kEnableExperimentalWebPlatformFeatures)
841 "enable-css-shaders",
842 IDS_FLAGS_CSS_SHADERS_NAME,
843 IDS_FLAGS_CSS_SHADERS_DESCRIPTION,
844 kOsAll,
845 SINGLE_VALUE_TYPE(switches::kEnableCssShaders)
848 "disable-ntp-other-sessions-menu",
849 IDS_FLAGS_NTP_OTHER_SESSIONS_MENU_NAME,
850 IDS_FLAGS_NTP_OTHER_SESSIONS_MENU_DESCRIPTION,
851 kOsDesktop,
852 SINGLE_VALUE_TYPE(switches::kDisableNTPOtherSessionsMenu)
854 #if defined(USE_ASH)
856 "enable-ash-oak",
857 IDS_FLAGS_ENABLE_ASH_OAK_NAME,
858 IDS_FLAGS_ENABLE_ASH_OAK_DESCRIPTION,
859 kOsAll,
860 SINGLE_VALUE_TYPE(ash::switches::kAshEnableOak),
862 #endif
864 "enable-devtools-experiments",
865 IDS_FLAGS_ENABLE_DEVTOOLS_EXPERIMENTS_NAME,
866 IDS_FLAGS_ENABLE_DEVTOOLS_EXPERIMENTS_DESCRIPTION,
867 kOsDesktop,
868 SINGLE_VALUE_TYPE(switches::kEnableDevToolsExperiments)
871 "remote-debugging-raw-usb",
872 IDS_FLAGS_REMOTE_DEBUGGING_RAW_USB_NAME,
873 IDS_FLAGS_REMOTE_DEBUGGING_RAW_USB_DESCRIPTION,
874 kOsDesktop,
875 SINGLE_VALUE_TYPE(switches::kRemoteDebuggingRawUSB)
878 "silent-debugger-extension-api",
879 IDS_FLAGS_SILENT_DEBUGGER_EXTENSION_API_NAME,
880 IDS_FLAGS_SILENT_DEBUGGER_EXTENSION_API_DESCRIPTION,
881 kOsDesktop,
882 SINGLE_VALUE_TYPE(switches::kSilentDebuggerExtensionAPI)
885 "enable-suggestions-ntp",
886 IDS_FLAGS_NTP_SUGGESTIONS_PAGE_NAME,
887 IDS_FLAGS_NTP_SUGGESTIONS_PAGE_DESCRIPTION,
888 kOsDesktop,
889 SINGLE_VALUE_TYPE(switches::kEnableSuggestionsTabPage)
892 "spellcheck-autocorrect",
893 IDS_FLAGS_SPELLCHECK_AUTOCORRECT,
894 IDS_FLAGS_SPELLCHECK_AUTOCORRECT_DESCRIPTION,
895 kOsWin | kOsLinux | kOsCrOS,
896 SINGLE_VALUE_TYPE(switches::kEnableSpellingAutoCorrect)
899 "enable-scroll-prediction",
900 IDS_FLAGS_ENABLE_SCROLL_PREDICTION_NAME,
901 IDS_FLAGS_ENABLE_SCROLL_PREDICTION_DESCRIPTION,
902 kOsDesktop,
903 SINGLE_VALUE_TYPE(switches::kEnableScrollPrediction)
906 "touch-events",
907 IDS_TOUCH_EVENTS_NAME,
908 IDS_TOUCH_EVENTS_DESCRIPTION,
909 kOsDesktop,
910 MULTI_VALUE_TYPE(kTouchEventsChoices)
913 "touch-optimized-ui",
914 IDS_FLAGS_TOUCH_OPTIMIZED_UI_NAME,
915 IDS_FLAGS_TOUCH_OPTIMIZED_UI_DESCRIPTION,
916 kOsWin,
917 MULTI_VALUE_TYPE(kTouchOptimizedUIChoices)
920 "disable-touch-adjustment",
921 IDS_DISABLE_TOUCH_ADJUSTMENT_NAME,
922 IDS_DISABLE_TOUCH_ADJUSTMENT_DESCRIPTION,
923 kOsWin | kOsLinux | kOsCrOS,
924 SINGLE_VALUE_TYPE(switches::kDisableTouchAdjustment)
926 #if defined(OS_CHROMEOS)
928 "ash-use-alternate-shelf",
929 IDS_FLAGS_ALTERNATE_SHELF_LAYOUT_NAME,
930 IDS_FLAGS_ALTERNATE_SHELF_LAYOUT_DESCRIPTION,
931 kOsCrOS,
932 SINGLE_VALUE_TYPE(ash::switches::kAshUseAlternateShelfLayout)
935 "enable-background-loader",
936 IDS_ENABLE_BACKLOADER_NAME,
937 IDS_ENABLE_BACKLOADER_DESCRIPTION,
938 kOsCrOS,
939 SINGLE_VALUE_TYPE(chromeos::switches::kEnableBackgroundLoader)
942 "enable-screensaver-extension",
943 IDS_ENABLE_SCREENSAVER_EXTENSION_NAME,
944 IDS_ENABLE_SCREENSAVER_EXTENSION_DESCRIPTION,
945 kOsCrOS,
946 SINGLE_VALUE_TYPE(chromeos::switches::kEnableScreensaverExtensions)
949 "no-discard-tabs",
950 IDS_FLAGS_NO_DISCARD_TABS_NAME,
951 IDS_FLAGS_NO_DISCARD_TABS_DESCRIPTION,
952 kOsCrOS,
953 SINGLE_VALUE_TYPE(chromeos::switches::kNoDiscardTabs)
956 "ash-enable-docked-windows",
957 IDS_FLAGS_DOCKED_WINDOWS_NAME,
958 IDS_FLAGS_DOCKED_WINDOWS_DESCRIPTION,
959 kOsCrOS,
960 SINGLE_VALUE_TYPE(ash::switches::kAshEnableDockedWindows)
962 #endif
964 "enable-download-resumption",
965 IDS_FLAGS_ENABLE_DOWNLOAD_RESUMPTION_NAME,
966 IDS_FLAGS_ENABLE_DOWNLOAD_RESUMPTION_DESCRIPTION,
967 kOsDesktop,
968 SINGLE_VALUE_TYPE(switches::kEnableDownloadResumption)
971 "allow-nacl-socket-api",
972 IDS_FLAGS_ALLOW_NACL_SOCKET_API_NAME,
973 IDS_FLAGS_ALLOW_NACL_SOCKET_API_DESCRIPTION,
974 kOsDesktop,
975 SINGLE_VALUE_TYPE_AND_VALUE(switches::kAllowNaClSocketAPI, "*")
978 "stacked-tab-strip",
979 IDS_FLAGS_STACKED_TAB_STRIP_NAME,
980 IDS_FLAGS_STACKED_TAB_STRIP_DESCRIPTION,
981 kOsWin,
982 SINGLE_VALUE_TYPE(switches::kEnableStackedTabStrip)
985 "force-device-scale-factor",
986 IDS_FLAGS_FORCE_HIGH_DPI_NAME,
987 IDS_FLAGS_FORCE_HIGH_DPI_DESCRIPTION,
988 kOsCrOS,
989 SINGLE_VALUE_TYPE_AND_VALUE(switches::kForceDeviceScaleFactor, "2")
991 #if defined(OS_CHROMEOS)
993 "allow-touchpad-three-finger-click",
994 IDS_FLAGS_ALLOW_TOUCHPAD_THREE_FINGER_CLICK_NAME,
995 IDS_FLAGS_ALLOW_TOUCHPAD_THREE_FINGER_CLICK_DESCRIPTION,
996 kOsCrOS,
997 SINGLE_VALUE_TYPE(chromeos::switches::kEnableTouchpadThreeFingerClick)
999 #endif
1000 #if defined(USE_ASH)
1002 "show-launcher-alignment-menu",
1003 IDS_FLAGS_SHOW_SHELF_ALIGNMENT_MENU_NAME,
1004 IDS_FLAGS_SHOW_SHELF_ALIGNMENT_MENU_DESCRIPTION,
1005 kOsAll,
1006 ENABLE_DISABLE_VALUE_TYPE(
1007 ash::switches::kShowShelfAlignmentMenu,
1008 ash::switches::kHideShelfAlignmentMenu)
1011 "disable-minimize-on-second-launcher-item-click",
1012 IDS_FLAGS_DISABLE_MINIMIZE_ON_SECOND_LAUNCHER_ITEM_CLICK_NAME,
1013 IDS_FLAGS_DISABLE_MINIMIZE_ON_SECOND_LAUNCHER_ITEM_CLICK_DESCRIPTION,
1014 kOsAll,
1015 SINGLE_VALUE_TYPE(switches::kDisableMinimizeOnSecondLauncherItemClick)
1018 "enable-overview-mode",
1019 IDS_FLAGS_OVERVIEW_MODE_NAME,
1020 IDS_FLAGS_OVERVIEW_MODE_DESCRIPTION,
1021 kOsCrOS,
1022 SINGLE_VALUE_TYPE(ash::switches::kAshEnableOverviewMode)
1025 "show-touch-hud",
1026 IDS_FLAGS_SHOW_TOUCH_HUD_NAME,
1027 IDS_FLAGS_SHOW_TOUCH_HUD_DESCRIPTION,
1028 kOsAll,
1029 SINGLE_VALUE_TYPE(ash::switches::kAshTouchHud)
1032 "enable-pinch",
1033 IDS_FLAGS_ENABLE_PINCH_SCALE_NAME,
1034 IDS_FLAGS_ENABLE_PINCH_SCALE_DESCRIPTION,
1035 kOsLinux | kOsWin | kOsCrOS,
1036 ENABLE_DISABLE_VALUE_TYPE(switches::kEnablePinch, switches::kDisablePinch),
1039 "enable-pinch-virtual-viewport",
1040 IDS_FLAGS_ENABLE_PINCH_VIRTUAL_VIEWPORT_NAME,
1041 IDS_FLAGS_ENABLE_PINCH_VIRTUAL_VIEWPORT_DESCRIPTION,
1042 kOsLinux | kOsWin | kOsCrOS,
1043 SINGLE_VALUE_TYPE(cc::switches::kEnablePinchVirtualViewport),
1046 "forced-maximize-mode",
1047 IDS_FLAGS_FORCE_MAXIMIZE_MODE_NAME,
1048 IDS_FLAGS_FORCE_MAXIMIZE_MODE_DESCRIPTION,
1049 kOsLinux | kOsWin | kOsCrOS,
1050 SINGLE_VALUE_TYPE(ash::switches::kForcedMaximizeMode),
1052 #endif // defined(USE_ASH)
1053 #if defined(OS_CHROMEOS)
1055 "disable-boot-animation",
1056 IDS_FLAGS_DISABLE_BOOT_ANIMATION,
1057 IDS_FLAGS_DISABLE_BOOT_ANIMATION_DESCRIPTION,
1058 kOsCrOSOwnerOnly,
1059 SINGLE_VALUE_TYPE(chromeos::switches::kDisableBootAnimation),
1062 "captive-portal-detector",
1063 IDS_FLAGS_CAPTIVE_PORTAL_DETECTOR_NAME,
1064 IDS_FLAGS_CAPTIVE_PORTAL_DETECTOR_DESCRIPTION,
1065 kOsCrOSOwnerOnly,
1066 MULTI_VALUE_TYPE(kChromeCaptivePortalDetectionChoices),
1069 "disable-new-lock-animations",
1070 IDS_FLAGS_ASH_NEW_LOCK_ANIMATIONS,
1071 IDS_FLAGS_ASH_NEW_LOCK_ANIMATIONS_DESCRIPTION,
1072 kOsCrOS,
1073 SINGLE_VALUE_TYPE(ash::switches::kAshDisableNewLockAnimations),
1076 "file-manager-show-checkboxes",
1077 IDS_FLAGS_FILE_MANAGER_SHOW_CHECKBOXES_NAME,
1078 IDS_FLAGS_FILE_MANAGER_SHOW_CHECKBOXES_DESCRIPTION,
1079 kOsCrOS,
1080 SINGLE_VALUE_TYPE(chromeos::switches::kFileManagerShowCheckboxes)
1083 "file-manager-enable-webstore-integration",
1084 IDS_FLAGS_FILE_MANAGER_ENABLE_WEBSTORE_INTEGRATION,
1085 IDS_FLAGS_FILE_MANAGER_ENABLE_WEBSTORE_INTEGRATION_DESCRIPTION,
1086 kOsCrOS,
1087 SINGLE_VALUE_TYPE(chromeos::switches::kFileManagerEnableWebstoreIntegration)
1090 "disable-quickoffice-component-app",
1091 IDS_FLAGS_DISABLE_QUICKOFFICE_COMPONENT_APP_NAME,
1092 IDS_FLAGS_DISABLE_QUICKOFFICE_COMPONENT_APP_DESCRIPTION,
1093 kOsCrOS,
1094 SINGLE_VALUE_TYPE(chromeos::switches::kDisableQuickofficeComponentApp),
1096 #endif // defined(OS_CHROMEOS)
1098 "views-textfield",
1099 IDS_FLAGS_VIEWS_TEXTFIELD_NAME,
1100 IDS_FLAGS_VIEWS_TEXTFIELD_DESCRIPTION,
1101 kOsWin,
1102 ENABLE_DISABLE_VALUE_TYPE(switches::kEnableViewsTextfield,
1103 switches::kDisableViewsTextfield),
1106 "new-dialog-style",
1107 IDS_FLAGS_NEW_DIALOG_STYLE_NAME,
1108 IDS_FLAGS_NEW_DIALOG_STYLE_DESCRIPTION,
1109 kOsWin | kOsCrOS,
1110 ENABLE_DISABLE_VALUE_TYPE(switches::kEnableNewDialogStyle,
1111 switches::kDisableNewDialogStyle),
1113 { "disable-accelerated-video-decode",
1114 IDS_FLAGS_DISABLE_ACCELERATED_VIDEO_DECODE_NAME,
1115 IDS_FLAGS_DISABLE_ACCELERATED_VIDEO_DECODE_DESCRIPTION,
1116 kOsWin | kOsCrOS,
1117 SINGLE_VALUE_TYPE(switches::kDisableAcceleratedVideoDecode),
1119 #if defined(USE_ASH)
1121 "ash-debug-shortcuts",
1122 IDS_FLAGS_DEBUG_SHORTCUTS_NAME,
1123 IDS_FLAGS_DEBUG_SHORTCUTS_DESCRIPTION,
1124 kOsAll,
1125 SINGLE_VALUE_TYPE(ash::switches::kAshDebugShortcuts),
1127 #endif
1129 "enable-contacts",
1130 IDS_FLAGS_ENABLE_CONTACTS_NAME,
1131 IDS_FLAGS_ENABLE_CONTACTS_DESCRIPTION,
1132 kOsCrOS,
1133 SINGLE_VALUE_TYPE(switches::kEnableContacts)
1135 #if defined(USE_ASH)
1136 { "ash-enable-advanced-gestures",
1137 IDS_FLAGS_ENABLE_ADVANCED_GESTURES_NAME,
1138 IDS_FLAGS_ENABLE_ADVANCED_GESTURES_DESCRIPTION,
1139 kOsCrOS,
1140 SINGLE_VALUE_TYPE(ash::switches::kAshEnableAdvancedGestures),
1142 { "ash-disable-tab-scrubbing",
1143 IDS_FLAGS_DISABLE_TAB_SCRUBBING_NAME,
1144 IDS_FLAGS_DISABLE_TAB_SCRUBBING_DESCRIPTION,
1145 kOsCrOS,
1146 SINGLE_VALUE_TYPE(switches::kAshDisableTabScrubbing),
1148 { "ash-disable-drag-and-drop-applist-to-launcher",
1149 IDS_FLAGS_DND_APPLIST_TO_LAUNCHER_NAME,
1150 IDS_FLAGS_DND_APPLIST_TO_LAUNCHER_DESCRIPTION,
1151 kOsCrOS,
1152 SINGLE_VALUE_TYPE(ash::switches::kAshDisableDragAndDropAppListToLauncher),
1154 { "ash-immersive-fullscreen-2",
1155 IDS_FLAGS_ASH_IMMERSIVE_FULLSCREEN_NAME,
1156 IDS_FLAGS_ASH_IMMERSIVE_FULLSCREEN_DESCRIPTION,
1157 kOsCrOS,
1158 ENABLE_DISABLE_VALUE_TYPE(ash::switches::kAshEnableImmersiveFullscreen,
1159 ash::switches::kAshDisableImmersiveFullscreen),
1161 #if defined(OS_LINUX)
1162 { "ash-enable-memory-monitor",
1163 IDS_FLAGS_ENABLE_MEMORY_MONITOR_NAME,
1164 IDS_FLAGS_ENABLE_MEMORY_MONITOR_DESCRIPTION,
1165 kOsCrOS,
1166 SINGLE_VALUE_TYPE(ash::switches::kAshEnableMemoryMonitor),
1168 #endif
1169 #endif
1170 #if defined(OS_CHROMEOS)
1171 { "use-new-network-configuration-handlers",
1172 IDS_FLAGS_CHROMEOS_USE_NEW_NETWORK_CONFIGURATION_HANDLERS_NAME,
1173 IDS_FLAGS_CHROMEOS_USE_NEW_NETWORK_CONFIGURATION_HANDLERS_DESCRIPTION,
1174 kOsCrOS,
1175 SINGLE_VALUE_TYPE(chromeos::switches::kUseNewNetworkConfigurationHandlers),
1178 "ash-audio-device-menu",
1179 IDS_FLAGS_ASH_AUDIO_DEVICE_MENU_NAME,
1180 IDS_FLAGS_ASH_AUDIO_DEVICE_MENU_DESCRIPTION,
1181 kOsCrOS,
1182 ENABLE_DISABLE_VALUE_TYPE(ash::switches::kAshEnableAudioDeviceMenu,
1183 ash::switches::kAshDisableAudioDeviceMenu)
1186 "enable-carrier-switching",
1187 IDS_FLAGS_ENABLE_CARRIER_SWITCHING,
1188 IDS_FLAGS_ENABLE_CARRIER_SWITCHING_DESCRIPTION,
1189 kOsCrOS,
1190 SINGLE_VALUE_TYPE(chromeos::switches::kEnableCarrierSwitching)
1193 "enable-request-tablet-site",
1194 IDS_FLAGS_ENABLE_REQUEST_TABLET_SITE_NAME,
1195 IDS_FLAGS_ENABLE_REQUEST_TABLET_SITE_DESCRIPTION,
1196 kOsCrOS,
1197 SINGLE_VALUE_TYPE(chromeos::switches::kEnableRequestTabletSite)
1199 #endif
1201 "debug-packed-apps",
1202 IDS_FLAGS_DEBUG_PACKED_APP_NAME,
1203 IDS_FLAGS_DEBUG_PACKED_APP_DESCRIPTION,
1204 kOsDesktop,
1205 SINGLE_VALUE_TYPE(switches::kDebugPackedApps)
1208 "enable-password-generation",
1209 IDS_FLAGS_ENABLE_PASSWORD_GENERATION_NAME,
1210 IDS_FLAGS_ENABLE_PASSWORD_GENERATION_DESCRIPTION,
1211 kOsDesktop,
1212 SINGLE_VALUE_TYPE(switches::kEnablePasswordGeneration)
1215 "password-autofill-public-suffix-domain-matching",
1216 IDS_FLAGS_PASSWORD_AUTOFILL_PUBLIC_SUFFIX_DOMAIN_MATCHING_NAME,
1217 IDS_FLAGS_PASSWORD_AUTOFILL_PUBLIC_SUFFIX_DOMAIN_MATCHING_DESCRIPTION,
1218 kOsAndroid,
1219 ENABLE_DISABLE_VALUE_TYPE(
1220 switches::kEnablePasswordAutofillPublicSuffixDomainMatching,
1221 switches::kDisablePasswordAutofillPublicSuffixDomainMatching)
1224 "enable-deferred-image-decoding",
1225 IDS_FLAGS_ENABLE_DEFERRED_IMAGE_DECODING_NAME,
1226 IDS_FLAGS_ENABLE_DEFERRED_IMAGE_DECODING_DESCRIPTION,
1227 kOsMac | kOsLinux | kOsCrOS,
1228 SINGLE_VALUE_TYPE(switches::kEnableDeferredImageDecoding)
1231 "performance-monitor-gathering",
1232 IDS_FLAGS_PERFORMANCE_MONITOR_GATHERING_NAME,
1233 IDS_FLAGS_PERFORMANCE_MONITOR_GATHERING_DESCRIPTION,
1234 kOsAll,
1235 SINGLE_VALUE_TYPE(switches::kPerformanceMonitorGathering)
1238 "enable-experimental-form-filling",
1239 IDS_FLAGS_ENABLE_EXPERIMENTAL_FORM_FILLING_NAME,
1240 IDS_FLAGS_ENABLE_EXPERIMENTAL_FORM_FILLING_DESCRIPTION,
1241 kOsWin | kOsCrOS,
1242 SINGLE_VALUE_TYPE(autofill::switches::kEnableExperimentalFormFilling)
1245 "wallet-service-use-prod",
1246 IDS_FLAGS_ENABLE_WALLET_PRODUCTION_SERVICE_NAME,
1247 IDS_FLAGS_ENABLE_WALLET_PRODUCTION_SERVICE_DESCRIPTION,
1248 kOsCrOS | kOsWin,
1249 SINGLE_VALUE_TYPE(autofill::switches::kWalletServiceUseProd)
1252 "enable-interactive-autocomplete",
1253 IDS_FLAGS_ENABLE_INTERACTIVE_AUTOCOMPLETE_NAME,
1254 IDS_FLAGS_ENABLE_INTERACTIVE_AUTOCOMPLETE_DESCRIPTION,
1255 kOsWin | kOsCrOS | kOsAndroid | kOsMac,
1256 ENABLE_DISABLE_VALUE_TYPE(
1257 autofill::switches::kEnableInteractiveAutocomplete,
1258 autofill::switches::kDisableInteractiveAutocomplete)
1260 #if defined(USE_AURA)
1262 "overscroll-history-navigation",
1263 IDS_FLAGS_OVERSCROLL_HISTORY_NAVIGATION_NAME,
1264 IDS_FLAGS_OVERSCROLL_HISTORY_NAVIGATION_DESCRIPTION,
1265 kOsAll,
1266 ENABLE_DISABLE_VALUE_TYPE_AND_VALUE(
1267 switches::kOverscrollHistoryNavigation, "1",
1268 switches::kOverscrollHistoryNavigation, "0")
1270 #endif
1272 "scroll-end-effect",
1273 IDS_FLAGS_SCROLL_END_EFFECT_NAME,
1274 IDS_FLAGS_SCROLL_END_EFFECT_DESCRIPTION,
1275 kOsCrOS,
1276 ENABLE_DISABLE_VALUE_TYPE_AND_VALUE(
1277 switches::kScrollEndEffect, "1",
1278 switches::kScrollEndEffect, "0")
1281 "enable-touch-side-bezels",
1282 IDS_FLAGS_ENABLE_TOUCH_SIDE_BEZELS_NAME,
1283 IDS_FLAGS_ENABLE_TOUCH_SIDE_BEZELS_DESCRIPTION,
1284 kOsCrOS,
1285 ENABLE_DISABLE_VALUE_TYPE_AND_VALUE(
1286 switches::kTouchSideBezels, "1",
1287 switches::kTouchSideBezels, "0")
1290 "enable-no-touch-to-renderer-while-scrolling",
1291 IDS_FLAGS_ENABLE_NO_TOUCH_TO_RENDERER_WHILE_SCROLLING_NAME,
1292 IDS_FLAGS_ENABLE_NO_TOUCH_TO_RENDERER_WHILE_SCROLLING_DESCRIPTION,
1293 kOsDesktop,
1294 ENABLE_DISABLE_VALUE_TYPE_AND_VALUE(
1295 switches::kNoTouchToRendererWhileScrolling, "1",
1296 switches::kNoTouchToRendererWhileScrolling, "0")
1299 "enable-touch-drag-drop",
1300 IDS_FLAGS_ENABLE_TOUCH_DRAG_DROP_NAME,
1301 IDS_FLAGS_ENABLE_TOUCH_DRAG_DROP_DESCRIPTION,
1302 kOsWin | kOsCrOS,
1303 ENABLE_DISABLE_VALUE_TYPE(switches::kEnableTouchDragDrop,
1304 switches::kDisableTouchDragDrop)
1307 "enable-touch-editing",
1308 IDS_FLAGS_ENABLE_TOUCH_EDITING_NAME,
1309 IDS_FLAGS_ENABLE_TOUCH_EDITING_DESCRIPTION,
1310 kOsCrOS,
1311 ENABLE_DISABLE_VALUE_TYPE(switches::kEnableTouchEditing,
1312 switches::kDisableTouchEditing)
1315 "enable-rich-notifications",
1316 IDS_FLAGS_ENABLE_RICH_NOTIFICATIONS_NAME,
1317 IDS_FLAGS_ENABLE_RICH_NOTIFICATIONS_DESCRIPTION,
1318 kOsWin | kOsMac,
1319 ENABLE_DISABLE_VALUE_TYPE(
1320 message_center::switches::kEnableRichNotifications,
1321 message_center::switches::kDisableRichNotifications)
1324 "enable-sync-synced-notifications",
1325 IDS_FLAGS_ENABLE_SYNCED_NOTIFICATIONS_NAME,
1326 IDS_FLAGS_ENABLE_SYNCED_NOTIFICATIONS_DESCRIPTION,
1327 kOsDesktop,
1328 ENABLE_DISABLE_VALUE_TYPE(switches::kEnableSyncSyncedNotifications,
1329 switches::kDisableSyncSyncedNotifications)
1332 "disable-full-history-sync",
1333 IDS_FLAGS_FULL_HISTORY_SYNC_NAME,
1334 IDS_FLAGS_FULL_HISTORY_SYNC_DESCRIPTION,
1335 kOsAll,
1336 SINGLE_VALUE_TYPE(switches::kHistoryDisableFullHistorySync)
1339 "enable-usermedia-screen-capture",
1340 IDS_FLAGS_ENABLE_SCREEN_CAPTURE_NAME,
1341 IDS_FLAGS_ENABLE_SCREEN_CAPTURE_DESCRIPTION,
1342 kOsDesktop,
1343 SINGLE_VALUE_TYPE(switches::kEnableUserMediaScreenCapturing)
1346 "enable-apps-devtool-app",
1347 IDS_FLAGS_ENABLE_APPS_DEVTOOL_APP_NAME,
1348 IDS_FLAGS_ENABLE_APPS_DEVTOOL_APP_DESCRIPTION,
1349 kOsDesktop,
1350 SINGLE_VALUE_TYPE(switches::kAppsDevtool)
1353 "impl-side-painting",
1354 IDS_FLAGS_IMPL_SIDE_PAINTING_NAME,
1355 IDS_FLAGS_IMPL_SIDE_PAINTING_DESCRIPTION,
1356 kOsAndroid | kOsLinux | kOsCrOS,
1357 MULTI_VALUE_TYPE(kImplSidePaintingChoices)
1360 "delegated-renderer",
1361 IDS_FLAGS_DELEGATED_RENDERER_NAME,
1362 IDS_FLAGS_DELEGATED_RENDERER_DESCRIPTION,
1363 #ifdef USE_AURA
1364 kOsWin | kOsLinux |
1365 #endif
1366 kOsAndroid | kOsCrOS,
1367 MULTI_VALUE_TYPE(kDelegatedRendererChoices)
1370 "enable-websocket-experimental-implementation",
1371 IDS_FLAGS_ENABLE_EXPERIMENTAL_WEBSOCKET_NAME,
1372 IDS_FLAGS_ENABLE_EXPERIMENTAL_WEBSOCKET_DESCRIPTION,
1373 kOsAll,
1374 SINGLE_VALUE_TYPE(switches::kEnableExperimentalWebSocket)
1377 "max-tiles-for-interest-area",
1378 IDS_FLAGS_MAX_TILES_FOR_INTEREST_AREA_NAME,
1379 IDS_FLAGS_MAX_TILES_FOR_INTEREST_AREA_DESCRIPTION,
1380 kOsAndroid | kOsLinux | kOsCrOS,
1381 MULTI_VALUE_TYPE(kMaxTilesForInterestAreaChoices)
1384 "enable-offline-mode",
1385 IDS_FLAGS_ENABLE_OFFLINE_MODE_NAME,
1386 IDS_FLAGS_ENABLE_OFFLINE_MODE_DESCRIPTION,
1387 kOsAll,
1388 SINGLE_VALUE_TYPE(switches::kEnableOfflineCacheAccess)
1391 "default-tile-width",
1392 IDS_FLAGS_DEFAULT_TILE_WIDTH_NAME,
1393 IDS_FLAGS_DEFAULT_TILE_WIDTH_DESCRIPTION,
1394 kOsAll,
1395 MULTI_VALUE_TYPE(kDefaultTileWidthChoices)
1398 "default-tile-height",
1399 IDS_FLAGS_DEFAULT_TILE_HEIGHT_NAME,
1400 IDS_FLAGS_DEFAULT_TILE_HEIGHT_DESCRIPTION,
1401 kOsAll,
1402 MULTI_VALUE_TYPE(kDefaultTileHeightChoices)
1404 // TODO(sky): ifdef needed until focus sorted out in DesktopNativeWidgetAura.
1405 #if !defined(USE_AURA)
1407 "track-active-visit-time",
1408 IDS_FLAGS_TRACK_ACTIVE_VISIT_TIME_NAME,
1409 IDS_FLAGS_TRACK_ACTIVE_VISIT_TIME_DESCRIPTION,
1410 kOsWin,
1411 SINGLE_VALUE_TYPE(switches::kTrackActiveVisitTime)
1413 #endif
1414 #if defined(OS_ANDROID)
1416 "disable-gesture-requirement-for-media-playback",
1417 IDS_FLAGS_DISABLE_GESTURE_REQUIREMENT_FOR_MEDIA_PLAYBACK_NAME,
1418 IDS_FLAGS_DISABLE_GESTURE_REQUIREMENT_FOR_MEDIA_PLAYBACK_DESCRIPTION,
1419 kOsAndroid,
1420 SINGLE_VALUE_TYPE(switches::kDisableGestureRequirementForMediaPlayback)
1422 #endif
1423 #if defined(ENABLE_GOOGLE_NOW)
1425 "enable-google-now",
1426 IDS_FLAGS_ENABLE_GOOGLE_NOW_INTEGRATION_NAME,
1427 IDS_FLAGS_ENABLE_GOOGLE_NOW_INTEGRATION_DESCRIPTION,
1428 kOsWin | kOsCrOS | kOsMac,
1429 SINGLE_VALUE_TYPE(switches::kEnableGoogleNowIntegration)
1431 #endif
1432 #if defined(OS_CHROMEOS)
1434 "enable-virtual-keyboard",
1435 IDS_FLAGS_ENABLE_VIRTUAL_KEYBOARD_NAME,
1436 IDS_FLAGS_ENABLE_VIRTUAL_KEYBOARD_DESCRIPTION,
1437 kOsCrOS,
1438 SINGLE_VALUE_TYPE(keyboard::switches::kEnableVirtualKeyboard)
1440 #endif
1442 "enable-simple-cache-backend",
1443 IDS_FLAGS_ENABLE_SIMPLE_CACHE_BACKEND_NAME,
1444 IDS_FLAGS_ENABLE_SIMPLE_CACHE_BACKEND_DESCRIPTION,
1445 kOsAll,
1446 MULTI_VALUE_TYPE(kSimpleCacheBackendChoices)
1449 "enable-tcp-fast-open",
1450 IDS_FLAGS_ENABLE_TCP_FAST_OPEN_NAME,
1451 IDS_FLAGS_ENABLE_TCP_FAST_OPEN_DESCRIPTION,
1452 kOsLinux | kOsCrOS | kOsAndroid,
1453 SINGLE_VALUE_TYPE(switches::kEnableTcpFastOpen)
1456 "apps-use-native-frame",
1457 IDS_FLAGS_ENABLE_NATIVE_FRAMES_FOR_APPS_NAME,
1458 IDS_FLAGS_ENABLE_NATIVE_FRAMES_FOR_APPS_DESCRIPTION,
1459 kOsMac | kOsWin,
1460 SINGLE_VALUE_TYPE(switches::kAppsUseNativeFrame)
1463 "enable-syncfs-directory-operation",
1464 IDS_FLAGS_ENABLE_SYNC_DIRECTORY_OPERATION_NAME,
1465 IDS_FLAGS_ENABLE_SYNC_DIRECTORY_OPERATION_DESCRIPTION,
1466 kOsAll,
1467 SINGLE_VALUE_TYPE(switches::kSyncfsEnableDirectoryOperation),
1470 "enable-reset-profile-settings",
1471 IDS_FLAGS_ENABLE_RESET_PROFILE_SETTINGS_NAME,
1472 IDS_FLAGS_ENABLE_RESET_PROFILE_SETTINGS_DESCRIPTION,
1473 kOsAll,
1474 SINGLE_VALUE_TYPE(switches::kEnableResetProfileSettings)
1477 "enable-device-discovery",
1478 IDS_FLAGS_ENABLE_DEVICE_DISCOVERY_NAME,
1479 IDS_FLAGS_ENABLE_DEVICE_DISCOVERY_DESCRIPTION,
1480 kOsDesktop,
1481 SINGLE_VALUE_TYPE(switches::kEnableDeviceDiscovery)
1483 #if defined(OS_MACOSX)
1485 "enable-app-list-shim",
1486 IDS_FLAGS_ENABLE_APP_LIST_SHIM_NAME,
1487 IDS_FLAGS_ENABLE_APP_LIST_SHIM_DESCRIPTION,
1488 kOsMac,
1489 SINGLE_VALUE_TYPE(switches::kEnableAppListShim)
1492 "enable-app-shims",
1493 IDS_FLAGS_ENABLE_APP_SHIMS_NAME,
1494 IDS_FLAGS_ENABLE_APP_SHIMS_DESCRIPTION,
1495 kOsMac,
1496 SINGLE_VALUE_TYPE(switches::kEnableAppShims)
1499 "enable-simplified-fullscreen",
1500 IDS_FLAGS_ENABLE_SIMPLIFIED_FULLSCREEN_NAME,
1501 IDS_FLAGS_ENABLE_SIMPLIFIED_FULLSCREEN_DESCRIPTION,
1502 kOsMac,
1503 SINGLE_VALUE_TYPE(switches::kEnableSimplifiedFullscreen)
1505 #endif
1506 #if defined(OS_CHROMEOS) || defined(OS_WIN)
1508 "omnibox-auto-completion-for-ime",
1509 IDS_FLAGS_ENABLE_OMNIBOX_AUTO_COMPLETION_FOR_IME_NAME,
1510 IDS_FLAGS_ENABLE_OMNIBOX_AUTO_COMPLETION_FOR_IME_DESCRIPTION,
1511 kOsCrOS | kOsWin,
1512 ENABLE_DISABLE_VALUE_TYPE(switches::kEnableOmniboxAutoCompletionForIme,
1513 switches::kDisableOmniboxAutoCompletionForIme)
1515 #endif
1516 #if defined(USE_AURA)
1518 "tab-capture-upscale-quality",
1519 IDS_FLAGS_TAB_CAPTURE_UPSCALE_QUALITY_NAME,
1520 IDS_FLAGS_TAB_CAPTURE_UPSCALE_QUALITY_DESCRIPTION,
1521 kOsAll,
1522 MULTI_VALUE_TYPE(kTabCaptureUpscaleQualityChoices)
1525 "tab-capture-downscale-quality",
1526 IDS_FLAGS_TAB_CAPTURE_DOWNSCALE_QUALITY_NAME,
1527 IDS_FLAGS_TAB_CAPTURE_DOWNSCALE_QUALITY_DESCRIPTION,
1528 kOsAll,
1529 MULTI_VALUE_TYPE(kTabCaptureDownscaleQualityChoices)
1531 #endif
1533 "enable-spelling-service-feedback",
1534 IDS_FLAGS_ENABLE_SPELLING_SERVICE_FEEDBACK_NAME,
1535 IDS_FLAGS_ENABLE_SPELLING_SERVICE_FEEDBACK_DESCRIPTION,
1536 kOsAll,
1537 SINGLE_VALUE_TYPE(switches::kEnableSpellingServiceFeedback)
1540 "enable-webgl-draft-extensions",
1541 IDS_FLAGS_ENABLE_WEBGL_DRAFT_EXTENSIONS_NAME,
1542 IDS_FLAGS_ENABLE_WEBGL_DRAFT_EXTENSIONS_DESCRIPTION,
1543 kOsAll,
1544 SINGLE_VALUE_TYPE(switches::kEnableWebGLDraftExtensions)
1547 "enable-html-imports",
1548 IDS_FLAGS_ENABLE_HTML_IMPORTS_NAME,
1549 IDS_FLAGS_ENABLE_HTML_IMPORTS_DESCRIPTION,
1550 kOsAll,
1551 SINGLE_VALUE_TYPE(switches::kEnableHTMLImports)
1554 "high-dpi-support",
1555 IDS_FLAGS_HIDPI_NAME,
1556 IDS_FLAGS_HIDPI_DESCRIPTION,
1557 kOsWin,
1558 ENABLE_DISABLE_VALUE_TYPE_AND_VALUE(switches::kHighDPISupport,"1",
1559 switches::kHighDPISupport,"0")
1561 #if defined(OS_CHROMEOS)
1563 "enable-quickoffice-viewing",
1564 IDS_FLAGS_ENABLE_QUICKOFFICE_DESKTOP_VIEWING_NAME,
1565 IDS_FLAGS_ENABLE_QUICKOFFICE_DESKTOP_VIEWING_DESCRIPTION,
1566 kOsCrOS,
1567 SINGLE_VALUE_TYPE(switches::kEnableQuickofficeViewing),
1570 "enable-sticky-keys",
1571 IDS_FLAGS_ENABLE_STICKY_KEYS_NAME,
1572 IDS_FLAGS_ENABLE_STICKY_KEYS_DESCRIPTION,
1573 kOsCrOS,
1574 ENABLE_DISABLE_VALUE_TYPE(switches::kEnableStickyKeys,
1575 switches::kDisableStickyKeys)
1577 #endif
1579 "enable-translate-settings",
1580 IDS_FLAGS_ENABLE_TRANSLATE_SETTINGS_NAME,
1581 IDS_FLAGS_ENABLE_TRANSLATE_SETTINGS_DESCRIPTION,
1582 kOsAll,
1583 SINGLE_VALUE_TYPE(switches::kEnableTranslateSettings)
1586 "enable-web-midi",
1587 IDS_FLAGS_ENABLE_WEB_MIDI_NAME,
1588 IDS_FLAGS_ENABLE_WEB_MIDI_DESCRIPTION,
1589 kOsMac,
1590 SINGLE_VALUE_TYPE(switches::kEnableWebMIDI)
1593 "enable-new-profile-management",
1594 IDS_FLAGS_ENABLE_NEW_PROFILE_MANAGEMENT_NAME,
1595 IDS_FLAGS_ENABLE_NEW_PROFILE_MANAGEMENT_DESCRIPTION,
1596 kOsWin,
1597 SINGLE_VALUE_TYPE(switches::kNewProfileManagement)
1600 "enable-gaia-profile-info",
1601 IDS_FLAGS_ENABLE_GAIA_PROFILE_INFO_NAME,
1602 IDS_FLAGS_ENABLE_GAIA_PROFILE_INFO_DESCRIPTION,
1603 kOsMac | kOsWin | kOsLinux,
1604 SINGLE_VALUE_TYPE(switches::kGaiaProfileInfo)
1606 #if defined(OS_WIN)
1608 "disable-app-launcher",
1609 IDS_FLAGS_DISABLE_APP_LIST_NAME,
1610 IDS_FLAGS_DISABLE_APP_LIST_DESCRIPTION,
1611 kOsAll,
1612 SINGLE_VALUE_TYPE(switches::kDisableAppList)
1614 #endif
1615 #if defined(OS_CHROMEOS)
1617 "disable-user-image-sync",
1618 IDS_FLAGS_DISABLE_USER_IMAGE_SYNC_NAME,
1619 IDS_FLAGS_DISABLE_USER_IMAGE_SYNC_DESCRIPTION,
1620 kOsCrOS,
1621 SINGLE_VALUE_TYPE(chromeos::switches::kDisableUserImageSync)
1623 #endif
1624 #if defined(OS_ANDROID)
1626 "enable-accessibility-tab-switcher",
1627 IDS_FLAGS_ENABLE_ACCESSIBILITY_TAB_SWITCHER_NAME,
1628 IDS_FLAGS_ENABLE_ACCESSIBILITY_TAB_SWITCHER_DESCRIPTION,
1629 kOsAndroid,
1630 SINGLE_VALUE_TYPE(switches::kEnableAccessibilityTabSwitcher)
1632 #endif
1635 const Experiment* experiments = kExperiments;
1636 size_t num_experiments = arraysize(kExperiments);
1638 // Stores and encapsulates the little state that about:flags has.
1639 class FlagsState {
1640 public:
1641 FlagsState() : needs_restart_(false) {}
1642 void ConvertFlagsToSwitches(FlagsStorage* flags_storage,
1643 CommandLine* command_line);
1644 bool IsRestartNeededToCommitChanges();
1645 void SetExperimentEnabled(
1646 FlagsStorage* flags_storage,
1647 const std::string& internal_name,
1648 bool enable);
1649 void RemoveFlagsSwitches(
1650 std::map<std::string, CommandLine::StringType>* switch_list);
1651 void ResetAllFlags(FlagsStorage* flags_storage);
1652 void reset();
1654 // Returns the singleton instance of this class
1655 static FlagsState* GetInstance() {
1656 return Singleton<FlagsState>::get();
1659 private:
1660 bool needs_restart_;
1661 std::map<std::string, std::string> flags_switches_;
1663 DISALLOW_COPY_AND_ASSIGN(FlagsState);
1666 // Adds the internal names for the specified experiment to |names|.
1667 void AddInternalName(const Experiment& e, std::set<std::string>* names) {
1668 if (e.type == Experiment::SINGLE_VALUE) {
1669 names->insert(e.internal_name);
1670 } else {
1671 DCHECK(e.type == Experiment::MULTI_VALUE ||
1672 e.type == Experiment::ENABLE_DISABLE_VALUE);
1673 for (int i = 0; i < e.num_choices; ++i)
1674 names->insert(e.NameForChoice(i));
1678 // Confirms that an experiment is valid, used in a DCHECK in
1679 // SanitizeList below.
1680 bool ValidateExperiment(const Experiment& e) {
1681 switch (e.type) {
1682 case Experiment::SINGLE_VALUE:
1683 DCHECK_EQ(0, e.num_choices);
1684 DCHECK(!e.choices);
1685 break;
1686 case Experiment::MULTI_VALUE:
1687 DCHECK_GT(e.num_choices, 0);
1688 DCHECK(e.choices);
1689 DCHECK(e.choices[0].command_line_switch);
1690 DCHECK_EQ('\0', e.choices[0].command_line_switch[0]);
1691 break;
1692 case Experiment::ENABLE_DISABLE_VALUE:
1693 DCHECK_EQ(3, e.num_choices);
1694 DCHECK(!e.choices);
1695 DCHECK(e.command_line_switch);
1696 DCHECK(e.command_line_value);
1697 DCHECK(e.disable_command_line_switch);
1698 DCHECK(e.disable_command_line_value);
1699 break;
1700 default:
1701 NOTREACHED();
1703 return true;
1706 // Removes all experiments from prefs::kEnabledLabsExperiments that are
1707 // unknown, to prevent this list to become very long as experiments are added
1708 // and removed.
1709 void SanitizeList(FlagsStorage* flags_storage) {
1710 std::set<std::string> known_experiments;
1711 for (size_t i = 0; i < num_experiments; ++i) {
1712 DCHECK(ValidateExperiment(experiments[i]));
1713 AddInternalName(experiments[i], &known_experiments);
1716 std::set<std::string> enabled_experiments = flags_storage->GetFlags();
1718 std::set<std::string> new_enabled_experiments;
1719 std::set_intersection(
1720 known_experiments.begin(), known_experiments.end(),
1721 enabled_experiments.begin(), enabled_experiments.end(),
1722 std::inserter(new_enabled_experiments, new_enabled_experiments.begin()));
1724 if (new_enabled_experiments != enabled_experiments)
1725 flags_storage->SetFlags(new_enabled_experiments);
1728 void GetSanitizedEnabledFlags(
1729 FlagsStorage* flags_storage, std::set<std::string>* result) {
1730 SanitizeList(flags_storage);
1731 *result = flags_storage->GetFlags();
1734 // Variant of GetSanitizedEnabledFlags that also removes any flags that aren't
1735 // enabled on the current platform.
1736 void GetSanitizedEnabledFlagsForCurrentPlatform(
1737 FlagsStorage* flags_storage, std::set<std::string>* result) {
1738 GetSanitizedEnabledFlags(flags_storage, result);
1740 // Filter out any experiments that aren't enabled on the current platform. We
1741 // don't remove these from prefs else syncing to a platform with a different
1742 // set of experiments would be lossy.
1743 std::set<std::string> platform_experiments;
1744 int current_platform = GetCurrentPlatform();
1745 for (size_t i = 0; i < num_experiments; ++i) {
1746 if (experiments[i].supported_platforms & current_platform)
1747 AddInternalName(experiments[i], &platform_experiments);
1748 #if defined(OS_CHROMEOS)
1749 if (experiments[i].supported_platforms & kOsCrOSOwnerOnly)
1750 AddInternalName(experiments[i], &platform_experiments);
1751 #endif
1754 std::set<std::string> new_enabled_experiments;
1755 std::set_intersection(
1756 platform_experiments.begin(), platform_experiments.end(),
1757 result->begin(), result->end(),
1758 std::inserter(new_enabled_experiments, new_enabled_experiments.begin()));
1760 result->swap(new_enabled_experiments);
1763 // Returns the Value representing the choice data in the specified experiment.
1764 Value* CreateChoiceData(const Experiment& experiment,
1765 const std::set<std::string>& enabled_experiments) {
1766 DCHECK(experiment.type == Experiment::MULTI_VALUE ||
1767 experiment.type == Experiment::ENABLE_DISABLE_VALUE);
1768 ListValue* result = new ListValue;
1769 for (int i = 0; i < experiment.num_choices; ++i) {
1770 DictionaryValue* value = new DictionaryValue;
1771 const std::string name = experiment.NameForChoice(i);
1772 value->SetString("internal_name", name);
1773 value->SetString("description", experiment.DescriptionForChoice(i));
1774 value->SetBoolean("selected", enabled_experiments.count(name) > 0);
1775 result->Append(value);
1777 return result;
1780 } // namespace
1782 std::string Experiment::NameForChoice(int index) const {
1783 DCHECK(type == Experiment::MULTI_VALUE ||
1784 type == Experiment::ENABLE_DISABLE_VALUE);
1785 DCHECK_LT(index, num_choices);
1786 return std::string(internal_name) + testing::kMultiSeparator +
1787 base::IntToString(index);
1790 string16 Experiment::DescriptionForChoice(int index) const {
1791 DCHECK(type == Experiment::MULTI_VALUE ||
1792 type == Experiment::ENABLE_DISABLE_VALUE);
1793 DCHECK_LT(index, num_choices);
1794 int description_id;
1795 if (type == Experiment::ENABLE_DISABLE_VALUE) {
1796 const int kEnableDisableDescriptionIds[] = {
1797 IDS_GENERIC_EXPERIMENT_CHOICE_DEFAULT,
1798 IDS_GENERIC_EXPERIMENT_CHOICE_ENABLED,
1799 IDS_GENERIC_EXPERIMENT_CHOICE_DISABLED,
1801 description_id = kEnableDisableDescriptionIds[index];
1802 } else {
1803 description_id = choices[index].description_id;
1805 return l10n_util::GetStringUTF16(description_id);
1808 void ConvertFlagsToSwitches(FlagsStorage* flags_storage,
1809 CommandLine* command_line) {
1810 FlagsState::GetInstance()->ConvertFlagsToSwitches(flags_storage,
1811 command_line);
1814 bool AreSwitchesIdenticalToCurrentCommandLine(
1815 const CommandLine& new_cmdline, const CommandLine& active_cmdline) {
1816 std::set<CommandLine::StringType> new_flags =
1817 ExtractFlagsFromCommandLine(new_cmdline);
1818 std::set<CommandLine::StringType> active_flags =
1819 ExtractFlagsFromCommandLine(active_cmdline);
1821 // Needed because std::equal doesn't check if the 2nd set is empty.
1822 if (new_flags.size() != active_flags.size())
1823 return false;
1825 return std::equal(new_flags.begin(), new_flags.end(), active_flags.begin());
1828 void GetFlagsExperimentsData(FlagsStorage* flags_storage,
1829 FlagAccess access,
1830 base::ListValue* supported_experiments,
1831 base::ListValue* unsupported_experiments) {
1832 std::set<std::string> enabled_experiments;
1833 GetSanitizedEnabledFlags(flags_storage, &enabled_experiments);
1835 int current_platform = GetCurrentPlatform();
1837 for (size_t i = 0; i < num_experiments; ++i) {
1838 const Experiment& experiment = experiments[i];
1840 DictionaryValue* data = new DictionaryValue();
1841 data->SetString("internal_name", experiment.internal_name);
1842 data->SetString("name",
1843 l10n_util::GetStringUTF16(experiment.visible_name_id));
1844 data->SetString("description",
1845 l10n_util::GetStringUTF16(
1846 experiment.visible_description_id));
1848 ListValue* supported_platforms = new ListValue();
1849 AddOsStrings(experiment.supported_platforms, supported_platforms);
1850 data->Set("supported_platforms", supported_platforms);
1852 switch (experiment.type) {
1853 case Experiment::SINGLE_VALUE:
1854 data->SetBoolean(
1855 "enabled",
1856 enabled_experiments.count(experiment.internal_name) > 0);
1857 break;
1858 case Experiment::MULTI_VALUE:
1859 case Experiment::ENABLE_DISABLE_VALUE:
1860 data->Set("choices", CreateChoiceData(experiment, enabled_experiments));
1861 break;
1862 default:
1863 NOTREACHED();
1866 bool supported = (experiment.supported_platforms & current_platform) != 0;
1867 #if defined(OS_CHROMEOS)
1868 if (access == kOwnerAccessToFlags &&
1869 (experiment.supported_platforms & kOsCrOSOwnerOnly) != 0) {
1870 supported = true;
1872 #endif
1873 if (supported)
1874 supported_experiments->Append(data);
1875 else
1876 unsupported_experiments->Append(data);
1880 bool IsRestartNeededToCommitChanges() {
1881 return FlagsState::GetInstance()->IsRestartNeededToCommitChanges();
1884 void SetExperimentEnabled(FlagsStorage* flags_storage,
1885 const std::string& internal_name,
1886 bool enable) {
1887 FlagsState::GetInstance()->SetExperimentEnabled(flags_storage,
1888 internal_name, enable);
1891 void RemoveFlagsSwitches(
1892 std::map<std::string, CommandLine::StringType>* switch_list) {
1893 FlagsState::GetInstance()->RemoveFlagsSwitches(switch_list);
1896 void ResetAllFlags(FlagsStorage* flags_storage) {
1897 FlagsState::GetInstance()->ResetAllFlags(flags_storage);
1900 int GetCurrentPlatform() {
1901 #if defined(OS_MACOSX)
1902 return kOsMac;
1903 #elif defined(OS_WIN)
1904 return kOsWin;
1905 #elif defined(OS_CHROMEOS) // Needs to be before the OS_LINUX check.
1906 return kOsCrOS;
1907 #elif defined(OS_LINUX) || defined(OS_OPENBSD)
1908 return kOsLinux;
1909 #elif defined(OS_ANDROID)
1910 return kOsAndroid;
1911 #else
1912 #error Unknown platform
1913 #endif
1916 void RecordUMAStatistics(FlagsStorage* flags_storage) {
1917 std::set<std::string> flags = flags_storage->GetFlags();
1918 for (std::set<std::string>::iterator it = flags.begin(); it != flags.end();
1919 ++it) {
1920 std::string action("AboutFlags_");
1921 action += *it;
1922 content::RecordComputedAction(action);
1924 // Since flag metrics are recorded every startup, add a tick so that the
1925 // stats can be made meaningful.
1926 if (flags.size())
1927 content::RecordAction(UserMetricsAction("AboutFlags_StartupTick"));
1928 content::RecordAction(UserMetricsAction("StartupTick"));
1931 //////////////////////////////////////////////////////////////////////////////
1932 // FlagsState implementation.
1934 namespace {
1936 typedef std::map<std::string, std::pair<std::string, std::string> >
1937 NameToSwitchAndValueMap;
1939 void SetFlagToSwitchMapping(const std::string& key,
1940 const std::string& switch_name,
1941 const std::string& switch_value,
1942 NameToSwitchAndValueMap* name_to_switch_map) {
1943 DCHECK(name_to_switch_map->end() == name_to_switch_map->find(key));
1944 (*name_to_switch_map)[key] = std::make_pair(switch_name, switch_value);
1947 void FlagsState::ConvertFlagsToSwitches(
1948 FlagsStorage* flags_storage, CommandLine* command_line) {
1949 if (command_line->HasSwitch(switches::kNoExperiments))
1950 return;
1952 std::set<std::string> enabled_experiments;
1954 GetSanitizedEnabledFlagsForCurrentPlatform(flags_storage,
1955 &enabled_experiments);
1957 NameToSwitchAndValueMap name_to_switch_map;
1958 for (size_t i = 0; i < num_experiments; ++i) {
1959 const Experiment& e = experiments[i];
1960 if (e.type == Experiment::SINGLE_VALUE) {
1961 SetFlagToSwitchMapping(e.internal_name, e.command_line_switch,
1962 e.command_line_value, &name_to_switch_map);
1963 } else if (e.type == Experiment::MULTI_VALUE) {
1964 for (int j = 0; j < e.num_choices; ++j) {
1965 SetFlagToSwitchMapping(e.NameForChoice(j),
1966 e.choices[j].command_line_switch,
1967 e.choices[j].command_line_value,
1968 &name_to_switch_map);
1970 } else {
1971 DCHECK_EQ(e.type, Experiment::ENABLE_DISABLE_VALUE);
1972 SetFlagToSwitchMapping(e.NameForChoice(0), std::string(), std::string(),
1973 &name_to_switch_map);
1974 SetFlagToSwitchMapping(e.NameForChoice(1), e.command_line_switch,
1975 e.command_line_value, &name_to_switch_map);
1976 SetFlagToSwitchMapping(e.NameForChoice(2), e.disable_command_line_switch,
1977 e.disable_command_line_value, &name_to_switch_map);
1981 command_line->AppendSwitch(switches::kFlagSwitchesBegin);
1982 flags_switches_.insert(
1983 std::pair<std::string, std::string>(switches::kFlagSwitchesBegin,
1984 std::string()));
1985 for (std::set<std::string>::iterator it = enabled_experiments.begin();
1986 it != enabled_experiments.end();
1987 ++it) {
1988 const std::string& experiment_name = *it;
1989 NameToSwitchAndValueMap::const_iterator name_to_switch_it =
1990 name_to_switch_map.find(experiment_name);
1991 if (name_to_switch_it == name_to_switch_map.end()) {
1992 NOTREACHED();
1993 continue;
1996 const std::pair<std::string, std::string>&
1997 switch_and_value_pair = name_to_switch_it->second;
1999 command_line->AppendSwitchASCII(switch_and_value_pair.first,
2000 switch_and_value_pair.second);
2001 flags_switches_[switch_and_value_pair.first] = switch_and_value_pair.second;
2003 command_line->AppendSwitch(switches::kFlagSwitchesEnd);
2004 flags_switches_.insert(
2005 std::pair<std::string, std::string>(switches::kFlagSwitchesEnd,
2006 std::string()));
2009 bool FlagsState::IsRestartNeededToCommitChanges() {
2010 return needs_restart_;
2013 void FlagsState::SetExperimentEnabled(FlagsStorage* flags_storage,
2014 const std::string& internal_name,
2015 bool enable) {
2016 size_t at_index = internal_name.find(testing::kMultiSeparator);
2017 if (at_index != std::string::npos) {
2018 DCHECK(enable);
2019 // We're being asked to enable a multi-choice experiment. Disable the
2020 // currently selected choice.
2021 DCHECK_NE(at_index, 0u);
2022 const std::string experiment_name = internal_name.substr(0, at_index);
2023 SetExperimentEnabled(flags_storage, experiment_name, false);
2025 // And enable the new choice, if it is not the default first choice.
2026 if (internal_name != experiment_name + "@0") {
2027 std::set<std::string> enabled_experiments;
2028 GetSanitizedEnabledFlags(flags_storage, &enabled_experiments);
2029 needs_restart_ |= enabled_experiments.insert(internal_name).second;
2030 flags_storage->SetFlags(enabled_experiments);
2032 return;
2035 std::set<std::string> enabled_experiments;
2036 GetSanitizedEnabledFlags(flags_storage, &enabled_experiments);
2038 const Experiment* e = NULL;
2039 for (size_t i = 0; i < num_experiments; ++i) {
2040 if (experiments[i].internal_name == internal_name) {
2041 e = experiments + i;
2042 break;
2045 DCHECK(e);
2047 if (e->type == Experiment::SINGLE_VALUE) {
2048 if (enable)
2049 needs_restart_ |= enabled_experiments.insert(internal_name).second;
2050 else
2051 needs_restart_ |= (enabled_experiments.erase(internal_name) > 0);
2052 } else {
2053 if (enable) {
2054 // Enable the first choice.
2055 needs_restart_ |= enabled_experiments.insert(e->NameForChoice(0)).second;
2056 } else {
2057 // Find the currently enabled choice and disable it.
2058 for (int i = 0; i < e->num_choices; ++i) {
2059 std::string choice_name = e->NameForChoice(i);
2060 if (enabled_experiments.find(choice_name) !=
2061 enabled_experiments.end()) {
2062 needs_restart_ = true;
2063 enabled_experiments.erase(choice_name);
2064 // Continue on just in case there's a bug and more than one
2065 // experiment for this choice was enabled.
2071 flags_storage->SetFlags(enabled_experiments);
2074 void FlagsState::RemoveFlagsSwitches(
2075 std::map<std::string, CommandLine::StringType>* switch_list) {
2076 for (std::map<std::string, std::string>::const_iterator
2077 it = flags_switches_.begin(); it != flags_switches_.end(); ++it) {
2078 switch_list->erase(it->first);
2082 void FlagsState::ResetAllFlags(FlagsStorage* flags_storage) {
2083 needs_restart_ = true;
2085 std::set<std::string> no_experiments;
2086 flags_storage->SetFlags(no_experiments);
2089 void FlagsState::reset() {
2090 needs_restart_ = false;
2091 flags_switches_.clear();
2094 } // namespace
2096 namespace testing {
2098 // WARNING: '@' is also used in the html file. If you update this constant you
2099 // also need to update the html file.
2100 const char kMultiSeparator[] = "@";
2102 void ClearState() {
2103 FlagsState::GetInstance()->reset();
2106 void SetExperiments(const Experiment* e, size_t count) {
2107 if (!e) {
2108 experiments = kExperiments;
2109 num_experiments = arraysize(kExperiments);
2110 } else {
2111 experiments = e;
2112 num_experiments = count;
2116 const Experiment* GetExperiments(size_t* count) {
2117 *count = num_experiments;
2118 return experiments;
2121 } // namespace testing
2123 } // namespace about_flags