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