1ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Copyright (c) 2011 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"
93345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "chrome/browser/tabs/tab_strip_model.h"
104a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#include "chrome/browser/ui/browser.h"
11ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/ui/browser_list.h"
124a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#include "chrome/browser/ui/browser_window.h"
13c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/test/in_process_browser_test.h"
14c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/test/ui_test_utils.h"
15dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/tab_contents/tab_contents.h"
16ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/common/page_transition_types.h"
17ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
18ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsennamespace {
19ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
20ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// BrowserList::Observer implementation that waits for a browser to be
21ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// removed.
22ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenclass BrowserListObserverImpl : public BrowserList::Observer {
23ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen public:
24ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  BrowserListObserverImpl() : did_remove_(false), running_(false) {
25ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    BrowserList::AddObserver(this);
26ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
27ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
28ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  ~BrowserListObserverImpl() {
29ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    BrowserList::RemoveObserver(this);
30ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
31ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
32ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Returns when a browser has been removed.
33ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  void Run() {
34ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    running_ = true;
35ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    if (!did_remove_)
36ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      ui_test_utils::RunMessageLoop();
37ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
38ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
39ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // BrowserList::Observer
40ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void OnBrowserAdded(const Browser* browser) OVERRIDE {
41ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
42ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void OnBrowserRemoved(const Browser* browser) OVERRIDE {
43ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    did_remove_ = true;
44ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    if (running_)
45ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      MessageLoop::current()->Quit();
46ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
47ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
48ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen private:
49ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Was OnBrowserRemoved invoked?
50ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  bool did_remove_;
51ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
52ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Was Run invoked?
53ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  bool running_;
54ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
55ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  DISALLOW_COPY_AND_ASSIGN(BrowserListObserverImpl);
56ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen};
57ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
58ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}  // namespace
59c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
60c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochtypedef InProcessBrowserTest SessionRestoreTest;
61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
62c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#if defined(OS_LINUX) && defined(TOOLKIT_VIEWS)
63c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Crashes on Linux Views: http://crbug.com/39476
64c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define MAYBE_RestoreOnNewWindowWithNoTabbedBrowsers \
65c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        DISABLED_RestoreOnNewWindowWithNoTabbedBrowsers
66c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#else
67c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define MAYBE_RestoreOnNewWindowWithNoTabbedBrowsers \
68c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        RestoreOnNewWindowWithNoTabbedBrowsers
69c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif
70c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
71c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Makes sure when session restore is triggered in the same process we don't end
72c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// up with an extra tab.
73c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochIN_PROC_BROWSER_TEST_F(SessionRestoreTest,
74c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                       MAYBE_RestoreOnNewWindowWithNoTabbedBrowsers) {
75c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (browser_defaults::kRestorePopups)
76c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return;
77c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
78c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  const FilePath::CharType* kTitle1File = FILE_PATH_LITERAL("title1.html");
79c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  GURL url(ui_test_utils::GetTestUrl(FilePath(FilePath::kCurrentDirectory),
80c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                     FilePath(kTitle1File)));
81c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ui_test_utils::NavigateToURL(browser(), url);
82c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
83c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Turn on session restore.
84c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  SessionStartupPref::SetStartupPref(
85c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      browser()->profile(),
86c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      SessionStartupPref(SessionStartupPref::LAST));
87c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
88c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Create a new popup.
89c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  Profile* profile = browser()->profile();
90731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  Browser* popup = Browser::CreateForType(Browser::TYPE_POPUP, profile);
91c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  popup->window()->Show();
92c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
93c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Close the browser.
94c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  browser()->window()->Close();
95c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
96c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Create a new window, which should trigger session restore.
97c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  popup->NewWindow();
98c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
99c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  Browser* new_browser = ui_test_utils::WaitForNewBrowser();
100c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
101c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(new_browser != NULL);
102c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
103c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // The browser should only have one tab.
104c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_EQ(1, new_browser->tab_count());
105c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
106c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // And the first url should be url.
107c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(url, new_browser->GetTabContentsAt(0)->GetURL());
108c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
109c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
110c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochIN_PROC_BROWSER_TEST_F(SessionRestoreTest, RestoreIndividualTabFromWindow) {
111c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  GURL url1(ui_test_utils::GetTestUrl(
112c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      FilePath(FilePath::kCurrentDirectory),
113c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      FilePath(FILE_PATH_LITERAL("title1.html"))));
114c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  GURL url2(ui_test_utils::GetTestUrl(
115c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      FilePath(FilePath::kCurrentDirectory),
116c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      FilePath(FILE_PATH_LITERAL("title2.html"))));
117c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  GURL url3(ui_test_utils::GetTestUrl(
118c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      FilePath(FilePath::kCurrentDirectory),
119c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      FilePath(FILE_PATH_LITERAL("title3.html"))));
120c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
121c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Add and navigate three tabs.
122c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ui_test_utils::NavigateToURL(browser(), url1);
123513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  browser()->AddSelectedTabWithURL(url2, PageTransition::LINK);
124c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ui_test_utils::WaitForNavigationInCurrentTab(browser());
125c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
126513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  browser()->AddSelectedTabWithURL(url3, PageTransition::LINK);
127c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ui_test_utils::WaitForNavigationInCurrentTab(browser());
128c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
129c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  TabRestoreService* service = browser()->profile()->GetTabRestoreService();
130c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  service->ClearEntries();
131c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
132c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  browser()->window()->Close();
133c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
134c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Expect a window with three tabs.
135c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(1U, service->entries().size());
136c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_EQ(TabRestoreService::WINDOW, service->entries().front()->type);
137c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  const TabRestoreService::Window* window =
138c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      static_cast<TabRestoreService::Window*>(service->entries().front());
139c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(3U, window->tabs.size());
140c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
141c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Find the SessionID for entry2. Since the session service was destroyed,
142c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // there is no guarantee that the SessionID for the tab has remained the same.
143c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::vector<TabRestoreService::Tab>::const_iterator it = window->tabs.begin();
144c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  for ( ; it != window->tabs.end(); ++it) {
145c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    const TabRestoreService::Tab& tab = *it;
146c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // If this tab held url2, then restore this single tab.
147c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    if (tab.navigations[0].virtual_url() == url2) {
148c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      service->RestoreEntryById(NULL, tab.id, false);
149c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      break;
150c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    }
151c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
152c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
153c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Make sure that the Window got updated.
154c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(1U, service->entries().size());
155c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_EQ(TabRestoreService::WINDOW, service->entries().front()->type);
156c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  window = static_cast<TabRestoreService::Window*>(service->entries().front());
157c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(2U, window->tabs.size());
158c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
159c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
160731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickIN_PROC_BROWSER_TEST_F(SessionRestoreTest, WindowWithOneTab) {
161731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  GURL url(ui_test_utils::GetTestUrl(
162731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      FilePath(FilePath::kCurrentDirectory),
163731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      FilePath(FILE_PATH_LITERAL("title1.html"))));
164731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
165731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // Add a single tab.
166731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  ui_test_utils::NavigateToURL(browser(), url);
167731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
168731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  TabRestoreService* service = browser()->profile()->GetTabRestoreService();
169731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  service->ClearEntries();
170731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  EXPECT_EQ(0U, service->entries().size());
171731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
172731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // Close the window.
173731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  browser()->window()->Close();
174731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
175731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // Expect the window to be converted to a tab by the TRS.
176731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  EXPECT_EQ(1U, service->entries().size());
177731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  ASSERT_EQ(TabRestoreService::TAB, service->entries().front()->type);
178731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  const TabRestoreService::Tab* tab =
179731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      static_cast<TabRestoreService::Tab*>(service->entries().front());
180731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
181731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // Restore the tab.
182731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  service->RestoreEntryById(NULL, tab->id, false);
183731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
184731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // Make sure the restore was successful.
185731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  EXPECT_EQ(0U, service->entries().size());
186731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
187ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
188ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Verifies we remember the last browser window when closing the last
189ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// non-incognito window while an incognito window is open.
190ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenIN_PROC_BROWSER_TEST_F(SessionRestoreTest, IncognitotoNonIncognito) {
191ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Turn on session restore.
192ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  SessionStartupPref pref(SessionStartupPref::LAST);
193ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  SessionStartupPref::SetStartupPref(browser()->profile(), pref);
194ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
195ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  GURL url(ui_test_utils::GetTestUrl(
196ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      FilePath(FilePath::kCurrentDirectory),
197ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      FilePath(FILE_PATH_LITERAL("title1.html"))));
198ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
199ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Add a single tab.
200ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  ui_test_utils::NavigateToURL(browser(), url);
201ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
202ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Create a new incognito window.
203ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  Browser* incognito_browser = CreateIncognitoBrowser();
204ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  incognito_browser->AddBlankTab(true);
205ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  incognito_browser->window()->Show();
206ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
207ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Close the normal browser. After this we only have the incognito window
208ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // open. We wait until the window closes as window closing is async.
209ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  {
210ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    BrowserListObserverImpl observer;
211ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    browser()->window()->Close();
212ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    observer.Run();
213ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
214ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
215ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Create a new window, which should trigger session restore.
216ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  incognito_browser->NewWindow();
217ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
218ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // The first tab should have 'url' as its url.
219ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  Browser* new_browser = ui_test_utils::WaitForNewBrowser();
220ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  ASSERT_TRUE(new_browser);
221ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_EQ(url, new_browser->GetTabContentsAt(0)->GetURL());
222ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
223