15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef CHROME_BROWSER_EXTENSIONS_EXTENSION_ACTION_MANAGER_H_ 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CHROME_BROWSER_EXTENSIONS_EXTENSION_ACTION_MANAGER_H_ 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <map> 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string> 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "base/scoped_observer.h" 126e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "chrome/common/extensions/api/extension_action/action_info.h" 13a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "components/keyed_service/core/keyed_service.h" 14a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "extensions/browser/extension_registry_observer.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ExtensionAction; 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Profile; 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace extensions { 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Extension; 22a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochclass ExtensionRegistry; 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Owns the ExtensionActions associated with each extension. These actions live 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// while an extension is loaded and are destroyed on unload. 26a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)class ExtensionActionManager : public KeyedService, 27a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch public ExtensionRegistryObserver { 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit ExtensionActionManager(Profile* profile); 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~ExtensionActionManager(); 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns this profile's ExtensionActionManager. One instance is 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // shared between a profile and its incognito version. 3403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) static ExtensionActionManager* Get(content::BrowserContext* browser_context); 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Retrieves the page action, browser action, or system indicator for 371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // |extension|. 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If the result is not NULL, it remains valid until the extension is 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // unloaded. 401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ExtensionAction* GetPageAction(const Extension& extension) const; 411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ExtensionAction* GetBrowserAction(const Extension& extension) const; 421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ExtensionAction* GetSystemIndicator(const Extension& extension) const; 431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Returns either the PageAction or BrowserAction for |extension|, or NULL if 451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // none exists. Since an extension can only declare one of Browser|PageAction, 461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // this is okay to use anywhere you need a generic "ExtensionAction". 471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Since SystemIndicators are used differently and don't follow this 481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // rule of mutual exclusion, they are not checked or returned. 491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ExtensionAction* GetExtensionAction(const Extension& extension) const; 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 516e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) // Gets the best fit ExtensionAction for the given |extension|. This takes 526e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) // into account |extension|'s browser or page actions, if any, along with its 536e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) // name and any declared icons. 546e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) scoped_ptr<ExtensionAction> GetBestFitAction( 551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const Extension& extension, ActionInfo::Type type) const; 566e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 58a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch // Implement ExtensionRegistryObserver. 59a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch virtual void OnExtensionUnloaded(content::BrowserContext* browser_context, 600529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch const Extension* extension, 610529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch UnloadedExtensionInfo::Reason reason) 620529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch OVERRIDE; 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Profile* profile_; 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 66a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch // Listen to extension unloaded notifications. 670529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch ScopedObserver<ExtensionRegistry, ExtensionRegistryObserver> 680529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch extension_registry_observer_; 69a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Keyed by Extension ID. These maps are populated lazily when their 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // ExtensionAction is first requested, and the entries are removed when the 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // extension is unloaded. Not every extension has a page action or browser 735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // action. 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef std::map<std::string, linked_ptr<ExtensionAction> > ExtIdToActionMap; 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mutable ExtIdToActionMap page_actions_; 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mutable ExtIdToActionMap browser_actions_; 772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mutable ExtIdToActionMap system_indicators_; 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace extensions 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // CHROME_BROWSER_EXTENSIONS_EXTENSION_ACTION_MANAGER_H_ 83