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