• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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.
4 
5 // Defines the classes to realize the Font Settings Extension API as specified
6 // in the extension API JSON.
7 
8 #ifndef CHROME_BROWSER_EXTENSIONS_API_FONT_SETTINGS_FONT_SETTINGS_API_H_
9 #define CHROME_BROWSER_EXTENSIONS_API_FONT_SETTINGS_FONT_SETTINGS_API_H_
10 
11 #include <string>
12 
13 #include "base/memory/scoped_ptr.h"
14 #include "base/prefs/pref_change_registrar.h"
15 #include "base/prefs/pref_service.h"
16 #include "chrome/browser/extensions/chrome_extension_function.h"
17 #include "extensions/browser/browser_context_keyed_api_factory.h"
18 #include "extensions/browser/event_router.h"
19 
20 class Profile;
21 
22 namespace content {
23 class BrowserContext;
24 }
25 
26 namespace extensions {
27 
28 // This class observes pref changed events on a profile and dispatches the
29 // corresponding extension API events to extensions.
30 class FontSettingsEventRouter {
31  public:
32   // Constructor for observing pref changed events on |profile|. Stores a
33   // pointer to |profile| but does not take ownership. |profile| must be
34   // non-NULL and remain alive for the lifetime of the instance.
35   explicit FontSettingsEventRouter(Profile* profile);
36   virtual ~FontSettingsEventRouter();
37 
38  private:
39   // Observes browser pref |pref_name|. When a change is observed, dispatches
40   // event |event_name| to extensions. A JavaScript object is passed to the
41   // extension event function with the new value of the pref in property |key|.
42   void AddPrefToObserve(const char* pref_name,
43                         const char* event_name,
44                         const char* key);
45 
46   // Decodes a preference change for a font family map and invokes
47   // OnFontNamePrefChange with the right parameters.
48   void OnFontFamilyMapPrefChanged(const std::string& pref_name);
49 
50   // Dispatches a changed event for the font setting for |generic_family| and
51   // |script| to extensions. The new value of the setting is the value of
52   // browser pref |pref_name|.
53   void OnFontNamePrefChanged(const std::string& pref_name,
54                              const std::string& generic_family,
55                              const std::string& script);
56 
57   // Dispatches the setting changed event |event_name| to extensions. The new
58   // value of the setting is the value of browser pref |pref_name|. This value
59   // is passed in the JavaScript object argument to the extension event function
60   // under the key |key|.
61   void OnFontPrefChanged(const std::string& event_name,
62                          const std::string& key,
63                          const std::string& pref_name);
64 
65   // Manages pref observation registration.
66   PrefChangeRegistrar registrar_;
67 
68   // Weak, owns us (transitively via ExtensionService).
69   Profile* profile_;
70 
71   DISALLOW_COPY_AND_ASSIGN(FontSettingsEventRouter);
72 };
73 
74 // The profile-keyed service that manages the font_settings extension API.
75 // This is not an EventRouter::Observer (and does not lazily initialize) because
76 // doing so caused a regression in perf tests. See crbug.com/163466.
77 class FontSettingsAPI : public BrowserContextKeyedAPI {
78  public:
79   explicit FontSettingsAPI(content::BrowserContext* context);
80   virtual ~FontSettingsAPI();
81 
82   // BrowserContextKeyedAPI implementation.
83   static BrowserContextKeyedAPIFactory<FontSettingsAPI>* GetFactoryInstance();
84 
85  private:
86   friend class BrowserContextKeyedAPIFactory<FontSettingsAPI>;
87 
88   // BrowserContextKeyedAPI implementation.
service_name()89   static const char* service_name() {
90     return "FontSettingsAPI";
91   }
92   static const bool kServiceIsNULLWhileTesting = true;
93 
94   scoped_ptr<FontSettingsEventRouter> font_settings_event_router_;
95 };
96 
97 // fontSettings.clearFont API function.
98 class FontSettingsClearFontFunction : public ChromeSyncExtensionFunction {
99  public:
100   DECLARE_EXTENSION_FUNCTION("fontSettings.clearFont", FONTSETTINGS_CLEARFONT)
101 
102  protected:
103   // RefCounted types have non-public destructors, as with all extension
104   // functions in this file.
~FontSettingsClearFontFunction()105   virtual ~FontSettingsClearFontFunction() {}
106 
107   // ExtensionFunction:
108   virtual bool RunSync() OVERRIDE;
109 };
110 
111 // fontSettings.getFont API function.
112 class FontSettingsGetFontFunction : public ChromeSyncExtensionFunction {
113  public:
114   DECLARE_EXTENSION_FUNCTION("fontSettings.getFont", FONTSETTINGS_GETFONT)
115 
116  protected:
~FontSettingsGetFontFunction()117   virtual ~FontSettingsGetFontFunction() {}
118 
119   // ExtensionFunction:
120   virtual bool RunSync() OVERRIDE;
121 };
122 
123 // fontSettings.setFont API function.
124 class FontSettingsSetFontFunction : public ChromeSyncExtensionFunction {
125  public:
126   DECLARE_EXTENSION_FUNCTION("fontSettings.setFont", FONTSETTINGS_SETFONT)
127 
128  protected:
~FontSettingsSetFontFunction()129   virtual ~FontSettingsSetFontFunction() {}
130 
131   // ExtensionFunction:
132   virtual bool RunSync() OVERRIDE;
133 };
134 
135 // fontSettings.getFontList API function.
136 class FontSettingsGetFontListFunction : public ChromeAsyncExtensionFunction {
137  public:
138   DECLARE_EXTENSION_FUNCTION("fontSettings.getFontList",
139                              FONTSETTINGS_GETFONTLIST)
140 
141  protected:
~FontSettingsGetFontListFunction()142   virtual ~FontSettingsGetFontListFunction() {}
143 
144   // ExtensionFunction:
145   virtual bool RunAsync() OVERRIDE;
146 
147  private:
148   void FontListHasLoaded(scoped_ptr<base::ListValue> list);
149   bool CopyFontsToResult(base::ListValue* fonts);
150 };
151 
152 // Base class for extension API functions that clear a browser font pref.
153 class ClearFontPrefExtensionFunction : public ChromeSyncExtensionFunction {
154  protected:
~ClearFontPrefExtensionFunction()155   virtual ~ClearFontPrefExtensionFunction() {}
156 
157   // ExtensionFunction:
158   virtual bool RunSync() OVERRIDE;
159 
160   // Implementations should return the name of the preference to clear, like
161   // "webkit.webprefs.default_font_size".
162   virtual const char* GetPrefName() = 0;
163 };
164 
165 // Base class for extension API functions that get a browser font pref.
166 class GetFontPrefExtensionFunction : public ChromeSyncExtensionFunction {
167  protected:
~GetFontPrefExtensionFunction()168   virtual ~GetFontPrefExtensionFunction() {}
169 
170   // ExtensionFunction:
171   virtual bool RunSync() OVERRIDE;
172 
173   // Implementations should return the name of the preference to get, like
174   // "webkit.webprefs.default_font_size".
175   virtual const char* GetPrefName() = 0;
176 
177   // Implementations should return the key for the value in the extension API,
178   // like "pixelSize".
179   virtual const char* GetKey() = 0;
180 };
181 
182 // Base class for extension API functions that set a browser font pref.
183 class SetFontPrefExtensionFunction : public ChromeSyncExtensionFunction {
184  protected:
~SetFontPrefExtensionFunction()185   virtual ~SetFontPrefExtensionFunction() {}
186 
187   // ExtensionFunction:
188   virtual bool RunSync() OVERRIDE;
189 
190   // Implementations should return the name of the preference to set, like
191   // "webkit.webprefs.default_font_size".
192   virtual const char* GetPrefName() = 0;
193 
194   // Implementations should return the key for the value in the extension API,
195   // like "pixelSize".
196   virtual const char* GetKey() = 0;
197 };
198 
199 // The following are get/set/clear API functions that act on a browser font
200 // pref.
201 
202 class FontSettingsClearDefaultFontSizeFunction
203     : public ClearFontPrefExtensionFunction {
204  public:
205   DECLARE_EXTENSION_FUNCTION("fontSettings.clearDefaultFontSize",
206                              FONTSETTINGS_CLEARDEFAULTFONTSIZE)
207 
208  protected:
~FontSettingsClearDefaultFontSizeFunction()209   virtual ~FontSettingsClearDefaultFontSizeFunction() {}
210 
211   // ClearFontPrefExtensionFunction:
212   virtual const char* GetPrefName() OVERRIDE;
213 };
214 
215 class FontSettingsGetDefaultFontSizeFunction
216     : public GetFontPrefExtensionFunction {
217  public:
218   DECLARE_EXTENSION_FUNCTION("fontSettings.getDefaultFontSize",
219                              FONTSETTINGS_GETDEFAULTFONTSIZE)
220 
221  protected:
~FontSettingsGetDefaultFontSizeFunction()222   virtual ~FontSettingsGetDefaultFontSizeFunction() {}
223 
224   // GetFontPrefExtensionFunction:
225   virtual const char* GetPrefName() OVERRIDE;
226   virtual const char* GetKey() OVERRIDE;
227 };
228 
229 class FontSettingsSetDefaultFontSizeFunction
230     : public SetFontPrefExtensionFunction {
231  public:
232   DECLARE_EXTENSION_FUNCTION("fontSettings.setDefaultFontSize",
233                              FONTSETTINGS_SETDEFAULTFONTSIZE)
234 
235  protected:
~FontSettingsSetDefaultFontSizeFunction()236   virtual ~FontSettingsSetDefaultFontSizeFunction() {}
237 
238   // SetFontPrefExtensionFunction:
239   virtual const char* GetPrefName() OVERRIDE;
240   virtual const char* GetKey() OVERRIDE;
241 };
242 
243 class FontSettingsClearDefaultFixedFontSizeFunction
244     : public ClearFontPrefExtensionFunction {
245  public:
246   DECLARE_EXTENSION_FUNCTION("fontSettings.clearDefaultFixedFontSize",
247                              FONTSETTINGS_CLEARDEFAULTFIXEDFONTSIZE)
248 
249  protected:
~FontSettingsClearDefaultFixedFontSizeFunction()250   virtual ~FontSettingsClearDefaultFixedFontSizeFunction() {}
251 
252   // ClearFontPrefExtensionFunction:
253   virtual const char* GetPrefName() OVERRIDE;
254 };
255 
256 class FontSettingsGetDefaultFixedFontSizeFunction
257     : public GetFontPrefExtensionFunction {
258  public:
259   DECLARE_EXTENSION_FUNCTION("fontSettings.getDefaultFixedFontSize",
260                              FONTSETTINGS_GETDEFAULTFIXEDFONTSIZE)
261 
262  protected:
~FontSettingsGetDefaultFixedFontSizeFunction()263   virtual ~FontSettingsGetDefaultFixedFontSizeFunction() {}
264 
265   // GetFontPrefExtensionFunction:
266   virtual const char* GetPrefName() OVERRIDE;
267   virtual const char* GetKey() OVERRIDE;
268 };
269 
270 class FontSettingsSetDefaultFixedFontSizeFunction
271     : public SetFontPrefExtensionFunction {
272  public:
273   DECLARE_EXTENSION_FUNCTION("fontSettings.setDefaultFixedFontSize",
274                              FONTSETTINGS_SETDEFAULTFIXEDFONTSIZE)
275 
276  protected:
~FontSettingsSetDefaultFixedFontSizeFunction()277   virtual ~FontSettingsSetDefaultFixedFontSizeFunction() {}
278 
279   // SetFontPrefExtensionFunction:
280   virtual const char* GetPrefName() OVERRIDE;
281   virtual const char* GetKey() OVERRIDE;
282 };
283 
284 class FontSettingsClearMinimumFontSizeFunction
285     : public ClearFontPrefExtensionFunction {
286  public:
287   DECLARE_EXTENSION_FUNCTION("fontSettings.clearMinimumFontSize",
288                              FONTSETTINGS_CLEARMINIMUMFONTSIZE)
289 
290  protected:
~FontSettingsClearMinimumFontSizeFunction()291   virtual ~FontSettingsClearMinimumFontSizeFunction() {}
292 
293   // ClearFontPrefExtensionFunction:
294   virtual const char* GetPrefName() OVERRIDE;
295 };
296 
297 class FontSettingsGetMinimumFontSizeFunction
298     : public GetFontPrefExtensionFunction {
299  public:
300   DECLARE_EXTENSION_FUNCTION("fontSettings.getMinimumFontSize",
301                              FONTSETTINGS_GETMINIMUMFONTSIZE)
302 
303  protected:
~FontSettingsGetMinimumFontSizeFunction()304   virtual ~FontSettingsGetMinimumFontSizeFunction() {}
305 
306   // GetFontPrefExtensionFunction:
307   virtual const char* GetPrefName() OVERRIDE;
308   virtual const char* GetKey() OVERRIDE;
309 };
310 
311 class FontSettingsSetMinimumFontSizeFunction
312     : public SetFontPrefExtensionFunction {
313  public:
314   DECLARE_EXTENSION_FUNCTION("fontSettings.setMinimumFontSize",
315                              FONTSETTINGS_SETMINIMUMFONTSIZE)
316 
317  protected:
~FontSettingsSetMinimumFontSizeFunction()318   virtual ~FontSettingsSetMinimumFontSizeFunction() {}
319 
320   // SetFontPrefExtensionFunction:
321   virtual const char* GetPrefName() OVERRIDE;
322   virtual const char* GetKey() OVERRIDE;
323 };
324 
325 }  // namespace extensions
326 
327 #endif  // CHROME_BROWSER_EXTENSIONS_API_FONT_SETTINGS_FONT_SETTINGS_API_H_
328