Upstream version 9.38.198.0
[platform/framework/web/crosswalk.git] / src / chrome / browser / about_flags.cc
index c9658df..2a87d86 100644 (file)
 
 #include "base/command_line.h"
 #include "base/memory/singleton.h"
+#include "base/metrics/sparse_histogram.h"
+#include "base/numerics/safe_conversions.h"
 #include "base/stl_util.h"
 #include "base/strings/string_number_conversions.h"
+#include "base/strings/string_util.h"
 #include "base/strings/utf_string_conversions.h"
 #include "base/values.h"
 #include "cc/base/switches.h"
@@ -22,7 +25,9 @@
 #include "chrome/common/chrome_switches.h"
 #include "components/autofill/core/common/autofill_switches.h"
 #include "components/cloud_devices/common/cloud_devices_switches.h"
+#include "components/metrics/metrics_hashes.h"
 #include "components/nacl/common/nacl_switches.h"
+#include "components/search/search_switches.h"
 #include "content/public/browser/user_metrics.h"
 #include "extensions/common/switches.h"
 #include "grit/chromium_strings.h"
@@ -42,6 +47,7 @@
 #if defined(OS_ANDROID)
 #include "chrome/common/chrome_version_info.h"
 #include "components/data_reduction_proxy/common/data_reduction_proxy_switches.h"
+#include "components/omnibox/omnibox_switches.h"
 #endif
 
 #if defined(USE_ASH)
@@ -61,6 +67,8 @@ using base::UserMetricsAction;
 
 namespace about_flags {
 
+const uint32_t kBadSwitchFormatHistogramId = 0;
+
 // Macros to simplify specifying the type.
 #define SINGLE_VALUE_TYPE_AND_VALUE(command_line_switch, switch_value) \
     Experiment::SINGLE_VALUE, \
@@ -180,6 +188,17 @@ const Experiment::Choice kOverscrollHistoryNavigationChoices[] = {
     "2" }
 };
 #endif
+#if defined(OS_CHROMEOS) || defined(OS_WIN) || defined(OS_LINUX)
+const Experiment::Choice kDeviceScaleFactorChoices[] = {
+  { IDS_GENERIC_EXPERIMENT_CHOICE_DEFAULT, "", ""},
+  { IDS_DEVICE_SCALE_FACTOR_1_1, switches::kForceDeviceScaleFactor, "1.1"},
+  { IDS_DEVICE_SCALE_FACTOR_1_2, switches::kForceDeviceScaleFactor, "1.2"},
+  { IDS_DEVICE_SCALE_FACTOR_1_25, switches::kForceDeviceScaleFactor, "1.25"},
+  { IDS_DEVICE_SCALE_FACTOR_1_3, switches::kForceDeviceScaleFactor, "1.3"},
+  { IDS_DEVICE_SCALE_FACTOR_1_4, switches::kForceDeviceScaleFactor, "1.4"},
+  { IDS_DEVICE_SCALE_FACTOR_2, switches::kForceDeviceScaleFactor, "2"},
+};
+#endif
 
 #if !defined(DISABLE_NACL)
 const Experiment::Choice kNaClDebugMaskChoices[] = {
@@ -398,14 +417,14 @@ const Experiment::Choice kEnableSyncAppListChoices[] = {
 const Experiment::Choice kExtensionContentVerificationChoices[] = {
   { IDS_GENERIC_EXPERIMENT_CHOICE_DEFAULT, "", "" },
   { IDS_FLAGS_EXTENSION_CONTENT_VERIFICATION_BOOTSTRAP,
-    extensions::switches::kExtensionContentVerification,
-    extensions::switches::kExtensionContentVerificationBootstrap },
+    switches::kExtensionContentVerification,
+    switches::kExtensionContentVerificationBootstrap },
   { IDS_FLAGS_EXTENSION_CONTENT_VERIFICATION_ENFORCE,
-    extensions::switches::kExtensionContentVerification,
-    extensions::switches::kExtensionContentVerificationEnforce },
+    switches::kExtensionContentVerification,
+    switches::kExtensionContentVerificationEnforce },
   { IDS_FLAGS_EXTENSION_CONTENT_VERIFICATION_ENFORCE_STRICT,
-    extensions::switches::kExtensionContentVerification,
-    extensions::switches::kExtensionContentVerificationEnforceStrict },
+    switches::kExtensionContentVerification,
+    switches::kExtensionContentVerificationEnforceStrict },
 };
 
 #if defined(OS_ANDROID)
@@ -418,38 +437,6 @@ const Experiment::Choice kAnswersInSuggestChoices[] = {
 };
 #endif
 
-// Using independent flags (instead of flag=value flags) to be able to
-// associate the version with a FieldTrial. FieldTrials don't currently support
-// flag=value flags.
-const Experiment::Choice kSSLInterstitialVersions[] = {
-  { IDS_GENERIC_EXPERIMENT_CHOICE_DEFAULT, "", "" },
-  { IDS_FLAGS_SSL_INTERSTITIAL_VERSION_V1,
-    switches::kSSLInterstitialVersionV1, "" },
-  { IDS_FLAGS_SSL_INTERSTITIAL_VERSION_V2_GRAY,
-    switches::kSSLInterstitialVersionV2Gray, "" },
-  { IDS_FLAGS_SSL_INTERSTITIAL_VERSION_V2_COLORFUL,
-    switches::kSSLInterstitialVersionV2Colorful, "" },
-};
-
-// Using independent flags (instead of flag=value flags) to be able to
-// associate the version with a FieldTrial. FieldTrials don't currently support
-// flag=value flags.
-const Experiment::Choice kMalwareInterstitialVersions[] = {
-  { IDS_GENERIC_EXPERIMENT_CHOICE_DEFAULT, "", "" },
-  { IDS_FLAGS_MALWARE_INTERSTITIAL_VERSION_V2,
-    switches::kMalwareInterstitialV2, "" },
-  { IDS_FLAGS_MALWARE_INTERSTITIAL_VERSION_V3,
-    switches::kMalwareInterstitialV3, "" },
-  { IDS_FLAGS_MALWARE_INTERSTITIAL_VERSION_V3_ADVICE,
-    switches::kMalwareInterstitialV3Advice, "" },
-  { IDS_FLAGS_MALWARE_INTERSTITIAL_VERSION_V3_SOCIAL,
-    switches::kMalwareInterstitialV3Social, "" },
-  { IDS_FLAGS_MALWARE_INTERSTITIAL_VERSION_V3_NOTRECOMMEND,
-    switches::kMalwareInterstitialV3NotRecommend, "" },
-  { IDS_FLAGS_MALWARE_INTERSTITIAL_VERSION_V3_HISTORY,
-    switches::kMalwareInterstitialV3History, "" },
-};
-
 #if defined(OS_CHROMEOS)
 const Experiment::Choice kEnableFileManagerMTPChoices[] = {
   { IDS_GENERIC_EXPERIMENT_CHOICE_DEFAULT, "", "" },
@@ -476,6 +463,56 @@ const Experiment::Choice kEnableSettingsWindowChoices[] = {
     ::switches::kDisableSettingsWindow, "" },
 };
 
+// Note that the value is specified in seconds (where 0 is equivalent to
+// disabled).
+const Experiment::Choice kRememberCertificateErrorDecisionsChoices[] = {
+  { IDS_GENERIC_EXPERIMENT_CHOICE_DEFAULT, "", "" },
+  { IDS_GENERIC_EXPERIMENT_CHOICE_DISABLED,
+    switches::kRememberCertErrorDecisions,
+    "-1" },
+  { IDS_REMEMBER_CERTIFICATE_ERROR_DECISION_CHOICE_ONE_DAY,
+    switches::kRememberCertErrorDecisions,
+    "86400" },
+  { IDS_REMEMBER_CERTIFICATE_ERROR_DECISION_CHOICE_THREE_DAYS,
+    switches::kRememberCertErrorDecisions,
+    "259200" },
+  { IDS_REMEMBER_CERTIFICATE_ERROR_DECISION_CHOICE_ONE_WEEK,
+    switches::kRememberCertErrorDecisions,
+    "604800" },
+  { IDS_REMEMBER_CERTIFICATE_ERROR_DECISION_CHOICE_ONE_MONTH,
+    switches::kRememberCertErrorDecisions,
+    "2592000" },
+  { IDS_REMEMBER_CERTIFICATE_ERROR_DECISION_CHOICE_THREE_MONTHS,
+    switches::kRememberCertErrorDecisions,
+    "7776000" },
+};
+
+const Experiment::Choice kEnableDropSyncCredentialChoices[] = {
+  { IDS_GENERIC_EXPERIMENT_CHOICE_DEFAULT, "", ""},
+  { IDS_GENERIC_EXPERIMENT_CHOICE_ENABLED,
+    password_manager::switches::kEnableDropSyncCredential, "" },
+  { IDS_GENERIC_EXPERIMENT_CHOICE_DISABLED,
+    password_manager::switches::kDisableDropSyncCredential, "" },
+};
+
+#if defined(OS_MACOSX)
+const Experiment::Choice kEnableAVFoundationChoices[] = {
+  { IDS_GENERIC_EXPERIMENT_CHOICE_DEFAULT, "", "" },
+  { IDS_GENERIC_EXPERIMENT_CHOICE_ENABLED, switches::kEnableAVFoundation, ""},
+  { IDS_GENERIC_EXPERIMENT_CHOICE_DISABLED, switches::kForceQTKit, ""}
+};
+#endif
+
+const Experiment::Choice kAutofillSyncCredentialChoices[] = {
+  { IDS_GENERIC_EXPERIMENT_CHOICE_DEFAULT, "", ""},
+  { IDS_ALLOW_AUTOFILL_SYNC_CREDENTIAL,
+    password_manager::switches::kAllowAutofillSyncCredential, ""},
+  { IDS_DISALLOW_AUTOFILL_SYNC_CREDENTIAL_FOR_REAUTH,
+    password_manager::switches::kDisallowAutofillSyncCredentialForReauth, ""},
+  { IDS_DISALLOW_AUTOFILL_SYNC_CREDENTIAL,
+    password_manager::switches::kDisallowAutofillSyncCredential, ""},
+};
+
 // RECORDING USER METRICS FOR FLAGS:
 // -----------------------------------------------------------------------------
 // The first line of the experiment is the internal name. If you'd like to
@@ -511,6 +548,10 @@ const Experiment::Choice kEnableSettingsWindowChoices[] = {
 //   array of choices.
 // See the documentation of Experiment for details on the fields.
 //
+// Command-line switches must have entries in enum "LoginCustomFlags" in
+// histograms.xml. See note in histograms.xml and don't forget to run
+// AboutFlagsHistogramTest unit test to calculate and verify checksum.
+//
 // When adding a new choice, add it to the end of the list.
 const Experiment kExperiments[] = {
   {
@@ -521,18 +562,6 @@ const Experiment kExperiments[] = {
     SINGLE_VALUE_TYPE(switches::kIgnoreGpuBlacklist)
   },
   {
-    "threaded-compositing-mode",
-    IDS_FLAGS_THREADED_COMPOSITING_MODE_NAME,
-    IDS_FLAGS_THREADED_COMPOSITING_MODE_DESCRIPTION,
-#if !defined(USE_AURA)
-    kOsLinux,
-#else
-    0,
-#endif
-    ENABLE_DISABLE_VALUE_TYPE(switches::kEnableThreadedCompositing,
-                              switches::kDisableThreadedCompositing)
-  },
-  {
     "force-accelerated-composited-scrolling",
      IDS_FLAGS_FORCE_ACCELERATED_OVERFLOW_SCROLL_MODE_NAME,
      IDS_FLAGS_FORCE_ACCELERATED_OVERFLOW_SCROLL_MODE_DESCRIPTION,
@@ -571,6 +600,13 @@ const Experiment kExperiments[] = {
     SINGLE_VALUE_TYPE(switches::kDisableAccelerated2dCanvas)
   },
   {
+    "enable-display-list-2d-canvas",
+    IDS_FLAGS_ENABLE_DISPLAY_LIST_2D_CANVAS_NAME,
+    IDS_FLAGS_ENABLE_DISPLAY_LIST_2D_CANVAS_DESCRIPTION,
+    kOsAll,
+    SINGLE_VALUE_TYPE(switches::kEnableDisplayList2dCanvas)
+  },
+  {
     "composited-layer-borders",
     IDS_FLAGS_COMPOSITED_LAYER_BORDERS,
     IDS_FLAGS_COMPOSITED_LAYER_BORDERS_DESCRIPTION,
@@ -604,13 +640,6 @@ const Experiment kExperiments[] = {
   },
 #if defined(ENABLE_WEBRTC)
   {
-    "disable-device-enumeration",
-    IDS_FLAGS_DISABLE_DEVICE_ENUMERATION_NAME,
-    IDS_FLAGS_DISABLE_DEVICE_ENUMERATION_DESCRIPTION,
-    kOsAll,
-    SINGLE_VALUE_TYPE(switches::kDisableDeviceEnumeration)
-  },
-  {
     "disable-webrtc-hw-decoding",
     IDS_FLAGS_DISABLE_WEBRTC_HW_DECODING_NAME,
     IDS_FLAGS_DISABLE_WEBRTC_HW_DECODING_DESCRIPTION,
@@ -672,13 +701,6 @@ const Experiment kExperiments[] = {
     SINGLE_VALUE_TYPE(switches::kEnableNaClDebug)
   },
   {
-    "disable-pnacl",  // FLAGS:RECORD_UMA
-    IDS_FLAGS_DISABLE_PNACL_NAME,
-    IDS_FLAGS_DISABLE_PNACL_DESCRIPTION,
-    kOsDesktop,
-    SINGLE_VALUE_TYPE(switches::kDisablePnacl)
-  },
-  {
     "nacl-debug-mask",  // FLAGS:RECORD_UMA
     IDS_FLAGS_NACL_DEBUG_MASK_NAME,
     IDS_FLAGS_NACL_DEBUG_MASK_DESCRIPTION,
@@ -723,14 +745,6 @@ const Experiment kExperiments[] = {
   },
 #if defined(OS_ANDROID)
   {
-    "enable-new-ntp",
-    IDS_FLAGS_ENABLE_NEW_NTP,
-    IDS_FLAGS_ENABLE_NEW_NTP_DESCRIPTION,
-    kOsAndroid,
-    ENABLE_DISABLE_VALUE_TYPE(switches::kEnableNewNTP,
-                              switches::kDisableNewNTP)
-  },
-  {
     "contextual-search",
     IDS_FLAGS_ENABLE_CONTEXTUAL_SEARCH,
     IDS_FLAGS_ENABLE_CONTEXTUAL_SEARCH_DESCRIPTION,
@@ -747,14 +761,6 @@ const Experiment kExperiments[] = {
     SINGLE_VALUE_TYPE(autofill::switches::kShowAutofillTypePredictions)
   },
   {
-    "enable-gesture-tap-highlight",
-    IDS_FLAGS_ENABLE_GESTURE_TAP_HIGHLIGHTING_NAME,
-    IDS_FLAGS_ENABLE_GESTURE_TAP_HIGHLIGHTING_DESCRIPTION,
-    kOsLinux | kOsCrOS | kOsWin | kOsAndroid,
-    ENABLE_DISABLE_VALUE_TYPE(switches::kEnableGestureTapHighlight,
-                              switches::kDisableGestureTapHighlight)
-  },
-  {
     "enable-smooth-scrolling",  // FLAGS:RECORD_UMA
     IDS_FLAGS_ENABLE_SMOOTH_SCROLLING_NAME,
     IDS_FLAGS_ENABLE_SMOOTH_SCROLLING_DESCRIPTION,
@@ -798,14 +804,6 @@ const Experiment kExperiments[] = {
                               switches::kDisableQuic)
   },
   {
-    "enable-quic-https",
-    IDS_FLAGS_ENABLE_QUIC_HTTPS_NAME,
-    IDS_FLAGS_ENABLE_QUIC_HTTPS_DESCRIPTION,
-    kOsAll,
-    ENABLE_DISABLE_VALUE_TYPE(switches::kEnableQuicHttps,
-                              switches::kDisableQuicHttps)
-  },
-  {
     "enable-spdy4",
     IDS_FLAGS_ENABLE_SPDY4_NAME,
     IDS_FLAGS_ENABLE_SPDY4_DESCRIPTION,
@@ -897,6 +895,14 @@ const Experiment kExperiments[] = {
     SINGLE_VALUE_TYPE(switches::kDisableNTPOtherSessionsMenu)
   },
   {
+    "enable-material-design-ntp",
+    IDS_FLAGS_ENABLE_MATERIAL_DESIGN_NTP_NAME,
+    IDS_FLAGS_ENABLE_MATERIAL_DESIGN_NTP_DESCRIPTION,
+    kOsDesktop,
+    ENABLE_DISABLE_VALUE_TYPE(switches::kEnableMaterialDesignNTP,
+                              switches::kDisableMaterialDesignNTP)
+  },
+  {
     "enable-devtools-experiments",
     IDS_FLAGS_ENABLE_DEVTOOLS_EXPERIMENTS_NAME,
     IDS_FLAGS_ENABLE_DEVTOOLS_EXPERIMENTS_DESCRIPTION,
@@ -956,8 +962,7 @@ const Experiment kExperiments[] = {
     kOsDesktop,
     SINGLE_VALUE_TYPE(switches::kEnableDownloadResumption)
   },
-  // Native client is compiled out when DISABLE_NACL is defined.
-#if !defined(DISABLE_NACL)
+#if defined(ENABLE_PLUGINS)
   {
     "allow-nacl-socket-api",
     IDS_FLAGS_ALLOW_NACL_SOCKET_API_NAME,
@@ -966,13 +971,15 @@ const Experiment kExperiments[] = {
     SINGLE_VALUE_TYPE_AND_VALUE(switches::kAllowNaClSocketAPI, "*")
   },
 #endif
+#if defined(OS_CHROMEOS) || defined(OS_WIN) || defined(OS_LINUX)
   {
     "force-device-scale-factor",
-    IDS_FLAGS_FORCE_HIGH_DPI_NAME,
-    IDS_FLAGS_FORCE_HIGH_DPI_DESCRIPTION,
-    kOsCrOS,
-    SINGLE_VALUE_TYPE_AND_VALUE(switches::kForceDeviceScaleFactor, "2")
+    IDS_FLAGS_FORCE_DEVICE_SCALE_FACTOR_NAME,
+    IDS_FLAGS_FORCE_DEVICE_SCALE_FACTOR_DESCRIPTION,
+    kOsLinux | kOsWin | kOsCrOS,
+    MULTI_VALUE_TYPE(kDeviceScaleFactorChoices)
   },
+#endif
 #if defined(OS_CHROMEOS)
   {
     "allow-touchpad-three-finger-click",
@@ -1030,13 +1037,6 @@ const Experiment kExperiments[] = {
     SINGLE_VALUE_TYPE(chromeos::switches::kDisableBootAnimation),
   },
   {
-    "enable-new-audio-player",
-    IDS_FLAGS_FILE_MANAGER_ENABLE_NEW_AUDIO_PLAYER_NAME,
-    IDS_FLAGS_FILE_MANAGER_ENABLE_NEW_AUDIO_PLAYER_DESCRIPTION,
-    kOsCrOS,
-    SINGLE_VALUE_TYPE(chromeos::switches::kFileManagerEnableNewAudioPlayer)
-  },
-  {
     "enable-new-gallery",
     IDS_FLAGS_FILE_MANAGER_ENABLE_NEW_GALLERY_NAME,
     IDS_FLAGS_FILE_MANAGER_ENABLE_NEW_GALLERY_DESCRIPTION,
@@ -1044,18 +1044,18 @@ const Experiment kExperiments[] = {
     MULTI_VALUE_TYPE(kEnableFileManagerNewGalleryChoices)
   },
   {
-    "disable-quickoffice-component-app",
-    IDS_FLAGS_DISABLE_QUICKOFFICE_COMPONENT_APP_NAME,
-    IDS_FLAGS_DISABLE_QUICKOFFICE_COMPONENT_APP_DESCRIPTION,
+    "enable-video-player-chromecast-support",
+    IDS_FLAGS_ENABLE_VIDEO_PLAYER_CHROMECAST_SUPPORT_NAME,
+    IDS_FLAGS_ENABLE_VIDEO_PLAYER_CHROMECAST_SUPPORT_DESCRIPTION,
     kOsCrOS,
-    SINGLE_VALUE_TYPE(chromeos::switches::kDisableQuickofficeComponentApp),
+    SINGLE_VALUE_TYPE(chromeos::switches::kEnableVideoPlayerChromecastSupport)
   },
   {
-    "disable-saml-signin",
-    IDS_FLAGS_DISABLE_SAML_SIGNIN_NAME,
-    IDS_FLAGS_DISABLE_SAML_SIGNIN_DESCRIPTION,
+    "disable-office-editing-component-app",
+    IDS_FLAGS_DISABLE_OFFICE_EDITING_COMPONENT_APP_NAME,
+    IDS_FLAGS_DISABLE_OFFICE_EDITING_COMPONENT_APP_DESCRIPTION,
     kOsCrOS,
-    SINGLE_VALUE_TYPE(chromeos::switches::kDisableSamlSignin),
+    SINGLE_VALUE_TYPE(chromeos::switches::kDisableOfficeEditingComponentApp),
   },
   {
     "disable-display-color-calibration",
@@ -1085,6 +1085,12 @@ const Experiment kExperiments[] = {
     kOsCrOS,
     SINGLE_VALUE_TYPE(ash::switches::kAshEnableTouchViewTesting),
   },
+  { "ash-disable-text-filtering-in-overview-mode",
+    IDS_FLAGS_ASH_DISABLE_TEXT_FILTERING_IN_OVERVIEW_MODE_NAME,
+    IDS_FLAGS_ASH_DISABLE_TEXT_FILTERING_IN_OVERVIEW_MODE_DESCRIPTION,
+    kOsCrOS,
+    SINGLE_VALUE_TYPE(ash::switches::kAshDisableTextFilteringInOverviewMode),
+  },
 #endif
 #if defined(OS_CHROMEOS)
   {
@@ -1113,7 +1119,7 @@ const Experiment kExperiments[] = {
     "enable-password-generation",
     IDS_FLAGS_ENABLE_PASSWORD_GENERATION_NAME,
     IDS_FLAGS_ENABLE_PASSWORD_GENERATION_DESCRIPTION,
-    kOsDesktop,
+    kOsWin | kOsLinux | kOsCrOS,
     ENABLE_DISABLE_VALUE_TYPE(autofill::switches::kEnablePasswordGeneration,
                               autofill::switches::kDisablePasswordGeneration)
   },
@@ -1133,6 +1139,15 @@ const Experiment kExperiments[] = {
     SINGLE_VALUE_TYPE(switches::kDisablePasswordManagerReauthentication)
   },
   {
+    "enable-android-password-link",
+    IDS_FLAGS_PASSWORD_MANAGER_ANDROID_LINK_NAME,
+    IDS_FLAGS_PASSWORD_MANAGER_ANDROID_LINK_DESCRIPTION,
+    kOsAndroid,
+    ENABLE_DISABLE_VALUE_TYPE(
+        password_manager::switches::kEnableAndroidPasswordLink,
+        password_manager::switches::kDisableAndroidPasswordLink)
+  },
+  {
     "enable-deferred-image-decoding",
     IDS_FLAGS_ENABLE_DEFERRED_IMAGE_DECODING_NAME,
     IDS_FLAGS_ENABLE_DEFERRED_IMAGE_DECODING_DESCRIPTION,
@@ -1174,6 +1189,13 @@ const Experiment kExperiments[] = {
         switches::kScrollEndEffect, "0")
   },
   {
+    "enable-renderer-mojo-channel",
+    IDS_FLAGS_ENABLE_RENDERER_MOJO_CHANNEL_NAME,
+    IDS_FLAGS_ENABLE_RENDERER_MOJO_CHANNEL_DESCRIPTION,
+    kOsAll,
+    SINGLE_VALUE_TYPE(switches::kEnableRendererMojoChannel)
+  },
+  {
     "enable-touch-drag-drop",
     IDS_FLAGS_ENABLE_TOUCH_DRAG_DROP_NAME,
     IDS_FLAGS_ENABLE_TOUCH_DRAG_DROP_DESCRIPTION,
@@ -1220,7 +1242,7 @@ const Experiment kExperiments[] = {
     IDS_FLAGS_ENABLE_AVFOUNDATION_NAME,
     IDS_FLAGS_ENABLE_AVFOUNDATION_DESCRIPTION,
     kOsMac,
-    SINGLE_VALUE_TYPE(switches::kEnableAVFoundation)
+    MULTI_VALUE_TYPE(kEnableAVFoundationChoices)
   },
 #endif
   {
@@ -1354,22 +1376,8 @@ const Experiment kExperiments[] = {
     kOsLinux | kOsCrOS | kOsAndroid,
     SINGLE_VALUE_TYPE(switches::kEnableTcpFastOpen)
   },
-  {
-    "enable-syncfs-directory-operation",
-    IDS_FLAGS_ENABLE_SYNC_DIRECTORY_OPERATION_NAME,
-    IDS_FLAGS_ENABLE_SYNC_DIRECTORY_OPERATION_DESCRIPTION,
-    kOsAll,
-    SINGLE_VALUE_TYPE(switches::kSyncfsEnableDirectoryOperation),
-  },
 #if defined(ENABLE_SERVICE_DISCOVERY)
   {
-    "disable-device-discovery",
-    IDS_FLAGS_DISABLE_DEVICE_DISCOVERY_NAME,
-    IDS_FLAGS_DISABLE_DEVICE_DISCOVERY_DESCRIPTION,
-    kOsDesktop,
-    SINGLE_VALUE_TYPE(switches::kDisableDeviceDiscovery)
-  },
-  {
     "device-discovery-notifications",
     IDS_FLAGS_DEVICE_DISCOVERY_NOTIFICATIONS_NAME,
     IDS_FLAGS_DEVICE_DISCOVERY_NOTIFICATIONS_DESCRIPTION,
@@ -1475,7 +1483,8 @@ const Experiment kExperiments[] = {
     IDS_FLAGS_ENABLE_NEW_AVATAR_MENU_NAME,
     IDS_FLAGS_ENABLE_NEW_AVATAR_MENU_DESCRIPTION,
     kOsMac | kOsWin | kOsLinux,
-    SINGLE_VALUE_TYPE(switches::kNewAvatarMenu)
+    ENABLE_DISABLE_VALUE_TYPE(switches::kEnableNewAvatarMenu,
+                              switches::kDisableNewAvatarMenu)
   },
   {
     "enable-web-based-signin",
@@ -1512,6 +1521,13 @@ const Experiment kExperiments[] = {
   },
 #endif
   {
+    "enable-app-view",
+    IDS_FLAGS_ENABLE_APP_VIEW_NAME,
+    IDS_FLAGS_ENABLE_APP_VIEW_DESCRIPTION,
+    kOsAll,
+    SINGLE_VALUE_TYPE(switches::kEnableAppView)
+  },
+  {
     "disable-app-list-app-info",
     IDS_FLAGS_DISABLE_APP_INFO_IN_APP_LIST,
     IDS_FLAGS_DISABLE_APP_INFO_IN_APP_LIST_DESCRIPTION,
@@ -1519,13 +1535,6 @@ const Experiment kExperiments[] = {
     SINGLE_VALUE_TYPE(app_list::switches::kDisableAppInfo)
   },
   {
-    "disable-app-list-voice-search",
-    IDS_FLAGS_DISABLE_APP_LIST_VOICE_SEARCH,
-    IDS_FLAGS_DISABLE_APP_LIST_VOICE_SEARCH_DESCRIPTION,
-    kOsCrOS,
-    SINGLE_VALUE_TYPE(app_list::switches::kDisableVoiceSearch)
-  },
-  {
     "enable-drive-apps-in-app-list",
     IDS_FLAGS_ENABLE_DRIVE_APPS_IN_APP_LIST_NAME,
     IDS_FLAGS_ENABLE_DRIVE_APPS_IN_APP_LIST_DESCRIPTION,
@@ -1576,13 +1585,6 @@ const Experiment kExperiments[] = {
   },
 #endif
   {
-    "disable-compositor-touch-hit-testing",
-    IDS_FLAGS_DISABLE_COMPOSITOR_TOUCH_HIT_TESTING_NAME,
-    IDS_FLAGS_DISABLE_COMPOSITOR_TOUCH_HIT_TESTING_DESCRIPTION,
-    kOsAll,
-    SINGLE_VALUE_TYPE(cc::switches::kDisableCompositorTouchHitTesting),
-  },
-  {
     "enable-streamlined-hosted-apps",
     IDS_FLAGS_ENABLE_STREAMLINED_HOSTED_APPS_NAME,
     IDS_FLAGS_ENABLE_STREAMLINED_HOSTED_APPS_DESCRIPTION,
@@ -1611,13 +1613,6 @@ const Experiment kExperiments[] = {
     SINGLE_VALUE_TYPE(switches::kEnableLinkableEphemeralApps)
   },
   {
-    "enable-service-worker",
-    IDS_FLAGS_ENABLE_SERVICE_WORKER_NAME,
-    IDS_FLAGS_ENABLE_SERVICE_WORKER_DESCRIPTION,
-    kOsAll,
-    SINGLE_VALUE_TYPE(switches::kEnableServiceWorker)
-  },
-  {
     "enable-service-worker-sync",
     IDS_FLAGS_ENABLE_SERVICE_WORKER_SYNC_NAME,
     IDS_FLAGS_ENABLE_SERVICE_WORKER_SYNC_DESCRIPTION,
@@ -1648,7 +1643,7 @@ const Experiment kExperiments[] = {
     "disable-views-rect-based-targeting",  // FLAGS:RECORD_UMA
     IDS_FLAGS_DISABLE_VIEWS_RECT_BASED_TARGETING_NAME,
     IDS_FLAGS_DISABLE_VIEWS_RECT_BASED_TARGETING_DESCRIPTION,
-    kOsCrOS | kOsWin,
+    kOsCrOS | kOsWin | kOsLinux,
     SINGLE_VALUE_TYPE(views::switches::kDisableViewsRectBasedTargeting)
   },
 #endif
@@ -1723,7 +1718,7 @@ const Experiment kExperiments[] = {
     "enable-permissions-bubbles",
     IDS_FLAGS_ENABLE_PERMISSIONS_BUBBLES_NAME,
     IDS_FLAGS_ENABLE_PERMISSIONS_BUBBLES_DESCRIPTION,
-    kOsAll,
+    kOsCrOS | kOsMac | kOsWin | kOsLinux,
     ENABLE_DISABLE_VALUE_TYPE(switches::kEnablePermissionsBubbles,
                               switches::kDisablePermissionsBubbles)
   },
@@ -1744,14 +1739,6 @@ const Experiment kExperiments[] = {
   },
 #if defined(OS_ANDROID)
   {
-    "enable-fast-text-autosizing",
-    IDS_FLAGS_ENABLE_FAST_TEXT_AUTOSIZING_NAME,
-    IDS_FLAGS_ENABLE_FAST_TEXT_AUTOSIZING_DESCRIPTION,
-    kOsAndroid,
-    ENABLE_DISABLE_VALUE_TYPE(switches::kEnableFastTextAutosizing,
-                              switches::kDisableFastTextAutosizing)
-  },
-  {
     "disable-cast",
     IDS_FLAGS_DISABLE_CAST_NAME,
     IDS_FLAGS_DISABLE_CAST_DESCRIPTION,
@@ -1820,22 +1807,6 @@ const Experiment kExperiments[] = {
     ENABLE_DISABLE_VALUE_TYPE(switches::kEnableSavePasswordBubble,
                               switches::kDisableSavePasswordBubble)
   },
-#if defined(GOOGLE_CHROME_BUILD)
-  {
-    "enable-easy-unlock",
-    IDS_FLAGS_ENABLE_EASY_UNLOCK_NAME,
-    IDS_FLAGS_ENABLE_EASY_UNLOCK_DESCRIPTION,
-    kOsCrOS,
-    SINGLE_VALUE_TYPE(switches::kEnableEasyUnlock)
-  },
-#endif
-  {
-    "disable-embedded-shared-worker",
-    IDS_FLAGS_DISABLE_EMBEDDED_SHARED_WORKER_NAME,
-    IDS_FLAGS_DISABLE_EMBEDDED_SHARED_WORKER_DESCRIPTION,
-    kOsDesktop,
-    SINGLE_VALUE_TYPE(switches::kDisableEmbeddedSharedWorker)
-  },
 #if defined(OS_CHROMEOS)
   {
     "enable-filemanager-mtp",
@@ -1854,15 +1825,6 @@ const Experiment kExperiments[] = {
     kOsAll,
     SINGLE_VALUE_TYPE(switches::kAllowInsecureWebSocketFromHttpsOrigin)
   },
-#if defined(OS_MACOSX)
-  {
-    "apps-keep-chrome-alive",
-    IDS_FLAGS_APPS_KEEP_CHROME_ALIVE_NAME,
-    IDS_FLAGS_APPS_KEEP_CHROME_ALIVE_DESCRIPTION,
-    kOsMac,
-    SINGLE_VALUE_TYPE(switches::kAppsKeepChromeAlive)
-  },
-#endif
   {
     "enable-apps-file-associations",
     IDS_FLAGS_ENABLE_APPS_FILE_ASSOCIATIONS_NAME,
@@ -1918,11 +1880,12 @@ const Experiment kExperiments[] = {
     SINGLE_VALUE_TYPE(extensions::switches::kEnableScriptsRequireAction)
   },
   {
-    "enable-harfbuzz-rendertext",
-    IDS_FLAGS_ENABLE_HARFBUZZ_RENDERTEXT_NAME,
-    IDS_FLAGS_ENABLE_HARFBUZZ_RENDERTEXT_DESCRIPTION,
+    "harfbuzz-rendertext",
+    IDS_FLAGS_HARFBUZZ_RENDERTEXT_NAME,
+    IDS_FLAGS_HARFBUZZ_RENDERTEXT_DESCRIPTION,
     kOsDesktop,
-    SINGLE_VALUE_TYPE(switches::kEnableHarfBuzzRenderText)
+    ENABLE_DISABLE_VALUE_TYPE(switches::kEnableHarfBuzzRenderText,
+                              switches::kDisableHarfBuzzRenderText)
   },
 #if defined(OS_ANDROID)
   {
@@ -1933,20 +1896,6 @@ const Experiment kExperiments[] = {
     MULTI_VALUE_TYPE(kAnswersInSuggestChoices)
   },
 #endif
-  {
-    "ssl-interstitial-version",
-    IDS_FLAGS_SSL_INTERSTITIAL_TRIAL_NAME,
-    IDS_FLAGS_SSL_INTERSTITIAL_TRIAL_DESCRIPTION,
-    kOsAll,
-    MULTI_VALUE_TYPE(kSSLInterstitialVersions)
-  },
-  {
-    "malware-interstitial-version",
-    IDS_FLAGS_MALWARE_INTERSTITIAL_TRIAL_NAME,
-    IDS_FLAGS_MALWARE_INTERSTITIAL_TRIAL_DESCRIPTION,
-    kOsAll,
-    MULTI_VALUE_TYPE(kMalwareInterstitialVersions)
-  },
 #if defined(OS_ANDROID)
   {
     "enable-data-reduction-proxy-dev",
@@ -1958,6 +1907,58 @@ const Experiment kExperiments[] = {
         data_reduction_proxy::switches::kDisableDataReductionProxyDev)
   },
 #endif
+  {
+    "enable-experimental-hotwording",
+    IDS_FLAGS_ENABLE_EXPERIMENTAL_HOTWORDING_NAME,
+    IDS_FLAGS_ENABLE_EXPERIMENTAL_HOTWORDING_DESCRIPTION,
+    kOsDesktop,
+    SINGLE_VALUE_TYPE(switches::kEnableExperimentalHotwording)
+  },
+  {
+    "enable-embedded-extension-options",
+    IDS_FLAGS_ENABLE_EMBEDDED_EXTENSION_OPTIONS_NAME,
+    IDS_FLAGS_ENABLE_EMBEDDED_EXTENSION_OPTIONS_DESCRIPTION,
+    kOsDesktop,
+    SINGLE_VALUE_TYPE(extensions::switches::kEnableEmbeddedExtensionOptions)
+  },
+  {
+    "enable-website-settings-manager",
+    IDS_FLAGS_ENABLE_WEBSITE_SETTINGS_NAME,
+    IDS_FLAGS_ENABLE_WEBSITE_SETTINGS_DESCRIPTION,
+    kOsDesktop,
+    SINGLE_VALUE_TYPE(switches::kEnableWebsiteSettingsManager)
+  },
+  {
+    "remember-cert-error-decisions",
+    IDS_FLAGS_REMEMBER_CERTIFICATE_ERROR_DECISIONS_NAME,
+    IDS_FLAGS_REMEMBER_CERTIFICATE_ERROR_DECISIONS_DESCRIPTION,
+    kOsAll,
+    MULTI_VALUE_TYPE(kRememberCertificateErrorDecisionsChoices)
+  },
+  {
+    "enable-drop-sync-credential",
+    IDS_FLAGS_ENABLE_DROP_SYNC_CREDENTIAL_NAME,
+    IDS_FLAGS_ENABLE_DROP_SYNC_CREDENTIAL_DESCRIPTION,
+    kOsAll,
+    MULTI_VALUE_TYPE(kEnableDropSyncCredentialChoices)
+  },
+  {
+    "enable-extension-action-redesign",
+    IDS_FLAGS_ENABLE_EXTENSION_ACTION_REDESIGN_NAME,
+    IDS_FLAGS_ENABLE_EXTENSION_ACTION_REDESIGN_DESCRIPTION,
+    kOsWin | kOsLinux | kOsCrOS,
+    SINGLE_VALUE_TYPE(extensions::switches::kEnableExtensionActionRedesign)
+  },
+  {
+    "autofill-sync-credential",
+    IDS_FLAGS_AUTOFILL_SYNC_CREDENTIAL_NAME,
+    IDS_FLAGS_AUTOFILL_SYNC_CREDENTIAL_DESCRIPTION,
+    kOsAll,
+    MULTI_VALUE_TYPE(kAutofillSyncCredentialChoices)
+  },
+  // NOTE: Adding new command-line switches requires adding corresponding
+  // entries to enum "LoginCustomFlags" in histograms.xml. See note in
+  // histograms.xml and don't forget to run AboutFlagsHistogramTest unit test.
 };
 
 const Experiment* experiments = kExperiments;
@@ -2169,17 +2170,31 @@ void ConvertFlagsToSwitches(FlagsStorage* flags_storage,
 }
 
 bool AreSwitchesIdenticalToCurrentCommandLine(
-    const CommandLine& new_cmdline, const CommandLine& active_cmdline) {
+    const CommandLine& new_cmdline,
+    const CommandLine& active_cmdline,
+    std::set<CommandLine::StringType>* out_difference) {
   std::set<CommandLine::StringType> new_flags =
       ExtractFlagsFromCommandLine(new_cmdline);
   std::set<CommandLine::StringType> active_flags =
       ExtractFlagsFromCommandLine(active_cmdline);
 
+  bool result = false;
   // Needed because std::equal doesn't check if the 2nd set is empty.
-  if (new_flags.size() != active_flags.size())
-    return false;
+  if (new_flags.size() == active_flags.size()) {
+    result =
+        std::equal(new_flags.begin(), new_flags.end(), active_flags.begin());
+  }
 
-  return std::equal(new_flags.begin(), new_flags.end(), active_flags.begin());
+  if (out_difference && !result) {
+    std::set_symmetric_difference(
+        new_flags.begin(),
+        new_flags.end(),
+        active_flags.begin(),
+        active_flags.end(),
+        std::inserter(*out_difference, out_difference->begin()));
+  }
+
+  return result;
 }
 
 void GetFlagsExperimentsData(FlagsStorage* flags_storage,
@@ -2287,6 +2302,40 @@ void RecordUMAStatistics(FlagsStorage* flags_storage) {
   content::RecordAction(UserMetricsAction("StartupTick"));
 }
 
+uint32_t GetSwitchUMAId(const std::string& switch_name) {
+  return static_cast<uint32_t>(metrics::HashMetricName(switch_name));
+}
+
+void ReportCustomFlags(const std::string& uma_histogram_hame,
+                       const std::set<std::string>& command_line_difference) {
+  for (std::set<std::string>::const_iterator it =
+           command_line_difference.begin();
+       it != command_line_difference.end();
+       ++it) {
+    int uma_id = about_flags::kBadSwitchFormatHistogramId;
+    if (StartsWithASCII(*it, "--", true /* case_sensitive */)) {
+      // Skip '--' before switch name.
+      std::string switch_name(it->substr(2));
+
+      // Kill value, if any.
+      const size_t value_pos = switch_name.find('=');
+      if (value_pos != std::string::npos)
+        switch_name.resize(value_pos);
+
+      uma_id = GetSwitchUMAId(switch_name);
+    } else {
+      NOTREACHED() << "ReportCustomFlags(): flag '" << *it
+                   << "' has incorrect format.";
+    }
+    DVLOG(1) << "ReportCustomFlags(): histogram='" << uma_histogram_hame
+             << "' '" << *it << "', uma_id=" << uma_id;
+
+    // Sparse histogram macro does not cache the histogram, so it's safe
+    // to use macro with non-static histogram name here.
+    UMA_HISTOGRAM_SPARSE_SLOWLY(uma_histogram_hame, uma_id);
+  }
+}
+
 //////////////////////////////////////////////////////////////////////////////
 // FlagsState implementation.