| // Copyright 2021 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_ASH_EXTENSION_KEEPLIST_MANAGER_H_ |
| #define CHROME_BROWSER_EXTENSIONS_ASH_EXTENSION_KEEPLIST_MANAGER_H_ |
| |
| #include <string> |
| |
| #include "base/memory/raw_ptr.h" |
| #include "base/scoped_observation.h" |
| #include "extensions/browser/extension_registry.h" |
| #include "extensions/browser/extension_registry_observer.h" |
| |
| class Profile; |
| |
| namespace extensions { |
| class ExtensionPrefs; |
| class ExtensionRegistry; |
| class ExtensionService; |
| |
| // This class manages the 1st party Ash extension keeplist. When Lacros becomes |
| // the only browser, all extensions should be installed in Lacros instead of |
| // Ash. However, there is a small exception set of 1st party extensions and |
| // platform apps we will keep running in Ash, since they are either needed to |
| // support some Chrome OS features such as accessibility, or are in the process |
| // of deprecation, or not completely Lacros compatible yet. This class will |
| // manage to disable all the extensions and platform apps in Ash if they are |
| // not in the keep list. |
| class AshExtensionKeeplistManager : private ExtensionRegistryObserver { |
| public: |
| AshExtensionKeeplistManager(Profile* profile, |
| ExtensionPrefs* extension_prefs, |
| ExtensionService* extension_service); |
| AshExtensionKeeplistManager(const AshExtensionKeeplistManager&) = delete; |
| AshExtensionKeeplistManager& operator=(const AshExtensionKeeplistManager&) = |
| delete; |
| ~AshExtensionKeeplistManager() override; |
| |
| void Init(); |
| |
| private: |
| // Returns true if |extension| should be disabled. |
| bool ShouldDisable(const Extension* extension) const; |
| |
| // Disables the extension with 'DISABLE_NOT_ASH_KEEPLISTED'. |
| void Disable(const std::string& extension_id); |
| |
| // Blocks all extensions not on the keeplist by disabling them with |
| // 'DISABLE_NOT_ASH_KEEPLISTED'. |
| void ActivateKeeplistEnforcement(); |
| |
| // Unblocks all extensions by removing 'DISABLE_NOT_ASH_KEEPLISTED' from |
| // disable reasons. It will be called when Lacros is not primary browser or |
| // features::kEnforceAshExtensionKeeplist is turned off. |
| void DeactivateKeeplistEnforcement(); |
| |
| // ExtensionRegistryObserver: |
| void OnExtensionReady(content::BrowserContext* browser_context, |
| const Extension* extension) override; |
| |
| // The |extension_prefs_|, |extension_service_| and |registry_| are passed |
| // from ctor and owned by the caller, and they are guaranteed to outlive this |
| // object. |
| raw_ptr<ExtensionPrefs> const extension_prefs_ = nullptr; // not owned |
| raw_ptr<ExtensionService> const extension_service_ = nullptr; // not owned |
| raw_ptr<ExtensionRegistry> const registry_ = nullptr; // not owned |
| |
| bool should_enforce_keeplist_ = false; |
| |
| base::ScopedObservation<ExtensionRegistry, ExtensionRegistryObserver> |
| registry_observation_{this}; |
| }; |
| |
| } // namespace extensions |
| |
| #endif // CHROME_BROWSER_EXTENSIONS_ASH_EXTENSION_KEEPLIST_MANAGER_H_ |