Chromium Code Reviews| Index: chrome/browser/sessions/session_service.cc | 
| diff --git a/chrome/browser/sessions/session_service.cc b/chrome/browser/sessions/session_service.cc | 
| index c5864b1c72eb22d6cbcbd4ab360c8882e65cea0b..7a85e8b8435ddfc68965d92e93bf23c427d8e7dc 100644 | 
| --- a/chrome/browser/sessions/session_service.cc | 
| +++ b/chrome/browser/sessions/session_service.cc | 
| @@ -66,6 +66,7 @@ static const SessionCommand::id_type | 
| static const SessionCommand::id_type kCommandSetPinnedState = 12; | 
| static const SessionCommand::id_type kCommandSetExtensionAppID = 13; | 
| static const SessionCommand::id_type kCommandSetWindowBounds3 = 14; | 
| +static const SessionCommand::id_type kCommandSetWindowAppName = 15; | 
| // Every kWritesPerReset commands triggers recreating the file. | 
| static const int kWritesPerReset = 250; | 
| @@ -319,8 +320,9 @@ void SessionService::WindowClosed(const SessionID& window_id) { | 
| } | 
| void SessionService::SetWindowType(const SessionID& window_id, | 
| - Browser::Type type) { | 
| - if (!should_track_changes_for_browser_type(type)) | 
| + Browser::Type type, | 
| + bool is_app) { | 
| + if (!should_track_changes_for_browser_type(type, is_app)) | 
| return; | 
| windows_tracking_.insert(window_id.id()); | 
| @@ -336,6 +338,18 @@ void SessionService::SetWindowType(const SessionID& window_id, | 
| CreateSetWindowTypeCommand(window_id, WindowTypeForBrowserType(type))); | 
| } | 
| +void SessionService::SetWindowAppName( | 
| + const SessionID& window_id, | 
| + const std::string& app_name) { | 
| + if (!ShouldTrackChangesToWindow(window_id)) | 
| + return; | 
| + | 
| + ScheduleCommand(CreateSetTabExtensionAppIDCommand( | 
| + kCommandSetWindowAppName, | 
| + window_id.id(), | 
| + app_name)); | 
| +} | 
| + | 
| void SessionService::TabNavigationPathPrunedFromBack(const SessionID& window_id, | 
| const SessionID& tab_id, | 
| int count) { | 
| @@ -470,7 +484,7 @@ void SessionService::Init() { | 
| content::NotificationService::AllSources()); | 
| registrar_.Add(this, content::NOTIFICATION_NAV_ENTRY_COMMITTED, | 
| content::NotificationService::AllSources()); | 
| - registrar_.Add(this, chrome::NOTIFICATION_BROWSER_OPENED, | 
| + registrar_.Add(this, chrome::NOTIFICATION_BROWSER_WINDOW_READY, | 
| 
 
sky
2012/02/24 20:56:04
Can you add a comment that we can't use OPENED as
 
DaveMoore
2012/02/25 16:54:42
Done.
 
 | 
| content::NotificationService::AllBrowserContextsAndSources()); | 
| registrar_.Add( | 
| this, chrome::NOTIFICATION_TAB_CONTENTS_APPLICATION_EXTENSION_CHANGED, | 
| @@ -522,15 +536,17 @@ void SessionService::Observe(int type, | 
| const content::NotificationDetails& details) { | 
| // All of our messages have the NavigationController as the source. | 
| switch (type) { | 
| - case chrome::NOTIFICATION_BROWSER_OPENED: { | 
| + case chrome::NOTIFICATION_BROWSER_WINDOW_READY: { | 
| Browser* browser = content::Source<Browser>(source).ptr(); | 
| if (browser->profile() != profile() || | 
| - !should_track_changes_for_browser_type(browser->type())) { | 
| + !should_track_changes_for_browser_type(browser->type(), | 
| + browser->is_app())) { | 
| return; | 
| } | 
| RestoreIfNecessary(std::vector<GURL>(), browser); | 
| - SetWindowType(browser->session_id(), browser->type()); | 
| + SetWindowType(browser->session_id(), browser->type(), browser->is_app()); | 
| + SetWindowAppName(browser->session_id(), browser->app_name()); | 
| break; | 
| } | 
| @@ -886,23 +902,25 @@ void SessionService::SortTabsBasedOnVisualOrderAndPrune( | 
| std::vector<SessionWindow*>* valid_windows) { | 
| std::map<int, SessionWindow*>::iterator i = windows->begin(); | 
| while (i != windows->end()) { | 
| - if (i->second->tabs.empty() || i->second->is_constrained || | 
| + SessionWindow* window = i->second; | 
| + if (window->tabs.empty() || window->is_constrained || | 
| !should_track_changes_for_browser_type( | 
| - static_cast<Browser::Type>(i->second->type))) { | 
| - delete i->second; | 
| + static_cast<Browser::Type>(window->type), | 
| + !window->app_name.empty())) { | 
| + delete window; | 
| windows->erase(i++); | 
| } else { | 
| // Valid window; sort the tabs and add it to the list of valid windows. | 
| - std::sort(i->second->tabs.begin(), i->second->tabs.end(), | 
| + std::sort(window->tabs.begin(), window->tabs.end(), | 
| &TabVisualIndexSortFunction); | 
| // Add the window such that older windows appear first. | 
| if (valid_windows->empty()) { | 
| - valid_windows->push_back(i->second); | 
| + valid_windows->push_back(window); | 
| } else { | 
| valid_windows->insert( | 
| std::upper_bound(valid_windows->begin(), valid_windows->end(), | 
| - i->second, &WindowOrderSortFunction), | 
| - i->second); | 
| + window, &WindowOrderSortFunction), | 
| + window); | 
| } | 
| ++i; | 
| } | 
| @@ -1106,6 +1124,16 @@ bool SessionService::CreateTabsAndWindows( | 
| break; | 
| } | 
| + case kCommandSetWindowAppName: { | 
| + SessionID::id_type window_id; | 
| + std::string app_name; | 
| + if (!RestoreSetWindowAppNameCommand(*command, &window_id, &app_name)) | 
| + return true; | 
| + | 
| + GetWindow(window_id, windows)->app_name.swap(app_name); | 
| + break; | 
| + } | 
| + | 
| case kCommandSetExtensionAppID: { | 
| SessionID::id_type tab_id; | 
| std::string extension_app_id; | 
| @@ -1201,6 +1229,13 @@ void SessionService::BuildCommandsForBrowser( | 
| commands->push_back(CreateSetWindowTypeCommand( | 
| browser->session_id(), WindowTypeForBrowserType(browser->type()))); | 
| + if (!browser->app_name().empty()) { | 
| + commands->push_back(CreateSetWindowAppNameCommand( | 
| + kCommandSetWindowAppName, | 
| + browser->session_id().id(), | 
| + browser->app_name())); | 
| + } | 
| + | 
| bool added_to_windows_to_track = false; | 
| for (int i = 0; i < browser->tab_count(); ++i) { | 
| TabContentsWrapper* tab = browser->GetTabContentsWrapperAt(i); | 
| @@ -1227,15 +1262,18 @@ void SessionService::BuildCommandsFromBrowsers( | 
| DCHECK(commands); | 
| for (BrowserList::const_iterator i = BrowserList::begin(); | 
| i != BrowserList::end(); ++i) { | 
| + Browser* browser = *i; | 
| // Make sure the browser has tabs and a window. Browsers destructor | 
| // removes itself from the BrowserList. When a browser is closed the | 
| // destructor is not necessarily run immediately. This means its possible | 
| // for us to get a handle to a browser that is about to be removed. If | 
| // the tab count is 0 or the window is NULL, the browser is about to be | 
| // deleted, so we ignore it. | 
| - if (should_track_changes_for_browser_type((*i)->type()) && | 
| - (*i)->tab_count() && (*i)->window()) { | 
| - BuildCommandsForBrowser(*i, commands, tab_to_available_range, | 
| + if (should_track_changes_for_browser_type(browser->type(), | 
| + browser->is_app()) && | 
| + browser->tab_count() && | 
| + browser->window()) { | 
| + BuildCommandsForBrowser(browser, commands, tab_to_available_range, | 
| windows_to_track); | 
| } | 
| } | 
| @@ -1342,9 +1380,11 @@ bool SessionService::IsOnlyOneTabLeft() { | 
| int window_count = 0; | 
| for (BrowserList::const_iterator i = BrowserList::begin(); | 
| i != BrowserList::end(); ++i) { | 
| - const SessionID::id_type window_id = (*i)->session_id().id(); | 
| - if (should_track_changes_for_browser_type((*i)->type()) && | 
| - (*i)->profile() == profile() && | 
| + Browser* browser = *i; | 
| 
 
sky
2012/02/24 20:56:04
nit: "  " -> " "
 
DaveMoore
2012/02/25 16:54:42
Done.
 
 | 
| + const SessionID::id_type window_id = browser->session_id().id(); | 
| + if (should_track_changes_for_browser_type(browser->type(), | 
| + browser->is_app()) && | 
| + browser->profile() == profile() && | 
| window_closing_ids_.find(window_id) == window_closing_ids_.end()) { | 
| if (++window_count > 1) | 
| return false; | 
| @@ -1369,7 +1409,8 @@ bool SessionService::HasOpenTrackableBrowsers(const SessionID& window_id) { | 
| const SessionID::id_type browser_id = browser->session_id().id(); | 
| if (browser_id != window_id.id() && | 
| window_closing_ids_.find(browser_id) == window_closing_ids_.end() && | 
| - should_track_changes_for_browser_type(browser->type()) && | 
| + should_track_changes_for_browser_type(browser->type(), | 
| + browser->is_app()) && | 
| browser->profile() == profile()) { | 
| return true; | 
| } | 
| @@ -1382,7 +1423,14 @@ bool SessionService::ShouldTrackChangesToWindow(const SessionID& window_id) { | 
| } | 
| -bool SessionService::should_track_changes_for_browser_type(Browser::Type type) { | 
| +bool SessionService::should_track_changes_for_browser_type(Browser::Type type, | 
| + bool is_app) { | 
| +#if defined(USE_AURA) | 
| + // Restore app popups for aura alone. | 
| + if (type == Browser::TYPE_POPUP && is_app) | 
| + return true; | 
| +#endif | 
| + | 
| return type == Browser::TYPE_TABBED || | 
| (type == Browser::TYPE_POPUP && browser_defaults::kRestorePopups); | 
| } |