| OLD | NEW |
| 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 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_EXTENSION_SERVICE_H_ |
| 6 #define CHROME_BROWSER_EXTENSIONS_EXTENSIONS_SERVICE_H_ | 6 #define CHROME_BROWSER_EXTENSIONS_EXTENSION_SERVICE_H_ |
| 7 #pragma once | 7 #pragma once |
| 8 | 8 |
| 9 #include <map> | 9 #include <map> |
| 10 #include <string> | 10 #include <string> |
| 11 #include <vector> | 11 #include <vector> |
| 12 | 12 |
| 13 #include "base/command_line.h" | 13 #include "base/command_line.h" |
| 14 #include "base/file_path.h" | 14 #include "base/file_path.h" |
| 15 #include "base/gtest_prod_util.h" | 15 #include "base/gtest_prod_util.h" |
| 16 #include "base/linked_ptr.h" | 16 #include "base/linked_ptr.h" |
| (...skipping 10 matching lines...) Expand all Loading... |
| 27 #include "chrome/browser/extensions/extension_toolbar_model.h" | 27 #include "chrome/browser/extensions/extension_toolbar_model.h" |
| 28 #include "chrome/browser/extensions/extensions_quota_service.h" | 28 #include "chrome/browser/extensions/extensions_quota_service.h" |
| 29 #include "chrome/browser/extensions/external_extension_provider.h" | 29 #include "chrome/browser/extensions/external_extension_provider.h" |
| 30 #include "chrome/browser/extensions/sandboxed_extension_unpacker.h" | 30 #include "chrome/browser/extensions/sandboxed_extension_unpacker.h" |
| 31 #include "chrome/browser/prefs/pref_change_registrar.h" | 31 #include "chrome/browser/prefs/pref_change_registrar.h" |
| 32 #include "chrome/common/notification_observer.h" | 32 #include "chrome/common/notification_observer.h" |
| 33 #include "chrome/common/notification_registrar.h" | 33 #include "chrome/common/notification_registrar.h" |
| 34 #include "chrome/common/extensions/extension.h" | 34 #include "chrome/common/extensions/extension.h" |
| 35 #include "chrome/common/property_bag.h" | 35 #include "chrome/common/property_bag.h" |
| 36 | 36 |
| 37 class ExtensionsServiceBackend; | 37 class ExtensionServiceBackend; |
| 38 class ExtensionToolbarModel; | 38 class ExtensionToolbarModel; |
| 39 class ExtensionUpdater; | 39 class ExtensionUpdater; |
| 40 class GURL; | 40 class GURL; |
| 41 class Profile; | 41 class Profile; |
| 42 class Version; | 42 class Version; |
| 43 | 43 |
| 44 // A pending extension is an extension that hasn't been installed yet | 44 // A pending extension is an extension that hasn't been installed yet |
| 45 // and is intended to be installed in the next auto-update cycle. The | 45 // and is intended to be installed in the next auto-update cycle. The |
| 46 // update URL of a pending extension may be blank, in which case a | 46 // update URL of a pending extension may be blank, in which case a |
| 47 // default one is assumed. | 47 // default one is assumed. |
| (...skipping 25 matching lines...) Expand all Loading... |
| 73 bool enable_on_install; | 73 bool enable_on_install; |
| 74 bool enable_incognito_on_install; | 74 bool enable_incognito_on_install; |
| 75 Extension::Location install_source; | 75 Extension::Location install_source; |
| 76 }; | 76 }; |
| 77 | 77 |
| 78 // A PendingExtensionMap is a map from IDs of pending extensions to | 78 // A PendingExtensionMap is a map from IDs of pending extensions to |
| 79 // their info. | 79 // their info. |
| 80 typedef std::map<std::string, PendingExtensionInfo> PendingExtensionMap; | 80 typedef std::map<std::string, PendingExtensionInfo> PendingExtensionMap; |
| 81 | 81 |
| 82 // This is an interface class to encapsulate the dependencies that | 82 // This is an interface class to encapsulate the dependencies that |
| 83 // ExtensionUpdater has on ExtensionsService. This allows easy mocking. | 83 // ExtensionUpdater has on ExtensionService. This allows easy mocking. |
| 84 class ExtensionUpdateService { | 84 class ExtensionUpdateService { |
| 85 public: | 85 public: |
| 86 virtual ~ExtensionUpdateService() {} | 86 virtual ~ExtensionUpdateService() {} |
| 87 virtual const ExtensionList* extensions() const = 0; | 87 virtual const ExtensionList* extensions() const = 0; |
| 88 virtual const PendingExtensionMap& pending_extensions() const = 0; | 88 virtual const PendingExtensionMap& pending_extensions() const = 0; |
| 89 virtual void UpdateExtension(const std::string& id, const FilePath& path, | 89 virtual void UpdateExtension(const std::string& id, const FilePath& path, |
| 90 const GURL& download_url) = 0; | 90 const GURL& download_url) = 0; |
| 91 virtual const Extension* GetExtensionById(const std::string& id, | 91 virtual const Extension* GetExtensionById(const std::string& id, |
| 92 bool include_disabled) = 0; | 92 bool include_disabled) = 0; |
| 93 virtual void UpdateExtensionBlacklist( | 93 virtual void UpdateExtensionBlacklist( |
| 94 const std::vector<std::string>& blacklist) = 0; | 94 const std::vector<std::string>& blacklist) = 0; |
| 95 virtual void CheckAdminBlacklist() = 0; | 95 virtual void CheckAdminBlacklist() = 0; |
| 96 virtual bool HasInstalledExtensions() = 0; | 96 virtual bool HasInstalledExtensions() = 0; |
| 97 | 97 |
| 98 virtual ExtensionPrefs* extension_prefs() = 0; | 98 virtual ExtensionPrefs* extension_prefs() = 0; |
| 99 }; | 99 }; |
| 100 | 100 |
| 101 // Manages installed and running Chromium extensions. | 101 // Manages installed and running Chromium extensions. |
| 102 class ExtensionsService | 102 class ExtensionService |
| 103 : public base::RefCountedThreadSafe<ExtensionsService, | 103 : public base::RefCountedThreadSafe<ExtensionService, |
| 104 BrowserThread::DeleteOnUIThread>, | 104 BrowserThread::DeleteOnUIThread>, |
| 105 public ExtensionUpdateService, | 105 public ExtensionUpdateService, |
| 106 public NotificationObserver { | 106 public NotificationObserver { |
| 107 public: | 107 public: |
| 108 // Information about a registered component extension. | 108 // Information about a registered component extension. |
| 109 struct ComponentExtensionInfo { | 109 struct ComponentExtensionInfo { |
| 110 ComponentExtensionInfo(const std::string& manifest, | 110 ComponentExtensionInfo(const std::string& manifest, |
| 111 const FilePath& root_directory) | 111 const FilePath& root_directory) |
| 112 : manifest(manifest), | 112 : manifest(manifest), |
| 113 root_directory(root_directory) { | 113 root_directory(root_directory) { |
| 114 } | 114 } |
| 115 | 115 |
| 116 // The extension's manifest. This is required for component extensions so | 116 // The extension's manifest. This is required for component extensions so |
| 117 // that ExtensionsService doesn't need to go to disk to load them. | 117 // that ExtensionService doesn't need to go to disk to load them. |
| 118 std::string manifest; | 118 std::string manifest; |
| 119 | 119 |
| 120 // Directory where the extension is stored. | 120 // Directory where the extension is stored. |
| 121 FilePath root_directory; | 121 FilePath root_directory; |
| 122 }; | 122 }; |
| 123 | 123 |
| 124 // The name of the directory inside the profile where extensions are | 124 // The name of the directory inside the profile where extensions are |
| 125 // installed to. | 125 // installed to. |
| 126 static const char* kInstallDirectoryName; | 126 static const char* kInstallDirectoryName; |
| 127 | 127 |
| (...skipping 11 matching lines...) Expand all Loading... |
| 139 | 139 |
| 140 // Determine if the downloaded extension came from the theme mini-gallery, | 140 // Determine if the downloaded extension came from the theme mini-gallery, |
| 141 // Used to test if we need to show the "Loading" dialog for themes. | 141 // Used to test if we need to show the "Loading" dialog for themes. |
| 142 static bool IsDownloadFromMiniGallery(const GURL& download_url); | 142 static bool IsDownloadFromMiniGallery(const GURL& download_url); |
| 143 | 143 |
| 144 // Returns whether the URL is from either a hosted or packaged app. | 144 // Returns whether the URL is from either a hosted or packaged app. |
| 145 bool IsInstalledApp(const GURL& url); | 145 bool IsInstalledApp(const GURL& url); |
| 146 | 146 |
| 147 // Attempts to uninstall an extension from a given ExtensionService. Returns | 147 // Attempts to uninstall an extension from a given ExtensionService. Returns |
| 148 // true iff the target extension exists. | 148 // true iff the target extension exists. |
| 149 static bool UninstallExtensionHelper(ExtensionsService* extensions_service, | 149 static bool UninstallExtensionHelper(ExtensionService* extensions_service, |
| 150 const std::string& extension_id); | 150 const std::string& extension_id); |
| 151 | 151 |
| 152 // Constructor stores pointers to |profile| and |extension_prefs| but | 152 // Constructor stores pointers to |profile| and |extension_prefs| but |
| 153 // ownership remains at caller. | 153 // ownership remains at caller. |
| 154 ExtensionsService(Profile* profile, | 154 ExtensionService(Profile* profile, |
| 155 const CommandLine* command_line, | 155 const CommandLine* command_line, |
| 156 const FilePath& install_directory, | 156 const FilePath& install_directory, |
| 157 ExtensionPrefs* extension_prefs, | 157 ExtensionPrefs* extension_prefs, |
| 158 bool autoupdate_enabled); | 158 bool autoupdate_enabled); |
| 159 | 159 |
| 160 // Gets the list of currently installed extensions. | 160 // Gets the list of currently installed extensions. |
| 161 virtual const ExtensionList* extensions() const; | 161 virtual const ExtensionList* extensions() const; |
| 162 virtual const ExtensionList* disabled_extensions() const; | 162 virtual const ExtensionList* disabled_extensions() const; |
| 163 | 163 |
| 164 // Gets the set of pending extensions. | 164 // Gets the set of pending extensions. |
| (...skipping 246 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 411 | 411 |
| 412 ExtensionsQuotaService* quota_service() { return "a_service_; } | 412 ExtensionsQuotaService* quota_service() { return "a_service_; } |
| 413 | 413 |
| 414 ExtensionMenuManager* menu_manager() { return &menu_manager_; } | 414 ExtensionMenuManager* menu_manager() { return &menu_manager_; } |
| 415 | 415 |
| 416 const std::map<GURL, int>& protected_storage_map() const { | 416 const std::map<GURL, int>& protected_storage_map() const { |
| 417 return protected_storage_map_; | 417 return protected_storage_map_; |
| 418 } | 418 } |
| 419 | 419 |
| 420 // Notify the frontend that there was an error loading an extension. | 420 // Notify the frontend that there was an error loading an extension. |
| 421 // This method is public because ExtensionsServiceBackend can post to here. | 421 // This method is public because ExtensionServiceBackend can post to here. |
| 422 void ReportExtensionLoadError(const FilePath& extension_path, | 422 void ReportExtensionLoadError(const FilePath& extension_path, |
| 423 const std::string& error, | 423 const std::string& error, |
| 424 NotificationType type, | 424 NotificationType type, |
| 425 bool be_noisy); | 425 bool be_noisy); |
| 426 | 426 |
| 427 // ExtensionHost of background page calls this method right after its render | 427 // ExtensionHost of background page calls this method right after its render |
| 428 // view has been created. | 428 // view has been created. |
| 429 void DidCreateRenderViewForBackgroundPage(ExtensionHost* host); | 429 void DidCreateRenderViewForBackgroundPage(ExtensionHost* host); |
| 430 | 430 |
| 431 // NotificationObserver | 431 // NotificationObserver |
| 432 virtual void Observe(NotificationType type, | 432 virtual void Observe(NotificationType type, |
| 433 const NotificationSource& source, | 433 const NotificationSource& source, |
| 434 const NotificationDetails& details); | 434 const NotificationDetails& details); |
| 435 | 435 |
| 436 // Whether there are any apps installed. Component apps are not included. | 436 // Whether there are any apps installed. Component apps are not included. |
| 437 bool HasApps() const; | 437 bool HasApps() const; |
| 438 | 438 |
| 439 // Gets the set of loaded app ids. Component apps are not included. | 439 // Gets the set of loaded app ids. Component apps are not included. |
| 440 ExtensionIdSet GetAppIds() const; | 440 ExtensionIdSet GetAppIds() const; |
| 441 | 441 |
| 442 private: | 442 private: |
| 443 friend class BrowserThread; | 443 friend class BrowserThread; |
| 444 friend class DeleteTask<ExtensionsService>; | 444 friend class DeleteTask<ExtensionService>; |
| 445 | 445 |
| 446 // Contains Extension data that can change during the life of the process, | 446 // Contains Extension data that can change during the life of the process, |
| 447 // but does not persist across restarts. | 447 // but does not persist across restarts. |
| 448 struct ExtensionRuntimeData { | 448 struct ExtensionRuntimeData { |
| 449 // True if the background page is ready. | 449 // True if the background page is ready. |
| 450 bool background_page_ready; | 450 bool background_page_ready; |
| 451 | 451 |
| 452 // True while the extension is being upgraded. | 452 // True while the extension is being upgraded. |
| 453 bool being_upgraded; | 453 bool being_upgraded; |
| 454 | 454 |
| 455 // Generic bag of runtime data that users can associate with extensions. | 455 // Generic bag of runtime data that users can associate with extensions. |
| 456 PropertyBag property_bag; | 456 PropertyBag property_bag; |
| 457 | 457 |
| 458 ExtensionRuntimeData(); | 458 ExtensionRuntimeData(); |
| 459 ~ExtensionRuntimeData(); | 459 ~ExtensionRuntimeData(); |
| 460 }; | 460 }; |
| 461 typedef std::map<std::string, ExtensionRuntimeData> ExtensionRuntimeDataMap; | 461 typedef std::map<std::string, ExtensionRuntimeData> ExtensionRuntimeDataMap; |
| 462 | 462 |
| 463 virtual ~ExtensionsService(); | 463 virtual ~ExtensionService(); |
| 464 | 464 |
| 465 // Clear all persistent data that may have been stored by the extension. | 465 // Clear all persistent data that may have been stored by the extension. |
| 466 void ClearExtensionData(const GURL& extension_url); | 466 void ClearExtensionData(const GURL& extension_url); |
| 467 | 467 |
| 468 // Look up an extension by ID, optionally including either or both of enabled | 468 // Look up an extension by ID, optionally including either or both of enabled |
| 469 // and disabled extensions. | 469 // and disabled extensions. |
| 470 const Extension* GetExtensionByIdInternal(const std::string& id, | 470 const Extension* GetExtensionByIdInternal(const std::string& id, |
| 471 bool include_enabled, | 471 bool include_enabled, |
| 472 bool include_disabled); | 472 bool include_disabled); |
| 473 | 473 |
| (...skipping 17 matching lines...) Expand all Loading... |
| 491 | 491 |
| 492 // Helper method. Loads extension from prefs. | 492 // Helper method. Loads extension from prefs. |
| 493 void LoadInstalledExtension(const ExtensionInfo& info, bool write_to_prefs); | 493 void LoadInstalledExtension(const ExtensionInfo& info, bool write_to_prefs); |
| 494 | 494 |
| 495 // Helper methods to configure the storage services accordingly. | 495 // Helper methods to configure the storage services accordingly. |
| 496 void GrantProtectedStorage(const Extension* extension); | 496 void GrantProtectedStorage(const Extension* extension); |
| 497 void RevokeProtectedStorage(const Extension* extension); | 497 void RevokeProtectedStorage(const Extension* extension); |
| 498 void GrantUnlimitedStorage(const Extension* extension); | 498 void GrantUnlimitedStorage(const Extension* extension); |
| 499 void RevokeUnlimitedStorage(const Extension* extension); | 499 void RevokeUnlimitedStorage(const Extension* extension); |
| 500 | 500 |
| 501 // The profile this ExtensionsService is part of. | 501 // The profile this ExtensionService is part of. |
| 502 Profile* profile_; | 502 Profile* profile_; |
| 503 | 503 |
| 504 // Preferences for the owning profile (weak reference). | 504 // Preferences for the owning profile (weak reference). |
| 505 ExtensionPrefs* extension_prefs_; | 505 ExtensionPrefs* extension_prefs_; |
| 506 | 506 |
| 507 // The current list of installed extensions. | 507 // The current list of installed extensions. |
| 508 ExtensionList extensions_; | 508 ExtensionList extensions_; |
| 509 | 509 |
| 510 // The list of installed extensions that have been disabled. | 510 // The list of installed extensions that have been disabled. |
| 511 ExtensionList disabled_extensions_; | 511 ExtensionList disabled_extensions_; |
| 512 | 512 |
| 513 // The set of pending extensions. | 513 // The set of pending extensions. |
| 514 PendingExtensionMap pending_extensions_; | 514 PendingExtensionMap pending_extensions_; |
| 515 | 515 |
| 516 // The map of extension IDs to their runtime data. | 516 // The map of extension IDs to their runtime data. |
| 517 ExtensionRuntimeDataMap extension_runtime_data_; | 517 ExtensionRuntimeDataMap extension_runtime_data_; |
| 518 | 518 |
| 519 // The full path to the directory where extensions are installed. | 519 // The full path to the directory where extensions are installed. |
| 520 FilePath install_directory_; | 520 FilePath install_directory_; |
| 521 | 521 |
| 522 // Whether or not extensions are enabled. | 522 // Whether or not extensions are enabled. |
| 523 bool extensions_enabled_; | 523 bool extensions_enabled_; |
| 524 | 524 |
| 525 // Whether to notify users when they attempt to install an extension. | 525 // Whether to notify users when they attempt to install an extension. |
| 526 bool show_extensions_prompts_; | 526 bool show_extensions_prompts_; |
| 527 | 527 |
| 528 // The backend that will do IO on behalf of this instance. | 528 // The backend that will do IO on behalf of this instance. |
| 529 scoped_refptr<ExtensionsServiceBackend> backend_; | 529 scoped_refptr<ExtensionServiceBackend> backend_; |
| 530 | 530 |
| 531 // Used by dispatchers to limit API quota for individual extensions. | 531 // Used by dispatchers to limit API quota for individual extensions. |
| 532 ExtensionsQuotaService quota_service_; | 532 ExtensionsQuotaService quota_service_; |
| 533 | 533 |
| 534 // Record that Init() has been called, and NotificationType::EXTENSIONS_READY | 534 // Record that Init() has been called, and NotificationType::EXTENSIONS_READY |
| 535 // has fired. | 535 // has fired. |
| 536 bool ready_; | 536 bool ready_; |
| 537 | 537 |
| 538 // Our extension updater, if updates are turned on. | 538 // Our extension updater, if updates are turned on. |
| 539 scoped_refptr<ExtensionUpdater> updater_; | 539 scoped_refptr<ExtensionUpdater> updater_; |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 584 typedef std::map<GURL, int> ProtectedStorageMap; | 584 typedef std::map<GURL, int> ProtectedStorageMap; |
| 585 ProtectedStorageMap protected_storage_map_; | 585 ProtectedStorageMap protected_storage_map_; |
| 586 | 586 |
| 587 // Manages the installation of default apps and the promotion of them in the | 587 // Manages the installation of default apps and the promotion of them in the |
| 588 // app launcher. | 588 // app launcher. |
| 589 DefaultApps default_apps_; | 589 DefaultApps default_apps_; |
| 590 | 590 |
| 591 // Flag to make sure event routers are only initialized once. | 591 // Flag to make sure event routers are only initialized once. |
| 592 bool event_routers_initialized_; | 592 bool event_routers_initialized_; |
| 593 | 593 |
| 594 FRIEND_TEST_ALL_PREFIXES(ExtensionsServiceTest, | 594 FRIEND_TEST_ALL_PREFIXES(ExtensionServiceTest, |
| 595 UpdatePendingExtensionAlreadyInstalled); | 595 UpdatePendingExtensionAlreadyInstalled); |
| 596 FRIEND_TEST_ALL_PREFIXES(ExtensionsServiceTest, | 596 FRIEND_TEST_ALL_PREFIXES(ExtensionServiceTest, |
| 597 InstallAppsWithUnlimtedStorage); | 597 InstallAppsWithUnlimtedStorage); |
| 598 FRIEND_TEST_ALL_PREFIXES(ExtensionsServiceTest, | 598 FRIEND_TEST_ALL_PREFIXES(ExtensionServiceTest, |
| 599 InstallAppsAndCheckStorageProtection); | 599 InstallAppsAndCheckStorageProtection); |
| 600 DISALLOW_COPY_AND_ASSIGN(ExtensionsService); | 600 DISALLOW_COPY_AND_ASSIGN(ExtensionService); |
| 601 }; | 601 }; |
| 602 | 602 |
| 603 #endif // CHROME_BROWSER_EXTENSIONS_EXTENSIONS_SERVICE_H_ | 603 #endif // CHROME_BROWSER_EXTENSIONS_EXTENSION_SERVICE_H_ |
| OLD | NEW |