diff --git base/win/dark_mode_support.cc base/win/dark_mode_support.cc index 73d6ad5e9bb36..6c450e79c0f94 100644 --- base/win/dark_mode_support.cc +++ base/win/dark_mode_support.cc @@ -7,6 +7,7 @@ #include #include "base/check.h" +#include "base/command_line.h" #include "base/native_library.h" #include "base/win/win_util.h" #include "base/win/windows_version.h" @@ -89,11 +90,20 @@ const DarkModeSupport& GetDarkModeSupport() { return dark_mode_support; } +bool IsForcedLightMode() { + static bool kIsForcedLightMode = + base::CommandLine::ForCurrentProcess()->HasSwitch( + "force-light-mode"); + return kIsForcedLightMode; +} + } // namespace namespace base::win { bool IsDarkModeAvailable() { + if (IsForcedLightMode()) + return false; auto& dark_mode_support = GetDarkModeSupport(); return (dark_mode_support.allow_dark_mode_for_app || dark_mode_support.set_preferred_app_mode) && diff --git chrome/browser/ui/views/chrome_browser_main_extra_parts_views_linux.cc chrome/browser/ui/views/chrome_browser_main_extra_parts_views_linux.cc index 23d0611fdb2b5..81fd1055e926e 100644 --- chrome/browser/ui/views/chrome_browser_main_extra_parts_views_linux.cc +++ chrome/browser/ui/views/chrome_browser_main_extra_parts_views_linux.cc @@ -61,7 +61,10 @@ void ChromeBrowserMainExtraPartsViewsLinux::ToolkitInitialized() { linux_ui_theme->GetNativeTheme()->system_theme()); } #if defined(USE_DBUS) - dark_mode_manager_ = std::make_unique(); + if (!ui::NativeTheme::IsForcedDarkMode() && + !ui::NativeTheme::IsForcedLightMode()) { + dark_mode_manager_ = std::make_unique(); + } #endif } diff --git ui/gtk/native_theme_gtk.cc ui/gtk/native_theme_gtk.cc index d69b17b004120..5175ea3a785a3 100644 --- ui/gtk/native_theme_gtk.cc +++ ui/gtk/native_theme_gtk.cc @@ -164,9 +164,11 @@ void NativeThemeGtk::OnThemeChanged(GtkSettings* settings, // have a light variant and aren't affected by the setting. Because of this, // experimentally check if the theme is dark by checking if the window // background color is dark. - const SkColor window_bg_color = GetBgColor(""); - set_use_dark_colors(IsForcedDarkMode() || - color_utils::IsDark(window_bg_color)); + if (!IsForcedLightMode()) { + const SkColor window_bg_color = GetBgColor(""); + set_use_dark_colors(IsForcedDarkMode() || + color_utils::IsDark(window_bg_color)); + } set_preferred_color_scheme(CalculatePreferredColorScheme()); // GTK doesn't have a native high contrast setting. Rather, it's implied by diff --git ui/native_theme/native_theme.cc ui/native_theme/native_theme.cc index f62df6eb7d12b..68f78b5e8bce0 100644 --- ui/native_theme/native_theme.cc +++ ui/native_theme/native_theme.cc @@ -143,6 +143,7 @@ void NativeTheme::NotifyOnNativeThemeUpdated() { color_provider_manager.ResetColorProviderCache(); for (NativeThemeObserver& observer : native_theme_observers_) observer.OnNativeThemeUpdated(this); + color_provider_manager.AfterNativeThemeUpdated(); RecordNumColorProvidersInitializedDuringOnNativeThemeUpdated( color_provider_manager.num_providers_initialized() - @@ -276,6 +277,13 @@ bool NativeTheme::IsForcedDarkMode() { return kIsForcedDarkMode; } +bool NativeTheme::IsForcedLightMode() { + static bool kIsForcedLightMode = + base::CommandLine::ForCurrentProcess()->HasSwitch( + "force-light-mode"); + return kIsForcedLightMode; +} + bool NativeTheme::IsForcedHighContrast() { static bool kIsForcedHighContrast = base::CommandLine::ForCurrentProcess()->HasSwitch( diff --git ui/native_theme/native_theme.h ui/native_theme/native_theme.h index fc32dfb0de44f..44ca8103247b1 100644 --- ui/native_theme/native_theme.h +++ ui/native_theme/native_theme.h @@ -587,6 +587,9 @@ class NATIVE_THEME_EXPORT NativeTheme { // Whether dark mode is forced via command-line flag. static bool IsForcedDarkMode(); + // Whether light mode is forced via command-line flag. + static bool IsForcedLightMode(); + protected: explicit NativeTheme( bool should_only_use_dark_colors, diff --git ui/native_theme/native_theme_mac.mm ui/native_theme/native_theme_mac.mm index 9ca3120cfe3ac..c29c17330a7e5 100644 --- ui/native_theme/native_theme_mac.mm +++ ui/native_theme/native_theme_mac.mm @@ -586,11 +586,15 @@ void NativeThemeMac::PaintSelectedMenuItem( void NativeThemeMac::InitializeDarkModeStateAndObserver() { __block auto theme = this; - set_use_dark_colors(IsDarkMode()); + if (!IsForcedLightMode()) { + set_use_dark_colors(IsForcedDarkMode() || IsDarkMode()); + } set_preferred_color_scheme(CalculatePreferredColorScheme()); appearance_observer_ = [[NativeThemeEffectiveAppearanceObserver alloc] initWithHandler:^{ - theme->set_use_dark_colors(IsDarkMode()); + if (!IsForcedLightMode()) { + theme->set_use_dark_colors(IsForcedDarkMode() || IsDarkMode()); + } theme->set_preferred_color_scheme(CalculatePreferredColorScheme()); theme->NotifyOnNativeThemeUpdated(); }]; diff --git ui/native_theme/native_theme_win.cc ui/native_theme/native_theme_win.cc index 547872076d126..14d0e817f3243 100644 --- ui/native_theme/native_theme_win.cc +++ ui/native_theme/native_theme_win.cc @@ -673,14 +673,17 @@ bool NativeThemeWin::ShouldUseDarkColors() const { // Windows high contrast modes are entirely different themes, // so let them take priority over dark mode. // ...unless --force-dark-mode was specified in which case caveat emptor. - if (InForcedColorsMode() && !IsForcedDarkMode()) + if (supports_windows_dark_mode_ && IsForcedDarkMode()) { + return true; + } + if (InForcedColorsMode()) return false; return NativeTheme::ShouldUseDarkColors(); } NativeTheme::PreferredColorScheme NativeThemeWin::CalculatePreferredColorScheme() const { - if (!InForcedColorsMode()) + if (!InForcedColorsMode() || !supports_windows_dark_mode_) return NativeTheme::CalculatePreferredColorScheme(); // According to the spec, the preferred color scheme for web content is 'dark' @@ -1671,8 +1674,9 @@ void NativeThemeWin::RegisterColorFilteringRegkeyObserver() { } void NativeThemeWin::UpdateDarkModeStatus() { - bool dark_mode_enabled = false; - if (hkcu_themes_regkey_.Valid()) { + bool dark_mode_enabled = ShouldUseDarkColors(); + if (supports_windows_dark_mode_ && !IsForcedDarkMode() && + hkcu_themes_regkey_.Valid()) { DWORD apps_use_light_theme = 1; hkcu_themes_regkey_.ReadValueDW(L"AppsUseLightTheme", &apps_use_light_theme);