sidebar_manager.cc revision ddb351dbec246cf1fab5ec20d2d5520909041de1
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