1// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef CHROME_BROWSER_EXTENSIONS_API_SYSTEM_INDICATOR_SYSTEM_INDICATOR_MANAGER_H_
6#define CHROME_BROWSER_EXTENSIONS_API_SYSTEM_INDICATOR_SYSTEM_INDICATOR_MANAGER_H_
7
8#include <map>
9#include <string>
10
11#include "base/memory/linked_ptr.h"
12#include "base/scoped_observer.h"
13#include "base/threading/thread_checker.h"
14#include "chrome/browser/extensions/api/extension_action/extension_action_api.h"
15#include "chrome/browser/extensions/extension_action_icon_factory.h"
16#include "components/keyed_service/core/keyed_service.h"
17#include "extensions/browser/extension_registry_observer.h"
18
19class ExtensionAction;
20class Profile;
21class StatusTray;
22
23FORWARD_DECLARE_TEST(SystemIndicatorApiTest, SystemIndicator);
24
25namespace extensions {
26class ExtensionIndicatorIcon;
27class ExtensionRegistry;
28
29// Keeps track of all the systemIndicator icons created for a given Profile
30// that are currently visible in the UI.  Use SystemIndicatorManagerFactory to
31// create a SystemIndicatorManager object.
32class SystemIndicatorManager : public ExtensionRegistryObserver,
33                               public ExtensionActionAPI::Observer,
34                               public KeyedService {
35 public:
36  SystemIndicatorManager(Profile* profile, StatusTray* status_tray);
37  virtual ~SystemIndicatorManager();
38
39  // KeyedService implementation.
40  virtual void Shutdown() OVERRIDE;
41
42 private:
43  FRIEND_TEST_ALL_PREFIXES(::SystemIndicatorApiTest, SystemIndicator);
44
45  // ExtensionRegistryObserver implementation.
46  virtual void OnExtensionUnloaded(
47      content::BrowserContext* browser_context,
48      const Extension* extension,
49      UnloadedExtensionInfo::Reason reason) OVERRIDE;
50
51  // ExtensionActionAPI::Observer implementation.
52  virtual void OnExtensionActionUpdated(
53      ExtensionAction* extension_action,
54      content::WebContents* web_contents,
55      content::BrowserContext* browser_context) OVERRIDE;
56
57  // Causes a call to OnStatusIconClicked for the specified extension_id.
58  // Returns false if no ExtensionIndicatorIcon is found for the extension.
59  bool SendClickEventToExtensionForTest(const std::string extension_id);
60
61  // Causes an indicator to be shown for the given extension_action.  Creates
62  // the indicator if necessary.
63  void CreateOrUpdateIndicator(
64      const Extension* extension,
65      const ExtensionAction* extension_action);
66
67  // Causes the indicator for the given extension to be hidden.
68  void RemoveIndicator(const std::string &extension_id);
69
70  typedef std::map<const std::string, linked_ptr<ExtensionIndicatorIcon> >
71      SystemIndicatorMap;
72
73  Profile* profile_;
74  StatusTray* status_tray_;
75  SystemIndicatorMap system_indicators_;
76  base::ThreadChecker thread_checker_;
77
78  ScopedObserver<ExtensionActionAPI, ExtensionActionAPI::Observer>
79      extension_action_observer_;
80
81  // Listen to extension unloaded notifications.
82  ScopedObserver<ExtensionRegistry, ExtensionRegistryObserver>
83      extension_registry_observer_;
84
85  DISALLOW_COPY_AND_ASSIGN(SystemIndicatorManager);
86};
87
88}  // namespace extensions
89
90#endif  // CHROME_BROWSER_EXTENSIONS_API_SYSTEM_INDICATOR_SYSTEM_INDICATOR_MANAGER_H_
91