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