Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2640)

Unified Diff: chrome/browser/sessions/tab_restore_service.cc

Issue 92001: Restore closed tabs into new windows when necessary, and track the windows th... (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: '' Created 11 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « chrome/browser/sessions/tab_restore_service.h ('k') | chrome/browser/tab_restore_uitest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome/browser/sessions/tab_restore_service.cc
===================================================================
--- chrome/browser/sessions/tab_restore_service.cc (revision 14184)
+++ chrome/browser/sessions/tab_restore_service.cc (working copy)
@@ -126,17 +126,10 @@
return;
scoped_ptr<Tab> local_tab(new Tab());
- PopulateTabFromController(tab, local_tab.get());
+ PopulateTab(local_tab.get(), browser, tab);
if (local_tab->navigations.empty())
return;
- // browser may be NULL when running unit tests.
- if (browser) {
- local_tab->browser_id = browser->session_id().id();
- local_tab->tabstrip_index =
- browser->tabstrip_model()->GetIndexOfController(tab);
- }
-
AddEntry(local_tab.release(), true, true);
}
@@ -152,13 +145,15 @@
window->tabs.resize(browser->tab_count());
size_t entry_index = 0;
for (int tab_index = 0; tab_index < browser->tab_count(); ++tab_index) {
- PopulateTabFromController(
- &browser->GetTabContentsAt(tab_index)->controller(),
- &(window->tabs[entry_index]));
- if (window->tabs[entry_index].navigations.empty())
+ PopulateTab(&(window->tabs[entry_index]),
+ browser,
+ &browser->GetTabContentsAt(tab_index)->controller());
+ if (window->tabs[entry_index].navigations.empty()) {
window->tabs.erase(window->tabs.begin() + entry_index);
- else
+ } else {
+ window->tabs[entry_index].browser_id = browser->session_id().id();
entry_index++;
+ }
}
if (window->tabs.empty()) {
delete window;
@@ -233,12 +228,20 @@
int tab_index = -1;
if (tab->has_browser())
tab_browser = BrowserList::FindBrowserWithID(tab->browser_id);
- if (tab_browser)
+
+ if (tab_browser) {
tab_index = tab->tabstrip_index;
- else
- tab_browser = browser;
- if (tab_index < 0 || tab_index > browser->tab_count())
- tab_index = browser->tab_count();
+ } else {
+ tab_browser = Browser::Create(profile());
+ if (tab->has_browser()) {
+ UpdateTabBrowserIDs(tab->browser_id,
+ tab_browser->session_id().id());
+ }
+ tab_browser->window()->Show();
+ }
+
+ if (tab_index < 0 || tab_index > tab_browser->tab_count())
+ tab_index = tab_browser->tab_count();
tab_browser->AddRestoredTab(tab->navigations, tab_index,
tab->current_navigation_index, true);
}
@@ -255,6 +258,11 @@
if (restored_tab)
restored_tab->controller().LoadIfNecessary();
}
+ // All the window's tabs had the same former browser_id.
+ if (window->tabs[0].has_browser()) {
+ UpdateTabBrowserIDs(window->tabs[0].browser_id,
+ browser->session_id().id());
+ }
browser->window()->Show();
} else {
NOTREACHED();
@@ -325,9 +333,9 @@
BaseSessionService::Save();
}
-void TabRestoreService::PopulateTabFromController(
- NavigationController* controller,
- Tab* tab) {
+void TabRestoreService::PopulateTab(Tab* tab,
+ Browser* browser,
+ NavigationController* controller) {
const int pending_index = controller->pending_entry_index();
int entry_count = controller->entry_count();
if (entry_count == 0 && pending_index == 0)
@@ -341,6 +349,13 @@
tab->current_navigation_index = controller->GetCurrentEntryIndex();
if (tab->current_navigation_index == -1 && entry_count > 0)
tab->current_navigation_index = 0;
+
+ // Browser may be NULL during unit tests.
+ if (browser) {
+ tab->browser_id = browser->session_id().id();
+ tab->tabstrip_index =
+ browser->tabstrip_model()->GetIndexOfController(controller);
+ }
}
void TabRestoreService::NotifyTabsChanged() {
@@ -683,6 +698,18 @@
STLDeleteElements(&invalid_entries);
}
+void TabRestoreService::UpdateTabBrowserIDs(SessionID::id_type old_id,
+ SessionID::id_type new_id) {
+ for (Entries::iterator i = entries_.begin(); i != entries_.end(); ++i) {
+ Entry* entry = *i;
+ if (entry->type == TAB) {
+ Tab* tab = static_cast<Tab*>(entry);
+ if (tab->browser_id == old_id)
+ tab->browser_id = new_id;
+ }
+ }
+}
+
void TabRestoreService::OnGotPreviousSession(
Handle handle,
std::vector<SessionWindow*>* windows) {
« no previous file with comments | « chrome/browser/sessions/tab_restore_service.h ('k') | chrome/browser/tab_restore_uitest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698