12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file. 42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#ifndef CHROME_BROWSER_EXTENSIONS_API_SYSTEM_INDICATOR_SYSTEM_INDICATOR_MANAGER_H_ 62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define CHROME_BROWSER_EXTENSIONS_API_SYSTEM_INDICATOR_SYSTEM_INDICATOR_MANAGER_H_ 72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <map> 92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <string> 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/memory/linked_ptr.h" 125c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "base/scoped_observer.h" 132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/threading/thread_checker.h" 1403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "chrome/browser/extensions/api/extension_action/extension_action_api.h" 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/extensions/extension_action_icon_factory.h" 16a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "components/keyed_service/core/keyed_service.h" 175c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "extensions/browser/extension_registry_observer.h" 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class ExtensionAction; 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class Profile; 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class StatusTray; 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)FORWARD_DECLARE_TEST(SystemIndicatorApiTest, SystemIndicator); 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace extensions { 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class ExtensionIndicatorIcon; 275c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuclass ExtensionRegistry; 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Keeps track of all the systemIndicator icons created for a given Profile 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// that are currently visible in the UI. Use SystemIndicatorManagerFactory to 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// create a SystemIndicatorManager object. 3203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)class SystemIndicatorManager : public ExtensionRegistryObserver, 3303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) public ExtensionActionAPI::Observer, 34a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) public KeyedService { 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SystemIndicatorManager(Profile* profile, StatusTray* status_tray); 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual ~SystemIndicatorManager(); 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 39a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // KeyedService implementation. 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void Shutdown() OVERRIDE; 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 425c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu private: 435c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu FRIEND_TEST_ALL_PREFIXES(::SystemIndicatorApiTest, SystemIndicator); 445c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 455c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // ExtensionRegistryObserver implementation. 465c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu virtual void OnExtensionUnloaded( 475c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu content::BrowserContext* browser_context, 485c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu const Extension* extension, 495c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu UnloadedExtensionInfo::Reason reason) OVERRIDE; 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // ExtensionActionAPI::Observer implementation. 5203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) virtual void OnExtensionActionUpdated( 5303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) ExtensionAction* extension_action, 5403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) content::WebContents* web_contents, 5503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) content::BrowserContext* browser_context) OVERRIDE; 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Causes a call to OnStatusIconClicked for the specified extension_id. 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Returns false if no ExtensionIndicatorIcon is found for the extension. 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool SendClickEventToExtensionForTest(const std::string extension_id); 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Causes an indicator to be shown for the given extension_action. Creates 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // the indicator if necessary. 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void CreateOrUpdateIndicator( 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const Extension* extension, 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const ExtensionAction* extension_action); 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Causes the indicator for the given extension to be hidden. 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void RemoveIndicator(const std::string &extension_id); 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) typedef std::map<const std::string, linked_ptr<ExtensionIndicatorIcon> > 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SystemIndicatorMap; 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Profile* profile_; 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) StatusTray* status_tray_; 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SystemIndicatorMap system_indicators_; 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::ThreadChecker thread_checker_; 772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) ScopedObserver<ExtensionActionAPI, ExtensionActionAPI::Observer> 7903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) extension_action_observer_; 8003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 815c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // Listen to extension unloaded notifications. 825c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ScopedObserver<ExtensionRegistry, ExtensionRegistryObserver> 835c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu extension_registry_observer_; 845c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(SystemIndicatorManager); 862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace extensions 892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif // CHROME_BROWSER_EXTENSIONS_API_SYSTEM_INDICATOR_SYSTEM_INDICATOR_MANAGER_H_ 91