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 "chrome/browser/ui/tab_contents/tab_contents_iterator.h" 6 7 #include "base/prefs/pref_registry_simple.h" 8 #include "base/prefs/testing_pref_service.h" 9 #include "chrome/browser/browser_process.h" 10 #include "chrome/browser/browser_shutdown.h" 11 #include "chrome/browser/profiles/profile_manager.h" 12 #include "chrome/browser/ui/browser.h" 13 #include "chrome/browser/ui/browser_commands.h" 14 #include "chrome/browser/ui/browser_list.h" 15 #include "chrome/browser/ui/host_desktop.h" 16 #include "chrome/browser/ui/tabs/tab_strip_model.h" 17 #include "chrome/common/pref_names.h" 18 #include "chrome/test/base/browser_with_test_window_test.h" 19 #include "chrome/test/base/test_browser_window.h" 20 #include "chrome/test/base/testing_browser_process.h" 21 22 typedef BrowserWithTestWindowTest BrowserListTest; 23 24 namespace { 25 26 // Helper function to iterate and count all the tabs. 27 size_t CountAllTabs() { 28 size_t count = 0; 29 for (TabContentsIterator iterator; !iterator.done(); iterator.Next()) 30 ++count; 31 return count; 32 } 33 34 } // namespace 35 36 TEST_F(BrowserListTest, TabContentsIteratorVerifyCount) { 37 // Make sure we have 1 window to start with. 38 EXPECT_EQ(1U, 39 BrowserList::GetInstance(chrome::HOST_DESKTOP_TYPE_NATIVE)->size()); 40 41 EXPECT_EQ(0U, CountAllTabs()); 42 43 // Create more browsers/windows. 44 Browser::CreateParams native_params(profile(), 45 chrome::HOST_DESKTOP_TYPE_NATIVE); 46 scoped_ptr<Browser> browser2( 47 chrome::CreateBrowserWithTestWindowForParams(&native_params)); 48 // Create browser 3 and 4 on the Ash desktop (the TabContentsIterator 49 // shouldn't see the difference). 50 Browser::CreateParams ash_params(profile(), chrome::HOST_DESKTOP_TYPE_ASH); 51 scoped_ptr<Browser> browser3( 52 chrome::CreateBrowserWithTestWindowForParams(&ash_params)); 53 scoped_ptr<Browser> browser4( 54 chrome::CreateBrowserWithTestWindowForParams(&ash_params)); 55 56 // Sanity checks. 57 #if defined(OS_CHROMEOS) 58 // The ash desktop is the native desktop on Chrome OS. 59 EXPECT_EQ(4U, 60 BrowserList::GetInstance(chrome::HOST_DESKTOP_TYPE_NATIVE)->size()); 61 #else 62 EXPECT_EQ(2U, 63 BrowserList::GetInstance(chrome::HOST_DESKTOP_TYPE_NATIVE)->size()); 64 EXPECT_EQ(2U, 65 BrowserList::GetInstance(chrome::HOST_DESKTOP_TYPE_ASH)->size()); 66 #endif 67 EXPECT_EQ(0, browser()->tab_strip_model()->count()); 68 EXPECT_EQ(0, browser2->tab_strip_model()->count()); 69 EXPECT_EQ(0, browser3->tab_strip_model()->count()); 70 EXPECT_EQ(0, browser4->tab_strip_model()->count()); 71 72 EXPECT_EQ(0U, CountAllTabs()); 73 74 // Add some tabs. 75 for (size_t i = 0; i < 3; ++i) 76 chrome::NewTab(browser2.get()); 77 chrome::NewTab(browser3.get()); 78 79 EXPECT_EQ(4U, CountAllTabs()); 80 81 // Close some tabs. 82 browser2->tab_strip_model()->CloseAllTabs(); 83 84 EXPECT_EQ(1U, CountAllTabs()); 85 86 // Add lots of tabs. 87 for (size_t i = 0; i < 41; ++i) 88 chrome::NewTab(browser()); 89 90 EXPECT_EQ(42U, CountAllTabs()); 91 // Close all remaining tabs to keep all the destructors happy. 92 browser3->tab_strip_model()->CloseAllTabs(); 93 } 94 95 TEST_F(BrowserListTest, TabContentsIteratorVerifyBrowser) { 96 // Make sure we have 1 window to start with. 97 EXPECT_EQ(1U, 98 BrowserList::GetInstance(chrome::HOST_DESKTOP_TYPE_NATIVE)->size()); 99 100 // Create more browsers/windows. 101 Browser::CreateParams native_params(profile(), 102 chrome::HOST_DESKTOP_TYPE_NATIVE); 103 scoped_ptr<Browser> browser2( 104 chrome::CreateBrowserWithTestWindowForParams(&native_params)); 105 // Create browser 3 on the Ash desktop (the TabContentsIterator shouldn't see 106 // the difference). 107 Browser::CreateParams ash_params(profile(), chrome::HOST_DESKTOP_TYPE_ASH); 108 scoped_ptr<Browser> browser3( 109 chrome::CreateBrowserWithTestWindowForParams(&ash_params)); 110 111 // Sanity checks. 112 #if defined(OS_CHROMEOS) 113 // The ash desktop is the native desktop on Chrome OS. 114 EXPECT_EQ(3U, 115 BrowserList::GetInstance(chrome::HOST_DESKTOP_TYPE_NATIVE)->size()); 116 #else 117 EXPECT_EQ(2U, 118 BrowserList::GetInstance(chrome::HOST_DESKTOP_TYPE_NATIVE)->size()); 119 EXPECT_EQ(1U, 120 BrowserList::GetInstance(chrome::HOST_DESKTOP_TYPE_ASH)->size()); 121 #endif 122 EXPECT_EQ(0, browser()->tab_strip_model()->count()); 123 EXPECT_EQ(0, browser2->tab_strip_model()->count()); 124 EXPECT_EQ(0, browser3->tab_strip_model()->count()); 125 126 EXPECT_EQ(0U, CountAllTabs()); 127 128 // Add some tabs. 129 for (size_t i = 0; i < 3; ++i) 130 chrome::NewTab(browser2.get()); 131 for (size_t i = 0; i < 2; ++i) 132 chrome::NewTab(browser3.get()); 133 134 size_t count = 0; 135 for (TabContentsIterator iterator; !iterator.done(); iterator.Next(), 136 ++count) { 137 if (count < 3) 138 EXPECT_EQ(browser2.get(), iterator.browser()); 139 else if (count < 5) 140 EXPECT_EQ(browser3.get(), iterator.browser()); 141 else 142 ADD_FAILURE(); 143 } 144 145 // Close some tabs. 146 browser2->tab_strip_model()->CloseAllTabs(); 147 browser3->tab_strip_model()->CloseWebContentsAt(1, TabStripModel::CLOSE_NONE); 148 149 count = 0; 150 for (TabContentsIterator iterator; !iterator.done(); iterator.Next(), 151 ++count) { 152 if (count == 0) 153 EXPECT_EQ(browser3.get(), iterator.browser()); 154 else 155 ADD_FAILURE(); 156 } 157 158 // Now make it one tab per browser. 159 chrome::NewTab(browser()); 160 chrome::NewTab(browser2.get()); 161 162 count = 0; 163 for (TabContentsIterator iterator; !iterator.done(); iterator.Next(), 164 ++count) { 165 if (count == 0) 166 EXPECT_EQ(browser(), iterator.browser()); 167 else if (count == 1) 168 EXPECT_EQ(browser2.get(), iterator.browser()); 169 else if (count == 2) 170 EXPECT_EQ(browser3.get(), iterator.browser()); 171 else 172 ADD_FAILURE(); 173 } 174 175 // Close all remaining tabs to keep all the destructors happy. 176 browser2->tab_strip_model()->CloseAllTabs(); 177 browser3->tab_strip_model()->CloseAllTabs(); 178 } 179 180 #if defined(OS_CHROMEOS) 181 // Calling AttemptRestart on ChromeOS will exit the test. 182 #define MAYBE_AttemptRestart DISABLED_AttemptRestart 183 #else 184 #define MAYBE_AttemptRestart AttemptRestart 185 #endif 186 187 TEST_F(BrowserListTest, MAYBE_AttemptRestart) { 188 ASSERT_TRUE(g_browser_process); 189 TestingPrefServiceSimple testing_pref_service; 190 testing_pref_service.registry()->RegisterBooleanPref( 191 prefs::kWasRestarted, false); 192 testing_pref_service.registry()->RegisterBooleanPref( 193 prefs::kRestartLastSessionOnShutdown, 194 false); 195 196 TestingBrowserProcess* testing_browser_process = 197 TestingBrowserProcess::GetGlobal(); 198 testing_browser_process->SetLocalState(&testing_pref_service); 199 ASSERT_TRUE(g_browser_process->local_state()); 200 ProfileManager* profile_manager = new ProfileManager(base::FilePath()); 201 testing_browser_process->SetProfileManager(profile_manager); 202 203 chrome::AttemptRestart(); 204 // Cancel the effects of us calling chrome::AttemptRestart. Otherwise tests 205 // ran after this one will fail. 206 browser_shutdown::SetTryingToQuit(false); 207 208 EXPECT_TRUE(testing_pref_service.GetBoolean(prefs::kWasRestarted)); 209 testing_browser_process->SetLocalState(NULL); 210 } 211