1 // Copyright (c) 2011 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_SIDEBAR_SIDEBAR_MANAGER_H_ 6 #define CHROME_BROWSER_SIDEBAR_SIDEBAR_MANAGER_H_ 7 8 #include <map> 9 #include <string> 10 11 #include "base/memory/ref_counted.h" 12 #include "base/string16.h" 13 #include "chrome/browser/sidebar/sidebar_container.h" 14 #include "content/common/notification_observer.h" 15 #include "content/common/notification_registrar.h" 16 17 class GURL; 18 class PrefService; 19 class Profile; 20 class SidebarContainer; 21 class SkBitmap; 22 class TabContents; 23 24 /////////////////////////////////////////////////////////////////////////////// 25 // SidebarManager 26 // 27 // This class is a singleton that manages SidebarContainer instances and 28 // maintains a connection between tabs and sidebars. 29 // 30 class SidebarManager : public NotificationObserver, 31 public base::RefCounted<SidebarManager>, 32 private SidebarContainer::Delegate { 33 public: 34 // Returns s singleton instance. 35 static SidebarManager* GetInstance(); 36 37 // Returns true if sidebar is allowed to be displayed in the browser. 38 static bool IsSidebarAllowed(); 39 40 SidebarManager(); 41 42 // Returns SidebarContainer registered for |tab| and active or NULL if 43 // there is no alive and active SidebarContainer registered for |tab|. 44 SidebarContainer* GetActiveSidebarContainerFor(TabContents* tab); 45 46 // Returns SidebarContainer registered for |tab| and |content_id| or NULL if 47 // there is no such SidebarContainer registered. 48 SidebarContainer* GetSidebarContainerFor(TabContents* tab, 49 const std::string& content_id); 50 51 // Returns sidebar's TabContents registered for |tab| and |content_id|. 52 TabContents* GetSidebarTabContents(TabContents* tab, 53 const std::string& content_id); 54 55 // Sends sidebar state change notification to extensions. 56 void NotifyStateChanges(TabContents* was_active_sidebar_contents, 57 TabContents* active_sidebar_contents); 58 59 // Functions supporting chrome.experimental.sidebar API. 60 61 // Shows sidebar identified by |tab| and |content_id| (only sidebar's 62 // mini tab is visible). 63 void ShowSidebar(TabContents* tab, const std::string& content_id); 64 65 // Expands sidebar identified by |tab| and |content_id|. 66 void ExpandSidebar(TabContents* tab, const std::string& content_id); 67 68 // Collapses sidebar identified by |tab| and |content_id| (has no effect 69 // if sidebar is not expanded). 70 void CollapseSidebar(TabContents* tab, const std::string& content_id); 71 72 // Hides sidebar identified by |tab| and |content_id| (removes sidebar's 73 // mini tab). 74 void HideSidebar(TabContents* tab, const std::string& content_id); 75 76 // Navigates sidebar identified by |tab| and |content_id| to |url|. 77 void NavigateSidebar(TabContents* tab, 78 const std::string& content_id, 79 const GURL& url); 80 81 // Changes sidebar's badge text (displayed on the mini tab). 82 void SetSidebarBadgeText(TabContents* tab, 83 const std::string& content_id, 84 const string16& badge_text); 85 86 // Changes sidebar's icon (displayed on the mini tab). 87 void SetSidebarIcon(TabContents* tab, 88 const std::string& content_id, 89 const SkBitmap& bitmap); 90 91 // Changes sidebar's title (mini tab's tooltip). 92 void SetSidebarTitle(TabContents* tab, 93 const std::string& content_id, 94 const string16& title); 95 96 private: 97 friend class base::RefCounted<SidebarManager>; 98 99 virtual ~SidebarManager(); 100 101 // Overridden from NotificationObserver. 102 virtual void Observe(NotificationType type, 103 const NotificationSource& source, 104 const NotificationDetails& details); 105 106 // Overridden from SidebarContainer::Delegate. 107 virtual void UpdateSidebar(SidebarContainer* host); 108 109 // Hides all sidebars registered for |tab|. 110 void HideAllSidebars(TabContents* tab); 111 112 // Returns SidebarContainer corresponding to |sidebar_contents|. 113 SidebarContainer* FindSidebarContainerFor(TabContents* sidebar_contents); 114 115 // Registers new SidebarContainer for |tab|. There must be no 116 // other SidebarContainers registered for the RenderViewHost at the moment. 117 void RegisterSidebarContainerFor(TabContents* tab, 118 SidebarContainer* container); 119 120 // Unregisters SidebarContainer identified by |tab| and |content_id|. 121 void UnregisterSidebarContainerFor(TabContents* tab, 122 const std::string& content_id); 123 124 // Records the link between |tab| and |sidebar_host|. 125 void BindSidebarHost(TabContents* tab, SidebarContainer* sidebar_host); 126 127 // Forgets the link between |tab| and |sidebar_host|. 128 void UnbindSidebarHost(TabContents* tab, SidebarContainer* sidebar_host); 129 130 NotificationRegistrar registrar_; 131 132 // This map stores sidebars linked to a particular tab. Sidebars are 133 // identified by their unique content id (string). 134 typedef std::map<std::string, SidebarContainer*> ContentIdToSidebarHostMap; 135 136 // These two maps are for tracking dependencies between tabs and 137 // their SidebarContainers. 138 // 139 // SidebarManager start listening to SidebarContainers when they are put 140 // into these maps and removes them when they are closing. 141 struct SidebarStateForTab; 142 typedef std::map<TabContents*, SidebarStateForTab> TabToSidebarHostMap; 143 TabToSidebarHostMap tab_to_sidebar_host_; 144 145 typedef std::map<SidebarContainer*, TabContents*> SidebarHostToTabMap; 146 SidebarHostToTabMap sidebar_host_to_tab_; 147 148 DISALLOW_COPY_AND_ASSIGN(SidebarManager); 149 }; 150 151 #endif // CHROME_BROWSER_SIDEBAR_SIDEBAR_MANAGER_H_ 152 153