Chromium Code Reviews| Index: chrome/browser/sessions/session_restore.cc |
| diff --git a/chrome/browser/sessions/session_restore.cc b/chrome/browser/sessions/session_restore.cc |
| index a4184999051a3dfb15435cc36f41d0e36b35503a..185e1c3b04d563c191b547f6242b545bb6a4da42 100644 |
| --- a/chrome/browser/sessions/session_restore.cc |
| +++ b/chrome/browser/sessions/session_restore.cc |
| @@ -31,6 +31,7 @@ |
| #include "chrome/browser/chrome_notification_types.h" |
| #include "chrome/browser/lifetime/keep_alive_types.h" |
| #include "chrome/browser/lifetime/scoped_keep_alive.h" |
| +#include "chrome/browser/prefs/session_startup_pref.h" |
| #include "chrome/browser/profiles/profile.h" |
| #include "chrome/browser/search/search.h" |
| #include "chrome/browser/sessions/session_restore_delegate.h" |
| @@ -75,6 +76,30 @@ using RestoredTab = SessionRestoreDelegate::RestoredTab; |
| namespace { |
| +// Appends the urls in |urls| to |browser|. |
| +void AppendURLsToBrowser(Browser* browser, const std::vector<GURL>& urls) { |
| + for (size_t i = 0; i < urls.size(); ++i) { |
| + int add_types = TabStripModel::ADD_FORCE_INDEX; |
| + if (i == 0) |
| + add_types |= TabStripModel::ADD_ACTIVE; |
| + chrome::NavigateParams params(browser, urls[i], |
| + ui::PAGE_TRANSITION_AUTO_TOPLEVEL); |
| + params.disposition = i == 0 ? WindowOpenDisposition::NEW_FOREGROUND_TAB |
| + : WindowOpenDisposition::NEW_BACKGROUND_TAB; |
| + params.tabstrip_add_types = add_types; |
| + chrome::Navigate(¶ms); |
| + } |
| +} |
| + |
| +bool HasSingleNewTabPage(Browser* browser) { |
| + if (browser->tab_strip_model()->count() != 1) |
| + return false; |
| + const content::WebContents* active_tab = |
| + browser->tab_strip_model()->GetWebContentsAt(0); |
| + return active_tab->GetURL() == chrome::kChromeUINewTabURL || |
| + search::IsInstantNTP(active_tab); |
| +} |
| + |
| class SessionRestoreImpl; |
| // Pointers to SessionRestoreImpls which are currently restoring the session. |
| @@ -649,21 +674,6 @@ class SessionRestoreImpl : public content::NotificationObserver { |
| browser->tab_strip_model()->GetActiveWebContents()->SetInitialFocus(); |
| } |
| - // Appends the urls in |urls| to |browser|. |
| - void AppendURLsToBrowser(Browser* browser, const std::vector<GURL>& urls) { |
| - for (size_t i = 0; i < urls.size(); ++i) { |
| - int add_types = TabStripModel::ADD_FORCE_INDEX; |
| - if (i == 0) |
| - add_types |= TabStripModel::ADD_ACTIVE; |
| - chrome::NavigateParams params(browser, urls[i], |
| - ui::PAGE_TRANSITION_AUTO_TOPLEVEL); |
| - params.disposition = i == 0 ? WindowOpenDisposition::NEW_FOREGROUND_TAB |
| - : WindowOpenDisposition::NEW_BACKGROUND_TAB; |
| - params.tabstrip_add_types = add_types; |
| - chrome::Navigate(¶ms); |
| - } |
| - } |
| - |
| // Invokes TabRestored on the SessionService for all tabs in browser after |
| // initial_count. |
| void NotifySessionServiceOfRestoredTabs(Browser* browser, int initial_count) { |
| @@ -764,22 +774,25 @@ Browser* SessionRestore::RestoreSession( |
| // static |
| void SessionRestore::RestoreSessionAfterCrash(Browser* browser) { |
| - uint32_t behavior = 0; |
| - if (browser->tab_strip_model()->count() == 1) { |
| - const content::WebContents* active_tab = |
| - browser->tab_strip_model()->GetWebContentsAt(0); |
| - if (active_tab->GetURL() == chrome::kChromeUINewTabURL || |
| - search::IsInstantNTP(active_tab)) { |
| - // There is only one tab and its the new tab page, make session restore |
| - // clobber it. |
| - behavior = SessionRestore::CLOBBER_CURRENT_TAB; |
| - } |
| - } |
| + uint32_t behavior = |
| + HasSingleNewTabPage(browser) ? SessionRestore::CLOBBER_CURRENT_TAB : 0; |
| SessionRestore::RestoreSession(browser->profile(), browser, behavior, |
| std::vector<GURL>()); |
| } |
| // static |
| +void SessionRestore::OpenStartupPagesAfterCrash(Browser* browser) { |
| + WebContents* tab_to_clobber = nullptr; |
| + if (HasSingleNewTabPage(browser)) |
| + tab_to_clobber = browser->tab_strip_model()->GetActiveWebContents(); |
| + |
| + AppendURLsToBrowser( |
|
sky
2017/01/24 23:00:39
I'm mildly concerned this isn't the same path we u
MAD
2017/01/25 19:48:53
I saw that, but I thought it would be too much tro
|
| + browser, SessionStartupPref::GetStartupPref(browser->profile()).urls); |
| + if (tab_to_clobber) |
|
sky
2017/01/24 23:00:39
You should make sure a tab was actually added.
MAD
2017/01/25 19:48:53
Done.
|
| + chrome::CloseWebContents(browser, tab_to_clobber, true); |
| +} |
| + |
| +// static |
| std::vector<Browser*> SessionRestore::RestoreForeignSessionWindows( |
| Profile* profile, |
| std::vector<const sessions::SessionWindow*>::const_iterator begin, |