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