| OLD | NEW |
| 1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #ifndef CHROME_BROWSER_EXTENSIONS_EXTENSIONS_SERVICE_H_ | 5 #ifndef CHROME_BROWSER_EXTENSIONS_EXTENSIONS_SERVICE_H_ |
| 6 #define CHROME_BROWSER_EXTENSIONS_EXTENSIONS_SERVICE_H_ | 6 #define CHROME_BROWSER_EXTENSIONS_EXTENSIONS_SERVICE_H_ |
| 7 | 7 |
| 8 #include <map> | 8 #include <map> |
| 9 #include <set> | 9 #include <set> |
| 10 #include <string> | 10 #include <string> |
| (...skipping 19 matching lines...) Expand all Loading... |
| 30 class ExtensionUpdater; | 30 class ExtensionUpdater; |
| 31 class GURL; | 31 class GURL; |
| 32 class MessageLoop; | 32 class MessageLoop; |
| 33 class PrefService; | 33 class PrefService; |
| 34 class Profile; | 34 class Profile; |
| 35 class ResourceDispatcherHost; | 35 class ResourceDispatcherHost; |
| 36 class SiteInstance; | 36 class SiteInstance; |
| 37 | 37 |
| 38 typedef std::vector<Extension*> ExtensionList; | 38 typedef std::vector<Extension*> ExtensionList; |
| 39 | 39 |
| 40 // A callback for when installs finish. If the Extension* parameter is | |
| 41 // null then the install failed. | |
| 42 typedef Callback2<const FilePath&, Extension*>::Type ExtensionInstallCallback; | |
| 43 | |
| 44 // This is an interface class to encapsulate the dependencies that | 40 // This is an interface class to encapsulate the dependencies that |
| 45 // ExtensionUpdater has on ExtensionsService. This allows easy mocking. | 41 // ExtensionUpdater has on ExtensionsService. This allows easy mocking. |
| 46 class ExtensionUpdateService { | 42 class ExtensionUpdateService { |
| 47 public: | 43 public: |
| 48 virtual ~ExtensionUpdateService() {} | 44 virtual ~ExtensionUpdateService() {} |
| 49 virtual const ExtensionList* extensions() const = 0; | 45 virtual const ExtensionList* extensions() const = 0; |
| 50 virtual void UpdateExtension(const std::string& id, | 46 virtual void UpdateExtension(const std::string& id, const FilePath& path) = 0; |
| 51 const FilePath& path, | |
| 52 bool alert_on_error, | |
| 53 ExtensionInstallCallback* callback) = 0; | |
| 54 virtual Extension* GetExtensionById(const std::string& id) = 0; | 47 virtual Extension* GetExtensionById(const std::string& id) = 0; |
| 55 }; | 48 }; |
| 56 | 49 |
| 57 // Manages installed and running Chromium extensions. | 50 // Manages installed and running Chromium extensions. |
| 58 class ExtensionsService | 51 class ExtensionsService |
| 59 : public ExtensionUpdateService, | 52 : public ExtensionUpdateService, |
| 60 public base::RefCountedThreadSafe<ExtensionsService> { | 53 public base::RefCountedThreadSafe<ExtensionsService> { |
| 61 public: | 54 public: |
| 62 | 55 |
| 63 // The name of the directory inside the profile where extensions are | 56 // The name of the directory inside the profile where extensions are |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 105 // immediately loaded. | 98 // immediately loaded. |
| 106 void InstallExtension(const FilePath& extension_path); | 99 void InstallExtension(const FilePath& extension_path); |
| 107 | 100 |
| 108 // XXX Hack: This is a temporary nasty hack to get theme installation working | 101 // XXX Hack: This is a temporary nasty hack to get theme installation working |
| 109 // without a dialog. Will be fixed by making ExtensionsService more modular. | 102 // without a dialog. Will be fixed by making ExtensionsService more modular. |
| 110 void InstallExtension(const FilePath& extension_path, | 103 void InstallExtension(const FilePath& extension_path, |
| 111 const GURL& download_url, | 104 const GURL& download_url, |
| 112 const GURL& referrer_url); | 105 const GURL& referrer_url); |
| 113 | 106 |
| 114 // Updates a currently-installed extension with the contents from | 107 // Updates a currently-installed extension with the contents from |
| 115 // |extension_path|. The |alert_on_error| parameter controls whether the | 108 // |extension_path|. |
| 116 // user will be notified in the event of failure. If |callback| is non-null, | |
| 117 // it will be called back when the update is finished (in success or failure). | |
| 118 // This is useful to know when the service is done using |extension_path|. | |
| 119 // Also, this takes ownership of |callback| if it's non-null. | |
| 120 virtual void UpdateExtension(const std::string& id, | 109 virtual void UpdateExtension(const std::string& id, |
| 121 const FilePath& extension_path, | 110 const FilePath& extension_path); |
| 122 bool alert_on_error, | |
| 123 ExtensionInstallCallback* callback); | |
| 124 | 111 |
| 125 // Uninstalls the specified extension. Callers should only call this method | 112 // Uninstalls the specified extension. Callers should only call this method |
| 126 // with extensions that exist. |external_uninstall| is a magical parameter | 113 // with extensions that exist. |external_uninstall| is a magical parameter |
| 127 // that is only used to send information to ExtensionPrefs, which external | 114 // that is only used to send information to ExtensionPrefs, which external |
| 128 // callers should never set to true. | 115 // callers should never set to true. |
| 129 // TODO(aa): Remove |external_uninstall| -- this information should be passed | 116 // TODO(aa): Remove |external_uninstall| -- this information should be passed |
| 130 // to ExtensionPrefs some other way. | 117 // to ExtensionPrefs some other way. |
| 131 void UninstallExtension(const std::string& extension_id, | 118 void UninstallExtension(const std::string& extension_id, |
| 132 bool external_uninstall); | 119 bool external_uninstall); |
| 133 | 120 |
| (...skipping 25 matching lines...) Expand all Loading... |
| 159 Extension* GetExtensionByURL(const GURL& url); | 146 Extension* GetExtensionByURL(const GURL& url); |
| 160 | 147 |
| 161 // Clear all ExternalExtensionProviders. | 148 // Clear all ExternalExtensionProviders. |
| 162 void ClearProvidersForTesting(); | 149 void ClearProvidersForTesting(); |
| 163 | 150 |
| 164 // Sets an ExternalExtensionProvider for the service to use during testing. | 151 // Sets an ExternalExtensionProvider for the service to use during testing. |
| 165 // |location| specifies what type of provider should be added. | 152 // |location| specifies what type of provider should be added. |
| 166 void SetProviderForTesting(Extension::Location location, | 153 void SetProviderForTesting(Extension::Location location, |
| 167 ExternalExtensionProvider* test_provider); | 154 ExternalExtensionProvider* test_provider); |
| 168 | 155 |
| 169 void SetExtensionsEnabled(bool enabled); | 156 // Called by the backend when the initial extension load has completed. |
| 157 void OnLoadedInstalledExtensions(); |
| 158 |
| 159 // Called by the backend when extensions have been loaded. |
| 160 void OnExtensionsLoaded(ExtensionList* extensions); |
| 161 |
| 162 // Called by the backend when an extension has been installed. |
| 163 void OnExtensionInstalled(Extension* extension); |
| 164 |
| 165 // Called by the backend when an attempt was made to reinstall the same |
| 166 // version of an existing extension. |
| 167 void OnExtensionOverinstallAttempted(const std::string& id); |
| 168 |
| 169 // Called by the backend when an external extension is found. |
| 170 void OnExternalExtensionFound(const std::string& id, |
| 171 const std::string& version, |
| 172 const FilePath& path, |
| 173 Extension::Location location); |
| 174 |
| 175 void set_extensions_enabled(bool enabled) { extensions_enabled_ = enabled; } |
| 170 bool extensions_enabled() { return extensions_enabled_; } | 176 bool extensions_enabled() { return extensions_enabled_; } |
| 171 | 177 |
| 172 void set_show_extensions_prompts(bool enabled) { | 178 void set_show_extensions_prompts(bool enabled) { |
| 173 show_extensions_prompts_ = enabled; | 179 show_extensions_prompts_ = enabled; |
| 174 } | 180 } |
| 175 | 181 |
| 176 bool show_extensions_prompts() { | 182 bool show_extensions_prompts() { |
| 177 return show_extensions_prompts_; | 183 return show_extensions_prompts_; |
| 178 } | 184 } |
| 179 | 185 |
| 180 // Profile calls this when it is destroyed so that we know not to call it. | 186 // Profile calls this when it is destroyed so that we know not to call it. |
| 181 void ProfileDestroyed() { profile_ = NULL; } | 187 void ProfileDestroyed() { profile_ = NULL; } |
| 182 | 188 |
| 183 ExtensionPrefs* extension_prefs() { return extension_prefs_.get(); } | 189 ExtensionPrefs* extension_prefs() { return extension_prefs_.get(); } |
| 184 | 190 |
| 185 // Whether the extension service is ready. | 191 // Whether the extension service is ready. |
| 186 bool is_ready() { return ready_; } | 192 bool is_ready() { return ready_; } |
| 187 | 193 |
| 188 private: | 194 private: |
| 189 // For OnExtensionLoaded, OnExtensionInstalled, and | |
| 190 // OnExtensionVersionReinstalled. | |
| 191 friend class ExtensionsServiceBackend; | |
| 192 | |
| 193 // Called by the backend when the initial extension load has completed. | |
| 194 void OnLoadedInstalledExtensions(); | |
| 195 | |
| 196 // Called by the backend when extensions have been loaded. | |
| 197 void OnExtensionsLoaded(ExtensionList* extensions); | |
| 198 | |
| 199 // Called by the backend when an extension has been installed. | |
| 200 void OnExtensionInstalled(const FilePath& path, Extension* extension, | |
| 201 Extension::InstallType install_type); | |
| 202 | |
| 203 // Calls and then removes any registered install callback for |path|. | |
| 204 void FireInstallCallback(const FilePath& path, Extension* extension); | |
| 205 | |
| 206 // Called by the backend when there was an error installing an extension. | |
| 207 void OnExtenionInstallError(const FilePath& path); | |
| 208 | |
| 209 // Called by the backend when an attempt was made to reinstall the same | |
| 210 // version of an existing extension. | |
| 211 void OnExtensionOverinstallAttempted(const std::string& id, | |
| 212 const FilePath& path); | |
| 213 | |
| 214 // Show a confirm installation infobar on the currently active tab. | 195 // Show a confirm installation infobar on the currently active tab. |
| 215 // TODO(aa): This should be moved up into the UI and attached to the tab it | 196 // TODO(aa): This should be moved up into the UI and attached to the tab it |
| 216 // actually occured in. This requires some modularization of | 197 // actually occured in. This requires some modularization of |
| 217 // ExtensionsService. | 198 // ExtensionsService. |
| 218 bool ShowThemePreviewInfobar(Extension* extension); | 199 bool ShowThemePreviewInfobar(Extension* extension); |
| 219 | 200 |
| 220 // The profile this ExtensionsService is part of. | 201 // The profile this ExtensionsService is part of. |
| 221 Profile* profile_; | 202 Profile* profile_; |
| 222 | 203 |
| 223 // Preferences for the owning profile. | 204 // Preferences for the owning profile. |
| (...skipping 10 matching lines...) Expand all Loading... |
| 234 | 215 |
| 235 // Whether or not extensions are enabled. | 216 // Whether or not extensions are enabled. |
| 236 bool extensions_enabled_; | 217 bool extensions_enabled_; |
| 237 | 218 |
| 238 // Whether to notify users when they attempt to install an extension. | 219 // Whether to notify users when they attempt to install an extension. |
| 239 bool show_extensions_prompts_; | 220 bool show_extensions_prompts_; |
| 240 | 221 |
| 241 // The backend that will do IO on behalf of this instance. | 222 // The backend that will do IO on behalf of this instance. |
| 242 scoped_refptr<ExtensionsServiceBackend> backend_; | 223 scoped_refptr<ExtensionsServiceBackend> backend_; |
| 243 | 224 |
| 244 // Stores data we'll need to do callbacks as installs complete. | |
| 245 typedef std::map<FilePath, linked_ptr<ExtensionInstallCallback> > CallbackMap; | |
| 246 CallbackMap install_callbacks_; | |
| 247 | |
| 248 // Is the service ready to go? | 225 // Is the service ready to go? |
| 249 bool ready_; | 226 bool ready_; |
| 250 | 227 |
| 251 // Our extension updater, if updates are turned on. | 228 // Our extension updater, if updates are turned on. |
| 252 scoped_refptr<ExtensionUpdater> updater_; | 229 scoped_refptr<ExtensionUpdater> updater_; |
| 253 | 230 |
| 254 DISALLOW_COPY_AND_ASSIGN(ExtensionsService); | 231 DISALLOW_COPY_AND_ASSIGN(ExtensionsService); |
| 255 }; | 232 }; |
| 256 | 233 |
| 257 // Implements IO for the ExtensionsService. | 234 // Implements IO for the ExtensionsService. |
| 258 // TODO(aa): This can probably move into the .cc file. | 235 // TODO(aa): This can probably move into the .cc file. |
| 259 class ExtensionsServiceBackend | 236 class ExtensionsServiceBackend |
| 260 : public base::RefCountedThreadSafe<ExtensionsServiceBackend>, | 237 : public base::RefCountedThreadSafe<ExtensionsServiceBackend>, |
| 261 public ExternalExtensionProvider::Visitor { | 238 public ExternalExtensionProvider::Visitor { |
| 262 public: | 239 public: |
| 263 // |rdh| can be NULL in the case of test environment. | 240 // |rdh| can be NULL in the case of test environment. |
| 264 // |extension_prefs| contains a dictionary value that points to the extension | 241 // |extension_prefs| contains a dictionary value that points to the extension |
| 265 // preferences. | 242 // preferences. |
| 266 ExtensionsServiceBackend(const FilePath& install_directory, | 243 ExtensionsServiceBackend(const FilePath& install_directory, |
| 267 ResourceDispatcherHost* rdh, | 244 MessageLoop* frontend_loop); |
| 268 MessageLoop* frontend_loop, | |
| 269 bool extensions_enabled); | |
| 270 | 245 |
| 271 virtual ~ExtensionsServiceBackend(); | 246 virtual ~ExtensionsServiceBackend(); |
| 272 | 247 |
| 273 void set_extensions_enabled(bool enabled) { extensions_enabled_ = enabled; } | |
| 274 | |
| 275 // Loads the installed extensions. | 248 // Loads the installed extensions. |
| 276 // Errors are reported through ExtensionErrorReporter. On completion, | 249 // Errors are reported through ExtensionErrorReporter. On completion, |
| 277 // OnExtensionsLoaded() is called with any successfully loaded extensions. | 250 // OnExtensionsLoaded() is called with any successfully loaded extensions. |
| 278 void LoadInstalledExtensions(scoped_refptr<ExtensionsService> frontend, | 251 void LoadInstalledExtensions(scoped_refptr<ExtensionsService> frontend, |
| 279 InstalledExtensions* installed); | 252 InstalledExtensions* installed); |
| 280 | 253 |
| 281 // Loads a single extension from |path| where |path| is the top directory of | 254 // Loads a single extension from |path| where |path| is the top directory of |
| 282 // a specific extension where its manifest file lives. | 255 // a specific extension where its manifest file lives. |
| 283 // Errors are reported through ExtensionErrorReporter. On completion, | 256 // Errors are reported through ExtensionErrorReporter. On completion, |
| 284 // OnExtensionsLoadedFromDirectory() is called with any successfully loaded | 257 // OnExtensionsLoadedFromDirectory() is called with any successfully loaded |
| 285 // extensions. | 258 // extensions. |
| 286 // TODO(erikkay): It might be useful to be able to load a packed extension | 259 // TODO(erikkay): It might be useful to be able to load a packed extension |
| 287 // (presumably into memory) without installing it. | 260 // (presumably into memory) without installing it. |
| 288 void LoadSingleExtension(const FilePath &path, | 261 void LoadSingleExtension(const FilePath &path, |
| 289 scoped_refptr<ExtensionsService> frontend); | 262 scoped_refptr<ExtensionsService> frontend); |
| 290 | 263 |
| 291 // Install the extension file at |extension_path|. Errors are reported through | |
| 292 // ExtensionErrorReporter. OnExtensionInstalled is called in the frontend on | |
| 293 // success. | |
| 294 void InstallExtension(const FilePath& extension_path, bool from_gallery, | |
| 295 scoped_refptr<ExtensionsService> frontend); | |
| 296 | |
| 297 // Similar to InstallExtension, but |extension_path| must be an updated | |
| 298 // version of an installed extension with id of |id|. | |
| 299 void UpdateExtension(const std::string& id, | |
| 300 const FilePath& extension_path, | |
| 301 bool alert_on_error, | |
| 302 scoped_refptr<ExtensionsService> frontend); | |
| 303 | |
| 304 // Check externally updated extensions for updates and install if necessary. | 264 // Check externally updated extensions for updates and install if necessary. |
| 305 // Errors are reported through ExtensionErrorReporter. Succcess is not | 265 // Errors are reported through ExtensionErrorReporter. Succcess is not |
| 306 // reported. | 266 // reported. |
| 307 void CheckForExternalUpdates(std::set<std::string> ids_to_ignore, | 267 void CheckForExternalUpdates(std::set<std::string> ids_to_ignore, |
| 308 scoped_refptr<ExtensionsService> frontend); | 268 scoped_refptr<ExtensionsService> frontend); |
| 309 | 269 |
| 310 // Clear all ExternalExtensionProviders. | 270 // Clear all ExternalExtensionProviders. |
| 311 void ClearProvidersForTesting(); | 271 void ClearProvidersForTesting(); |
| 312 | 272 |
| 313 // Sets an ExternalExtensionProvider for the service to use during testing. | 273 // Sets an ExternalExtensionProvider for the service to use during testing. |
| 314 // |location| specifies what type of provider should be added. | 274 // |location| specifies what type of provider should be added. |
| 315 void SetProviderForTesting(Extension::Location location, | 275 void SetProviderForTesting(Extension::Location location, |
| 316 ExternalExtensionProvider* test_provider); | 276 ExternalExtensionProvider* test_provider); |
| 317 | 277 |
| 318 // ExternalExtensionProvider::Visitor implementation. | 278 // ExternalExtensionProvider::Visitor implementation. |
| 319 virtual void OnExternalExtensionFound(const std::string& id, | 279 virtual void OnExternalExtensionFound(const std::string& id, |
| 320 const Version* version, | 280 const Version* version, |
| 321 const FilePath& path); | 281 const FilePath& path, |
| 282 Extension::Location location); |
| 322 private: | 283 private: |
| 323 class UnpackerClient; | |
| 324 friend class UnpackerClient; | |
| 325 | |
| 326 // Loads a single installed extension. | 284 // Loads a single installed extension. |
| 327 void LoadInstalledExtension(const std::string& id, const FilePath& path, | 285 void LoadInstalledExtension(const std::string& id, const FilePath& path, |
| 328 Extension::Location location); | 286 Extension::Location location); |
| 329 | 287 |
| 330 // Install a crx file at |extension_path|. If |expected_id| is not empty, it's | |
| 331 // verified against the extension's manifest before installation. If the | |
| 332 // extension is already installed, install the new version only if its version | |
| 333 // number is greater than the current installed version. If |silent| is true, | |
| 334 // the confirmation dialog will not pop up. | |
| 335 void InstallOrUpdateExtension(const FilePath& extension_path, | |
| 336 bool from_gallery, | |
| 337 const std::string& expected_id, bool silent); | |
| 338 | |
| 339 // Finish installing the extension in |crx_path| after it has been unpacked to | 288 // Finish installing the extension in |crx_path| after it has been unpacked to |
| 340 // |unpacked_path|. If |expected_id| is not empty, it's verified against the | 289 // |unpacked_path|. If |expected_id| is not empty, it's verified against the |
| 341 // extension's manifest before installation. If |silent| is true, there will | 290 // extension's manifest before installation. If |silent| is true, there will |
| 342 // be no install confirmation dialog. |from_gallery| indicates whether the | 291 // be no install confirmation dialog. |from_gallery| indicates whether the |
| 343 // crx was installed from our gallery, which results in different UI. | 292 // crx was installed from our gallery, which results in different UI. |
| 344 // | 293 // |
| 345 // Note: We take ownership of |extension|. | 294 // Note: We take ownership of |extension|. |
| 346 void OnExtensionUnpacked( | 295 void OnExtensionUnpacked( |
| 347 const FilePath& crx_path, | 296 const FilePath& crx_path, |
| 348 const FilePath& unpacked_path, | 297 const FilePath& unpacked_path, |
| 349 Extension* extension, | 298 Extension* extension, |
| 350 const std::string expected_id, | 299 const std::string expected_id); |
| 351 bool silent, | |
| 352 bool from_gallery); | |
| 353 | 300 |
| 354 // Notify the frontend that there was an error loading an extension. | 301 // Notify the frontend that there was an error loading an extension. |
| 355 void ReportExtensionLoadError(const FilePath& extension_path, | 302 void ReportExtensionLoadError(const FilePath& extension_path, |
| 356 const std::string& error); | 303 const std::string& error); |
| 357 | 304 |
| 358 // Notify the frontend that extensions were loaded. | 305 // Notify the frontend that extensions were loaded. |
| 359 void ReportExtensionsLoaded(ExtensionList* extensions); | 306 void ReportExtensionsLoaded(ExtensionList* extensions); |
| 360 | 307 |
| 361 // Notify the frontend that there was an error installing an extension. | 308 // Notify the frontend that there was an error installing an extension. |
| 362 void ReportExtensionInstallError(const FilePath& extension_path, | 309 void ReportExtensionInstallError(const FilePath& extension_path, |
| 363 const std::string& error); | 310 const std::string& error); |
| 364 | 311 |
| 365 // Notify the frontend that an attempt was made (but not carried out) to | |
| 366 // install the same version of an existing extension. | |
| 367 void ReportExtensionOverinstallAttempted(const std::string& id, | |
| 368 const FilePath& path); | |
| 369 | |
| 370 // Lookup an external extension by |id| by going through all registered | 312 // Lookup an external extension by |id| by going through all registered |
| 371 // external extension providers until we find a provider that contains an | 313 // external extension providers until we find a provider that contains an |
| 372 // extension that matches. If |version| is not NULL, the extension version | 314 // extension that matches. If |version| is not NULL, the extension version |
| 373 // will be returned (caller is responsible for deleting that pointer). | 315 // will be returned (caller is responsible for deleting that pointer). |
| 374 // |location| can also be null, if not needed. Returns true if extension is | 316 // |location| can also be null, if not needed. Returns true if extension is |
| 375 // found, false otherwise. | 317 // found, false otherwise. |
| 376 bool LookupExternalExtension(const std::string& id, | 318 bool LookupExternalExtension(const std::string& id, |
| 377 Version** version, | 319 Version** version, |
| 378 Extension::Location* location); | 320 Extension::Location* location); |
| 379 | 321 |
| 380 // For the extension in |version_path| with |id|, check to see if it's an | 322 // For the extension in |version_path| with |id|, check to see if it's an |
| 381 // externally managed extension. If so return true if it should be | 323 // externally managed extension. If so return true if it should be |
| 382 // uninstalled. | 324 // uninstalled. |
| 383 bool CheckExternalUninstall(const std::string& id, | 325 bool CheckExternalUninstall(const std::string& id, |
| 384 Extension::Location location); | 326 Extension::Location location); |
| 385 | 327 |
| 386 // This is a naked pointer which is set by each entry point. | 328 // This is a naked pointer which is set by each entry point. |
| 387 // The entry point is responsible for ensuring lifetime. | 329 // The entry point is responsible for ensuring lifetime. |
| 388 ExtensionsService* frontend_; | 330 ExtensionsService* frontend_; |
| 389 | 331 |
| 390 // The top-level extensions directory being installed to. | 332 // The top-level extensions directory being installed to. |
| 391 FilePath install_directory_; | 333 FilePath install_directory_; |
| 392 | 334 |
| 393 // We only need a pointer to this to pass along to other interfaces. | |
| 394 ResourceDispatcherHost* resource_dispatcher_host_; | |
| 395 | |
| 396 // Whether errors result in noisy alerts. | 335 // Whether errors result in noisy alerts. |
| 397 bool alert_on_error_; | 336 bool alert_on_error_; |
| 398 | 337 |
| 399 // The message loop to use to call the frontend. | 338 // The message loop to use to call the frontend. |
| 400 MessageLoop* frontend_loop_; | 339 MessageLoop* frontend_loop_; |
| 401 | 340 |
| 402 // Whether non-theme extensions are enabled (themes and externally registered | |
| 403 // extensions are always enabled). | |
| 404 bool extensions_enabled_; | |
| 405 | |
| 406 // A map of all external extension providers. | 341 // A map of all external extension providers. |
| 407 typedef std::map<Extension::Location, | 342 typedef std::map<Extension::Location, |
| 408 linked_ptr<ExternalExtensionProvider> > ProviderMap; | 343 linked_ptr<ExternalExtensionProvider> > ProviderMap; |
| 409 ProviderMap external_extension_providers_; | 344 ProviderMap external_extension_providers_; |
| 410 | 345 |
| 411 DISALLOW_COPY_AND_ASSIGN(ExtensionsServiceBackend); | 346 DISALLOW_COPY_AND_ASSIGN(ExtensionsServiceBackend); |
| 412 }; | 347 }; |
| 413 | 348 |
| 414 #endif // CHROME_BROWSER_EXTENSIONS_EXTENSIONS_SERVICE_H_ | 349 #endif // CHROME_BROWSER_EXTENSIONS_EXTENSIONS_SERVICE_H_ |
| OLD | NEW |