Home | History | Annotate | Download | only in sessions
      1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include <vector>
      6 
      7 #include "base/command_line.h"
      8 #include "base/files/file_path.h"
      9 #include "base/process/launch.h"
     10 #include "base/strings/utf_string_conversions.h"
     11 #include "base/time/time.h"
     12 #include "chrome/browser/browser_process.h"
     13 #include "chrome/browser/chrome_notification_types.h"
     14 #include "chrome/browser/defaults.h"
     15 #include "chrome/browser/first_run/first_run.h"
     16 #include "chrome/browser/profiles/profile.h"
     17 #include "chrome/browser/profiles/profile_manager.h"
     18 #include "chrome/browser/sessions/session_restore.h"
     19 #include "chrome/browser/sessions/session_service.h"
     20 #include "chrome/browser/sessions/session_service_factory.h"
     21 #include "chrome/browser/sessions/session_service_test_helper.h"
     22 #include "chrome/browser/sessions/session_types.h"
     23 #include "chrome/browser/sessions/tab_restore_service.h"
     24 #include "chrome/browser/sessions/tab_restore_service_factory.h"
     25 #include "chrome/browser/ui/browser.h"
     26 #include "chrome/browser/ui/browser_commands.h"
     27 #include "chrome/browser/ui/browser_list.h"
     28 #include "chrome/browser/ui/browser_tabstrip.h"
     29 #include "chrome/browser/ui/browser_window.h"
     30 #include "chrome/browser/ui/host_desktop.h"
     31 #include "chrome/browser/ui/tabs/tab_strip_model.h"
     32 #include "chrome/common/chrome_switches.h"
     33 #include "chrome/common/url_constants.h"
     34 #include "chrome/test/base/in_process_browser_test.h"
     35 #include "chrome/test/base/test_switches.h"
     36 #include "chrome/test/base/ui_test_utils.h"
     37 #include "components/sessions/serialized_navigation_entry_test_helper.h"
     38 #include "content/public/browser/navigation_controller.h"
     39 #include "content/public/browser/navigation_entry.h"
     40 #include "content/public/browser/notification_service.h"
     41 #include "content/public/browser/notification_types.h"
     42 #include "content/public/browser/render_process_host.h"
     43 #include "content/public/browser/render_view_host.h"
     44 #include "content/public/browser/web_contents.h"
     45 #include "content/public/common/bindings_policy.h"
     46 #include "content/public/common/page_transition_types.h"
     47 #include "content/public/test/test_navigation_observer.h"
     48 #include "sync/protocol/session_specifics.pb.h"
     49 
     50 using sessions::SerializedNavigationEntry;
     51 using sessions::SerializedNavigationEntryTestHelper;
     52 
     53 #if defined(OS_MACOSX)
     54 #include "base/mac/scoped_nsautorelease_pool.h"
     55 #endif
     56 
     57 class SessionRestoreTest : public InProcessBrowserTest {
     58  public:
     59   SessionRestoreTest() : active_browser_list_(NULL) {}
     60 
     61  protected:
     62 #if defined(OS_CHROMEOS)
     63   virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE {
     64     // TODO(nkostylev): Investigate if we can remove this switch.
     65     command_line->AppendSwitch(switches::kCreateBrowserOnStartupForTests);
     66     InProcessBrowserTest::SetUpCommandLine(command_line);
     67   }
     68 #endif
     69 
     70   virtual void SetUpOnMainThread() OVERRIDE {
     71     active_browser_list_ = BrowserList::GetInstance(chrome::GetActiveDesktop());
     72 
     73     SessionStartupPref pref(SessionStartupPref::LAST);
     74     SessionStartupPref::SetStartupPref(browser()->profile(), pref);
     75 #if defined(OS_CHROMEOS) || defined(OS_MACOSX)
     76     const testing::TestInfo* const test_info =
     77         testing::UnitTest::GetInstance()->current_test_info();
     78     if (strcmp(test_info->name(), "NoSessionRestoreNewWindowChromeOS")) {
     79       // Undo the effect of kBrowserAliveWithNoWindows in defaults.cc so that we
     80       // can get these test to work without quitting.
     81       SessionServiceTestHelper helper(
     82           SessionServiceFactory::GetForProfile(browser()->profile()));
     83       helper.SetForceBrowserNotAliveWithNoWindows(true);
     84       helper.ReleaseService();
     85     }
     86 #endif
     87 
     88     InProcessBrowserTest::SetUpOnMainThread();
     89   }
     90 
     91   virtual bool SetUpUserDataDirectory() OVERRIDE {
     92     url1_ = ui_test_utils::GetTestUrl(
     93         base::FilePath().AppendASCII("session_history"),
     94         base::FilePath().AppendASCII("bot1.html"));
     95     url2_ = ui_test_utils::GetTestUrl(
     96         base::FilePath().AppendASCII("session_history"),
     97         base::FilePath().AppendASCII("bot2.html"));
     98     url3_ = ui_test_utils::GetTestUrl(
     99         base::FilePath().AppendASCII("session_history"),
    100         base::FilePath().AppendASCII("bot3.html"));
    101 
    102     return InProcessBrowserTest::SetUpUserDataDirectory();
    103   }
    104 
    105   void CloseBrowserSynchronously(Browser* browser) {
    106     content::WindowedNotificationObserver observer(
    107         chrome::NOTIFICATION_BROWSER_CLOSED,
    108         content::NotificationService::AllSources());
    109     browser->window()->Close();
    110 #if defined(OS_MACOSX)
    111     // BrowserWindowController depends on the auto release pool being recycled
    112     // in the message loop to delete itself, which frees the Browser object
    113     // which fires this event.
    114     AutoreleasePool()->Recycle();
    115 #endif
    116     observer.Wait();
    117   }
    118 
    119   Browser* QuitBrowserAndRestore(Browser* browser, int expected_tab_count) {
    120     return QuitBrowserAndRestoreWithURL(browser, expected_tab_count, GURL());
    121   }
    122 
    123   Browser* QuitBrowserAndRestoreWithURL(Browser* browser,
    124                                         int expected_tab_count,
    125                                         const GURL& url) {
    126     Profile* profile = browser->profile();
    127 
    128     // Close the browser.
    129     g_browser_process->AddRefModule();
    130     CloseBrowserSynchronously(browser);
    131 
    132     // Create a new window, which should trigger session restore.
    133     ui_test_utils::BrowserAddedObserver window_observer;
    134     content::WindowedNotificationObserver restore_observer(
    135         chrome::NOTIFICATION_SESSION_RESTORE_DONE,
    136         content::NotificationService::AllSources());
    137     if (url.is_empty()) {
    138       chrome::NewEmptyWindow(profile, chrome::HOST_DESKTOP_TYPE_NATIVE);
    139     } else {
    140       chrome::NavigateParams params(profile,
    141                                     url,
    142                                     content::PAGE_TRANSITION_LINK);
    143       chrome::Navigate(&params);
    144     }
    145     Browser* new_browser = window_observer.WaitForSingleNewBrowser();
    146     restore_observer.Wait();
    147     g_browser_process->ReleaseModule();
    148 
    149     return new_browser;
    150   }
    151 
    152   void GoBack(Browser* browser) {
    153     content::TestNavigationObserver observer(
    154         browser->tab_strip_model()->GetActiveWebContents());
    155     chrome::GoBack(browser, CURRENT_TAB);
    156     observer.Wait();
    157   }
    158 
    159   void GoForward(Browser* browser) {
    160     content::TestNavigationObserver observer(
    161         browser->tab_strip_model()->GetActiveWebContents());
    162     chrome::GoForward(browser, CURRENT_TAB);
    163     observer.Wait();
    164   }
    165 
    166   void AssertOneWindowWithOneTab(Browser* browser) {
    167     ASSERT_EQ(1u, active_browser_list_->size());
    168     ASSERT_EQ(1, browser->tab_strip_model()->count());
    169   }
    170 
    171   int RenderProcessHostCount() {
    172     content::RenderProcessHost::iterator hosts =
    173         content::RenderProcessHost::AllHostsIterator();
    174     int count = 0;
    175     while (!hosts.IsAtEnd()) {
    176       if (hosts.GetCurrentValue()->HasConnection())
    177         count++;
    178       hosts.Advance();
    179     }
    180     return count;
    181   }
    182 
    183   GURL url1_;
    184   GURL url2_;
    185   GURL url3_;
    186 
    187   const BrowserList* active_browser_list_;
    188 };
    189 
    190 #if defined(OS_CHROMEOS)
    191 // Verify that session restore does not occur when a user opens a browser window
    192 // when no other browser windows are open on ChromeOS.
    193 // TODO(pkotwicz): Add test which doesn't open incognito browser once
    194 // disable-zero-browsers-open-for-tests is removed.
    195 // (http://crbug.com/119175)
    196 // TODO(pkotwicz): Mac should have the behavior outlined by this test. It should
    197 // not do session restore if an incognito window is already open.
    198 // (http://crbug.com/120927)
    199 IN_PROC_BROWSER_TEST_F(SessionRestoreTest, NoSessionRestoreNewWindowChromeOS) {
    200   GURL url(ui_test_utils::GetTestUrl(
    201       base::FilePath(base::FilePath::kCurrentDirectory),
    202       base::FilePath(FILE_PATH_LITERAL("title1.html"))));
    203 
    204   // Add a single tab.
    205   ui_test_utils::NavigateToURL(browser(), url);
    206 
    207   Browser* incognito_browser = CreateIncognitoBrowser();
    208   chrome::AddTabAt(incognito_browser, GURL(), -1, true);
    209   incognito_browser->window()->Show();
    210 
    211   // Close the normal browser. After this we only have the incognito window
    212   // open.
    213   CloseBrowserSynchronously(browser());
    214 
    215   // Create a new window, which should open NTP.
    216   ui_test_utils::BrowserAddedObserver browser_added_observer;
    217   chrome::NewWindow(incognito_browser);
    218   Browser* new_browser = browser_added_observer.WaitForSingleNewBrowser();
    219 
    220   ASSERT_TRUE(new_browser);
    221   EXPECT_EQ(1, new_browser->tab_strip_model()->count());
    222   EXPECT_EQ(GURL(chrome::kChromeUINewTabURL),
    223             new_browser->tab_strip_model()->GetWebContentsAt(0)->GetURL());
    224 }
    225 
    226 // Test that maximized applications get restored maximized.
    227 IN_PROC_BROWSER_TEST_F(SessionRestoreTest, MaximizedApps) {
    228   const char* app_name = "TestApp";
    229   Browser* app_browser = CreateBrowserForApp(app_name, browser()->profile());
    230   app_browser->window()->Maximize();
    231   app_browser->window()->Show();
    232   EXPECT_TRUE(app_browser->window()->IsMaximized());
    233   EXPECT_TRUE(app_browser->is_app());
    234   EXPECT_TRUE(app_browser->is_type_popup());
    235 
    236   // Close the normal browser. After this we only have the app_browser window.
    237   CloseBrowserSynchronously(browser());
    238 
    239   // Create a new window, which should open NTP.
    240   ui_test_utils::BrowserAddedObserver browser_added_observer;
    241   chrome::NewWindow(app_browser);
    242   Browser* new_browser = browser_added_observer.WaitForSingleNewBrowser();
    243 
    244   ASSERT_TRUE(new_browser);
    245   EXPECT_TRUE(app_browser->window()->IsMaximized());
    246   EXPECT_TRUE(app_browser->is_app());
    247   EXPECT_TRUE(app_browser->is_type_popup());
    248 }
    249 #endif  // OS_CHROMEOS
    250 
    251 #if !defined(OS_CHROMEOS)
    252 // This test does not apply to ChromeOS as it does not do session restore when
    253 // a new window is opened.
    254 
    255 #if defined(OS_LINUX) && defined(TOOLKIT_VIEWS)
    256 // Crashes on Linux Views: http://crbug.com/39476
    257 #define MAYBE_RestoreOnNewWindowWithNoTabbedBrowsers \
    258         DISABLED_RestoreOnNewWindowWithNoTabbedBrowsers
    259 #else
    260 #define MAYBE_RestoreOnNewWindowWithNoTabbedBrowsers \
    261         RestoreOnNewWindowWithNoTabbedBrowsers
    262 #endif
    263 
    264 // Makes sure when session restore is triggered in the same process we don't end
    265 // up with an extra tab.
    266 IN_PROC_BROWSER_TEST_F(SessionRestoreTest,
    267                        MAYBE_RestoreOnNewWindowWithNoTabbedBrowsers) {
    268   if (browser_defaults::kRestorePopups)
    269     return;
    270 
    271   const base::FilePath::CharType* kTitle1File =
    272       FILE_PATH_LITERAL("title1.html");
    273   GURL url(ui_test_utils::GetTestUrl(base::FilePath(
    274       base::FilePath::kCurrentDirectory), base::FilePath(kTitle1File)));
    275   ui_test_utils::NavigateToURL(browser(), url);
    276 
    277   // Turn on session restore.
    278   SessionStartupPref::SetStartupPref(
    279       browser()->profile(),
    280       SessionStartupPref(SessionStartupPref::LAST));
    281 
    282   // Create a new popup.
    283   Profile* profile = browser()->profile();
    284   Browser* popup =
    285       new Browser(Browser::CreateParams(Browser::TYPE_POPUP, profile,
    286                                         browser()->host_desktop_type()));
    287   popup->window()->Show();
    288 
    289   // Close the browser.
    290   CloseBrowserSynchronously(browser());
    291 
    292   // Create a new window, which should trigger session restore.
    293   ui_test_utils::BrowserAddedObserver observer;
    294   chrome::NewWindow(popup);
    295   Browser* new_browser = observer.WaitForSingleNewBrowser();
    296 
    297   ASSERT_TRUE(new_browser != NULL);
    298 
    299   // The browser should only have one tab.
    300   ASSERT_EQ(1, new_browser->tab_strip_model()->count());
    301 
    302   // And the first url should be url.
    303   EXPECT_EQ(url, new_browser->tab_strip_model()->GetWebContentsAt(0)->GetURL());
    304 }
    305 #endif  // !OS_CHROMEOS
    306 
    307 IN_PROC_BROWSER_TEST_F(SessionRestoreTest, RestoreIndividualTabFromWindow) {
    308   GURL url1(ui_test_utils::GetTestUrl(
    309       base::FilePath(base::FilePath::kCurrentDirectory),
    310       base::FilePath(FILE_PATH_LITERAL("title1.html"))));
    311   // Any page that will yield a 200 status code will work here.
    312   GURL url2("about:version");
    313   GURL url3(ui_test_utils::GetTestUrl(
    314       base::FilePath(base::FilePath::kCurrentDirectory),
    315       base::FilePath(FILE_PATH_LITERAL("title3.html"))));
    316 
    317   // Add and navigate three tabs.
    318   ui_test_utils::NavigateToURL(browser(), url1);
    319   {
    320     content::WindowedNotificationObserver observer(
    321         content::NOTIFICATION_LOAD_STOP,
    322         content::NotificationService::AllSources());
    323     chrome::AddSelectedTabWithURL(browser(), url2,
    324                                   content::PAGE_TRANSITION_LINK);
    325     observer.Wait();
    326   }
    327   {
    328     content::WindowedNotificationObserver observer(
    329         content::NOTIFICATION_LOAD_STOP,
    330         content::NotificationService::AllSources());
    331     chrome::AddSelectedTabWithURL(browser(), url3,
    332                                   content::PAGE_TRANSITION_LINK);
    333     observer.Wait();
    334   }
    335 
    336   TabRestoreService* service =
    337       TabRestoreServiceFactory::GetForProfile(browser()->profile());
    338   service->ClearEntries();
    339 
    340   chrome::HostDesktopType host_desktop_type = browser()->host_desktop_type();
    341 
    342   browser()->window()->Close();
    343 
    344   // Expect a window with three tabs.
    345   ASSERT_EQ(1U, service->entries().size());
    346   ASSERT_EQ(TabRestoreService::WINDOW, service->entries().front()->type);
    347   const TabRestoreService::Window* window =
    348       static_cast<TabRestoreService::Window*>(service->entries().front());
    349   EXPECT_EQ(3U, window->tabs.size());
    350 
    351   // Find the SessionID for entry2. Since the session service was destroyed,
    352   // there is no guarantee that the SessionID for the tab has remained the same.
    353   base::Time timestamp;
    354   int http_status_code = 0;
    355   for (std::vector<TabRestoreService::Tab>::const_iterator it =
    356            window->tabs.begin(); it != window->tabs.end(); ++it) {
    357     const TabRestoreService::Tab& tab = *it;
    358     // If this tab held url2, then restore this single tab.
    359     if (tab.navigations[0].virtual_url() == url2) {
    360       timestamp = tab.navigations[0].timestamp();
    361       http_status_code = tab.navigations[0].http_status_code();
    362       std::vector<content::WebContents*> content =
    363           service->RestoreEntryById(NULL, tab.id, host_desktop_type, UNKNOWN);
    364       ASSERT_EQ(1U, content.size());
    365       ASSERT_TRUE(content[0]);
    366       EXPECT_EQ(url2, content[0]->GetURL());
    367       break;
    368     }
    369   }
    370   EXPECT_FALSE(timestamp.is_null());
    371   EXPECT_EQ(200, http_status_code);
    372 
    373   // Make sure that the restored tab is removed from the service.
    374   ASSERT_EQ(1U, service->entries().size());
    375   ASSERT_EQ(TabRestoreService::WINDOW, service->entries().front()->type);
    376   window = static_cast<TabRestoreService::Window*>(service->entries().front());
    377   EXPECT_EQ(2U, window->tabs.size());
    378 
    379   // Make sure that the restored tab was restored with the correct
    380   // timestamp and status code.
    381   const content::WebContents* contents =
    382       browser()->tab_strip_model()->GetActiveWebContents();
    383   ASSERT_TRUE(contents);
    384   const content::NavigationEntry* entry =
    385       contents->GetController().GetActiveEntry();
    386   ASSERT_TRUE(entry);
    387   EXPECT_EQ(timestamp, entry->GetTimestamp());
    388   EXPECT_EQ(http_status_code, entry->GetHttpStatusCode());
    389 }
    390 
    391 IN_PROC_BROWSER_TEST_F(SessionRestoreTest, WindowWithOneTab) {
    392   GURL url(ui_test_utils::GetTestUrl(
    393       base::FilePath(base::FilePath::kCurrentDirectory),
    394       base::FilePath(FILE_PATH_LITERAL("title1.html"))));
    395 
    396   // Add a single tab.
    397   ui_test_utils::NavigateToURL(browser(), url);
    398 
    399   TabRestoreService* service =
    400       TabRestoreServiceFactory::GetForProfile(browser()->profile());
    401   service->ClearEntries();
    402   EXPECT_EQ(0U, service->entries().size());
    403 
    404   chrome::HostDesktopType host_desktop_type = browser()->host_desktop_type();
    405 
    406   // Close the window.
    407   browser()->window()->Close();
    408 
    409   // Expect the window to be converted to a tab by the TRS.
    410   EXPECT_EQ(1U, service->entries().size());
    411   ASSERT_EQ(TabRestoreService::TAB, service->entries().front()->type);
    412   const TabRestoreService::Tab* tab =
    413       static_cast<TabRestoreService::Tab*>(service->entries().front());
    414 
    415   // Restore the tab.
    416   std::vector<content::WebContents*> content =
    417       service->RestoreEntryById(NULL, tab->id, host_desktop_type, UNKNOWN);
    418   ASSERT_EQ(1U, content.size());
    419   ASSERT_TRUE(content[0]);
    420   EXPECT_EQ(url, content[0]->GetURL());
    421 
    422   // Make sure the restore was successful.
    423   EXPECT_EQ(0U, service->entries().size());
    424 }
    425 
    426 #if !defined(OS_CHROMEOS)
    427 // This test does not apply to ChromeOS as ChromeOS does not do session
    428 // restore when a new window is open.
    429 
    430 // Verifies we remember the last browser window when closing the last
    431 // non-incognito window while an incognito window is open.
    432 IN_PROC_BROWSER_TEST_F(SessionRestoreTest, IncognitotoNonIncognito) {
    433   GURL url(ui_test_utils::GetTestUrl(
    434       base::FilePath(base::FilePath::kCurrentDirectory),
    435       base::FilePath(FILE_PATH_LITERAL("title1.html"))));
    436 
    437   // Add a single tab.
    438   ui_test_utils::NavigateToURL(browser(), url);
    439 
    440   // Create a new incognito window.
    441   Browser* incognito_browser = CreateIncognitoBrowser();
    442   chrome::AddTabAt(incognito_browser, GURL(), -1, true);
    443   incognito_browser->window()->Show();
    444 
    445   // Close the normal browser. After this we only have the incognito window
    446   // open.
    447   CloseBrowserSynchronously(browser());
    448 
    449   // Create a new window, which should trigger session restore.
    450   ui_test_utils::BrowserAddedObserver browser_added_observer;
    451   chrome::NewWindow(incognito_browser);
    452   Browser* new_browser = browser_added_observer.WaitForSingleNewBrowser();
    453 
    454   // The first tab should have 'url' as its url.
    455   ASSERT_TRUE(new_browser);
    456   EXPECT_EQ(url, new_browser->tab_strip_model()->GetWebContentsAt(0)->GetURL());
    457 }
    458 #endif  // !OS_CHROMEOS
    459 
    460 namespace {
    461 
    462 // Verifies that the given NavigationController has exactly two
    463 // entries that correspond to the given URLs and that all but the last
    464 // entry have null timestamps.
    465 void VerifyNavigationEntries(
    466     const content::NavigationController& controller,
    467     GURL url1, GURL url2) {
    468   ASSERT_EQ(2, controller.GetEntryCount());
    469   EXPECT_EQ(1, controller.GetCurrentEntryIndex());
    470   EXPECT_EQ(url1, controller.GetEntryAtIndex(0)->GetURL());
    471   EXPECT_EQ(url2, controller.GetEntryAtIndex(1)->GetURL());
    472   EXPECT_TRUE(controller.GetEntryAtIndex(0)->GetTimestamp().is_null());
    473   EXPECT_FALSE(controller.GetEntryAtIndex(1)->GetTimestamp().is_null());
    474 }
    475 
    476 }  // namespace
    477 
    478 IN_PROC_BROWSER_TEST_F(SessionRestoreTest, RestoreForeignTab) {
    479   GURL url1("http://google.com");
    480   GURL url2("http://google2.com");
    481   SerializedNavigationEntry nav1 =
    482       SerializedNavigationEntryTestHelper::CreateNavigation(url1.spec(), "one");
    483   SerializedNavigationEntry nav2 =
    484       SerializedNavigationEntryTestHelper::CreateNavigation(url2.spec(), "two");
    485 
    486   // Set up the restore data.
    487   sync_pb::SessionTab sync_data;
    488   sync_data.set_tab_visual_index(0);
    489   sync_data.set_current_navigation_index(1);
    490   sync_data.set_pinned(false);
    491   sync_data.add_navigation()->CopyFrom(nav1.ToSyncData());
    492   sync_data.add_navigation()->CopyFrom(nav2.ToSyncData());
    493 
    494   SessionTab tab;
    495   tab.SetFromSyncData(sync_data, base::Time::Now());
    496   EXPECT_EQ(2U, tab.navigations.size());
    497   for (size_t i = 0; i < tab.navigations.size(); ++i)
    498     EXPECT_TRUE(tab.navigations[i].timestamp().is_null());
    499 
    500   ASSERT_EQ(1, browser()->tab_strip_model()->count());
    501 
    502   // Restore in the current tab.
    503   content::WebContents* tab_content = NULL;
    504   {
    505     content::WindowedNotificationObserver observer(
    506         content::NOTIFICATION_LOAD_STOP,
    507         content::NotificationService::AllSources());
    508     tab_content = SessionRestore::RestoreForeignSessionTab(
    509         browser()->tab_strip_model()->GetActiveWebContents(), tab, CURRENT_TAB);
    510     observer.Wait();
    511   }
    512   ASSERT_EQ(1, browser()->tab_strip_model()->count());
    513   content::WebContents* web_contents =
    514       browser()->tab_strip_model()->GetWebContentsAt(0);
    515   VerifyNavigationEntries(web_contents->GetController(), url1, url2);
    516   ASSERT_TRUE(web_contents->GetUserAgentOverride().empty());
    517   ASSERT_TRUE(tab_content);
    518   ASSERT_EQ(url2, tab_content->GetURL());
    519 
    520   // Restore in a new tab.
    521   tab_content = NULL;
    522   {
    523     content::WindowedNotificationObserver observer(
    524         content::NOTIFICATION_LOAD_STOP,
    525         content::NotificationService::AllSources());
    526     tab_content = SessionRestore::RestoreForeignSessionTab(
    527         browser()->tab_strip_model()->GetActiveWebContents(),
    528         tab, NEW_BACKGROUND_TAB);
    529     observer.Wait();
    530   }
    531   ASSERT_EQ(2, browser()->tab_strip_model()->count());
    532   ASSERT_EQ(0, browser()->tab_strip_model()->active_index());
    533   web_contents = browser()->tab_strip_model()->GetWebContentsAt(1);
    534   VerifyNavigationEntries(web_contents->GetController(), url1, url2);
    535   ASSERT_TRUE(web_contents->GetUserAgentOverride().empty());
    536   ASSERT_TRUE(tab_content);
    537   ASSERT_EQ(url2, tab_content->GetURL());
    538 
    539   // Restore in a new window.
    540   Browser* new_browser = NULL;
    541   tab_content = NULL;
    542   {
    543     ui_test_utils::BrowserAddedObserver browser_observer;
    544     content::WindowedNotificationObserver observer(
    545         content::NOTIFICATION_LOAD_STOP,
    546         content::NotificationService::AllSources());
    547     tab_content = SessionRestore::RestoreForeignSessionTab(
    548         browser()->tab_strip_model()->GetActiveWebContents(), tab, NEW_WINDOW);
    549     new_browser = browser_observer.WaitForSingleNewBrowser();
    550     observer.Wait();
    551   }
    552 
    553   ASSERT_EQ(1, new_browser->tab_strip_model()->count());
    554   web_contents = new_browser->tab_strip_model()->GetWebContentsAt(0);
    555   VerifyNavigationEntries(web_contents->GetController(), url1, url2);
    556   ASSERT_TRUE(web_contents->GetUserAgentOverride().empty());
    557   ASSERT_TRUE(tab_content);
    558   ASSERT_EQ(url2, tab_content->GetURL());
    559 }
    560 
    561 IN_PROC_BROWSER_TEST_F(SessionRestoreTest, RestoreForeignSession) {
    562   Profile* profile = browser()->profile();
    563 
    564   GURL url1("http://google.com");
    565   GURL url2("http://google2.com");
    566   SerializedNavigationEntry nav1 =
    567       SerializedNavigationEntryTestHelper::CreateNavigation(url1.spec(), "one");
    568   SerializedNavigationEntry nav2 =
    569       SerializedNavigationEntryTestHelper::CreateNavigation(url2.spec(), "two");
    570   SerializedNavigationEntryTestHelper::SetIsOverridingUserAgent(true, &nav2);
    571 
    572   // Set up the restore data -- one window with two tabs.
    573   std::vector<const SessionWindow*> session;
    574   SessionWindow window;
    575   SessionTab tab1;
    576   {
    577     sync_pb::SessionTab sync_data;
    578     sync_data.set_tab_visual_index(0);
    579     sync_data.set_current_navigation_index(0);
    580     sync_data.set_pinned(true);
    581     sync_data.add_navigation()->CopyFrom(nav1.ToSyncData());
    582     tab1.SetFromSyncData(sync_data, base::Time::Now());
    583   }
    584   window.tabs.push_back(&tab1);
    585 
    586   SessionTab tab2;
    587   {
    588     sync_pb::SessionTab sync_data;
    589     sync_data.set_tab_visual_index(1);
    590     sync_data.set_current_navigation_index(0);
    591     sync_data.set_pinned(false);
    592     sync_data.add_navigation()->CopyFrom(nav2.ToSyncData());
    593     tab2.SetFromSyncData(sync_data, base::Time::Now());
    594   }
    595   window.tabs.push_back(&tab2);
    596 
    597   session.push_back(static_cast<const SessionWindow*>(&window));
    598   ui_test_utils::BrowserAddedObserver window_observer;
    599   std::vector<Browser*> browsers =
    600       SessionRestore::RestoreForeignSessionWindows(
    601           profile, browser()->host_desktop_type(), session.begin(),
    602           session.end());
    603   Browser* new_browser = window_observer.WaitForSingleNewBrowser();
    604   ASSERT_TRUE(new_browser);
    605   ASSERT_EQ(2u, active_browser_list_->size());
    606   ASSERT_EQ(2, new_browser->tab_strip_model()->count());
    607 
    608   ASSERT_EQ(1u, browsers.size());
    609   ASSERT_TRUE(browsers[0]);
    610   ASSERT_EQ(2, browsers[0]->tab_strip_model()->count());
    611 
    612   content::WebContents* web_contents_1 =
    613       new_browser->tab_strip_model()->GetWebContentsAt(0);
    614   content::WebContents* web_contents_2 =
    615       new_browser->tab_strip_model()->GetWebContentsAt(1);
    616   ASSERT_EQ(url1, web_contents_1->GetURL());
    617   ASSERT_EQ(url2, web_contents_2->GetURL());
    618 
    619   // Check user agent override state.
    620   ASSERT_TRUE(web_contents_1->GetUserAgentOverride().empty());
    621   ASSERT_TRUE(web_contents_2->GetUserAgentOverride().empty());
    622 
    623   content::NavigationEntry* entry =
    624       web_contents_1->GetController().GetActiveEntry();
    625   ASSERT_TRUE(entry);
    626   ASSERT_FALSE(entry->GetIsOverridingUserAgent());
    627 
    628   entry = web_contents_2->GetController().GetActiveEntry();
    629   ASSERT_TRUE(entry);
    630   ASSERT_FALSE(entry->GetIsOverridingUserAgent());
    631 
    632   // The SessionWindow destructor deletes the tabs, so we have to clear them
    633   // here to avoid a crash.
    634   window.tabs.clear();
    635 }
    636 
    637 IN_PROC_BROWSER_TEST_F(SessionRestoreTest, Basic) {
    638   ui_test_utils::NavigateToURL(browser(), url1_);
    639   ui_test_utils::NavigateToURL(browser(), url2_);
    640 
    641   Browser* new_browser = QuitBrowserAndRestore(browser(), 1);
    642   ASSERT_EQ(1u, active_browser_list_->size());
    643   ASSERT_EQ(url2_,
    644             new_browser->tab_strip_model()->GetActiveWebContents()->GetURL());
    645   GoBack(new_browser);
    646   ASSERT_EQ(url1_,
    647             new_browser->tab_strip_model()->GetActiveWebContents()->GetURL());
    648 }
    649 
    650 IN_PROC_BROWSER_TEST_F(SessionRestoreTest, RestoreWebUI) {
    651   const GURL webui_url("chrome://omnibox");
    652   ui_test_utils::NavigateToURL(browser(), webui_url);
    653   const content::WebContents* old_tab =
    654       browser()->tab_strip_model()->GetActiveWebContents();
    655   EXPECT_EQ(content::BINDINGS_POLICY_WEB_UI,
    656             old_tab->GetRenderViewHost()->GetEnabledBindings());
    657 
    658   Browser* new_browser = QuitBrowserAndRestore(browser(), 1);
    659   ASSERT_EQ(1u, active_browser_list_->size());
    660   const content::WebContents* new_tab =
    661       new_browser->tab_strip_model()->GetActiveWebContents();
    662   EXPECT_EQ(webui_url, new_tab->GetURL());
    663   EXPECT_EQ(content::BINDINGS_POLICY_WEB_UI,
    664             new_tab->GetRenderViewHost()->GetEnabledBindings());
    665 }
    666 
    667 IN_PROC_BROWSER_TEST_F(SessionRestoreTest, RestoreWebUISettings) {
    668   const GURL webui_url("chrome://settings");
    669   ui_test_utils::NavigateToURL(browser(), webui_url);
    670   const content::WebContents* old_tab =
    671       browser()->tab_strip_model()->GetActiveWebContents();
    672   EXPECT_EQ(content::BINDINGS_POLICY_WEB_UI,
    673             old_tab->GetRenderViewHost()->GetEnabledBindings());
    674 
    675   Browser* new_browser = QuitBrowserAndRestore(browser(), 1);
    676   ASSERT_EQ(1u, active_browser_list_->size());
    677   const content::WebContents* new_tab =
    678       new_browser->tab_strip_model()->GetActiveWebContents();
    679   EXPECT_EQ(webui_url, new_tab->GetURL());
    680   EXPECT_EQ(content::BINDINGS_POLICY_WEB_UI,
    681             new_tab->GetRenderViewHost()->GetEnabledBindings());
    682 }
    683 
    684 IN_PROC_BROWSER_TEST_F(SessionRestoreTest, RestoresForwardAndBackwardNavs) {
    685   ui_test_utils::NavigateToURL(browser(), url1_);
    686   ui_test_utils::NavigateToURL(browser(), url2_);
    687   ui_test_utils::NavigateToURL(browser(), url3_);
    688 
    689   GoBack(browser());
    690   Browser* new_browser = QuitBrowserAndRestore(browser(), 1);
    691   ASSERT_EQ(1u, active_browser_list_->size());
    692   ASSERT_EQ(url2_,
    693             new_browser->tab_strip_model()->GetActiveWebContents()->GetURL());
    694   GoForward(new_browser);
    695   ASSERT_EQ(url3_,
    696             new_browser->tab_strip_model()->GetActiveWebContents()->GetURL());
    697   GoBack(new_browser);
    698   ASSERT_EQ(url2_,
    699             new_browser->tab_strip_model()->GetActiveWebContents()->GetURL());
    700 
    701   // Test renderer-initiated back/forward as well.
    702   GURL go_back_url("javascript:history.back();");
    703   ui_test_utils::NavigateToURL(new_browser, go_back_url);
    704   ASSERT_EQ(url1_,
    705             new_browser->tab_strip_model()->GetActiveWebContents()->GetURL());
    706 }
    707 
    708 // Tests that the SiteInstances used for entries in a restored tab's history
    709 // are given appropriate max page IDs, so that going back to a restored
    710 // cross-site page and then forward again works.  (Bug 1204135)
    711 // This test fails. See http://crbug.com/237497.
    712 IN_PROC_BROWSER_TEST_F(SessionRestoreTest,
    713                        DISABLED_RestoresCrossSiteForwardAndBackwardNavs) {
    714   ASSERT_TRUE(test_server()->Start());
    715 
    716   GURL cross_site_url(test_server()->GetURL("files/title2.html"));
    717 
    718   // Visit URLs on different sites.
    719   ui_test_utils::NavigateToURL(browser(), url1_);
    720   ui_test_utils::NavigateToURL(browser(), cross_site_url);
    721   ui_test_utils::NavigateToURL(browser(), url2_);
    722 
    723   GoBack(browser());
    724   Browser* new_browser = QuitBrowserAndRestore(browser(), 1);
    725   ASSERT_EQ(1u, active_browser_list_->size());
    726   ASSERT_EQ(1, new_browser->tab_strip_model()->count());
    727 
    728   // Check that back and forward work as expected.
    729   ASSERT_EQ(cross_site_url,
    730             new_browser->tab_strip_model()->GetActiveWebContents()->GetURL());
    731 
    732   GoBack(new_browser);
    733   ASSERT_EQ(url1_,
    734             new_browser->tab_strip_model()->GetActiveWebContents()->GetURL());
    735 
    736   GoForward(new_browser);
    737   ASSERT_EQ(cross_site_url,
    738             new_browser->tab_strip_model()->GetActiveWebContents()->GetURL());
    739 
    740   // Test renderer-initiated back/forward as well.
    741   GURL go_forward_url("javascript:history.forward();");
    742   ui_test_utils::NavigateToURL(new_browser, go_forward_url);
    743   ASSERT_EQ(url2_,
    744             new_browser->tab_strip_model()->GetActiveWebContents()->GetURL());
    745 }
    746 
    747 IN_PROC_BROWSER_TEST_F(SessionRestoreTest, TwoTabsSecondSelected) {
    748   ui_test_utils::NavigateToURL(browser(), url1_);
    749 
    750   ui_test_utils::NavigateToURLWithDisposition(
    751       browser(), url2_, NEW_FOREGROUND_TAB,
    752       ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
    753 
    754   Browser* new_browser = QuitBrowserAndRestore(browser(), 2);
    755 
    756   ASSERT_EQ(1u, active_browser_list_->size());
    757   ASSERT_EQ(2, new_browser->tab_strip_model()->count());
    758   ASSERT_EQ(1, new_browser->tab_strip_model()->active_index());
    759   ASSERT_EQ(url2_,
    760             new_browser->tab_strip_model()->GetActiveWebContents()->GetURL());
    761 
    762   ASSERT_EQ(url1_,
    763             new_browser->tab_strip_model()->GetWebContentsAt(0)->GetURL());
    764 }
    765 
    766 // Creates two tabs, closes one, quits and makes sure only one tab is restored.
    767 IN_PROC_BROWSER_TEST_F(SessionRestoreTest, ClosedTabStaysClosed) {
    768   ui_test_utils::NavigateToURL(browser(), url1_);
    769 
    770   ui_test_utils::NavigateToURLWithDisposition(
    771       browser(), url2_, NEW_FOREGROUND_TAB,
    772       ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
    773   chrome::CloseTab(browser());
    774 
    775   Browser* new_browser = QuitBrowserAndRestore(browser(), 1);
    776 
    777   AssertOneWindowWithOneTab(new_browser);
    778   ASSERT_EQ(url1_,
    779             new_browser->tab_strip_model()->GetActiveWebContents()->GetURL());
    780 }
    781 
    782 // Ensures active tab properly restored when tabs before it closed.
    783 IN_PROC_BROWSER_TEST_F(SessionRestoreTest, ActiveIndexUpdatedAtClose) {
    784   ui_test_utils::NavigateToURL(browser(), url1_);
    785   ui_test_utils::NavigateToURLWithDisposition(
    786       browser(), url2_, NEW_FOREGROUND_TAB,
    787       ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
    788   ui_test_utils::NavigateToURLWithDisposition(
    789       browser(), url3_, NEW_BACKGROUND_TAB,
    790       ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
    791 
    792   browser()->tab_strip_model()->CloseWebContentsAt(
    793       0,
    794       TabStripModel::CLOSE_CREATE_HISTORICAL_TAB);
    795 
    796   Browser* new_browser = QuitBrowserAndRestore(browser(), 2);
    797 
    798   ASSERT_EQ(url2_,
    799             new_browser->tab_strip_model()->GetActiveWebContents()->GetURL());
    800   ASSERT_EQ(new_browser->tab_strip_model()->active_index(), 0);
    801 }
    802 
    803 // Ensures active tab properly restored when tabs are inserted before it .
    804 IN_PROC_BROWSER_TEST_F(SessionRestoreTest, ActiveIndexUpdatedAtInsert) {
    805   ui_test_utils::NavigateToURL(browser(), url1_);
    806   ui_test_utils::NavigateToURLWithDisposition(
    807       browser(), url2_, NEW_BACKGROUND_TAB,
    808       ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
    809 
    810   chrome::NavigateParams navigate_params(browser(), url3_,
    811                                          content::PAGE_TRANSITION_TYPED);
    812   navigate_params.tabstrip_index = 0;
    813   navigate_params.disposition = NEW_BACKGROUND_TAB;
    814   ui_test_utils::NavigateToURL(&navigate_params);
    815 
    816   Browser* new_browser = QuitBrowserAndRestore(browser(), 3);
    817 
    818   ASSERT_EQ(url1_,
    819             new_browser->tab_strip_model()->GetActiveWebContents()->GetURL());
    820   ASSERT_EQ(new_browser->tab_strip_model()->active_index(), 1);
    821 }
    822 
    823 // Creates a tabbed browser and popup and makes sure we restore both.
    824 IN_PROC_BROWSER_TEST_F(SessionRestoreTest, NormalAndPopup) {
    825   if (!browser_defaults::kRestorePopups)
    826     return;  // Test only applicable if restoring popups.
    827 
    828   ui_test_utils::NavigateToURL(browser(), url1_);
    829 
    830   // Make sure we have one window.
    831   AssertOneWindowWithOneTab(browser());
    832 
    833   // Open a popup.
    834   Browser* popup = new Browser(
    835       Browser::CreateParams(Browser::TYPE_POPUP, browser()->profile(),
    836                             browser()->host_desktop_type()));
    837   popup->window()->Show();
    838   ASSERT_EQ(2u, active_browser_list_->size());
    839 
    840   ui_test_utils::NavigateToURL(popup, url1_);
    841 
    842   // Simulate an exit by shuting down the session service. If we don't do this
    843   // the first window close is treated as though the user closed the window
    844   // and won't be restored.
    845   SessionServiceFactory::ShutdownForProfile(browser()->profile());
    846 
    847   // Restart and make sure we have two windows.
    848   QuitBrowserAndRestore(browser(), 1);
    849 
    850   ASSERT_EQ(2u, active_browser_list_->size());
    851 
    852   Browser* browser1 = active_browser_list_->get(0);
    853   Browser* browser2 = active_browser_list_->get(1);
    854 
    855   Browser::Type type1 = browser1->type();
    856   Browser::Type type2 = browser2->type();
    857 
    858   // The order of whether the normal window or popup is first depends upon
    859   // activation order, which is not necessarily consistant across runs.
    860   if (type1 == Browser::TYPE_TABBED) {
    861     EXPECT_EQ(type2, Browser::TYPE_POPUP);
    862   } else {
    863     EXPECT_EQ(type1, Browser::TYPE_POPUP);
    864     EXPECT_EQ(type2, Browser::TYPE_TABBED);
    865   }
    866 }
    867 
    868 #if !defined(OS_CHROMEOS) && !defined(OS_MACOSX)
    869 // This test doesn't apply to the Mac version; see GetCommandLineForRelaunch
    870 // for details. It was disabled for a long time so might never have worked on
    871 // ChromeOS.
    872 
    873 // Launches an app window, closes tabbed browser, launches and makes sure
    874 // we restore the tabbed browser url.
    875 // If this test flakes, use http://crbug.com/29110
    876 IN_PROC_BROWSER_TEST_F(SessionRestoreTest,
    877                        RestoreAfterClosingTabbedBrowserWithAppAndLaunching) {
    878 #if defined(OS_WIN) && defined(USE_ASH)
    879   // Disable this test in Metro+Ash for now (http://crbug.com/262796).
    880   if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kAshBrowserTests))
    881     return;
    882 #endif
    883 
    884   ui_test_utils::NavigateToURL(browser(), url1_);
    885 
    886   // Launch an app.
    887   CommandLine app_launch_arguments = GetCommandLineForRelaunch();
    888   app_launch_arguments.AppendSwitchASCII(switches::kApp, url2_.spec());
    889 
    890   ui_test_utils::BrowserAddedObserver window_observer;
    891 
    892   base::LaunchProcess(app_launch_arguments, base::LaunchOptions(), NULL);
    893 
    894   Browser* app_window = window_observer.WaitForSingleNewBrowser();
    895   ASSERT_EQ(2u, active_browser_list_->size());
    896 
    897   // Close the first window. The only window left is the App window.
    898   CloseBrowserSynchronously(browser());
    899 
    900   // Restore the session, which should bring back the first window with url1_.
    901   Browser* new_browser = QuitBrowserAndRestore(app_window, 1);
    902 
    903   AssertOneWindowWithOneTab(new_browser);
    904 
    905   ASSERT_EQ(url1_,
    906             new_browser->tab_strip_model()->GetActiveWebContents()->GetURL());
    907 }
    908 
    909 #endif  // !defined(OS_CHROMEOS) && !defined(OS_MACOSX)
    910 
    911 // Creates two windows, closes one, restores, make sure only one window open.
    912 IN_PROC_BROWSER_TEST_F(SessionRestoreTest, TwoWindowsCloseOneRestoreOnlyOne) {
    913   ui_test_utils::NavigateToURL(browser(), url1_);
    914 
    915   // Open a second window.
    916   ui_test_utils::NavigateToURLWithDisposition(
    917       browser(), GURL(content::kAboutBlankURL), NEW_WINDOW,
    918       ui_test_utils::BROWSER_TEST_WAIT_FOR_BROWSER);
    919 
    920   ASSERT_EQ(2u, active_browser_list_->size());
    921 
    922   // Close it.
    923   Browser* new_window = active_browser_list_->get(1);
    924   CloseBrowserSynchronously(new_window);
    925 
    926   // Restart and make sure we have only one window with one tab and the url
    927   // is url1_.
    928   Browser* new_browser = QuitBrowserAndRestore(browser(), 1);
    929 
    930   AssertOneWindowWithOneTab(new_browser);
    931 
    932   ASSERT_EQ(url1_,
    933             new_browser->tab_strip_model()->GetActiveWebContents()->GetURL());
    934 }
    935 
    936 // Make sure after a restore the number of processes matches that of the number
    937 // of processes running before the restore. This creates a new tab so that
    938 // we should have two new tabs running.  (This test will pass in both
    939 // process-per-site and process-per-site-instance, because we treat the new tab
    940 // as a special case in process-per-site-instance so that it only ever uses one
    941 // process.)
    942 //
    943 // Flaky: http://code.google.com/p/chromium/issues/detail?id=52022
    944 // Unfortunately, the fix at http://codereview.chromium.org/6546078
    945 // breaks NTP background image refreshing, so ThemeSource had to revert to
    946 // replacing the existing data source.
    947 IN_PROC_BROWSER_TEST_F(SessionRestoreTest, ShareProcessesOnRestore) {
    948   // Create two new tabs.
    949   ui_test_utils::NavigateToURLWithDisposition(
    950       browser(), GURL(content::kAboutBlankURL), NEW_FOREGROUND_TAB,
    951       ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
    952   ui_test_utils::NavigateToURLWithDisposition(
    953       browser(), GURL(content::kAboutBlankURL), NEW_FOREGROUND_TAB,
    954       ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
    955 
    956   int expected_process_count = RenderProcessHostCount();
    957 
    958   // Restart.
    959   Browser* new_browser = QuitBrowserAndRestore(browser(), 3);
    960 
    961   ASSERT_EQ(3, new_browser->tab_strip_model()->count());
    962 
    963   ASSERT_EQ(expected_process_count, RenderProcessHostCount());
    964 }
    965 
    966 // Test that changing the user agent override will persist it to disk.
    967 IN_PROC_BROWSER_TEST_F(SessionRestoreTest, PersistAndRestoreUserAgentOverride) {
    968   // Create a tab with an overridden user agent.
    969   ui_test_utils::NavigateToURL(browser(), url1_);
    970   ASSERT_EQ(0, browser()->tab_strip_model()->active_index());
    971   browser()->tab_strip_model()->GetWebContentsAt(0)->
    972       SetUserAgentOverride("override");
    973 
    974   // Create a tab without an overridden user agent.
    975   ui_test_utils::NavigateToURLWithDisposition(
    976       browser(), url2_, NEW_FOREGROUND_TAB,
    977       ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
    978   ASSERT_EQ(1, browser()->tab_strip_model()->active_index());
    979 
    980   // Kill the original browser then open a new one to trigger a restore.
    981   Browser* new_browser = QuitBrowserAndRestore(browser(), 1);
    982   ASSERT_EQ(1u, active_browser_list_->size());
    983   ASSERT_EQ(2, new_browser->tab_strip_model()->count());
    984   ASSERT_EQ(1, new_browser->tab_strip_model()->active_index());
    985 
    986   // Confirm that the user agent overrides are properly set.
    987   EXPECT_EQ("override",
    988             new_browser->tab_strip_model()->GetWebContentsAt(0)->
    989                 GetUserAgentOverride());
    990   EXPECT_EQ("",
    991             new_browser->tab_strip_model()->GetWebContentsAt(1)->
    992                 GetUserAgentOverride());
    993 }
    994 
    995 // Regression test for crbug.com/125958. When restoring a pinned selected tab in
    996 // a setting where there are existing tabs, the selected index computation was
    997 // wrong, leading to the wrong tab getting selected, DCHECKs firing, and the
    998 // pinned tab not getting loaded.
    999 IN_PROC_BROWSER_TEST_F(SessionRestoreTest, RestorePinnedSelectedTab) {
   1000   // Create a pinned tab.
   1001   ui_test_utils::NavigateToURL(browser(), url1_);
   1002   browser()->tab_strip_model()->SetTabPinned(0, true);
   1003   ASSERT_EQ(0, browser()->tab_strip_model()->active_index());
   1004   // Create a nonpinned tab.
   1005   ui_test_utils::NavigateToURLWithDisposition(
   1006       browser(), url2_, NEW_FOREGROUND_TAB,
   1007       ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
   1008   ASSERT_EQ(1, browser()->tab_strip_model()->active_index());
   1009   // Select the pinned tab.
   1010   browser()->tab_strip_model()->ActivateTabAt(0, true);
   1011   ASSERT_EQ(0, browser()->tab_strip_model()->active_index());
   1012   Profile* profile = browser()->profile();
   1013 
   1014   // This will also initiate a session restore, but we're not interested in it.
   1015   Browser* new_browser = QuitBrowserAndRestore(browser(), 1);
   1016   ASSERT_EQ(1u, active_browser_list_->size());
   1017   ASSERT_EQ(2, new_browser->tab_strip_model()->count());
   1018   ASSERT_EQ(0, new_browser->tab_strip_model()->active_index());
   1019   // Close the pinned tab.
   1020   chrome::CloseTab(new_browser);
   1021   ASSERT_EQ(1, new_browser->tab_strip_model()->count());
   1022   ASSERT_EQ(0, new_browser->tab_strip_model()->active_index());
   1023   // Use the existing tab to navigate away, so that we can verify it was really
   1024   // clobbered.
   1025   ui_test_utils::NavigateToURL(new_browser, url3_);
   1026 
   1027   // Restore the session again, clobbering the existing tab.
   1028   SessionRestore::RestoreSession(
   1029       profile, new_browser,
   1030       new_browser->host_desktop_type(),
   1031       SessionRestore::CLOBBER_CURRENT_TAB | SessionRestore::SYNCHRONOUS,
   1032       std::vector<GURL>());
   1033 
   1034   // The pinned tab is the selected tab.
   1035   ASSERT_EQ(2, new_browser->tab_strip_model()->count());
   1036   EXPECT_EQ(0, new_browser->tab_strip_model()->active_index());
   1037   EXPECT_EQ(url1_,
   1038             new_browser->tab_strip_model()->GetActiveWebContents()->GetURL());
   1039   EXPECT_EQ(url2_,
   1040             new_browser->tab_strip_model()->GetWebContentsAt(1)->GetURL());
   1041 }
   1042 
   1043 // Regression test for crbug.com/240156. When restoring tabs with a navigation,
   1044 // the navigation should take active tab focus.
   1045 IN_PROC_BROWSER_TEST_F(SessionRestoreTest, RestoreWithNavigateSelectedTab) {
   1046   // Create 2 tabs.
   1047   ui_test_utils::NavigateToURL(browser(), url1_);
   1048   ui_test_utils::NavigateToURLWithDisposition(
   1049       browser(), url2_, NEW_FOREGROUND_TAB,
   1050       ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
   1051 
   1052   // Restore the session by calling chrome::Navigate().
   1053   Browser* new_browser = QuitBrowserAndRestoreWithURL(browser(), 3, url3_);
   1054   ASSERT_EQ(1u, active_browser_list_->size());
   1055   ASSERT_EQ(3, new_browser->tab_strip_model()->count());
   1056   // Navigated url should be the active tab.
   1057   ASSERT_EQ(url3_,
   1058             new_browser->tab_strip_model()->GetActiveWebContents()->GetURL());
   1059 }
   1060 
   1061 // Do a clobber restore from the new tab page. This test follows the code path
   1062 // of a crash followed by the user clicking restore from the new tab page.
   1063 IN_PROC_BROWSER_TEST_F(SessionRestoreTest, ClobberRestoreTest) {
   1064   // Create 2 tabs.
   1065   ui_test_utils::NavigateToURL(browser(), url1_);
   1066   ASSERT_EQ(0, browser()->tab_strip_model()->active_index());
   1067   ui_test_utils::NavigateToURLWithDisposition(
   1068       browser(), url2_, NEW_FOREGROUND_TAB,
   1069       ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
   1070   ASSERT_EQ(1, browser()->tab_strip_model()->active_index());
   1071   Profile* profile = browser()->profile();
   1072 
   1073   // This will also initiate a session restore, but we're not interested in it.
   1074   Browser* new_browser = QuitBrowserAndRestore(browser(), 1);
   1075   ASSERT_EQ(1u, active_browser_list_->size());
   1076   ASSERT_EQ(2, new_browser->tab_strip_model()->count());
   1077   ASSERT_EQ(1, new_browser->tab_strip_model()->active_index());
   1078   // Close the first tab.
   1079   chrome::CloseTab(new_browser);
   1080   ASSERT_EQ(1, new_browser->tab_strip_model()->count());
   1081   ASSERT_EQ(0, new_browser->tab_strip_model()->active_index());
   1082   // Use the existing tab to navigate to the NTP.
   1083   ui_test_utils::NavigateToURL(new_browser, GURL(chrome::kChromeUINewTabURL));
   1084 
   1085   // Restore the session again, clobbering the existing tab.
   1086   SessionRestore::RestoreSession(
   1087       profile, new_browser,
   1088       new_browser->host_desktop_type(),
   1089       SessionRestore::CLOBBER_CURRENT_TAB | SessionRestore::SYNCHRONOUS,
   1090       std::vector<GURL>());
   1091 
   1092   // 2 tabs should have been restored, with the existing tab clobbered, giving
   1093   // us a total of 2 tabs.
   1094   ASSERT_EQ(2, new_browser->tab_strip_model()->count());
   1095   EXPECT_EQ(1, new_browser->tab_strip_model()->active_index());
   1096   EXPECT_EQ(url1_,
   1097             new_browser->tab_strip_model()->GetWebContentsAt(0)->GetURL());
   1098   EXPECT_EQ(url2_,
   1099             new_browser->tab_strip_model()->GetActiveWebContents()->GetURL());
   1100 }
   1101 
   1102 IN_PROC_BROWSER_TEST_F(SessionRestoreTest, SessionStorage) {
   1103   ui_test_utils::NavigateToURL(browser(), url1_);
   1104   content::NavigationController* controller =
   1105       &browser()->tab_strip_model()->GetActiveWebContents()->GetController();
   1106   ASSERT_TRUE(controller->GetDefaultSessionStorageNamespace());
   1107   std::string session_storage_persistent_id =
   1108       controller->GetDefaultSessionStorageNamespace()->persistent_id();
   1109   Browser* new_browser = QuitBrowserAndRestore(browser(), 1);
   1110   ASSERT_EQ(1u, active_browser_list_->size());
   1111   ASSERT_EQ(url1_,
   1112             new_browser->tab_strip_model()->GetActiveWebContents()->GetURL());
   1113   content::NavigationController* new_controller =
   1114       &new_browser->tab_strip_model()->GetActiveWebContents()->GetController();
   1115   ASSERT_TRUE(new_controller->GetDefaultSessionStorageNamespace());
   1116   std::string restored_session_storage_persistent_id =
   1117       new_controller->GetDefaultSessionStorageNamespace()->persistent_id();
   1118   EXPECT_EQ(session_storage_persistent_id,
   1119             restored_session_storage_persistent_id);
   1120 }
   1121 
   1122 IN_PROC_BROWSER_TEST_F(SessionRestoreTest, SessionStorageAfterTabReplace) {
   1123   // Simulate what prerendering does: create a new WebContents with the same
   1124   // SessionStorageNamespace as an existing tab, then replace the tab with it.
   1125   {
   1126     content::NavigationController* controller =
   1127         &browser()->tab_strip_model()->GetActiveWebContents()->GetController();
   1128     ASSERT_TRUE(controller->GetDefaultSessionStorageNamespace());
   1129 
   1130     content::SessionStorageNamespaceMap session_storage_namespace_map;
   1131     session_storage_namespace_map[std::string()] =
   1132         controller->GetDefaultSessionStorageNamespace();
   1133     scoped_ptr<content::WebContents> web_contents(
   1134         content::WebContents::CreateWithSessionStorage(
   1135             content::WebContents::CreateParams(browser()->profile()),
   1136             session_storage_namespace_map));
   1137 
   1138     TabStripModel* tab_strip_model = browser()->tab_strip_model();
   1139     scoped_ptr<content::WebContents> old_web_contents(
   1140         tab_strip_model->ReplaceWebContentsAt(
   1141             tab_strip_model->active_index(), web_contents.release()));
   1142     // Navigate with the new tab.
   1143     ui_test_utils::NavigateToURL(browser(), url2_);
   1144     // old_web_contents goes out of scope.
   1145   }
   1146 
   1147   // Check that the sessionStorage data is going to be persisted.
   1148   content::NavigationController* controller =
   1149       &browser()->tab_strip_model()->GetActiveWebContents()->GetController();
   1150   EXPECT_TRUE(
   1151       controller->GetDefaultSessionStorageNamespace()->should_persist());
   1152 
   1153   // Quit and restore. Check that no extra tabs were created.
   1154   Browser* new_browser = QuitBrowserAndRestore(browser(), 1);
   1155   ASSERT_EQ(1u, active_browser_list_->size());
   1156   EXPECT_EQ(1, new_browser->tab_strip_model()->count());
   1157 }
   1158