Home | History | Annotate | Download | only in tab_contents
      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