Add Field Trial Support for Material Refresh

This change allows for the experimentation of Material Refresh versus
the previous Material Design UI.

BUG=865722

Change-Id: I1d6b18760433e5d286e282e54f370a074f375397
Reviewed-on: https://chromium-review.googlesource.com/1144627
Reviewed-by: Robert Liao <robliao@chromium.org>
Reviewed-by: Scott Violet <sky@chromium.org>
Reviewed-by: Alexei Svitkine <asvitkine@chromium.org>
Commit-Queue: Robert Liao <robliao@chromium.org>
Cr-Commit-Position: refs/heads/master@{#576966}
diff --git a/ui/base/material_design/material_design_controller.cc b/ui/base/material_design/material_design_controller.cc
index 286542d..c698b28 100644
--- a/ui/base/material_design/material_design_controller.cc
+++ b/ui/base/material_design/material_design_controller.cc
@@ -7,6 +7,7 @@
 #include <string>
 
 #include "base/command_line.h"
+#include "base/feature_list.h"
 #include "base/logging.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/trace_event/trace_event.h"
@@ -38,6 +39,19 @@
 namespace ui {
 namespace {
 
+#if defined(OS_CHROMEOS) || defined(OS_WIN) || defined(OS_LINUX)
+
+// Whether Material Refresh should be used by default.
+// Material refresh is controlled by both --top-chrome-md and this feature.
+// --top-chrome-md should take precedence over what this feature may indicate.
+bool IsMaterialRefreshEnabled() {
+  static constexpr base::Feature kMaterialRefreshEnabledFeature = {
+      "MaterialRefresh", base::FEATURE_ENABLED_BY_DEFAULT};
+  return base::FeatureList::IsEnabled(kMaterialRefreshEnabledFeature);
+}
+
+#endif
+
 #if defined(OS_CHROMEOS)
 
 // Whether to use MATERIAL_TOUCH_OPTIMIZED when a touch device is detected.
@@ -46,9 +60,18 @@
                                          base::FEATURE_ENABLED_BY_DEFAULT};
 
 MaterialDesignController::Mode GetDefaultTouchDeviceMode() {
-  return base::FeatureList::IsEnabled(kTouchOptimizedUi)
-             ? MaterialDesignController::MATERIAL_TOUCH_REFRESH
-             : MaterialDesignController::MATERIAL_REFRESH;
+  bool material_refresh_enabled = IsMaterialRefreshEnabled();
+  bool touch_optimized_ui_enabled =
+      base::FeatureList::IsEnabled(kTouchOptimizedUi);
+  if (material_refresh_enabled) {
+    return touch_optimized_ui_enabled
+               ? MaterialDesignController::MATERIAL_TOUCH_REFRESH
+               : MaterialDesignController::MATERIAL_REFRESH;
+  }
+
+  return touch_optimized_ui_enabled
+             ? MaterialDesignController::MATERIAL_TOUCH_OPTIMIZED
+             : MaterialDesignController::MATERIAL_HYBRID;
 }
 
 bool HasTouchscreen() {
@@ -178,11 +201,11 @@
   if (HasTouchscreen())
     return GetDefaultTouchDeviceMode();
 
-  return MATERIAL_REFRESH;
+  return IsMaterialRefreshEnabled() ? MATERIAL_REFRESH : MATERIAL_NORMAL;
 #endif  // defined(OS_CHROMEOS)
 
 #if defined(OS_WIN) || defined(OS_LINUX)
-  return MATERIAL_REFRESH;
+  return IsMaterialRefreshEnabled() ? MATERIAL_REFRESH : MATERIAL_NORMAL;
 #elif defined(OS_MACOSX) && BUILDFLAG(MAC_VIEWS_BROWSER)
   return features::IsViewsBrowserCocoa() ? MATERIAL_NORMAL : MATERIAL_REFRESH;
 #else