diff --git ui/color/color_provider_manager.cc ui/color/color_provider_manager.cc index a0933fab35037..7a381e24a8816 100644 --- ui/color/color_provider_manager.cc +++ ui/color/color_provider_manager.cc @@ -46,6 +46,15 @@ std::optional& GetGlobalManager() { } // namespace +void ColorProviderManager::AddObserver(ColorProviderManagerObserver* observer) { + observers_.AddObserver(observer); +} + +void ColorProviderManager::RemoveObserver( + ColorProviderManagerObserver* observer) { + observers_.RemoveObserver(observer); +} + ColorProviderManager::ColorProviderManager() { ResetColorProviderInitializerList(); } @@ -86,8 +95,19 @@ void ColorProviderManager::ResetColorProviderInitializerList() { } void ColorProviderManager::ResetColorProviderCache() { - if (!color_providers_.empty()) + if (!color_providers_.empty()) { color_providers_.clear(); + + for (ColorProviderManagerObserver& observer : observers_) { + observer.OnColorProviderCacheReset(); + } + } +} + +void ColorProviderManager::AfterNativeThemeUpdated() { + for (ColorProviderManagerObserver& observer : observers_) { + observer.OnAfterNativeThemeUpdated(); + } } void ColorProviderManager::AppendColorProviderInitializer( diff --git ui/color/color_provider_manager.h ui/color/color_provider_manager.h index 67341dd5fc3d6..ee70de7f7fd44 100644 --- ui/color/color_provider_manager.h +++ ui/color/color_provider_manager.h @@ -15,6 +15,7 @@ #include "base/containers/flat_map.h" #include "base/functional/callback.h" #include "base/memory/weak_ptr.h" +#include "base/observer_list.h" #include "third_party/skia/include/core/SkColor.h" #include "ui/color/color_provider_key.h" #include "ui/color/system_theme.h" @@ -24,6 +25,19 @@ namespace ui { class ColorProvider; +// Observers which are notified when the color provider manager changes. +class COMPONENT_EXPORT(COLOR) ColorProviderManagerObserver { + public: + // Called when the color provider cache is reset. + virtual void OnColorProviderCacheReset() {} + + // Called after NativeTheme sends OnNativeThemeUpdated notifications. + virtual void OnAfterNativeThemeUpdated() {} + + protected: + virtual ~ColorProviderManagerObserver() = default; +}; + // Manages and provides color providers. // // In most cases, use ColorProviderManager::Get() to obtain an instance to the @@ -48,6 +62,9 @@ class COMPONENT_EXPORT(COLOR) ColorProviderManager { // Clears the ColorProviders stored in `color_providers_`. void ResetColorProviderCache(); + // Called after NativeTheme sends OnNativeThemeUpdated notifications. + void AfterNativeThemeUpdated(); + // Appends `initializer` to the end of the current `initializer_list_`. void AppendColorProviderInitializer( ColorProviderInitializerList::CallbackType Initializer); @@ -59,6 +76,10 @@ class COMPONENT_EXPORT(COLOR) ColorProviderManager { return num_providers_initialized_; } + // Add or remove observers. + void AddObserver(ColorProviderManagerObserver* observer); + void RemoveObserver(ColorProviderManagerObserver* observer); + protected: ColorProviderManager(); virtual ~ColorProviderManager(); @@ -76,6 +97,9 @@ class COMPONENT_EXPORT(COLOR) ColorProviderManager { // Tracks the number of ColorProviders constructed and initialized by the // manager for metrics purposes. size_t num_providers_initialized_ = 0; + + base::ObserverList::UncheckedAndDanglingUntriaged + observers_; }; } // namespace ui