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