Index: chrome/browser/ui/views/frame/browser_view.cc |
diff --git a/chrome/browser/ui/views/frame/browser_view.cc b/chrome/browser/ui/views/frame/browser_view.cc |
index 2d7a8e089ccc313d358f640e460bb87708fca26b..9b12a2e4938156ab3ff8959aef3b2d5587d87529 100644 |
--- a/chrome/browser/ui/views/frame/browser_view.cc |
+++ b/chrome/browser/ui/views/frame/browser_view.cc |
@@ -165,6 +165,7 @@ |
#include "base/win/windows_version.h" |
#include "chrome/browser/jumplist_win.h" |
#include "ui/gfx/color_palette.h" |
+#include "ui/native_theme/native_theme_dark_win.h" |
#include "ui/views/win/scoped_fullscreen_visibility.h" |
#endif |
@@ -182,6 +183,10 @@ |
#include "content/public/common/mojo_shell_connection.h" |
#endif |
+#if defined(OS_LINUX) |
+#include "ui/native_theme/native_theme_dark_aura.h" |
+#endif |
+ |
using base::TimeDelta; |
using base::UserMetricsAction; |
using content::NativeWebKeyboardEvent; |
@@ -450,8 +455,8 @@ const char BrowserView::kViewClassName[] = "BrowserView"; |
BrowserView::BrowserView() |
: views::ClientView(nullptr, nullptr), |
- last_focused_view_storage_id_(views::ViewStorage::GetInstance() |
- ->CreateStorageID()), |
+ last_focused_view_storage_id_( |
+ views::ViewStorage::GetInstance()->CreateStorageID()), |
frame_(nullptr), |
top_container_(nullptr), |
tabstrip_(nullptr), |
@@ -462,6 +467,7 @@ BrowserView::BrowserView() |
devtools_web_view_(nullptr), |
contents_container_(nullptr), |
initialized_(false), |
+ handling_theme_changed_(false), |
in_process_fullscreen_(false), |
#if defined(OS_WIN) |
ticker_(0), |
@@ -2010,12 +2016,33 @@ void BrowserView::GetAccessibleState(ui::AXViewState* state) { |
state->role = ui::AX_ROLE_CLIENT; |
} |
+void BrowserView::OnThemeChanged() { |
+ if (!IsRegularOrGuestSession() && |
+ ui::MaterialDesignController::IsModeMaterial()) { |
+ // When the theme changes, the native theme may also change (in OTR, the |
+ // usage of dark or normal hinges on the browser theme), so we have to |
+ // propagate both kinds of change. |
+ base::AutoReset<bool> reset(&handling_theme_changed_, true); |
+#if defined(OS_WIN) |
+ ui::NativeThemeDarkWin::instance()->NotifyObservers(); |
+ ui::NativeThemeWin::instance()->NotifyObservers(); |
+#elif defined(OS_LINUX) |
+ ui::NativeThemeDarkAura::instance()->NotifyObservers(); |
+ ui::NativeThemeAura::instance()->NotifyObservers(); |
+#endif |
+ } |
+ |
+ views::View::OnThemeChanged(); |
+} |
+ |
void BrowserView::OnNativeThemeChanged(const ui::NativeTheme* theme) { |
// Do not handle native theme changes before the browser view is initialized. |
if (!initialized_) |
return; |
ClientView::OnNativeThemeChanged(theme); |
- UserChangedTheme(); |
+ // Don't infinitely recurse. |
+ if (!handling_theme_changed_) |
+ UserChangedTheme(); |
chrome::MaybeShowInvertBubbleView(this); |
} |