views: Split SetBackgroundColor() out of Widget::SetColorModeOverride()

The existing Widget::SetColorModeOverride() can set both color mode and
a background color. This CL splits SetBackgroundColor() out of
SetColorModeOverride() to improve clarity.

Call sites have been updated to use the appropriate new method.

Bug: none
Change-Id: Ie531b337fc4142ee5b0dbd631a2ed499b37efe39
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/6914440
Commit-Queue: Keren Zhu <kerenzhu@chromium.org>
Reviewed-by: Colin Blundell <blundell@chromium.org>
Cr-Commit-Position: refs/heads/main@{#1511717}
diff --git a/ash/webui/camera_app_ui/camera_app_ui.cc b/ash/webui/camera_app_ui/camera_app_ui.cc
index 8b2ab8f..d194b26 100644
--- a/ash/webui/camera_app_ui/camera_app_ui.cc
+++ b/ash/webui/camera_app_ui/camera_app_ui.cc
@@ -298,8 +298,7 @@
   views::Widget* widget = views::Widget::GetWidgetForNativeWindow(window());
   if (widget) {
     // Camera app is always dark.
-    widget->SetColorModeOverride(ui::ColorProviderKey::ColorMode::kDark,
-                                 /*background_color=*/std::nullopt);
+    widget->SetColorModeOverride(ui::ColorProviderKey::ColorMode::kDark);
   } else {
     LOG(ERROR) << "Can't find widget for CCA window.";
   }
diff --git a/chrome/browser/glic/widget/glic_view.cc b/chrome/browser/glic/widget/glic_view.cc
index 66e428f..e6a82bc 100644
--- a/chrome/browser/glic/widget/glic_view.cc
+++ b/chrome/browser/glic/widget/glic_view.cc
@@ -85,8 +85,7 @@
 
   if (views::Widget* widget = GetWidget(); explicit_background && widget) {
     // Set the native widget background color if needed.
-    widget->SetColorModeOverride(
-        /*color_mode=*/std::nullopt, kColorGlicBackground);
+    widget->SetBackgroundColor(kColorGlicBackground);
   }
 }
 
diff --git a/chrome/browser/ui/views/borealis/borealis_splash_screen_view.cc b/chrome/browser/ui/views/borealis/borealis_splash_screen_view.cc
index c4391cb..6a4b3d1e 100644
--- a/chrome/browser/ui/views/borealis/borealis_splash_screen_view.cc
+++ b/chrome/browser/ui/views/borealis/borealis_splash_screen_view.cc
@@ -68,8 +68,7 @@
     // This UI has custom colors to match Steam's and those are close to ash's
     // dark mode.
     g_delegate->GetWidget()->SetColorModeOverride(
-        {ui::ColorProviderKey::ColorMode::kDark},
-        /*background_color=*/std::nullopt);
+        ui::ColorProviderKey::ColorMode::kDark);
   }
   g_delegate->GetWidget()->Show();
 }
diff --git a/chrome/browser/ui/views/frame/picture_in_picture_browser_frame_view.cc b/chrome/browser/ui/views/frame/picture_in_picture_browser_frame_view.cc
index 5b7536d2..28aac762 100644
--- a/chrome/browser/ui/views/frame/picture_in_picture_browser_frame_view.cc
+++ b/chrome/browser/ui/views/frame/picture_in_picture_browser_frame_view.cc
@@ -954,8 +954,7 @@
 
   // TODO(crbug.com/40279642): Don't force dark mode once we support a
   // light mode window.
-  GetWidget()->SetColorModeOverride(ui::ColorProviderKey::ColorMode::kDark,
-                                    /*background_color=*/std::nullopt);
+  GetWidget()->SetColorModeOverride(ui::ColorProviderKey::ColorMode::kDark);
 
 // Fade in animation is disabled for Document and Video Picture-in-Picture on
 // Windows. On Windows, resizable windows can not be translucent. See
diff --git a/chrome/browser/ui/views/overlay/video_overlay_window_views.cc b/chrome/browser/ui/views/overlay/video_overlay_window_views.cc
index 3b72b61..f14ba4d 100644
--- a/chrome/browser/ui/views/overlay/video_overlay_window_views.cc
+++ b/chrome/browser/ui/views/overlay/video_overlay_window_views.cc
@@ -386,8 +386,8 @@
 
   // The 2024 updated controls use dark mode colors.
   if (Use2024UI()) {
-    overlay_window->SetColorModeOverride(ui::ColorProviderKey::ColorMode::kDark,
-                                         /*background_color=*/std::nullopt);
+    overlay_window->SetColorModeOverride(
+        ui::ColorProviderKey::ColorMode::kDark);
   }
 
   overlay_window->CalculateAndUpdateWindowBounds();
diff --git a/components/live_caption/views/caption_bubble.cc b/components/live_caption/views/caption_bubble.cc
index 97ca397..f9dbddef 100644
--- a/components/live_caption/views/caption_bubble.cc
+++ b/components/live_caption/views/caption_bubble.cc
@@ -1402,8 +1402,7 @@
   }
 
   views::BubbleDialogDelegateView::SetBackgroundColor(background_color);
-  GetWidget()->SetColorModeOverride(ui::ColorProviderKey::ColorMode::kDark,
-                                    /*background_color=*/std::nullopt);
+  GetWidget()->SetColorModeOverride(ui::ColorProviderKey::ColorMode::kDark);
 }
 
 void CaptionBubble::OnLanguageChanged(const std::string& display_language) {
diff --git a/ui/views/widget/widget.cc b/ui/views/widget/widget.cc
index dcb03d2..d21d8b52 100644
--- a/ui/views/widget/widget.cc
+++ b/ui/views/widget/widget.cc
@@ -2408,11 +2408,15 @@
 }
 
 void Widget::SetColorModeOverride(
-    std::optional<ui::ColorProviderKey::ColorMode> color_mode,
-    std::optional<ui::ColorId> background_color) {
-  if (color_mode != color_mode_override_ ||
-      background_color != background_color_) {
+    std::optional<ui::ColorProviderKey::ColorMode> color_mode) {
+  if (color_mode != color_mode_override_) {
     color_mode_override_ = color_mode;
+    ThemeChanged();
+  }
+}
+
+void Widget::SetBackgroundColor(std::optional<ui::ColorId> background_color) {
+  if (background_color != background_color_) {
     background_color_ = background_color;
     ThemeChanged();
   }
diff --git a/ui/views/widget/widget.h b/ui/views/widget/widget.h
index 4988309..396e91d 100644
--- a/ui/views/widget/widget.h
+++ b/ui/views/widget/widget.h
@@ -1435,8 +1435,11 @@
   // Sets an override for `color_mode` when `GetColorProvider()` is requested.
   // e.g. if set to kDark, colors will always be for the dark theme.
   void SetColorModeOverride(
-      std::optional<ui::ColorProviderKey::ColorMode> color_mode,
-      std::optional<ui::ColorId> background_color);
+      std::optional<ui::ColorProviderKey::ColorMode> color_mode);
+
+  // Sets the background color for the widget. This color is used before the
+  // view paints anything.
+  void SetBackgroundColor(std::optional<ui::ColorId> background_color);
 
   // ui::ColorProviderSource:
   const ui::ColorProvider* GetColorProvider() const override;
diff --git a/ui/views/widget/widget_unittest.cc b/ui/views/widget/widget_unittest.cc
index 332ceb8..35f8bac5 100644
--- a/ui/views/widget/widget_unittest.cc
+++ b/ui/views/widget/widget_unittest.cc
@@ -395,7 +395,7 @@
   test_theme.SetDarkMode(true);
   widget->SetNativeThemeForTest(&test_theme);
 
-  widget->SetColorModeOverride(std::nullopt, std::nullopt);
+  widget->SetColorModeOverride(std::nullopt);
   // Verify that we resolve the dark color when we don't override color mode.
   EXPECT_EQ(kDarkColor,
             widget->GetColorProvider()->GetColor(ui::kColorSysPrimary));
@@ -408,8 +408,7 @@
   test_theme.SetDarkMode(false);
   widget->SetNativeThemeForTest(&test_theme);
 
-  widget->SetColorModeOverride(ui::ColorProviderKey::ColorMode::kDark,
-                               std::nullopt);
+  widget->SetColorModeOverride(ui::ColorProviderKey::ColorMode::kDark);
   // Verify that we resolve the light color even though the theme is dark.
   EXPECT_EQ(kDarkColor,
             widget->GetColorProvider()->GetColor(ui::kColorSysPrimary));
@@ -422,8 +421,7 @@
   test_theme.SetDarkMode(true);
   widget->SetNativeThemeForTest(&test_theme);
 
-  widget->SetColorModeOverride(ui::ColorProviderKey::ColorMode::kLight,
-                               std::nullopt);
+  widget->SetColorModeOverride(ui::ColorProviderKey::ColorMode::kLight);
   // Verify that we resolve the light color even though the theme is dark.
   EXPECT_EQ(kLightColor,
             widget->GetColorProvider()->GetColor(ui::kColorSysPrimary));
@@ -444,8 +442,8 @@
 
   // Ensure neither has an override set. The child should inherit the color mode
   // of the parent.
-  widget->SetColorModeOverride(std::nullopt, std::nullopt);
-  widget_child->SetColorModeOverride(std::nullopt, std::nullopt);
+  widget->SetColorModeOverride(std::nullopt);
+  widget_child->SetColorModeOverride(std::nullopt);
   EXPECT_EQ(kDarkColor,
             widget->GetColorProvider()->GetColor(ui::kColorSysPrimary));
   EXPECT_EQ(kDarkColor,
@@ -475,8 +473,8 @@
 
   // Ensure neither has an override set. The child should inherit the color mode
   // of the parent.
-  widget->SetColorModeOverride(std::nullopt, std::nullopt);
-  widget_child->SetColorModeOverride(std::nullopt, std::nullopt);
+  widget->SetColorModeOverride(std::nullopt);
+  widget_child->SetColorModeOverride(std::nullopt);
   EXPECT_EQ(kDarkColor,
             widget->GetColorProvider()->GetColor(ui::kColorSysPrimary));
   EXPECT_EQ(kDarkColor,
@@ -484,15 +482,13 @@
 
   // Set the parent's override to light, then back to dark. the child should
   // follow the parent's overridden color mode.
-  widget->SetColorModeOverride(ui::ColorProviderKey::ColorMode::kLight,
-                               std::nullopt);
+  widget->SetColorModeOverride(ui::ColorProviderKey::ColorMode::kLight);
   EXPECT_EQ(kLightColor,
             widget->GetColorProvider()->GetColor(ui::kColorSysPrimary));
   EXPECT_EQ(kLightColor,
             widget_child->GetColorProvider()->GetColor(ui::kColorSysPrimary));
 
-  widget->SetColorModeOverride(ui::ColorProviderKey::ColorMode::kDark,
-                               std::nullopt);
+  widget->SetColorModeOverride(ui::ColorProviderKey::ColorMode::kDark);
   EXPECT_EQ(kDarkColor,
             widget->GetColorProvider()->GetColor(ui::kColorSysPrimary));
   EXPECT_EQ(kDarkColor,
@@ -500,8 +496,7 @@
 
   // Override the child's color mode to light. The parent should continue to
   // report a dark color mode.
-  widget_child->SetColorModeOverride(ui::ColorProviderKey::ColorMode::kLight,
-                                     std::nullopt);
+  widget_child->SetColorModeOverride(ui::ColorProviderKey::ColorMode::kLight);
   EXPECT_EQ(kDarkColor,
             widget->GetColorProvider()->GetColor(ui::kColorSysPrimary));
   EXPECT_EQ(kLightColor,