Add feature flag for Switch Access

Bug: 907179
Change-Id: I1f66d659690027191a5c2d0d21f09abb2f2d82d0
Reviewed-on: https://chromium-review.googlesource.com/c/1347575
Reviewed-by: Elly Fong-Jones <[email protected]>
Reviewed-by: Hector Carmona <[email protected]>
Reviewed-by: Dominic Mazzoni <[email protected]>
Commit-Queue: Anastasia Helfinstein <[email protected]>
Cr-Commit-Position: refs/heads/master@{#610911}
diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc
index 5afcfa0b..e36dcd1 100644
--- a/chrome/browser/about_flags.cc
+++ b/chrome/browser/about_flags.cc
@@ -2734,6 +2734,12 @@
     {"enable-cros-ime-service", flag_descriptions::kImeServiceName,
      flag_descriptions::kImeServiceDescription, kOsCrOS,
      FEATURE_VALUE_TYPE(chromeos::features::kImeServiceConnectable)},
+    {"enable-experimental-accessibility-switch-access",
+     flag_descriptions::kExperimentalAccessibilitySwitchAccessName,
+     flag_descriptions::kExperimentalAccessibilitySwitchAccessDescription,
+     kOsCrOS,
+     SINGLE_VALUE_TYPE(
+         ::switches::kEnableExperimentalAccessibilitySwitchAccess)},
 #endif  // OS_CHROMEOS
 #if !defined(OS_ANDROID) && defined(GOOGLE_CHROME_BUILD)
     {"enable-google-branded-context-menu",
diff --git a/chrome/browser/chromeos/accessibility/accessibility_manager.cc b/chrome/browser/chromeos/accessibility/accessibility_manager.cc
index c754b2c..5b47c0ff 100644
--- a/chrome/browser/chromeos/accessibility/accessibility_manager.cc
+++ b/chrome/browser/chromeos/accessibility/accessibility_manager.cc
@@ -873,10 +873,10 @@
   // even if the preference is enabled, if the flag isn't also set.
   base::CommandLine* command_line = base::CommandLine::ForCurrentProcess();
   if (!command_line->HasSwitch(
-          ::switches::kEnableExperimentalAccessibilityFeatures)) {
+          ::switches::kEnableExperimentalAccessibilitySwitchAccess)) {
     if (enabled) {
       LOG(WARNING) << "Switch access enabled but experimental accessibility "
-                   << "features flag is not set.";
+                   << "switch access flag is not set.";
     }
     return;
   }
diff --git a/chrome/browser/flag-metadata.json b/chrome/browser/flag-metadata.json
index 50e74f38..309dde0 100644
--- a/chrome/browser/flag-metadata.json
+++ b/chrome/browser/flag-metadata.json
@@ -1127,6 +1127,11 @@
     "expiry_milestone": 76
   },
   {
+    "name": "enable-experimental-accessibility-switch-access",
+    "owners": [ "[email protected]", "dmazzoni", "dtseng" ],
+    "expiry_milestone": 76
+  },
+  {
     "name": "enable-experimental-app-banners",
     // "owners": [ "your-team" ],
     "expiry_milestone": 76
diff --git a/chrome/browser/flag_descriptions.cc b/chrome/browser/flag_descriptions.cc
index a3590a7..84f0e10 100644
--- a/chrome/browser/flag_descriptions.cc
+++ b/chrome/browser/flag_descriptions.cc
@@ -694,6 +694,11 @@
 const char kExperimentalAccessibilityFeaturesDescription[] =
     "Enable additional accessibility features in the Settings page.";
 
+const char kExperimentalAccessibilitySwitchAccessName[] =
+    "Experimental feature Switch Access";
+const char kExperimentalAccessibilitySwitchAccessDescription[] =
+    "Add a setting to enable the prototype of Switch Access";
+
 const char kVizDisplayCompositorName[] = "Viz Display Compositor (OOP-D)";
 const char kVizDisplayCompositorDescription[] =
     "If enabled, the display compositor runs as part of the viz service in the"
diff --git a/chrome/browser/flag_descriptions.h b/chrome/browser/flag_descriptions.h
index b3ae602b..d197f1f 100644
--- a/chrome/browser/flag_descriptions.h
+++ b/chrome/browser/flag_descriptions.h
@@ -159,6 +159,9 @@
 extern const char kExperimentalAccessibilityFeaturesName[];
 extern const char kExperimentalAccessibilityFeaturesDescription[];
 
+extern const char kExperimentalAccessibilitySwitchAccessName[];
+extern const char kExperimentalAccessibilitySwitchAccessDescription[];
+
 extern const char kFCMInvalidationsName[];
 extern const char kFCMInvalidationsDescription[];
 
diff --git a/chrome/browser/resources/chromeos/switch_access/switch_access_e2e_test_base.js b/chrome/browser/resources/chromeos/switch_access/switch_access_e2e_test_base.js
index f2d76c88..955ee093 100644
--- a/chrome/browser/resources/chromeos/switch_access/switch_access_e2e_test_base.js
+++ b/chrome/browser/resources/chromeos/switch_access/switch_access_e2e_test_base.js
@@ -51,7 +51,7 @@
           base::Unretained(chromeos::AccessibilityManager::Get()),
           true);
   base::CommandLine::ForCurrentProcess()->AppendSwitch(
-      ::switches::kEnableExperimentalAccessibilityFeatures);
+      ::switches::kEnableExperimentalAccessibilitySwitchAccess);
   chromeos::AccessibilityManager::Get()->SetSwitchAccessEnabled(true);
   WaitForExtension(extension_misc::kSwitchAccessExtensionId, load_cb);
     */ });
diff --git a/chrome/browser/resources/settings/a11y_page/manage_a11y_page.html b/chrome/browser/resources/settings/a11y_page/manage_a11y_page.html
index 67b74e5..25fd06a 100644
--- a/chrome/browser/resources/settings/a11y_page/manage_a11y_page.html
+++ b/chrome/browser/resources/settings/a11y_page/manage_a11y_page.html
@@ -169,7 +169,7 @@
         pref="{{prefs.settings.a11y.caret_highlight}}"
         label="$i18n{caretHighlightLabel}">
     </settings-toggle-button>
-    <template is="dom-if" if="[[showExperimentalFeatures_]]">
+    <template is="dom-if" if="[[showExperimentalSwitchAccess_]]">
       <settings-toggle-button
           pref="{{prefs.settings.a11y.switch_access}}"
           label="$i18n{switchAccessLabel}">
diff --git a/chrome/browser/resources/settings/a11y_page/manage_a11y_page.js b/chrome/browser/resources/settings/a11y_page/manage_a11y_page.js
index da1722b..d3c5e11 100644
--- a/chrome/browser/resources/settings/a11y_page/manage_a11y_page.js
+++ b/chrome/browser/resources/settings/a11y_page/manage_a11y_page.js
@@ -147,6 +147,14 @@
       },
     },
 
+    showExperimentalSwitchAccess_: {
+      type: Boolean,
+      value: function() {
+        return loadTimeData.getBoolean(
+            'showExperimentalAccessibilitySwitchAccess');
+      },
+    },
+
     /**
      * Whether the docked magnifier flag is enabled.
      * @private {boolean}
diff --git a/chrome/browser/ui/webui/settings/md_settings_localized_strings_provider.cc b/chrome/browser/ui/webui/settings/md_settings_localized_strings_provider.cc
index 2c3c4be..f8a2a3f 100644
--- a/chrome/browser/ui/webui/settings/md_settings_localized_strings_provider.cc
+++ b/chrome/browser/ui/webui/settings/md_settings_localized_strings_provider.cc
@@ -333,6 +333,11 @@
       base::CommandLine::ForCurrentProcess()->HasSwitch(
           ::switches::kEnableExperimentalAccessibilityFeatures));
 
+  html_source->AddBoolean(
+      "showExperimentalAccessibilitySwitchAccess",
+      base::CommandLine::ForCurrentProcess()->HasSwitch(
+          ::switches::kEnableExperimentalAccessibilitySwitchAccess));
+
   html_source->AddBoolean("dockedMagnifierFeatureEnabled",
                           ash::features::IsDockedMagnifierEnabled());
 #endif
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml
index 6a4f173..b74d2572 100644
--- a/tools/metrics/histograms/enums.xml
+++ b/tools/metrics/histograms/enums.xml
@@ -29245,6 +29245,8 @@
   <int value="-1956747298" label="LayeredAPI:enabled"/>
   <int value="-1956349722" label="disable-smooth-scrolling"/>
   <int value="-1955923385" label="EnableGamepadButtonAxisEvents:enabled"/>
+  <int value="-1954246274"
+      label="enable-experimental-accessibility-switch-access"/>
   <int value="-1953121360" label="EphemeralTab:disabled"/>
   <int value="-1948540128" label="disable-webrtc-hw-encoding (deprecated)"/>
   <int value="-1946595906" label="enable-push-api-background-mode"/>
diff --git a/ui/accessibility/accessibility_switches.cc b/ui/accessibility/accessibility_switches.cc
index 580987d2..d1df718 100644
--- a/ui/accessibility/accessibility_switches.cc
+++ b/ui/accessibility/accessibility_switches.cc
@@ -13,6 +13,10 @@
 const char kEnableExperimentalAccessibilityFeatures[] =
     "enable-experimental-accessibility-features";
 
+// Shows setting to enable Switch Access before it has launched.
+const char kEnableExperimentalAccessibilitySwitchAccess[] =
+    "enable-experimental-accessibility-switch-access";
+
 bool AreExperimentalAccessibilityFeaturesEnabled() {
   return base::CommandLine::ForCurrentProcess()->HasSwitch(
       ::switches::kEnableExperimentalAccessibilityFeatures);
diff --git a/ui/accessibility/accessibility_switches.h b/ui/accessibility/accessibility_switches.h
index 0bfea58..735a76a 100644
--- a/ui/accessibility/accessibility_switches.h
+++ b/ui/accessibility/accessibility_switches.h
@@ -11,6 +11,7 @@
 namespace switches {
 
 AX_EXPORT extern const char kEnableExperimentalAccessibilityFeatures[];
+AX_EXPORT extern const char kEnableExperimentalAccessibilitySwitchAccess[];
 
 // Returns true if experimental accessibility features are enabled.
 AX_EXPORT bool AreExperimentalAccessibilityFeaturesEnabled();