Enable Oculus devices behind a runtime flag

This change moves the Oculus device to be behind a runtime flag, rather
than a build flag.  It will only be enabled if is_chrome_branding,
is_win, and src_internal is available.

The means that developers testing with Oculus support should still build
locally with enable_oculus_vr gn arg if they aren't building with chrome
branding.

Public bots (CQ) will not build this, but perftests/fyi will.

BUG=812050

Change-Id: I7b99d98b53adf8878c0523e2eafe4ab422936ebe
Reviewed-on: https://chromium-review.googlesource.com/917644
Reviewed-by: Dirk Pranke <[email protected]>
Reviewed-by: Brandon Jones <[email protected]>
Commit-Queue: Bill Orr <[email protected]>
Cr-Commit-Position: refs/heads/master@{#536817}
diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc
index 7fa9744c..1161a64a7 100644
--- a/chrome/browser/about_flags.cc
+++ b/chrome/browser/about_flags.cc
@@ -2245,6 +2245,11 @@
      flag_descriptions::kWebVrAutopresentFromIntentDescription, kOsAndroid,
      FEATURE_VALUE_TYPE(chrome::android::kWebVrAutopresentFromIntent)},
 #endif  // OS_ANDROID
+#if BUILDFLAG(ENABLE_OCULUS_VR)
+    {"oculus-vr", flag_descriptions::kOculusVRName,
+     flag_descriptions::kOculusVRDescription, kOsWin,
+     FEATURE_VALUE_TYPE(features::kOculusVR)},
+#endif  // ENABLE_OCULUS_VR
 #if BUILDFLAG(ENABLE_OPENVR)
     {"openvr", flag_descriptions::kOpenVRName,
      flag_descriptions::kOpenVRDescription, kOsWin,
diff --git a/chrome/browser/flag_descriptions.cc b/chrome/browser/flag_descriptions.cc
index 92d667a..8f6cf97 100644
--- a/chrome/browser/flag_descriptions.cc
+++ b/chrome/browser/flag_descriptions.cc
@@ -2892,6 +2892,13 @@
 
 #endif  // OS_ANDROID
 
+#if BUILDFLAG(ENABLE_OCULUS_VR)
+const char kOculusVRName[] = "Oculus hardware support";
+const char kOculusVRDescription[] =
+    "If enabled, Chrome will use Oculus devices for VR (supported only on "
+    "Windows 10 or later).";
+#endif  // ENABLE_OCULUS_VR
+
 #if BUILDFLAG(ENABLE_OPENVR)
 const char kOpenVRName[] = "OpenVR hardware support";
 const char kOpenVRDescription[] =
diff --git a/chrome/browser/flag_descriptions.h b/chrome/browser/flag_descriptions.h
index e9bddd9..bb0d09d 100644
--- a/chrome/browser/flag_descriptions.h
+++ b/chrome/browser/flag_descriptions.h
@@ -1781,6 +1781,11 @@
 
 #endif  // OS_ANDROID
 
+#if BUILDFLAG(ENABLE_OCULUS_VR)
+extern const char kOculusVRName[];
+extern const char kOculusVRDescription[];
+#endif  // ENABLE_OCULUS_VR
+
 #if BUILDFLAG(ENABLE_OPENVR)
 extern const char kOpenVRName[];
 extern const char kOpenVRDescription[];
diff --git a/chrome/browser/vr/service/vr_device_manager.cc b/chrome/browser/vr/service/vr_device_manager.cc
index 5380228..109c23b 100644
--- a/chrome/browser/vr/service/vr_device_manager.cc
+++ b/chrome/browser/vr/service/vr_device_manager.cc
@@ -51,7 +51,13 @@
 #endif
 
 #if BUILDFLAG(ENABLE_OCULUS_VR)
-    providers.emplace_back(std::make_unique<device::OculusVRDeviceProvider>());
+    // For now, only use the Oculus when OpenVR is not enabled.
+    // TODO(billorr): Add more complicated logic to avoid routing Oculus devices
+    // through OpenVR.
+    if (base::FeatureList::IsEnabled(features::kOculusVR) &&
+        providers.size() == 0)
+      providers.emplace_back(
+          std::make_unique<device::OculusVRDeviceProvider>());
 #endif
 
     if (base::FeatureList::IsEnabled(features::kWebXrOrientationSensorDevice)) {
diff --git a/chrome/common/chrome_features.cc b/chrome/common/chrome_features.cc
index c66734d..8307742 100644
--- a/chrome/common/chrome_features.cc
+++ b/chrome/common/chrome_features.cc
@@ -257,6 +257,11 @@
 const base::Feature kVrBrowsingExperimentalRendering{
     "VrBrowsingExperimentalRendering", base::FEATURE_DISABLED_BY_DEFAULT};
 
+#if BUILDFLAG(ENABLE_OCULUS_VR)
+// Controls Oculus support.
+const base::Feature kOculusVR{"OculusVR", base::FEATURE_DISABLED_BY_DEFAULT};
+#endif  // ENABLE_OCULUS_VR
+
 #if BUILDFLAG(ENABLE_OPENVR)
 // Controls OpenVR support.
 const base::Feature kOpenVR{"OpenVR", base::FEATURE_DISABLED_BY_DEFAULT};
diff --git a/chrome/common/chrome_features.h b/chrome/common/chrome_features.h
index 3613834..9c569e9 100644
--- a/chrome/common/chrome_features.h
+++ b/chrome/common/chrome_features.h
@@ -132,6 +132,10 @@
 extern const base::Feature kVrBrowsingExperimentalFeatures;
 extern const base::Feature kVrBrowsingExperimentalRendering;
 
+#if BUILDFLAG(ENABLE_OCULUS_VR)
+extern const base::Feature kOculusVR;
+#endif  // ENABLE_OCULUS_VR
+
 #if BUILDFLAG(ENABLE_OPENVR)
 extern const base::Feature kOpenVR;
 #endif  // ENABLE_OPENVR