| // Copyright 2014 The Chromium Authors | 
 | // Use of this source code is governed by a BSD-style license that can be | 
 | // found in the LICENSE file. | 
 |  | 
 | #ifndef CHROME_BROWSER_EXTENSIONS_SHARED_MODULE_SERVICE_H_ | 
 | #define CHROME_BROWSER_EXTENSIONS_SHARED_MODULE_SERVICE_H_ | 
 |  | 
 | #include <list> | 
 |  | 
 | #include "base/memory/raw_ptr.h" | 
 | #include "base/scoped_observation.h" | 
 | #include "components/keyed_service/core/keyed_service.h" | 
 | #include "extensions/browser/extension_registry.h" | 
 | #include "extensions/browser/extension_registry_observer.h" | 
 | #include "extensions/browser/install_gate.h" | 
 | #include "extensions/buildflags/buildflags.h" | 
 | #include "extensions/common/manifest_handlers/shared_module_info.h" | 
 |  | 
 | static_assert(BUILDFLAG(ENABLE_EXTENSIONS_CORE)); | 
 |  | 
 | namespace content { | 
 | class BrowserContext; | 
 | } | 
 |  | 
 | namespace extensions { | 
 | class Extension; | 
 | class ExtensionSet; | 
 |  | 
 | class SharedModuleService : public KeyedService, | 
 |                             public ExtensionRegistryObserver, | 
 |                             public InstallGate { | 
 |  public: | 
 |   enum ImportStatus { | 
 |     // No imports needed. | 
 |     IMPORT_STATUS_OK, | 
 |  | 
 |     // Imports are needed, but can be satisfied (i.e., there are missing or | 
 |     // outdated imports for a webstore extension). | 
 |     IMPORT_STATUS_UNSATISFIED, | 
 |  | 
 |     // Imports are needed, and can't be satisfied (i.e., missing or outdated | 
 |     // imports for an extension not in the webstore). | 
 |     IMPORT_STATUS_UNRECOVERABLE | 
 |   }; | 
 |  | 
 |   static SharedModuleService* Get(content::BrowserContext* context); | 
 |  | 
 |   SharedModuleService(const SharedModuleService&) = delete; | 
 |   SharedModuleService& operator=(const SharedModuleService&) = delete; | 
 |  | 
 |   ~SharedModuleService() override; | 
 |  | 
 |   // KeyedService: | 
 |   void Shutdown() override; | 
 |  | 
 |   // Checks an extension's imports. Imports that are not installed are stored | 
 |   // in `missing_modules`, and imports that are out of date are stored in | 
 |   // `outdated_modules`. | 
 |   ImportStatus CheckImports( | 
 |       const Extension* extension, | 
 |       std::list<SharedModuleInfo::ImportInfo>* missing_modules, | 
 |       std::list<SharedModuleInfo::ImportInfo>* outdated_modules); | 
 |  | 
 |   // Checks an extension's shared module imports to see if they are satisfied. | 
 |   // If they are not, this function adds the dependencies to the pending install | 
 |   // list if `extension` came from the webstore. | 
 |   ImportStatus SatisfyImports(const Extension* extension); | 
 |  | 
 |   // Returns a set of extensions that import a given extension. | 
 |   std::unique_ptr<ExtensionSet> GetDependentExtensions( | 
 |       const Extension* extension); | 
 |  | 
 |   // InstallGate: | 
 |   Action ShouldDelay(const Extension* extension, | 
 |                      bool install_immediately) override; | 
 |  | 
 |  private: | 
 |   friend class SharedModuleServiceFactory; | 
 |  | 
 |   explicit SharedModuleService(content::BrowserContext* context); | 
 |  | 
 |   // Uninstall shared modules which are not used by other extensions. | 
 |   void PruneSharedModules(); | 
 |  | 
 |   // ExtensionRegistryObserver implementation. | 
 |   void OnExtensionInstalled(content::BrowserContext* browser_context, | 
 |                             const Extension* extension, | 
 |                             bool is_update) override; | 
 |   void OnExtensionUninstalled(content::BrowserContext* browser_context, | 
 |                               const Extension* extension, | 
 |                               extensions::UninstallReason reason) override; | 
 |  | 
 |   base::ScopedObservation<ExtensionRegistry, ExtensionRegistryObserver> | 
 |       extension_registry_observation_{this}; | 
 |  | 
 |   // The context associated with this SharedModuleService. | 
 |   raw_ptr<content::BrowserContext> browser_context_; | 
 | }; | 
 |  | 
 | }  // namespace extensions | 
 |  | 
 | #endif  // CHROME_BROWSER_EXTENSIONS_SHARED_MODULE_SERVICE_H_ |