session_restore_browsertest.cc revision 21d179b334e59e9a3bfcaed4c4430bef1bc5759d
1c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. 2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be 3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file. 4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 5c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/file_path.h" 6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/defaults.h" 721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "chrome/browser/profiles/profile.h" 8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/sessions/tab_restore_service.h" 9c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/tab_contents/tab_contents.h" 103345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "chrome/browser/tabs/tab_strip_model.h" 114a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#include "chrome/browser/ui/browser.h" 124a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#include "chrome/browser/ui/browser_window.h" 13c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/common/page_transition_types.h" 14c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/test/in_process_browser_test.h" 15c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/test/ui_test_utils.h" 16c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 17c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochtypedef InProcessBrowserTest SessionRestoreTest; 18c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 19c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#if defined(OS_LINUX) && defined(TOOLKIT_VIEWS) 20c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Crashes on Linux Views: http://crbug.com/39476 21c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define MAYBE_RestoreOnNewWindowWithNoTabbedBrowsers \ 22c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DISABLED_RestoreOnNewWindowWithNoTabbedBrowsers 23c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#else 24c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define MAYBE_RestoreOnNewWindowWithNoTabbedBrowsers \ 25c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch RestoreOnNewWindowWithNoTabbedBrowsers 26c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif 27c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 28c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Makes sure when session restore is triggered in the same process we don't end 29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// up with an extra tab. 30c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochIN_PROC_BROWSER_TEST_F(SessionRestoreTest, 31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch MAYBE_RestoreOnNewWindowWithNoTabbedBrowsers) { 32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (browser_defaults::kRestorePopups) 33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return; 34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const FilePath::CharType* kTitle1File = FILE_PATH_LITERAL("title1.html"); 36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch GURL url(ui_test_utils::GetTestUrl(FilePath(FilePath::kCurrentDirectory), 37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch FilePath(kTitle1File))); 38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ui_test_utils::NavigateToURL(browser(), url); 39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Turn on session restore. 41c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch SessionStartupPref::SetStartupPref( 42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch browser()->profile(), 43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch SessionStartupPref(SessionStartupPref::LAST)); 44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 45c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Create a new popup. 46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch Profile* profile = browser()->profile(); 47731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick Browser* popup = Browser::CreateForType(Browser::TYPE_POPUP, profile); 48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch popup->window()->Show(); 49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Close the browser. 51c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch browser()->window()->Close(); 52c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Create a new window, which should trigger session restore. 54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch popup->NewWindow(); 55c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 56c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch Browser* new_browser = ui_test_utils::WaitForNewBrowser(); 57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 58c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(new_browser != NULL); 59c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 60c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // The browser should only have one tab. 61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_EQ(1, new_browser->tab_count()); 62c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 63c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // And the first url should be url. 64c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(url, new_browser->GetTabContentsAt(0)->GetURL()); 65c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 66c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 67c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 68c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochIN_PROC_BROWSER_TEST_F(SessionRestoreTest, RestoreIndividualTabFromWindow) { 69c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch GURL url1(ui_test_utils::GetTestUrl( 70c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch FilePath(FilePath::kCurrentDirectory), 71c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch FilePath(FILE_PATH_LITERAL("title1.html")))); 72c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch GURL url2(ui_test_utils::GetTestUrl( 73c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch FilePath(FilePath::kCurrentDirectory), 74c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch FilePath(FILE_PATH_LITERAL("title2.html")))); 75c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch GURL url3(ui_test_utils::GetTestUrl( 76c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch FilePath(FilePath::kCurrentDirectory), 77c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch FilePath(FILE_PATH_LITERAL("title3.html")))); 78c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 79c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Add and navigate three tabs. 80c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ui_test_utils::NavigateToURL(browser(), url1); 81513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch browser()->AddSelectedTabWithURL(url2, PageTransition::LINK); 82c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ui_test_utils::WaitForNavigationInCurrentTab(browser()); 83c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 84513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch browser()->AddSelectedTabWithURL(url3, PageTransition::LINK); 85c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ui_test_utils::WaitForNavigationInCurrentTab(browser()); 86c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 87c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch TabRestoreService* service = browser()->profile()->GetTabRestoreService(); 88c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch service->ClearEntries(); 89c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 90c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch browser()->window()->Close(); 91c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 92c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Expect a window with three tabs. 93c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(1U, service->entries().size()); 94c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_EQ(TabRestoreService::WINDOW, service->entries().front()->type); 95c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const TabRestoreService::Window* window = 96c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch static_cast<TabRestoreService::Window*>(service->entries().front()); 97c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(3U, window->tabs.size()); 98c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 99c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Find the SessionID for entry2. Since the session service was destroyed, 100c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // there is no guarantee that the SessionID for the tab has remained the same. 101c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch std::vector<TabRestoreService::Tab>::const_iterator it = window->tabs.begin(); 102c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch for ( ; it != window->tabs.end(); ++it) { 103c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const TabRestoreService::Tab& tab = *it; 104c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // If this tab held url2, then restore this single tab. 105c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (tab.navigations[0].virtual_url() == url2) { 106c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch service->RestoreEntryById(NULL, tab.id, false); 107c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch break; 108c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 109c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 110c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 111c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Make sure that the Window got updated. 112c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(1U, service->entries().size()); 113c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_EQ(TabRestoreService::WINDOW, service->entries().front()->type); 114c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch window = static_cast<TabRestoreService::Window*>(service->entries().front()); 115c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(2U, window->tabs.size()); 116c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 117c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 118731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickIN_PROC_BROWSER_TEST_F(SessionRestoreTest, WindowWithOneTab) { 119731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick GURL url(ui_test_utils::GetTestUrl( 120731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick FilePath(FilePath::kCurrentDirectory), 121731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick FilePath(FILE_PATH_LITERAL("title1.html")))); 122731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 123731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // Add a single tab. 124731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ui_test_utils::NavigateToURL(browser(), url); 125731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 126731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick TabRestoreService* service = browser()->profile()->GetTabRestoreService(); 127731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick service->ClearEntries(); 128731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_EQ(0U, service->entries().size()); 129731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 130731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // Close the window. 131731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick browser()->window()->Close(); 132731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 133731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // Expect the window to be converted to a tab by the TRS. 134731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_EQ(1U, service->entries().size()); 135731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ASSERT_EQ(TabRestoreService::TAB, service->entries().front()->type); 136731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick const TabRestoreService::Tab* tab = 137731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick static_cast<TabRestoreService::Tab*>(service->entries().front()); 138731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 139731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // Restore the tab. 140731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick service->RestoreEntryById(NULL, tab->id, false); 141731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 142731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // Make sure the restore was successful. 143731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_EQ(0U, service->entries().size()); 144731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 145