• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright (c) 2011 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.
4 
5 #ifndef CHROME_BROWSER_THEMES_THEME_SERVICE_H_
6 #define CHROME_BROWSER_THEMES_THEME_SERVICE_H_
7 #pragma once
8 
9 #include <map>
10 #include <set>
11 #include <string>
12 
13 #include "base/memory/ref_counted.h"
14 #include "base/threading/non_thread_safe.h"
15 #include "chrome/browser/profiles/profile_keyed_service.h"
16 #include "content/common/notification_observer.h"
17 #include "content/common/notification_registrar.h"
18 #include "ui/base/theme_provider.h"
19 
20 class BrowserThemePack;
21 class ThemeServiceTest;
22 class Extension;
23 class FilePath;
24 class Profile;
25 
26 namespace color_utils {
27 struct HSL;
28 }
29 
30 namespace ui {
31 class ResourceBundle;
32 }
33 using ui::ResourceBundle;
34 
35 #ifdef __OBJC__
36 @class NSString;
37 // Sent whenever the browser theme changes.  Object => NSValue wrapping the
38 // ThemeService that changed.
39 extern "C" NSString* const kBrowserThemeDidChangeNotification;
40 #endif  // __OBJC__
41 
42 class ThemeService : public base::NonThreadSafe,
43                      public NotificationObserver,
44                      public ProfileKeyedService,
45                      public ui::ThemeProvider {
46  public:
47   // Public constants used in ThemeService and its subclasses:
48 
49   // Strings used in alignment properties.
50   static const char* kAlignmentTop;
51   static const char* kAlignmentBottom;
52   static const char* kAlignmentLeft;
53   static const char* kAlignmentRight;
54 
55   // Strings used in tiling properties.
56   static const char* kTilingNoRepeat;
57   static const char* kTilingRepeatX;
58   static const char* kTilingRepeatY;
59   static const char* kTilingRepeat;
60 
61   static const char* kDefaultThemeID;
62 
63   // Returns true if the image is themeable.  Safe to call on any thread.
64   static bool IsThemeableImage(int resource_id);
65 
66   ThemeService();
67   virtual ~ThemeService();
68 
69   enum {
70     COLOR_FRAME,
71     COLOR_FRAME_INACTIVE,
72     COLOR_FRAME_INCOGNITO,
73     COLOR_FRAME_INCOGNITO_INACTIVE,
74     COLOR_TOOLBAR,
75     COLOR_TAB_TEXT,
76     COLOR_BACKGROUND_TAB_TEXT,
77     COLOR_BOOKMARK_TEXT,
78     COLOR_NTP_BACKGROUND,
79     COLOR_NTP_TEXT,
80     COLOR_NTP_LINK,
81     COLOR_NTP_LINK_UNDERLINE,
82     COLOR_NTP_HEADER,
83     COLOR_NTP_SECTION,
84     COLOR_NTP_SECTION_TEXT,
85     COLOR_NTP_SECTION_LINK,
86     COLOR_NTP_SECTION_LINK_UNDERLINE,
87     COLOR_CONTROL_BACKGROUND,
88     COLOR_BUTTON_BACKGROUND,
89 
90     // These colors don't have constant default values. They are derived from
91     // the runtime value of other colors.
92     COLOR_NTP_SECTION_HEADER_TEXT,
93     COLOR_NTP_SECTION_HEADER_TEXT_HOVER,
94     COLOR_NTP_SECTION_HEADER_RULE,
95     COLOR_NTP_SECTION_HEADER_RULE_LIGHT,
96     COLOR_NTP_TEXT_LIGHT,
97 
98     TINT_BUTTONS,
99     TINT_FRAME,
100     TINT_FRAME_INACTIVE,
101     TINT_FRAME_INCOGNITO,
102     TINT_FRAME_INCOGNITO_INACTIVE,
103     TINT_BACKGROUND_TAB,
104     NTP_BACKGROUND_ALIGNMENT,
105     NTP_BACKGROUND_TILING,
106     NTP_LOGO_ALTERNATE
107 #if defined(OS_MACOSX)
108     ,
109     COLOR_TOOLBAR_BEZEL = 1000,
110     COLOR_TOOLBAR_STROKE,
111     COLOR_TOOLBAR_STROKE_INACTIVE,
112     COLOR_TOOLBAR_BUTTON_STROKE,
113     COLOR_TOOLBAR_BUTTON_STROKE_INACTIVE,
114     GRADIENT_FRAME_INCOGNITO,
115     GRADIENT_FRAME_INCOGNITO_INACTIVE,
116     GRADIENT_TOOLBAR,
117     GRADIENT_TOOLBAR_INACTIVE,
118     GRADIENT_TOOLBAR_BUTTON,
119     GRADIENT_TOOLBAR_BUTTON_INACTIVE,
120     GRADIENT_TOOLBAR_BUTTON_PRESSED,
121     GRADIENT_TOOLBAR_BUTTON_PRESSED_INACTIVE
122 #endif  // OS_MACOSX
123   };
124 
125   // A bitfield mask for alignments.
126   typedef enum {
127     ALIGN_CENTER = 0x0,
128     ALIGN_LEFT = 0x1,
129     ALIGN_TOP = 0x2,
130     ALIGN_RIGHT = 0x4,
131     ALIGN_BOTTOM = 0x8,
132   } AlignmentMasks;
133 
134   // Background tiling choices.
135   typedef enum {
136     NO_REPEAT = 0,
137     REPEAT_X = 1,
138     REPEAT_Y = 2,
139     REPEAT = 3
140   } Tiling;
141 
142   // ui::ThemeProvider implementation.
143   virtual void Init(Profile* profile);
144   virtual SkBitmap* GetBitmapNamed(int id) const;
145   virtual SkColor GetColor(int id) const;
146   virtual bool GetDisplayProperty(int id, int* result) const;
147   virtual bool ShouldUseNativeFrame() const;
148   virtual bool HasCustomImage(int id) const;
149   virtual RefCountedMemory* GetRawData(int id) const;
150 #if defined(TOOLKIT_USES_GTK)
151   // GdkPixbufs returned by GetPixbufNamed and GetRTLEnabledPixbufNamed are
152   // shared instances owned by the theme provider and should not be freed.
153   virtual GdkPixbuf* GetPixbufNamed(int id) const;
154   virtual GdkPixbuf* GetRTLEnabledPixbufNamed(int id) const;
155 #elif defined(OS_MACOSX)
156   virtual NSImage* GetNSImageNamed(int id, bool allow_default) const;
157   virtual NSColor* GetNSImageColorNamed(int id, bool allow_default) const;
158   virtual NSColor* GetNSColor(int id, bool allow_default) const;
159   virtual NSColor* GetNSColorTint(int id, bool allow_default) const;
160   virtual NSGradient* GetNSGradient(int id) const;
161 #endif
162 
163   // Set the current theme to the theme defined in |extension|.
164   virtual void SetTheme(const Extension* extension);
165 
166   // Reset the theme to default.
167   virtual void UseDefaultTheme();
168 
169   // Set the current theme to the native theme. On some platforms, the native
170   // theme is the default theme.
171   virtual void SetNativeTheme();
172 
173   // Whether we're using the chrome default theme. Virtual so linux can check
174   // if we're using the GTK theme.
175   virtual bool UsingDefaultTheme();
176 
177   // Gets the id of the last installed theme. (The theme may have been further
178   // locally customized.)
179   virtual std::string GetThemeID() const;
180 
181   // This class needs to keep track of the number of theme infobars so that we
182   // clean up unused themes.
183   void OnInfobarDisplayed();
184 
185   // Decrements the number of theme infobars. If the last infobar has been
186   // destroyed, uninstalls all themes that aren't the currently selected.
187   void OnInfobarDestroyed();
188 
189   // Convert a bitfield alignment into a string like "top left". Public so that
190   // it can be used to generate CSS values. Takes a bitfield of AlignmentMasks.
191   static std::string AlignmentToString(int alignment);
192 
193   // Parse alignments from something like "top left" into a bitfield of
194   // AlignmentMasks
195   static int StringToAlignment(const std::string& alignment);
196 
197   // Convert a tiling value into a string like "no-repeat". Public
198   // so that it can be used to generate CSS values. Takes a Tiling.
199   static std::string TilingToString(int tiling);
200 
201   // Parse tiling values from something like "no-repeat" into a Tiling value.
202   static int StringToTiling(const std::string& tiling);
203 
204   // Returns the default tint for the given tint |id| TINT_* enum value.
205   static color_utils::HSL GetDefaultTint(int id);
206 
207   // Returns the default color for the given color |id| COLOR_* enum value.
208   static SkColor GetDefaultColor(int id);
209 
210   // Returns true and sets |result| to the requested default property, if |id|
211   // is valid.
212   static bool GetDefaultDisplayProperty(int id, int* result);
213 
214   // Returns the set of IDR_* resources that should be tinted.
215   static const std::set<int>& GetTintableToolbarButtons();
216 
217   // Remove preference values for themes that are no longer in use.
218   void RemoveUnusedThemes();
219 
220   // Save the images to be written to disk, mapping file path to id.
221   typedef std::map<FilePath, int> ImagesDiskCache;
222 
223  protected:
224   // Get the specified tint - |id| is one of the TINT_* enum values.
225   color_utils::HSL GetTint(int id) const;
226 
227   // Clears all the override fields and saves the dictionary.
228   virtual void ClearAllThemeData();
229 
230   // Load theme data from preferences.
231   virtual void LoadThemePrefs();
232 
233   // Let all the browser views know that themes have changed.
234   virtual void NotifyThemeChanged();
235 
236 #if defined(OS_MACOSX)
237   // Let all the browser views know that themes have changed in a platform way.
238   virtual void NotifyPlatformThemeChanged();
239 #endif  // OS_MACOSX
240 
241   // Clears the platform-specific caches. Do not call directly; it's called
242   // from ClearCaches().
243   virtual void FreePlatformCaches();
244 
profile()245   Profile* profile() { return profile_; }
246 
247   // NotificationObserver:
248   virtual void Observe(NotificationType type,
249                        const NotificationSource& source,
250                        const NotificationDetails& details);
251 
252  private:
253   friend class ThemeServiceTest;
254 
255   // Saves the filename of the cached theme pack.
256   void SavePackName(const FilePath& pack_path);
257 
258   // Save the id of the last theme installed.
259   void SaveThemeID(const std::string& id);
260 
261   // Implementation of SetTheme() (and the fallback from LoadThemePrefs() in
262   // case we don't have a theme pack).
263   void BuildFromExtension(const Extension* extension);
264 
265 #if defined(TOOLKIT_USES_GTK)
266   // Loads an image and flips it horizontally if |rtl_enabled| is true.
267   GdkPixbuf* GetPixbufImpl(int id, bool rtl_enabled) const;
268 #endif
269 
270 #if defined(TOOLKIT_USES_GTK)
271   typedef std::map<int, GdkPixbuf*> GdkPixbufMap;
272   mutable GdkPixbufMap gdk_pixbufs_;
273 #elif defined(OS_MACOSX)
274   typedef std::map<int, NSImage*> NSImageMap;
275   mutable NSImageMap nsimage_cache_;
276 
277   // The bool member of the pair is whether the color is a default color.
278   typedef std::map<int, std::pair<NSColor*, bool> > NSColorMap;
279   mutable NSColorMap nscolor_cache_;
280 
281   typedef std::map<int, NSGradient*> NSGradientMap;
282   mutable NSGradientMap nsgradient_cache_;
283 #endif
284 
285   ResourceBundle& rb_;
286   Profile* profile_;
287 
288   scoped_refptr<BrowserThemePack> theme_pack_;
289 
290   // The number of infobars currently displayed.
291   int number_of_infobars_;
292 
293   NotificationRegistrar registrar_;
294 
295   DISALLOW_COPY_AND_ASSIGN(ThemeService);
296 };
297 
298 #endif  // CHROME_BROWSER_THEMES_THEME_SERVICE_H_
299