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); |
} |