1ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// Use of this source code is governed by a BSD-style license that can be
3bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// found in the LICENSE file.
4bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
5bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "chrome/browser/sidebar/sidebar_manager.h"
6bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
7bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include <vector>
8bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
9bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "base/command_line.h"
10bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "chrome/browser/browser_process.h"
11bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "chrome/browser/extensions/extension_sidebar_api.h"
1221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "chrome/browser/profiles/profile.h"
13bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "chrome/browser/sidebar/sidebar_container.h"
14bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "chrome/common/chrome_switches.h"
15dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/tab_contents/tab_contents.h"
16ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/common/notification_service.h"
17bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "googleurl/src/gurl.h"
18bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
19513209b27ff55e2841eac0e4120199c23acce758Ben Murdochstruct SidebarManager::SidebarStateForTab {
20513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // Sidebars linked to this tab.
21513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  ContentIdToSidebarHostMap content_id_to_sidebar_host;
22513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // Content id of the currently active (expanded and visible) sidebar.
23513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  std::string active_content_id;
24513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch};
25513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
26bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// static
27bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenSidebarManager* SidebarManager::GetInstance() {
28bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  return g_browser_process->sidebar_manager();
29bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
30bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
31bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// static
32bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenbool SidebarManager::IsSidebarAllowed() {
33bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  return CommandLine::ForCurrentProcess()->HasSwitch(
34bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      switches::kEnableExperimentalExtensionApis);
35bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
36bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
37bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenSidebarManager::SidebarManager() {
38bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
39bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
40bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenSidebarContainer* SidebarManager::GetActiveSidebarContainerFor(
41bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    TabContents* tab) {
42bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  TabToSidebarHostMap::iterator it = tab_to_sidebar_host_.find(tab);
43bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (it == tab_to_sidebar_host_.end())
44bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    return NULL;
45bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (it->second.active_content_id.empty())
46bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    return NULL;
47bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  ContentIdToSidebarHostMap::iterator host_it =
48bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      it->second.content_id_to_sidebar_host.find(it->second.active_content_id);
49bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  DCHECK(host_it != it->second.content_id_to_sidebar_host.end());
50bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  return host_it->second;
51bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
52bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
53bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenSidebarContainer* SidebarManager::GetSidebarContainerFor(
54bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    TabContents* tab, const std::string& content_id) {
55bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  DCHECK(!content_id.empty());
56bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  TabToSidebarHostMap::iterator it = tab_to_sidebar_host_.find(tab);
57bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (it == tab_to_sidebar_host_.end())
58bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    return NULL;
59bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  ContentIdToSidebarHostMap::iterator host_it =
60bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      it->second.content_id_to_sidebar_host.find(content_id);
61bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (host_it == it->second.content_id_to_sidebar_host.end())
62bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    return NULL;
63bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  return host_it->second;
64bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
65bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
66bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenTabContents* SidebarManager::GetSidebarTabContents(
67bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    TabContents* tab, const std::string& content_id) {
68bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  DCHECK(!content_id.empty());
69bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  SidebarContainer* sidebar_host = GetSidebarContainerFor(tab, content_id);
70bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (!sidebar_host)
71bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    return NULL;
72bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  return sidebar_host->sidebar_contents();
73bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
74bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
75bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid SidebarManager::NotifyStateChanges(
76bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    TabContents* was_active_sidebar_contents,
77bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    TabContents* active_sidebar_contents) {
78bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (was_active_sidebar_contents == active_sidebar_contents)
79bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    return;
80bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
81bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  SidebarContainer* was_active_host =
82bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      was_active_sidebar_contents == NULL ? NULL :
83bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen          FindSidebarContainerFor(was_active_sidebar_contents);
84bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  SidebarContainer* active_host =
85bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      active_sidebar_contents == NULL ? NULL :
86bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen          FindSidebarContainerFor(active_sidebar_contents);
87bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
88bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (was_active_host != NULL) {
89bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    ExtensionSidebarEventRouter::OnStateChanged(
90bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen        was_active_sidebar_contents->profile(),
91bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen        was_active_host->tab_contents(), was_active_host->content_id(),
92bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen        extension_sidebar_constants::kShownState);
93bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
94bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
95bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (active_host != NULL) {
96bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    ExtensionSidebarEventRouter::OnStateChanged(
97bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen        active_sidebar_contents->profile(),
98bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen        active_host->tab_contents(), active_host->content_id(),
99bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen        extension_sidebar_constants::kActiveState);
100bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
101bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
102bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
103bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid SidebarManager::ShowSidebar(TabContents* tab,
104bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                 const std::string& content_id) {
105bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  DCHECK(!content_id.empty());
106bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  SidebarContainer* host = GetSidebarContainerFor(tab, content_id);
107bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (!host) {
108bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    host = new SidebarContainer(tab, content_id, this);
109bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    RegisterSidebarContainerFor(tab, host);
11072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    // It might trigger UpdateSidebar notification, so load them after
11172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    // the registration.
11272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    host->LoadDefaults();
113bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
114bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
115bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  host->Show();
116bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
117bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  ExtensionSidebarEventRouter::OnStateChanged(
118bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      tab->profile(), tab, content_id,
119bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      extension_sidebar_constants::kShownState);
120bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
121bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
122bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid SidebarManager::ExpandSidebar(TabContents* tab,
123bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                   const std::string& content_id) {
124bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  DCHECK(!content_id.empty());
125bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  TabToSidebarHostMap::iterator it = tab_to_sidebar_host_.find(tab);
126bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (it == tab_to_sidebar_host_.end())
127bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    return;
128bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // If it's already active, bail out.
129bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (it->second.active_content_id == content_id)
130bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    return;
131bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
132bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  SidebarContainer* host = GetSidebarContainerFor(tab, content_id);
133bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  DCHECK(host);
134bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (!host)
135bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    return;
136bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  it->second.active_content_id = content_id;
137bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
138bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  host->Expand();
139bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
140bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
141bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid SidebarManager::CollapseSidebar(TabContents* tab,
142bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                     const std::string& content_id) {
143bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  DCHECK(!content_id.empty());
144bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  TabToSidebarHostMap::iterator it = tab_to_sidebar_host_.find(tab);
145bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (it == tab_to_sidebar_host_.end())
146bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    return;
147bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // If it's not the one active now, bail out.
148bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (it->second.active_content_id != content_id)
149bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    return;
150bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
151bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  SidebarContainer* host = GetSidebarContainerFor(tab, content_id);
152bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  DCHECK(host);
153bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (!host)
154bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    return;
155bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  it->second.active_content_id.clear();
156bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
157bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  host->Collapse();
158bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
159bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
160bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid SidebarManager::HideSidebar(TabContents* tab,
161bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                 const std::string& content_id) {
162bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  DCHECK(!content_id.empty());
163bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  TabToSidebarHostMap::iterator it = tab_to_sidebar_host_.find(tab);
164bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (it == tab_to_sidebar_host_.end())
165bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    return;
166bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (it->second.active_content_id == content_id)
167bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    it->second.active_content_id.clear();
168bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
169bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  SidebarContainer* host = GetSidebarContainerFor(tab, content_id);
170bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  DCHECK(host);
171bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
172bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  UnregisterSidebarContainerFor(tab, content_id);
173bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
174bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  ExtensionSidebarEventRouter::OnStateChanged(
175bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      tab->profile(), tab, content_id,
176bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      extension_sidebar_constants::kHiddenState);
177bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
178bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
179bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid SidebarManager::NavigateSidebar(TabContents* tab,
180bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                     const std::string& content_id,
181bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                     const GURL& url) {
182bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  DCHECK(!content_id.empty());
183bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  SidebarContainer* host = GetSidebarContainerFor(tab, content_id);
184bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (!host)
185bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    return;
186bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
187bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  host->Navigate(url);
188bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
189bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
190bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid SidebarManager::SetSidebarBadgeText(
191bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    TabContents* tab, const std::string& content_id,
192bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    const string16& badge_text) {
193bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  SidebarContainer* host = GetSidebarContainerFor(tab, content_id);
194bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (!host)
195bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    return;
196bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  host->SetBadgeText(badge_text);
197bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
198bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
199bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid SidebarManager::SetSidebarIcon(
200bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    TabContents* tab, const std::string& content_id,
201bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    const SkBitmap& bitmap) {
202bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  SidebarContainer* host = GetSidebarContainerFor(tab, content_id);
203bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (!host)
204bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    return;
205bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  host->SetIcon(bitmap);
206bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
207bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
208bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid SidebarManager::SetSidebarTitle(
209bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    TabContents* tab, const std::string& content_id,
210bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    const string16& title) {
211bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  SidebarContainer* host = GetSidebarContainerFor(tab, content_id);
212bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (!host)
213bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    return;
214bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  host->SetTitle(title);
215bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
216bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
217bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenSidebarManager::~SidebarManager() {
218bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  DCHECK(tab_to_sidebar_host_.empty());
219bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  DCHECK(sidebar_host_to_tab_.empty());
220bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
221bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
222bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid SidebarManager::Observe(NotificationType type,
223bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                             const NotificationSource& source,
224bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                             const NotificationDetails& details) {
225bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (type == NotificationType::TAB_CONTENTS_DESTROYED) {
226bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    HideAllSidebars(Source<TabContents>(source).ptr());
227bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  } else {
228bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    NOTREACHED() << "Got a notification we didn't register for!";
229bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
230bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
231bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
232bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid SidebarManager::UpdateSidebar(SidebarContainer* host) {
233bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  NotificationService::current()->Notify(
234bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      NotificationType::SIDEBAR_CHANGED,
235bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      Source<SidebarManager>(this),
236bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      Details<SidebarContainer>(host));
237bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
238bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
239bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid SidebarManager::HideAllSidebars(TabContents* tab) {
240bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  TabToSidebarHostMap::iterator tab_it = tab_to_sidebar_host_.find(tab);
241bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (tab_it == tab_to_sidebar_host_.end())
242bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    return;
243bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  const ContentIdToSidebarHostMap& hosts =
244bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      tab_it->second.content_id_to_sidebar_host;
245bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
246bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  std::vector<std::string> content_ids;
247bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  for (ContentIdToSidebarHostMap::const_iterator it = hosts.begin();
248bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen       it != hosts.end(); ++it) {
249bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    content_ids.push_back(it->first);
250bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
251bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
252bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  for (std::vector<std::string>::iterator it = content_ids.begin();
253bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen       it != content_ids.end(); ++it) {
254bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    HideSidebar(tab, *it);
255bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
256bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
257bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
258bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenSidebarContainer* SidebarManager::FindSidebarContainerFor(
259bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    TabContents* sidebar_contents) {
260bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  for (SidebarHostToTabMap::iterator it = sidebar_host_to_tab_.begin();
261bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen       it != sidebar_host_to_tab_.end();
262bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen       ++it) {
263bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    if (sidebar_contents == it->first->sidebar_contents())
264bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      return it->first;
265bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
266bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  return NULL;
267bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
268bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
269bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid SidebarManager::RegisterSidebarContainerFor(
270bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    TabContents* tab, SidebarContainer* sidebar_host) {
271bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  DCHECK(!GetSidebarContainerFor(tab, sidebar_host->content_id()));
272bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
273bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // If it's a first sidebar for this tab, register destroy notification.
274bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (tab_to_sidebar_host_.find(tab) == tab_to_sidebar_host_.end()) {
275bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    registrar_.Add(this,
276bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                   NotificationType::TAB_CONTENTS_DESTROYED,
277bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                   Source<TabContents>(tab));
278bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
279bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
280bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  BindSidebarHost(tab, sidebar_host);
281bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
282bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
283bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid SidebarManager::UnregisterSidebarContainerFor(
284bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      TabContents* tab, const std::string& content_id) {
285bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  SidebarContainer* host = GetSidebarContainerFor(tab, content_id);
286bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  DCHECK(host);
287bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (!host)
288bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    return;
289bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
290bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  UnbindSidebarHost(tab, host);
291bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
292bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // If there's no more sidebars linked to this tab, unsubscribe.
293bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (tab_to_sidebar_host_.find(tab) == tab_to_sidebar_host_.end()) {
294bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    registrar_.Remove(this,
295bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                      NotificationType::TAB_CONTENTS_DESTROYED,
296bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                      Source<TabContents>(tab));
297bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
298bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
299bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Issue tab closing event post unbound.
300bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  host->SidebarClosing();
301bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Destroy sidebar container.
302bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  delete host;
303bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
304bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
305bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid SidebarManager::BindSidebarHost(TabContents* tab,
306bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                     SidebarContainer* sidebar_host) {
307bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  const std::string& content_id = sidebar_host->content_id();
308bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
309bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  DCHECK(GetSidebarContainerFor(tab, content_id) == NULL);
310bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  DCHECK(sidebar_host_to_tab_.find(sidebar_host) ==
311bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen         sidebar_host_to_tab_.end());
312bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
313bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  tab_to_sidebar_host_[tab].content_id_to_sidebar_host[content_id] =
314bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      sidebar_host;
315bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  sidebar_host_to_tab_[sidebar_host] = tab;
316bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
317bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
318bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid SidebarManager::UnbindSidebarHost(TabContents* tab,
319bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                       SidebarContainer* sidebar_host) {
320bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  const std::string& content_id = sidebar_host->content_id();
321bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
322bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  DCHECK(GetSidebarContainerFor(tab, content_id) == sidebar_host);
323bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  DCHECK(sidebar_host_to_tab_.find(sidebar_host)->second == tab);
324bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  DCHECK(tab_to_sidebar_host_[tab].active_content_id != content_id);
325bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
326bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  tab_to_sidebar_host_[tab].content_id_to_sidebar_host.erase(content_id);
327bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (tab_to_sidebar_host_[tab].content_id_to_sidebar_host.empty())
328bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    tab_to_sidebar_host_.erase(tab);
329bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  sidebar_host_to_tab_.erase(sidebar_host);
330bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
331