diff --git a/libcef/browser/chrome/views/chrome_browser_frame.cc b/libcef/browser/chrome/views/chrome_browser_frame.cc index 845389b5b..3b7487d13 100644 --- a/libcef/browser/chrome/views/chrome_browser_frame.cc +++ b/libcef/browser/chrome/views/chrome_browser_frame.cc @@ -5,6 +5,7 @@ #include "libcef/browser/chrome/views/chrome_browser_frame.h" #include "libcef/browser/chrome/chrome_browser_host_impl.h" +#include "libcef/browser/thread_util.h" #include "libcef/browser/views/window_view.h" #include "chrome/browser/themes/theme_service.h" @@ -93,10 +94,7 @@ void ChromeBrowserFrame::UserChangedTheme( // Calls ThemeChanged() and possibly SelectNativeTheme(). BrowserFrame::UserChangedTheme(theme_change_type); - if (window_view_) { - window_view_->OnThemeColorsChanged(/*chrome_theme=*/!native_theme_change_); - ThemeChanged(); - } + NotifyThemeColorsChanged(/*chrome_theme=*/!native_theme_change_); } views::internal::RootView* ChromeBrowserFrame::CreateRootView() { @@ -156,8 +154,15 @@ void ChromeBrowserFrame::OnColorProviderCacheResetMissed() { return; } + NotifyThemeColorsChanged(/*chrome_theme=*/false); +} + +void ChromeBrowserFrame::NotifyThemeColorsChanged(bool chrome_theme) { if (window_view_) { - window_view_->OnThemeColorsChanged(/*chrome_theme=*/false); - ThemeChanged(); + window_view_->OnThemeColorsChanged(chrome_theme); + + // Call ThemeChanged() asynchronously to avoid possible reentrancy. + CEF_POST_TASK(TID_UI, base::BindOnce(&ChromeBrowserFrame::ThemeChanged, + weak_ptr_factory_.GetWeakPtr())); } } diff --git a/libcef/browser/chrome/views/chrome_browser_frame.h b/libcef/browser/chrome/views/chrome_browser_frame.h index 436e13edd..7165df6a1 100644 --- a/libcef/browser/chrome/views/chrome_browser_frame.h +++ b/libcef/browser/chrome/views/chrome_browser_frame.h @@ -9,6 +9,7 @@ #include "libcef/browser/views/color_provider_tracker.h" #include "libcef/browser/views/widget.h" +#include "base/memory/weak_ptr.h" #include "chrome/browser/ui/browser.h" #include "chrome/browser/ui/views/frame/browser_frame.h" @@ -136,6 +137,8 @@ class ChromeBrowserFrame : public BrowserFrame, // CefColorProviderTracker::Observer methods: void OnColorProviderCacheResetMissed() override; + void NotifyThemeColorsChanged(bool chrome_theme); + CefWindowView* window_view_; BrowserView* browser_view_ = nullptr; @@ -143,6 +146,8 @@ class ChromeBrowserFrame : public BrowserFrame, bool native_theme_change_ = false; CefColorProviderTracker color_provider_tracker_{this}; + + base::WeakPtrFactory weak_ptr_factory_{this}; }; #endif // CEF_LIBCEF_BROWSER_CHROME_VIEWS_CHROME_BROWSER_FRAME_H_ diff --git a/libcef/browser/views/widget_impl.cc b/libcef/browser/views/widget_impl.cc index 404f9bf98..f8c1620a8 100644 --- a/libcef/browser/views/widget_impl.cc +++ b/libcef/browser/views/widget_impl.cc @@ -4,6 +4,7 @@ #include "libcef/browser/views/widget_impl.h" +#include "libcef/browser/thread_util.h" #include "libcef/browser/views/window_view.h" #include "libcef/features/runtime.h" @@ -226,7 +227,9 @@ void CefWidgetImpl::NotifyThemeColorsChanged(bool chrome_theme, if (window_view_) { window_view_->OnThemeColorsChanged(chrome_theme); if (call_theme_changed) { - ThemeChanged(); + // Call ThemeChanged() asynchronously to avoid possible reentrancy. + CEF_POST_TASK(TID_UI, base::BindOnce(&CefWidgetImpl::ThemeChanged, + weak_ptr_factory_.GetWeakPtr())); } } } diff --git a/libcef/browser/views/widget_impl.h b/libcef/browser/views/widget_impl.h index 82b83cec4..b33d32822 100644 --- a/libcef/browser/views/widget_impl.h +++ b/libcef/browser/views/widget_impl.h @@ -11,6 +11,7 @@ #include "libcef/browser/views/color_provider_tracker.h" #include "libcef/browser/views/widget.h" +#include "base/memory/weak_ptr.h" #include "chrome/browser/themes/theme_service_observer.h" #include "ui/views/widget/widget.h" @@ -91,6 +92,8 @@ class CefWidgetImpl : public views::Widget, ProfileMap associated_profiles_; CefColorProviderTracker color_provider_tracker_{this}; + + base::WeakPtrFactory weak_ptr_factory_{this}; }; #endif // CEF_LIBCEF_BROWSER_VIEWS_WIDGET_IMPL_H_