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"
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"
39 #include "ash/ash_switches.h"
42 #if defined(OS_CHROMEOS)
43 #include "chromeos/chromeos_switches.h"
44 #include "third_party/cros_system_api/switches/chrome_switches.h"
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)
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
) {
76 const char* const name
;
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
);
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
, "" }
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
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
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
,
320 #if defined(OS_MACOSX)
321 // The switch exists only on OS X.
322 SINGLE_VALUE_TYPE(switches::kEnableExposeForTabs
)
324 SINGLE_VALUE_TYPE("")
328 "conflicting-modules-check", // FLAGS:RECORD_UMA
329 IDS_FLAGS_CONFLICTS_CHECK_NAME
,
330 IDS_FLAGS_CONFLICTS_CHECK_DESCRIPTION
,
332 SINGLE_VALUE_TYPE(switches::kConflictingModulesCheck
)
335 "ignore-gpu-blacklist",
336 IDS_FLAGS_IGNORE_GPU_BLACKLIST_NAME
,
337 IDS_FLAGS_IGNORE_GPU_BLACKLIST_DESCRIPTION
,
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
,
362 ENABLE_DISABLE_VALUE_TYPE(switches::kEnableAcceleratedOverflowScroll
,
363 switches::kDisableAcceleratedOverflowScroll
)
367 IDS_FLAGS_PRESENT_WITH_GDI_NAME
,
368 IDS_FLAGS_PRESENT_WITH_GDI_DESCRIPTION
,
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
,
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
,
384 SINGLE_VALUE_TYPE(switches::kDisableAccelerated2dCanvas
)
387 "disable-threaded-animation",
388 IDS_FLAGS_DISABLE_THREADED_ANIMATION_NAME
,
389 IDS_FLAGS_DISABLE_THREADED_ANIMATION_DESCRIPTION
,
391 SINGLE_VALUE_TYPE(cc::switches::kDisableThreadedAnimation
)
394 "composited-layer-borders",
395 IDS_FLAGS_COMPOSITED_LAYER_BORDERS
,
396 IDS_FLAGS_COMPOSITED_LAYER_BORDERS_DESCRIPTION
,
398 SINGLE_VALUE_TYPE(cc::switches::kShowCompositedLayerBorders
)
402 IDS_FLAGS_SHOW_FPS_COUNTER
,
403 IDS_FLAGS_SHOW_FPS_COUNTER_DESCRIPTION
,
405 SINGLE_VALUE_TYPE(cc::switches::kShowFPSCounter
)
408 "accelerated-filters",
409 IDS_FLAGS_ACCELERATED_FILTERS
,
410 IDS_FLAGS_ACCELERATED_FILTERS_DESCRIPTION
,
412 SINGLE_VALUE_TYPE(switches::kEnableAcceleratedFilters
)
416 IDS_FLAGS_DISABLE_GPU_VSYNC_NAME
,
417 IDS_FLAGS_DISABLE_GPU_VSYNC_DESCRIPTION
,
419 SINGLE_VALUE_TYPE(switches::kDisableGpuVsync
)
423 IDS_FLAGS_DISABLE_WEBGL_NAME
,
424 IDS_FLAGS_DISABLE_WEBGL_DESCRIPTION
,
426 SINGLE_VALUE_TYPE(switches::kDisableExperimentalWebGL
)
430 IDS_FLAGS_DISABLE_WEBRTC_NAME
,
431 IDS_FLAGS_DISABLE_WEBRTC_DESCRIPTION
,
433 #if defined(OS_ANDROID)
434 SINGLE_VALUE_TYPE(switches::kDisableWebRTC
)
436 SINGLE_VALUE_TYPE("")
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
,
445 SINGLE_VALUE_TYPE(switches::kEnableSCTPDataChannels
)
448 "disable-device-enumeration",
449 IDS_FLAGS_DISABLE_DEVICE_ENUMERATION_NAME
,
450 IDS_FLAGS_DISABLE_DEVICE_ENUMERATION_DESCRIPTION
,
452 SINGLE_VALUE_TYPE(switches::kDisableDeviceEnumeration
)
455 #if defined(OS_ANDROID)
458 IDS_FLAGS_DISABLE_WEBAUDIO_NAME
,
459 IDS_FLAGS_DISABLE_WEBAUDIO_DESCRIPTION
,
461 SINGLE_VALUE_TYPE(switches::kDisableWebAudio
)
465 "fixed-position-creates-stacking-context",
466 IDS_FLAGS_FIXED_POSITION_CREATES_STACKING_CONTEXT_NAME
,
467 IDS_FLAGS_FIXED_POSITION_CREATES_STACKING_CONTEXT_DESCRIPTION
,
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
,
478 MULTI_VALUE_TYPE(kEnableCompositingForFixedPositionChoices
)
481 "enable-compositing-for-transition",
482 IDS_FLAGS_COMPOSITING_FOR_TRANSITION_NAME
,
483 IDS_FLAGS_COMPOSITING_FOR_TRANSITION_DESCRIPTION
,
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
,
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
,
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
,
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
,
514 MULTI_VALUE_TYPE(kNaClDebugMaskChoices
)
517 "enable-pnacl", // FLAGS:RECORD_UMA
518 IDS_FLAGS_ENABLE_PNACL_NAME
,
519 IDS_FLAGS_ENABLE_PNACL_DESCRIPTION
,
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
,
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
,
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
,
542 SINGLE_VALUE_TYPE(switches::kEnableFastUnload
)
546 IDS_FLAGS_ENABLE_ADVIEW_NAME
,
547 IDS_FLAGS_ENABLE_ADVIEW_DESCRIPTION
,
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
,
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
,
563 SINGLE_VALUE_TYPE(switches::kEnableAppWindowControls
)
567 IDS_FLAGS_SCRIPT_BADGES_NAME
,
568 IDS_FLAGS_SCRIPT_BADGES_DESCRIPTION
,
570 SINGLE_VALUE_TYPE(switches::kScriptBadges
)
574 IDS_FLAGS_SCRIPT_BUBBLE_NAME
,
575 IDS_FLAGS_SCRIPT_BUBBLE_DESCRIPTION
,
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
,
585 SINGLE_VALUE_TYPE(switches::kAppsNewInstallBubble
)
588 "disable-hyperlink-auditing",
589 IDS_FLAGS_DISABLE_HYPERLINK_AUDITING_NAME
,
590 IDS_FLAGS_DISABLE_HYPERLINK_AUDITING_DESCRIPTION
,
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
,
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)
620 IDS_FLAGS_ENABLE_NEW_NTP
,
621 IDS_FLAGS_ENABLE_NEW_NTP_DESCRIPTION
,
623 SINGLE_VALUE_TYPE(switches::kEnableNewNTP
)
628 IDS_FLAGS_STATIC_IP_CONFIG_NAME
,
629 IDS_FLAGS_STATIC_IP_CONFIG_DESCRIPTION
,
631 #if defined(OS_CHROMEOS)
632 // This switch exists only on Chrome OS.
633 SINGLE_VALUE_TYPE(chromeos::switches::kEnableStaticIPConfig
)
635 SINGLE_VALUE_TYPE("")
639 "show-autofill-type-predictions",
640 IDS_FLAGS_SHOW_AUTOFILL_TYPE_PREDICTIONS_NAME
,
641 IDS_FLAGS_SHOW_AUTOFILL_TYPE_PREDICTIONS_DESCRIPTION
,
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
,
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).
660 SINGLE_VALUE_TYPE(switches::kEnableSmoothScrolling
)
664 IDS_FLAGS_ENABLE_PANELS_NAME
,
665 IDS_FLAGS_ENABLE_PANELS_DESCRIPTION
,
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
)
679 IDS_FLAGS_ENABLE_AUTOLOGIN_NAME
,
680 IDS_FLAGS_ENABLE_AUTOLOGIN_DESCRIPTION
,
681 kOsMac
| kOsWin
| kOsLinux
,
682 SINGLE_VALUE_TYPE(switches::kEnableAutologin
)
686 IDS_FLAGS_ENABLE_QUIC_NAME
,
687 IDS_FLAGS_ENABLE_QUIC_DESCRIPTION
,
689 ENABLE_DISABLE_VALUE_TYPE(switches::kEnableQuic
,
690 switches::kDisableQuic
)
694 IDS_FLAGS_ENABLE_QUIC_HTTPS_NAME
,
695 IDS_FLAGS_ENABLE_QUIC_HTTPS_DESCRIPTION
,
697 ENABLE_DISABLE_VALUE_TYPE(switches::kEnableQuicHttps
,
698 switches::kDisableQuicHttps
)
702 IDS_FLAGS_ENABLE_SPDY4A2_NAME
,
703 IDS_FLAGS_ENABLE_SPDY4A2_DESCRIPTION
,
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
,
712 SINGLE_VALUE_TYPE(switches::kEnableHttp2Draft04
)
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
,
727 SINGLE_VALUE_TYPE(switches::kDisableWebKitMediaSource
)
730 "enable-encrypted-media",
731 IDS_FLAGS_ENABLE_ENCRYPTED_MEDIA_NAME
,
732 IDS_FLAGS_ENABLE_ENCRYPTED_MEDIA_DESCRIPTION
,
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
,
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
,
748 SINGLE_VALUE_TYPE(switches::kOverrideEncryptedMediaCanPlayType
)
751 "enable-opus-playback",
752 IDS_FLAGS_ENABLE_OPUS_PLAYBACK_NAME
,
753 IDS_FLAGS_ENABLE_OPUS_PLAYBACK_DESCRIPTION
,
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
,
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
)
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
)
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
,
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
,
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
,
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)
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
,
838 SINGLE_VALUE_TYPE(switches::kEnableExperimentalWebPlatformFeatures
)
841 "enable-css-shaders",
842 IDS_FLAGS_CSS_SHADERS_NAME
,
843 IDS_FLAGS_CSS_SHADERS_DESCRIPTION
,
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
,
852 SINGLE_VALUE_TYPE(switches::kDisableNTPOtherSessionsMenu
)
857 IDS_FLAGS_ENABLE_ASH_OAK_NAME
,
858 IDS_FLAGS_ENABLE_ASH_OAK_DESCRIPTION
,
860 SINGLE_VALUE_TYPE(ash::switches::kAshEnableOak
),
864 "enable-devtools-experiments",
865 IDS_FLAGS_ENABLE_DEVTOOLS_EXPERIMENTS_NAME
,
866 IDS_FLAGS_ENABLE_DEVTOOLS_EXPERIMENTS_DESCRIPTION
,
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
,
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
,
882 SINGLE_VALUE_TYPE(switches::kSilentDebuggerExtensionAPI
)
885 "enable-suggestions-ntp",
886 IDS_FLAGS_NTP_SUGGESTIONS_PAGE_NAME
,
887 IDS_FLAGS_NTP_SUGGESTIONS_PAGE_DESCRIPTION
,
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
,
903 SINGLE_VALUE_TYPE(switches::kEnableScrollPrediction
)
907 IDS_TOUCH_EVENTS_NAME
,
908 IDS_TOUCH_EVENTS_DESCRIPTION
,
910 MULTI_VALUE_TYPE(kTouchEventsChoices
)
913 "touch-optimized-ui",
914 IDS_FLAGS_TOUCH_OPTIMIZED_UI_NAME
,
915 IDS_FLAGS_TOUCH_OPTIMIZED_UI_DESCRIPTION
,
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
,
932 SINGLE_VALUE_TYPE(ash::switches::kAshUseAlternateShelfLayout
)
935 "enable-background-loader",
936 IDS_ENABLE_BACKLOADER_NAME
,
937 IDS_ENABLE_BACKLOADER_DESCRIPTION
,
939 SINGLE_VALUE_TYPE(chromeos::switches::kEnableBackgroundLoader
)
942 "enable-screensaver-extension",
943 IDS_ENABLE_SCREENSAVER_EXTENSION_NAME
,
944 IDS_ENABLE_SCREENSAVER_EXTENSION_DESCRIPTION
,
946 SINGLE_VALUE_TYPE(chromeos::switches::kEnableScreensaverExtensions
)
950 IDS_FLAGS_NO_DISCARD_TABS_NAME
,
951 IDS_FLAGS_NO_DISCARD_TABS_DESCRIPTION
,
953 SINGLE_VALUE_TYPE(chromeos::switches::kNoDiscardTabs
)
956 "ash-enable-docked-windows",
957 IDS_FLAGS_DOCKED_WINDOWS_NAME
,
958 IDS_FLAGS_DOCKED_WINDOWS_DESCRIPTION
,
960 SINGLE_VALUE_TYPE(ash::switches::kAshEnableDockedWindows
)
964 "enable-download-resumption",
965 IDS_FLAGS_ENABLE_DOWNLOAD_RESUMPTION_NAME
,
966 IDS_FLAGS_ENABLE_DOWNLOAD_RESUMPTION_DESCRIPTION
,
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
,
975 SINGLE_VALUE_TYPE_AND_VALUE(switches::kAllowNaClSocketAPI
, "*")
979 IDS_FLAGS_STACKED_TAB_STRIP_NAME
,
980 IDS_FLAGS_STACKED_TAB_STRIP_DESCRIPTION
,
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
,
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
,
997 SINGLE_VALUE_TYPE(chromeos::switches::kEnableTouchpadThreeFingerClick
)
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
,
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
,
1015 SINGLE_VALUE_TYPE(switches::kDisableMinimizeOnSecondLauncherItemClick
)
1018 "enable-overview-mode",
1019 IDS_FLAGS_OVERVIEW_MODE_NAME
,
1020 IDS_FLAGS_OVERVIEW_MODE_DESCRIPTION
,
1022 SINGLE_VALUE_TYPE(ash::switches::kAshEnableOverviewMode
)
1026 IDS_FLAGS_SHOW_TOUCH_HUD_NAME
,
1027 IDS_FLAGS_SHOW_TOUCH_HUD_DESCRIPTION
,
1029 SINGLE_VALUE_TYPE(ash::switches::kAshTouchHud
)
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
,
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
,
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
,
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
,
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
,
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
,
1094 SINGLE_VALUE_TYPE(chromeos::switches::kDisableQuickofficeComponentApp
),
1096 #endif // defined(OS_CHROMEOS)
1099 IDS_FLAGS_VIEWS_TEXTFIELD_NAME
,
1100 IDS_FLAGS_VIEWS_TEXTFIELD_DESCRIPTION
,
1102 ENABLE_DISABLE_VALUE_TYPE(switches::kEnableViewsTextfield
,
1103 switches::kDisableViewsTextfield
),
1107 IDS_FLAGS_NEW_DIALOG_STYLE_NAME
,
1108 IDS_FLAGS_NEW_DIALOG_STYLE_DESCRIPTION
,
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
,
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
,
1125 SINGLE_VALUE_TYPE(ash::switches::kAshDebugShortcuts
),
1130 IDS_FLAGS_ENABLE_CONTACTS_NAME
,
1131 IDS_FLAGS_ENABLE_CONTACTS_DESCRIPTION
,
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
,
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
,
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
,
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
,
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
,
1166 SINGLE_VALUE_TYPE(ash::switches::kAshEnableMemoryMonitor
),
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
,
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
,
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
,
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
,
1197 SINGLE_VALUE_TYPE(chromeos::switches::kEnableRequestTabletSite
)
1201 "debug-packed-apps",
1202 IDS_FLAGS_DEBUG_PACKED_APP_NAME
,
1203 IDS_FLAGS_DEBUG_PACKED_APP_DESCRIPTION
,
1205 SINGLE_VALUE_TYPE(switches::kDebugPackedApps
)
1208 "enable-password-generation",
1209 IDS_FLAGS_ENABLE_PASSWORD_GENERATION_NAME
,
1210 IDS_FLAGS_ENABLE_PASSWORD_GENERATION_DESCRIPTION
,
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
,
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
,
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
,
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
,
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
,
1266 ENABLE_DISABLE_VALUE_TYPE_AND_VALUE(
1267 switches::kOverscrollHistoryNavigation
, "1",
1268 switches::kOverscrollHistoryNavigation
, "0")
1272 "scroll-end-effect",
1273 IDS_FLAGS_SCROLL_END_EFFECT_NAME
,
1274 IDS_FLAGS_SCROLL_END_EFFECT_DESCRIPTION
,
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
,
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
,
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
,
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
,
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
,
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
,
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
,
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
,
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
,
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
,
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
,
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
,
1388 SINGLE_VALUE_TYPE(switches::kEnableOfflineCacheAccess
)
1391 "default-tile-width",
1392 IDS_FLAGS_DEFAULT_TILE_WIDTH_NAME
,
1393 IDS_FLAGS_DEFAULT_TILE_WIDTH_DESCRIPTION
,
1395 MULTI_VALUE_TYPE(kDefaultTileWidthChoices
)
1398 "default-tile-height",
1399 IDS_FLAGS_DEFAULT_TILE_HEIGHT_NAME
,
1400 IDS_FLAGS_DEFAULT_TILE_HEIGHT_DESCRIPTION
,
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
,
1411 SINGLE_VALUE_TYPE(switches::kTrackActiveVisitTime
)
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
,
1420 SINGLE_VALUE_TYPE(switches::kDisableGestureRequirementForMediaPlayback
)
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
)
1432 #if defined(OS_CHROMEOS)
1434 "enable-virtual-keyboard",
1435 IDS_FLAGS_ENABLE_VIRTUAL_KEYBOARD_NAME
,
1436 IDS_FLAGS_ENABLE_VIRTUAL_KEYBOARD_DESCRIPTION
,
1438 SINGLE_VALUE_TYPE(keyboard::switches::kEnableVirtualKeyboard
)
1442 "enable-simple-cache-backend",
1443 IDS_FLAGS_ENABLE_SIMPLE_CACHE_BACKEND_NAME
,
1444 IDS_FLAGS_ENABLE_SIMPLE_CACHE_BACKEND_DESCRIPTION
,
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
,
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
,
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
,
1474 SINGLE_VALUE_TYPE(switches::kEnableResetProfileSettings
)
1477 "enable-device-discovery",
1478 IDS_FLAGS_ENABLE_DEVICE_DISCOVERY_NAME
,
1479 IDS_FLAGS_ENABLE_DEVICE_DISCOVERY_DESCRIPTION
,
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
,
1489 SINGLE_VALUE_TYPE(switches::kEnableAppListShim
)
1493 IDS_FLAGS_ENABLE_APP_SHIMS_NAME
,
1494 IDS_FLAGS_ENABLE_APP_SHIMS_DESCRIPTION
,
1496 SINGLE_VALUE_TYPE(switches::kEnableAppShims
)
1499 "enable-simplified-fullscreen",
1500 IDS_FLAGS_ENABLE_SIMPLIFIED_FULLSCREEN_NAME
,
1501 IDS_FLAGS_ENABLE_SIMPLIFIED_FULLSCREEN_DESCRIPTION
,
1503 SINGLE_VALUE_TYPE(switches::kEnableSimplifiedFullscreen
)
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
,
1512 ENABLE_DISABLE_VALUE_TYPE(switches::kEnableOmniboxAutoCompletionForIme
,
1513 switches::kDisableOmniboxAutoCompletionForIme
)
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
,
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
,
1529 MULTI_VALUE_TYPE(kTabCaptureDownscaleQualityChoices
)
1533 "enable-spelling-service-feedback",
1534 IDS_FLAGS_ENABLE_SPELLING_SERVICE_FEEDBACK_NAME
,
1535 IDS_FLAGS_ENABLE_SPELLING_SERVICE_FEEDBACK_DESCRIPTION
,
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
,
1544 SINGLE_VALUE_TYPE(switches::kEnableWebGLDraftExtensions
)
1547 "enable-html-imports",
1548 IDS_FLAGS_ENABLE_HTML_IMPORTS_NAME
,
1549 IDS_FLAGS_ENABLE_HTML_IMPORTS_DESCRIPTION
,
1551 SINGLE_VALUE_TYPE(switches::kEnableHTMLImports
)
1555 IDS_FLAGS_HIDPI_NAME
,
1556 IDS_FLAGS_HIDPI_DESCRIPTION
,
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
,
1567 SINGLE_VALUE_TYPE(switches::kEnableQuickofficeViewing
),
1570 "enable-sticky-keys",
1571 IDS_FLAGS_ENABLE_STICKY_KEYS_NAME
,
1572 IDS_FLAGS_ENABLE_STICKY_KEYS_DESCRIPTION
,
1574 ENABLE_DISABLE_VALUE_TYPE(switches::kEnableStickyKeys
,
1575 switches::kDisableStickyKeys
)
1579 "enable-translate-settings",
1580 IDS_FLAGS_ENABLE_TRANSLATE_SETTINGS_NAME
,
1581 IDS_FLAGS_ENABLE_TRANSLATE_SETTINGS_DESCRIPTION
,
1583 SINGLE_VALUE_TYPE(switches::kEnableTranslateSettings
)
1587 IDS_FLAGS_ENABLE_WEB_MIDI_NAME
,
1588 IDS_FLAGS_ENABLE_WEB_MIDI_DESCRIPTION
,
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
,
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
)
1608 "disable-app-launcher",
1609 IDS_FLAGS_DISABLE_APP_LIST_NAME
,
1610 IDS_FLAGS_DISABLE_APP_LIST_DESCRIPTION
,
1612 SINGLE_VALUE_TYPE(switches::kDisableAppList
)
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
,
1621 SINGLE_VALUE_TYPE(chromeos::switches::kDisableUserImageSync
)
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
,
1630 SINGLE_VALUE_TYPE(switches::kEnableAccessibilityTabSwitcher
)
1635 const Experiment
* experiments
= kExperiments
;
1636 size_t num_experiments
= arraysize(kExperiments
);
1638 // Stores and encapsulates the little state that about:flags has.
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
,
1649 void RemoveFlagsSwitches(
1650 std::map
<std::string
, CommandLine::StringType
>* switch_list
);
1651 void ResetAllFlags(FlagsStorage
* flags_storage
);
1654 // Returns the singleton instance of this class
1655 static FlagsState
* GetInstance() {
1656 return Singleton
<FlagsState
>::get();
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
);
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
) {
1682 case Experiment::SINGLE_VALUE
:
1683 DCHECK_EQ(0, e
.num_choices
);
1686 case Experiment::MULTI_VALUE
:
1687 DCHECK_GT(e
.num_choices
, 0);
1689 DCHECK(e
.choices
[0].command_line_switch
);
1690 DCHECK_EQ('\0', e
.choices
[0].command_line_switch
[0]);
1692 case Experiment::ENABLE_DISABLE_VALUE
:
1693 DCHECK_EQ(3, e
.num_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
);
1706 // Removes all experiments from prefs::kEnabledLabsExperiments that are
1707 // unknown, to prevent this list to become very long as experiments are added
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
);
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
);
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
);
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
];
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
,
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())
1825 return std::equal(new_flags
.begin(), new_flags
.end(), active_flags
.begin());
1828 void GetFlagsExperimentsData(FlagsStorage
* flags_storage
,
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
:
1856 enabled_experiments
.count(experiment
.internal_name
) > 0);
1858 case Experiment::MULTI_VALUE
:
1859 case Experiment::ENABLE_DISABLE_VALUE
:
1860 data
->Set("choices", CreateChoiceData(experiment
, enabled_experiments
));
1866 bool supported
= (experiment
.supported_platforms
& current_platform
) != 0;
1867 #if defined(OS_CHROMEOS)
1868 if (access
== kOwnerAccessToFlags
&&
1869 (experiment
.supported_platforms
& kOsCrOSOwnerOnly
) != 0) {
1874 supported_experiments
->Append(data
);
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
,
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)
1903 #elif defined(OS_WIN)
1905 #elif defined(OS_CHROMEOS) // Needs to be before the OS_LINUX check.
1907 #elif defined(OS_LINUX) || defined(OS_OPENBSD)
1909 #elif defined(OS_ANDROID)
1912 #error Unknown platform
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();
1920 std::string
action("AboutFlags_");
1922 content::RecordComputedAction(action
);
1924 // Since flag metrics are recorded every startup, add a tick so that the
1925 // stats can be made meaningful.
1927 content::RecordAction(UserMetricsAction("AboutFlags_StartupTick"));
1928 content::RecordAction(UserMetricsAction("StartupTick"));
1931 //////////////////////////////////////////////////////////////////////////////
1932 // FlagsState implementation.
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
))
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
);
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
,
1985 for (std::set
<std::string
>::iterator it
= enabled_experiments
.begin();
1986 it
!= enabled_experiments
.end();
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()) {
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
,
2009 bool FlagsState::IsRestartNeededToCommitChanges() {
2010 return needs_restart_
;
2013 void FlagsState::SetExperimentEnabled(FlagsStorage
* flags_storage
,
2014 const std::string
& internal_name
,
2016 size_t at_index
= internal_name
.find(testing::kMultiSeparator
);
2017 if (at_index
!= std::string::npos
) {
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
);
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
;
2047 if (e
->type
== Experiment::SINGLE_VALUE
) {
2049 needs_restart_
|= enabled_experiments
.insert(internal_name
).second
;
2051 needs_restart_
|= (enabled_experiments
.erase(internal_name
) > 0);
2054 // Enable the first choice.
2055 needs_restart_
|= enabled_experiments
.insert(e
->NameForChoice(0)).second
;
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();
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
[] = "@";
2103 FlagsState::GetInstance()->reset();
2106 void SetExperiments(const Experiment
* e
, size_t count
) {
2108 experiments
= kExperiments
;
2109 num_experiments
= arraysize(kExperiments
);
2112 num_experiments
= count
;
2116 const Experiment
* GetExperiments(size_t* count
) {
2117 *count
= num_experiments
;
2121 } // namespace testing
2123 } // namespace about_flags