1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #ifndef CHROME_BROWSER_THEMES_THEME_SERVICE_H_
6 #define CHROME_BROWSER_THEMES_THEME_SERVICE_H_
13 #include "base/compiler_specific.h"
14 #include "base/memory/ref_counted.h"
15 #include "base/memory/scoped_ptr.h"
16 #include "base/memory/weak_ptr.h"
17 #include "base/threading/non_thread_safe.h"
18 #include "components/browser_context_keyed_service/browser_context_keyed_service.h"
19 #include "content/public/browser/notification_observer.h"
20 #include "content/public/browser/notification_registrar.h"
21 #include "ui/base/theme_provider.h"
23 class CustomThemeSupplier
;
24 class BrowserThemePack
;
25 class ThemeSyncableService
;
32 namespace color_utils
{
36 namespace extensions
{
44 namespace theme_service_internal
{
45 class ThemeServiceTest
;
54 // Sent whenever the browser theme changes. Object => NSValue wrapping the
55 // ThemeService that changed.
56 extern "C" NSString
* const kBrowserThemeDidChangeNotification
;
59 class ThemeService
: public base::NonThreadSafe
,
60 public content::NotificationObserver
,
61 public BrowserContextKeyedService
,
62 public ui::ThemeProvider
{
64 // Public constants used in ThemeService and its subclasses:
65 static const char* kDefaultThemeID
;
68 virtual ~ThemeService();
70 virtual void Init(Profile
* profile
);
72 // Returns a cross platform image for an id.
74 // TODO(erg): Make this part of the ui::ThemeProvider and the main way to get
75 // theme properties out of the theme provider since it's cross platform.
76 virtual gfx::Image
GetImageNamed(int id
) const;
78 // Overridden from ui::ThemeProvider:
79 virtual gfx::ImageSkia
* GetImageSkiaNamed(int id
) const OVERRIDE
;
80 virtual SkColor
GetColor(int id
) const OVERRIDE
;
81 virtual int GetDisplayProperty(int id
) const OVERRIDE
;
82 virtual bool ShouldUseNativeFrame() const OVERRIDE
;
83 virtual bool HasCustomImage(int id
) const OVERRIDE
;
84 virtual base::RefCountedMemory
* GetRawData(
86 ui::ScaleFactor scale_factor
) const OVERRIDE
;
87 #if defined(OS_MACOSX)
88 virtual NSImage
* GetNSImageNamed(int id
) const OVERRIDE
;
89 virtual NSColor
* GetNSImageColorNamed(int id
) const OVERRIDE
;
90 virtual NSColor
* GetNSColor(int id
) const OVERRIDE
;
91 virtual NSColor
* GetNSColorTint(int id
) const OVERRIDE
;
92 virtual NSGradient
* GetNSGradient(int id
) const OVERRIDE
;
93 #elif defined(OS_POSIX) && !defined(TOOLKIT_VIEWS) && !defined(OS_ANDROID)
94 // This mismatch between what this class defines and whether or not it
95 // overrides ui::ThemeProvider is http://crbug.com/105040 .
96 // GdkPixbufs returned by GetPixbufNamed and GetRTLEnabledPixbufNamed are
97 // shared instances owned by the theme provider and should not be freed.
98 virtual GdkPixbuf
* GetRTLEnabledPixbufNamed(int id
) const OVERRIDE
;
101 // Overridden from content::NotificationObserver:
102 virtual void Observe(int type
,
103 const content::NotificationSource
& source
,
104 const content::NotificationDetails
& details
) OVERRIDE
;
106 // Set the current theme to the theme defined in |extension|.
107 // |extension| must already be added to this profile's
109 virtual void SetTheme(const extensions::Extension
* extension
);
111 // Reset the theme to default.
112 virtual void UseDefaultTheme();
114 // Set the current theme to the native theme. On some platforms, the native
115 // theme is the default theme.
116 virtual void SetNativeTheme();
118 // Whether we're using the chrome default theme. Virtual so linux can check
119 // if we're using the GTK theme.
120 virtual bool UsingDefaultTheme() const;
122 // Whether we're using the native theme (which may or may not be the
123 // same as the default theme).
124 virtual bool UsingNativeTheme() const;
126 // Gets the id of the last installed theme. (The theme may have been further
127 // locally customized.)
128 virtual std::string
GetThemeID() const;
130 // This class needs to keep track of the number of theme infobars so that we
131 // clean up unused themes.
132 void OnInfobarDisplayed();
134 // Decrements the number of theme infobars. If the last infobar has been
135 // destroyed, uninstalls all themes that aren't the currently selected.
136 void OnInfobarDestroyed();
138 // Uninstall theme extensions which are no longer in use. |ignore_infobars| is
139 // whether unused themes should be removed despite a theme infobar being
141 void RemoveUnusedThemes(bool ignore_infobars
);
143 // Returns the syncable service for syncing theme. The returned service is
144 // owned by |this| object.
145 virtual ThemeSyncableService
* GetThemeSyncableService() const;
147 // Save the images to be written to disk, mapping file path to id.
148 typedef std::map
<base::FilePath
, int> ImagesDiskCache
;
151 // Set a custom default theme instead of the normal default theme.
152 virtual void SetCustomDefaultTheme(
153 scoped_refptr
<CustomThemeSupplier
> theme_supplier
);
155 // Returns true if the ThemeService should use the native theme on startup.
156 virtual bool ShouldInitWithNativeTheme() const;
158 // Get the specified tint - |id| is one of the TINT_* enum values.
159 color_utils::HSL
GetTint(int id
) const;
161 // Clears all the override fields and saves the dictionary.
162 virtual void ClearAllThemeData();
164 // Load theme data from preferences.
165 virtual void LoadThemePrefs();
167 // Let all the browser views know that themes have changed.
168 virtual void NotifyThemeChanged();
170 #if defined(OS_MACOSX)
171 // Let all the browser views know that themes have changed in a platform way.
172 virtual void NotifyPlatformThemeChanged();
175 // Clears the platform-specific caches. Do not call directly; it's called
176 // from ClearAllThemeData().
177 virtual void FreePlatformCaches();
179 Profile
* profile() const { return profile_
; }
181 void set_ready() { ready_
= true; }
183 const CustomThemeSupplier
* get_theme_supplier() const {
184 return theme_supplier_
.get();
187 // True if the theme service is ready to be used.
188 // TODO(pkotwicz): Add DCHECKS to the theme service's getters once
189 // ThemeSource no longer uses the ThemeService when it is not ready.
193 friend class theme_service_internal::ThemeServiceTest
;
195 // Called when the extension service is ready.
196 void OnExtensionServiceReady();
198 // Migrate the theme to the new theme pack schema by recreating the data pack
199 // from the extension.
202 // Replaces the current theme supplier with a new one and calls
203 // StopUsingTheme() or StartUsingTheme() as appropriate.
204 void SwapThemeSupplier(scoped_refptr
<CustomThemeSupplier
> theme_supplier
);
206 // Saves the filename of the cached theme pack.
207 void SavePackName(const base::FilePath
& pack_path
);
209 // Save the id of the last theme installed.
210 void SaveThemeID(const std::string
& id
);
212 // Implementation of SetTheme() (and the fallback from LoadThemePrefs() in
213 // case we don't have a theme pack).
214 void BuildFromExtension(const extensions::Extension
* extension
);
216 // Returns true if the profile belongs to a managed user.
217 bool IsManagedUser() const;
219 // Sets the current theme to the managed user theme. Should only be used for
220 // managed user profiles.
221 void SetManagedUserTheme();
223 // Sets the managed user theme if the user has no custom theme yet.
224 void OnManagedUserInitialized();
226 #if defined(TOOLKIT_GTK)
227 // Loads an image and flips it horizontally if |rtl_enabled| is true.
228 GdkPixbuf
* GetPixbufImpl(int id
, bool rtl_enabled
) const;
231 #if defined(TOOLKIT_GTK)
232 typedef std::map
<int, GdkPixbuf
*> GdkPixbufMap
;
233 mutable GdkPixbufMap gdk_pixbufs_
;
234 #elif defined(OS_MACOSX)
235 // |nsimage_cache_| retains the images it has cached.
236 typedef std::map
<int, NSImage
*> NSImageMap
;
237 mutable NSImageMap nsimage_cache_
;
239 // |nscolor_cache_| retains the colors it has cached.
240 typedef std::map
<int, NSColor
*> NSColorMap
;
241 mutable NSColorMap nscolor_cache_
;
243 typedef std::map
<int, NSGradient
*> NSGradientMap
;
244 mutable NSGradientMap nsgradient_cache_
;
247 ui::ResourceBundle
& rb_
;
250 scoped_refptr
<CustomThemeSupplier
> theme_supplier_
;
252 // The id of the theme extension which has just been installed but has not
253 // been loaded yet. The theme extension with |installed_pending_load_id_| may
254 // never be loaded if the install is due to updating a disabled theme.
255 // |pending_install_id_| should be set to |kDefaultThemeID| if there are no
256 // recently installed theme extensions
257 std::string installed_pending_load_id_
;
259 // The number of infobars currently displayed.
260 int number_of_infobars_
;
262 content::NotificationRegistrar registrar_
;
264 scoped_ptr
<ThemeSyncableService
> theme_syncable_service_
;
266 base::WeakPtrFactory
<ThemeService
> weak_ptr_factory_
;
268 DISALLOW_COPY_AND_ASSIGN(ThemeService
);
271 #endif // CHROME_BROWSER_THEMES_THEME_SERVICE_H_