Index: chrome/browser/sidebar/sidebar_manager.cc |
=================================================================== |
--- chrome/browser/sidebar/sidebar_manager.cc (revision 74134) |
+++ chrome/browser/sidebar/sidebar_manager.cc (working copy) |
@@ -10,8 +10,9 @@ |
#include "chrome/browser/browser_process.h" |
#include "chrome/browser/extensions/extension_sidebar_api.h" |
#include "chrome/browser/profiles/profile.h" |
+#include "chrome/browser/sidebar/sidebar_container.h" |
#include "chrome/browser/tab_contents/tab_contents.h" |
-#include "chrome/browser/sidebar/sidebar_container.h" |
+#include "chrome/browser/ui/tab_contents/tab_contents_wrapper.h" |
#include "chrome/common/chrome_switches.h" |
#include "chrome/common/notification_service.h" |
#include "googleurl/src/gurl.h" |
@@ -37,8 +38,27 @@ |
SidebarManager::SidebarManager() { |
} |
+// SidebarModel overrides. |
+ |
+std::vector<SidebarContainer*> SidebarManager::GetAllSidebarsFor( |
+ TabContentsWrapper* tab) { |
+ std::vector<SidebarContainer*> sidebars; |
+ TabToSidebarHostMap::const_iterator it = tab_to_sidebar_host_.find(tab); |
+ if (it != tab_to_sidebar_host_.end()) { |
+ const ContentIdToSidebarHostMap& hosts = |
+ it->second.content_id_to_sidebar_host; |
+ |
+ sidebars.reserve(hosts.size()); |
+ for (ContentIdToSidebarHostMap::const_iterator it = hosts.begin(); |
+ it != hosts.end(); ++it) { |
+ sidebars.push_back(it->second); |
+ } |
+ } |
+ return sidebars; |
+} |
+ |
SidebarContainer* SidebarManager::GetActiveSidebarContainerFor( |
- TabContents* tab) { |
+ TabContentsWrapper* tab) { |
TabToSidebarHostMap::iterator it = tab_to_sidebar_host_.find(tab); |
if (it == tab_to_sidebar_host_.end()) |
return NULL; |
@@ -51,7 +71,7 @@ |
} |
SidebarContainer* SidebarManager::GetSidebarContainerFor( |
- TabContents* tab, const std::string& content_id) { |
+ TabContentsWrapper* tab, const std::string& content_id) { |
DCHECK(!content_id.empty()); |
TabToSidebarHostMap::iterator it = tab_to_sidebar_host_.find(tab); |
if (it == tab_to_sidebar_host_.end()) |
@@ -64,7 +84,7 @@ |
} |
TabContents* SidebarManager::GetSidebarTabContents( |
- TabContents* tab, const std::string& content_id) { |
+ TabContentsWrapper* tab, const std::string& content_id) { |
DCHECK(!content_id.empty()); |
SidebarContainer* sidebar_host = GetSidebarContainerFor(tab, content_id); |
if (!sidebar_host) |
@@ -88,19 +108,32 @@ |
if (was_active_host != NULL) { |
ExtensionSidebarEventRouter::OnStateChanged( |
was_active_sidebar_contents->profile(), |
- was_active_host->tab_contents(), was_active_host->content_id(), |
+ was_active_host->tab(), was_active_host->content_id(), |
extension_sidebar_constants::kShownState); |
} |
if (active_host != NULL) { |
ExtensionSidebarEventRouter::OnStateChanged( |
active_sidebar_contents->profile(), |
- active_host->tab_contents(), active_host->content_id(), |
+ active_host->tab(), active_host->content_id(), |
extension_sidebar_constants::kActiveState); |
} |
} |
-void SidebarManager::ShowSidebar(TabContents* tab, |
+void SidebarManager::ToggleSidebar(TabContentsWrapper* tab, |
+ const std::string& content_id) { |
+ DCHECK(!content_id.empty()); |
+ TabToSidebarHostMap::iterator it = tab_to_sidebar_host_.find(tab); |
+ if (it == tab_to_sidebar_host_.end()) |
+ return; |
+ // If it's not active, expand it. |
+ if (it->second.active_content_id != content_id) |
+ ExpandSidebar(tab, content_id); |
+ else |
+ CollapseSidebar(tab, content_id); |
+} |
+ |
+void SidebarManager::ShowSidebar(TabContentsWrapper* tab, |
const std::string& content_id) { |
DCHECK(!content_id.empty()); |
SidebarContainer* host = GetSidebarContainerFor(tab, content_id); |
@@ -119,7 +152,7 @@ |
extension_sidebar_constants::kShownState); |
} |
-void SidebarManager::ExpandSidebar(TabContents* tab, |
+void SidebarManager::ExpandSidebar(TabContentsWrapper* tab, |
const std::string& content_id) { |
DCHECK(!content_id.empty()); |
TabToSidebarHostMap::iterator it = tab_to_sidebar_host_.find(tab); |
@@ -130,7 +163,6 @@ |
return; |
SidebarContainer* host = GetSidebarContainerFor(tab, content_id); |
- DCHECK(host); |
if (!host) |
return; |
it->second.active_content_id = content_id; |
@@ -138,7 +170,7 @@ |
host->Expand(); |
} |
-void SidebarManager::CollapseSidebar(TabContents* tab, |
+void SidebarManager::CollapseSidebar(TabContentsWrapper* tab, |
const std::string& content_id) { |
DCHECK(!content_id.empty()); |
TabToSidebarHostMap::iterator it = tab_to_sidebar_host_.find(tab); |
@@ -149,7 +181,6 @@ |
return; |
SidebarContainer* host = GetSidebarContainerFor(tab, content_id); |
- DCHECK(host); |
if (!host) |
return; |
it->second.active_content_id.clear(); |
@@ -157,7 +188,7 @@ |
host->Collapse(); |
} |
-void SidebarManager::HideSidebar(TabContents* tab, |
+void SidebarManager::HideSidebar(TabContentsWrapper* tab, |
const std::string& content_id) { |
DCHECK(!content_id.empty()); |
TabToSidebarHostMap::iterator it = tab_to_sidebar_host_.find(tab); |
@@ -167,7 +198,8 @@ |
it->second.active_content_id.clear(); |
SidebarContainer* host = GetSidebarContainerFor(tab, content_id); |
- DCHECK(host); |
+ if (!host) |
+ return; |
UnregisterSidebarContainerFor(tab, content_id); |
@@ -176,7 +208,7 @@ |
extension_sidebar_constants::kHiddenState); |
} |
-void SidebarManager::NavigateSidebar(TabContents* tab, |
+void SidebarManager::NavigateSidebar(TabContentsWrapper* tab, |
const std::string& content_id, |
const GURL& url) { |
DCHECK(!content_id.empty()); |
@@ -188,7 +220,7 @@ |
} |
void SidebarManager::SetSidebarBadgeText( |
- TabContents* tab, const std::string& content_id, |
+ TabContentsWrapper* tab, const std::string& content_id, |
const string16& badge_text) { |
SidebarContainer* host = GetSidebarContainerFor(tab, content_id); |
if (!host) |
@@ -197,7 +229,7 @@ |
} |
void SidebarManager::SetSidebarIcon( |
- TabContents* tab, const std::string& content_id, |
+ TabContentsWrapper* tab, const std::string& content_id, |
const SkBitmap& bitmap) { |
SidebarContainer* host = GetSidebarContainerFor(tab, content_id); |
if (!host) |
@@ -206,7 +238,7 @@ |
} |
void SidebarManager::SetSidebarTitle( |
- TabContents* tab, const std::string& content_id, |
+ TabContentsWrapper* tab, const std::string& content_id, |
const string16& title) { |
SidebarContainer* host = GetSidebarContainerFor(tab, content_id); |
if (!host) |
@@ -214,29 +246,45 @@ |
host->SetTitle(title); |
} |
+// SidebarManager, public. |
+ |
+bool SidebarManager::IsAnySidebarDefinedFor(TabContentsWrapper* tab) { |
+ TabToSidebarHostMap::const_iterator it = tab_to_sidebar_host_.find(tab); |
+ if (it == tab_to_sidebar_host_.end()) |
+ return false; |
+ return !it->second.content_id_to_sidebar_host.empty(); |
+} |
+ |
SidebarManager::~SidebarManager() { |
DCHECK(tab_to_sidebar_host_.empty()); |
DCHECK(sidebar_host_to_tab_.empty()); |
} |
+// NotificationObserver overrides. |
+ |
void SidebarManager::Observe(NotificationType type, |
const NotificationSource& source, |
const NotificationDetails& details) { |
if (type == NotificationType::TAB_CONTENTS_DESTROYED) { |
- HideAllSidebars(Source<TabContents>(source).ptr()); |
+ TabContents* tab_contents = Source<TabContents>(source).ptr(); |
+ HideAllSidebars(FindTabContentsWrapperFor(tab_contents)); |
} else { |
NOTREACHED() << "Got a notification we didn't register for!"; |
} |
} |
-void SidebarManager::UpdateSidebar(SidebarContainer* host) { |
+// SidebarContainer::Delegate overrides. |
+ |
+void SidebarManager::UpdateSidebar(SidebarChangedDetails* details) { |
NotificationService::current()->Notify( |
NotificationType::SIDEBAR_CHANGED, |
Source<SidebarManager>(this), |
- Details<SidebarContainer>(host)); |
+ Details<SidebarChangedDetails>(details)); |
} |
-void SidebarManager::HideAllSidebars(TabContents* tab) { |
+// SidebarManager, private. |
+ |
+void SidebarManager::HideAllSidebars(TabContentsWrapper* tab) { |
TabToSidebarHostMap::iterator tab_it = tab_to_sidebar_host_.find(tab); |
if (tab_it == tab_to_sidebar_host_.end()) |
return; |
@@ -266,22 +314,32 @@ |
return NULL; |
} |
+TabContentsWrapper* SidebarManager::FindTabContentsWrapperFor( |
+ TabContents* tab_contents) { |
+ for (TabToSidebarHostMap::const_iterator it = tab_to_sidebar_host_.begin(); |
+ it != tab_to_sidebar_host_.end(); ++it) { |
+ if (it->first->tab_contents() == tab_contents) |
+ return it->first; |
+ } |
+ return NULL; |
+} |
+ |
void SidebarManager::RegisterSidebarContainerFor( |
- TabContents* tab, SidebarContainer* sidebar_host) { |
+ TabContentsWrapper* tab, SidebarContainer* sidebar_host) { |
DCHECK(!GetSidebarContainerFor(tab, sidebar_host->content_id())); |
// If it's a first sidebar for this tab, register destroy notification. |
if (tab_to_sidebar_host_.find(tab) == tab_to_sidebar_host_.end()) { |
registrar_.Add(this, |
NotificationType::TAB_CONTENTS_DESTROYED, |
- Source<TabContents>(tab)); |
+ Source<TabContents>(tab->tab_contents())); |
} |
BindSidebarHost(tab, sidebar_host); |
} |
void SidebarManager::UnregisterSidebarContainerFor( |
- TabContents* tab, const std::string& content_id) { |
+ TabContentsWrapper* tab, const std::string& content_id) { |
SidebarContainer* host = GetSidebarContainerFor(tab, content_id); |
DCHECK(host); |
if (!host) |
@@ -293,7 +351,7 @@ |
if (tab_to_sidebar_host_.find(tab) == tab_to_sidebar_host_.end()) { |
registrar_.Remove(this, |
NotificationType::TAB_CONTENTS_DESTROYED, |
- Source<TabContents>(tab)); |
+ Source<TabContents>(tab->tab_contents())); |
} |
// Issue tab closing event post unbound. |
@@ -302,7 +360,7 @@ |
delete host; |
} |
-void SidebarManager::BindSidebarHost(TabContents* tab, |
+void SidebarManager::BindSidebarHost(TabContentsWrapper* tab, |
SidebarContainer* sidebar_host) { |
const std::string& content_id = sidebar_host->content_id(); |
@@ -315,7 +373,7 @@ |
sidebar_host_to_tab_[sidebar_host] = tab; |
} |
-void SidebarManager::UnbindSidebarHost(TabContents* tab, |
+void SidebarManager::UnbindSidebarHost(TabContentsWrapper* tab, |
SidebarContainer* sidebar_host) { |
const std::string& content_id = sidebar_host->content_id(); |