// Copyright (c) 2012 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef EXTENSIONS_BROWSER_EXTENSION_ACTION_MANAGER_H_ #define EXTENSIONS_BROWSER_EXTENSION_ACTION_MANAGER_H_ #include #include #include #include "base/scoped_observer.h" #include "components/keyed_service/core/keyed_service.h" #include "extensions/browser/extension_registry.h" #include "extensions/browser/extension_registry_observer.h" #include "extensions/common/api/extension_action/action_info.h" namespace content { class BrowserContext; } namespace extensions { class Extension; class ExtensionAction; // Owns the ExtensionActions associated with each extension. These actions live // while an extension is loaded and are destroyed on unload. class ExtensionActionManager : public KeyedService, public ExtensionRegistryObserver { public: explicit ExtensionActionManager(content::BrowserContext* browser_context); ~ExtensionActionManager() override; // Returns this |browser_context|'s ExtensionActionManager. One instance is // shared between a BrowserContext and its off-the-record version. static ExtensionActionManager* Get(content::BrowserContext* browser_context); // Returns the action associated with the extension (specified through the // "action", "browser_action", or "page_action" keys), or null if none exists. // Since an extension can only declare one of these, this is safe to use // anywhere callers simply need to get at the action and don't care about // the manifest key. ExtensionAction* GetExtensionAction(const Extension& extension) const; private: // Implement ExtensionRegistryObserver. void OnExtensionUnloaded(content::BrowserContext* browser_context, const Extension* extension, UnloadedExtensionReason reason) override; content::BrowserContext* browser_context_; // Listen to extension unloaded notifications. ScopedObserver extension_registry_observer_{this}; // Keyed by Extension ID. These maps are populated lazily when their // ExtensionAction is first requested, and the entries are removed when the // extension is unloaded. Not every extension has an action. using ExtIdToActionMap = std::map>; mutable ExtIdToActionMap actions_; }; } // namespace extensions #endif // EXTENSIONS_BROWSER_EXTENSION_ACTION_MANAGER_H_