// Copyright (c) 2011 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 CHROME_BROWSER_SIDEBAR_SIDEBAR_MANAGER_H_ #define CHROME_BROWSER_SIDEBAR_SIDEBAR_MANAGER_H_ #include <map> #include <string> #include "base/memory/ref_counted.h" #include "base/string16.h" #include "chrome/browser/sidebar/sidebar_container.h" #include "content/common/notification_observer.h" #include "content/common/notification_registrar.h" class GURL; class PrefService; class Profile; class SidebarContainer; class SkBitmap; class TabContents; /////////////////////////////////////////////////////////////////////////////// // SidebarManager // // This class is a singleton that manages SidebarContainer instances and // maintains a connection between tabs and sidebars. // class SidebarManager : public NotificationObserver, public base::RefCounted<SidebarManager>, private SidebarContainer::Delegate { public: // Returns s singleton instance. static SidebarManager* GetInstance(); // Returns true if sidebar is allowed to be displayed in the browser. static bool IsSidebarAllowed(); SidebarManager(); // Returns SidebarContainer registered for |tab| and active or NULL if // there is no alive and active SidebarContainer registered for |tab|. SidebarContainer* GetActiveSidebarContainerFor(TabContents* tab); // Returns SidebarContainer registered for |tab| and |content_id| or NULL if // there is no such SidebarContainer registered. SidebarContainer* GetSidebarContainerFor(TabContents* tab, const std::string& content_id); // Returns sidebar's TabContents registered for |tab| and |content_id|. TabContents* GetSidebarTabContents(TabContents* tab, const std::string& content_id); // Sends sidebar state change notification to extensions. void NotifyStateChanges(TabContents* was_active_sidebar_contents, TabContents* active_sidebar_contents); // Functions supporting chrome.experimental.sidebar API. // Shows sidebar identified by |tab| and |content_id| (only sidebar's // mini tab is visible). void ShowSidebar(TabContents* tab, const std::string& content_id); // Expands sidebar identified by |tab| and |content_id|. void ExpandSidebar(TabContents* tab, const std::string& content_id); // Collapses sidebar identified by |tab| and |content_id| (has no effect // if sidebar is not expanded). void CollapseSidebar(TabContents* tab, const std::string& content_id); // Hides sidebar identified by |tab| and |content_id| (removes sidebar's // mini tab). void HideSidebar(TabContents* tab, const std::string& content_id); // Navigates sidebar identified by |tab| and |content_id| to |url|. void NavigateSidebar(TabContents* tab, const std::string& content_id, const GURL& url); // Changes sidebar's badge text (displayed on the mini tab). void SetSidebarBadgeText(TabContents* tab, const std::string& content_id, const string16& badge_text); // Changes sidebar's icon (displayed on the mini tab). void SetSidebarIcon(TabContents* tab, const std::string& content_id, const SkBitmap& bitmap); // Changes sidebar's title (mini tab's tooltip). void SetSidebarTitle(TabContents* tab, const std::string& content_id, const string16& title); private: friend class base::RefCounted<SidebarManager>; virtual ~SidebarManager(); // Overridden from NotificationObserver. virtual void Observe(NotificationType type, const NotificationSource& source, const NotificationDetails& details); // Overridden from SidebarContainer::Delegate. virtual void UpdateSidebar(SidebarContainer* host); // Hides all sidebars registered for |tab|. void HideAllSidebars(TabContents* tab); // Returns SidebarContainer corresponding to |sidebar_contents|. SidebarContainer* FindSidebarContainerFor(TabContents* sidebar_contents); // Registers new SidebarContainer for |tab|. There must be no // other SidebarContainers registered for the RenderViewHost at the moment. void RegisterSidebarContainerFor(TabContents* tab, SidebarContainer* container); // Unregisters SidebarContainer identified by |tab| and |content_id|. void UnregisterSidebarContainerFor(TabContents* tab, const std::string& content_id); // Records the link between |tab| and |sidebar_host|. void BindSidebarHost(TabContents* tab, SidebarContainer* sidebar_host); // Forgets the link between |tab| and |sidebar_host|. void UnbindSidebarHost(TabContents* tab, SidebarContainer* sidebar_host); NotificationRegistrar registrar_; // This map stores sidebars linked to a particular tab. Sidebars are // identified by their unique content id (string). typedef std::map<std::string, SidebarContainer*> ContentIdToSidebarHostMap; // These two maps are for tracking dependencies between tabs and // their SidebarContainers. // // SidebarManager start listening to SidebarContainers when they are put // into these maps and removes them when they are closing. struct SidebarStateForTab; typedef std::map<TabContents*, SidebarStateForTab> TabToSidebarHostMap; TabToSidebarHostMap tab_to_sidebar_host_; typedef std::map<SidebarContainer*, TabContents*> SidebarHostToTabMap; SidebarHostToTabMap sidebar_host_to_tab_; DISALLOW_COPY_AND_ASSIGN(SidebarManager); }; #endif // CHROME_BROWSER_SIDEBAR_SIDEBAR_MANAGER_H_