10529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// Copyright 2014 The Chromium Authors. All rights reserved. 20529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// Use of this source code is governed by a BSD-style license that can be 30529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// found in the LICENSE file. 40529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 50529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "chrome/browser/ui/settings_window_manager.h" 60529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 70529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "base/command_line.h" 81320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/files/file_util.h" 90529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "base/files/scoped_temp_dir.h" 100529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "chrome/browser/browser_process.h" 110529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "chrome/browser/chrome_notification_types.h" 120529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "chrome/browser/profiles/profile_manager.h" 130529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "chrome/browser/ui/browser.h" 14010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "chrome/browser/ui/browser_finder.h" 15010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "chrome/browser/ui/browser_iterator.h" 160529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "chrome/browser/ui/browser_window.h" 17010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "chrome/browser/ui/chrome_pages.h" 180529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "chrome/browser/ui/settings_window_manager_observer.h" 190529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "chrome/common/chrome_switches.h" 20010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "chrome/common/url_constants.h" 210529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "chrome/test/base/in_process_browser_test.h" 220529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "content/public/browser/notification_service.h" 230529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "content/public/test/test_utils.h" 24010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "url/gurl.h" 250529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 260529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochnamespace { 270529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 280529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochclass SettingsWindowTestObserver 290529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch : public chrome::SettingsWindowManagerObserver { 300529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch public: 310529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch SettingsWindowTestObserver() : browser_(NULL), new_settings_count_(0) {} 320529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch virtual ~SettingsWindowTestObserver() {} 330529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 340529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch virtual void OnNewSettingsWindow(Browser* settings_browser) OVERRIDE { 350529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch browser_ = settings_browser; 360529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch ++new_settings_count_; 370529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch } 380529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 390529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch Browser* browser() { return browser_; } 400529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch size_t new_settings_count() const { return new_settings_count_; } 410529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 420529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch private: 430529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch Browser* browser_; 440529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch size_t new_settings_count_; 450529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 460529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch DISALLOW_COPY_AND_ASSIGN(SettingsWindowTestObserver); 470529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch}; 480529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 490529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch} // namespace 500529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 510529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochclass SettingsWindowManagerTest : public InProcessBrowserTest { 520529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch public: 53010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) SettingsWindowManagerTest() 54010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) : settings_manager_(chrome::SettingsWindowManager::GetInstance()), 55010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) test_profile_(NULL) { 56010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) settings_manager_->AddObserver(&observer_); 570529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch } 580529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch virtual ~SettingsWindowManagerTest() { 59010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) settings_manager_->RemoveObserver(&observer_); 600529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch } 610529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 620529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE { 63010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) command_line->AppendSwitch(::switches::kEnableSettingsWindow); 640529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch } 650529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 660529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch Profile* CreateTestProfile() { 670529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch CHECK(!test_profile_); 680529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 690529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch ProfileManager* profile_manager = g_browser_process->profile_manager(); 700529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch base::RunLoop run_loop; 710529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch profile_manager->CreateProfileAsync( 720529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch profile_manager->GenerateNextProfileDirectoryPath(), 730529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch base::Bind(&SettingsWindowManagerTest::ProfileInitialized, 740529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch base::Unretained(this), 750529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch run_loop.QuitClosure()), 760529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch base::string16(), 770529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch base::string16(), 780529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch std::string()); 790529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch run_loop.Run(); 800529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 810529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch return test_profile_; 820529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch } 830529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 840529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch void ProfileInitialized(const base::Closure& closure, 850529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch Profile* profile, 860529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch Profile::CreateStatus status) { 870529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch if (status == Profile::CREATE_STATUS_INITIALIZED) { 880529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch test_profile_ = profile; 890529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch closure.Run(); 900529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch } 910529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch } 920529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 93010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) void ShowSettingsForProfile(Profile* profile) { 94010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) settings_manager_->ShowChromePageForProfile( 95010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) profile, GURL(chrome::kChromeUISettingsURL)); 96010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 97010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 980529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch void CloseBrowserSynchronously(Browser* browser) { 990529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch content::WindowedNotificationObserver observer( 1000529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch chrome::NOTIFICATION_BROWSER_CLOSED, 1010529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch content::NotificationService::AllSources()); 1020529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch browser->window()->Close(); 1030529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch observer.Wait(); 1040529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch } 1050529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 106010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) void CloseNonDefaultBrowsers() { 107010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) std::list<Browser*> browsers_to_close; 108010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) for (chrome::BrowserIterator it; !it.done(); it.Next()) { 109010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (*it != browser()) 110010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) browsers_to_close.push_back(*it); 111010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 112010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) for (std::list<Browser*>::iterator iter = browsers_to_close.begin(); 113010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) iter != browsers_to_close.end(); ++iter) { 114010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) CloseBrowserSynchronously(*iter); 115010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 116010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 117010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 1180529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch protected: 119010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) chrome::SettingsWindowManager* settings_manager_; 1200529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch SettingsWindowTestObserver observer_; 1210529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch base::ScopedTempDir temp_profile_dir_; 1220529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch Profile* test_profile_; // Owned by g_browser_process->profile_manager() 1230529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 1240529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch DISALLOW_COPY_AND_ASSIGN(SettingsWindowManagerTest); 1250529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch}; 1260529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 1270529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 1280529e5d033099cbfc42635f6f6183833b09dff6eBen MurdochIN_PROC_BROWSER_TEST_F(SettingsWindowManagerTest, OpenSettingsWindow) { 1290529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // Open a settings window. 130010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ShowSettingsForProfile(browser()->profile()); 1310529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch Browser* settings_browser = 132010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) settings_manager_->FindBrowserForProfile(browser()->profile()); 1330529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch ASSERT_TRUE(settings_browser); 1340529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // Ensure the observer fired correctly. 1350529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch EXPECT_EQ(1u, observer_.new_settings_count()); 1360529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch EXPECT_EQ(settings_browser, observer_.browser()); 1370529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 1380529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // Open the settings again: no new window. 139010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ShowSettingsForProfile(browser()->profile()); 1400529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch EXPECT_EQ(settings_browser, 141010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) settings_manager_->FindBrowserForProfile(browser()->profile())); 1420529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch EXPECT_EQ(1u, observer_.new_settings_count()); 1430529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 1440529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // Close the settings window. 1450529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch CloseBrowserSynchronously(settings_browser); 146010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_FALSE(settings_manager_->FindBrowserForProfile(browser()->profile())); 1470529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 1480529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // Open a new settings window. 149010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ShowSettingsForProfile(browser()->profile()); 1500529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch Browser* settings_browser2 = 151010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) settings_manager_->FindBrowserForProfile(browser()->profile()); 1520529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch ASSERT_TRUE(settings_browser2); 1530529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch EXPECT_EQ(2u, observer_.new_settings_count()); 1540529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 1550529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch CloseBrowserSynchronously(settings_browser2); 1560529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch} 1570529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 1580529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#if !defined(OS_CHROMEOS) 1590529e5d033099cbfc42635f6f6183833b09dff6eBen MurdochIN_PROC_BROWSER_TEST_F(SettingsWindowManagerTest, SettingsWindowMultiProfile) { 1600529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch Profile* test_profile = CreateTestProfile(); 1610529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch ASSERT_TRUE(test_profile); 1620529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 1630529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // Open a settings window. 164010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ShowSettingsForProfile(browser()->profile()); 1650529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch Browser* settings_browser = 166010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) settings_manager_->FindBrowserForProfile(browser()->profile()); 1670529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch ASSERT_TRUE(settings_browser); 1680529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // Ensure the observer fired correctly. 1690529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch EXPECT_EQ(1u, observer_.new_settings_count()); 1700529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch EXPECT_EQ(settings_browser, observer_.browser()); 1710529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 1720529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // Open a settings window for a new profile. 173010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ShowSettingsForProfile(test_profile); 1740529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch Browser* settings_browser2 = 175010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) settings_manager_->FindBrowserForProfile(test_profile); 1760529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch ASSERT_TRUE(settings_browser2); 1770529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // Ensure the observer fired correctly. 1780529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch EXPECT_EQ(2u, observer_.new_settings_count()); 1790529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch EXPECT_EQ(settings_browser2, observer_.browser()); 1800529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 1810529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch CloseBrowserSynchronously(settings_browser); 1820529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch CloseBrowserSynchronously(settings_browser2); 1830529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch} 1840529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#endif 185010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 186f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(SettingsWindowManagerTest, OpenChromePages) { 187f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_EQ(1u, chrome::GetTotalBrowserCount()); 188f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 189f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // History should open in the existing browser window. 190f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) chrome::ShowHistory(browser()); 191010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(1u, chrome::GetTotalBrowserCount()); 192010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 193010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Settings should open a new browser window. 194010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) chrome::ShowSettings(browser()); 195010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(2u, chrome::GetTotalBrowserCount()); 196010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 197f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // About should reuse the existing Settings window. 198f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) chrome::ShowAboutChrome(browser()); 199010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(2u, chrome::GetTotalBrowserCount()); 200010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 201f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // Extensions should open in an existing browser window. 202010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) CloseNonDefaultBrowsers(); 203010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(1u, chrome::GetTotalBrowserCount()); 204010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) std::string extension_to_highlight; // none 205010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) chrome::ShowExtensions(browser(), extension_to_highlight); 206010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(1u, chrome::GetTotalBrowserCount()); 207f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 208f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // Downloads should open in an existing browser window. 209010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) chrome::ShowDownloads(browser()); 210010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(1u, chrome::GetTotalBrowserCount()); 211f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 212f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // About should open a new browser window. 213f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) chrome::ShowAboutChrome(browser()); 214f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_EQ(2u, chrome::GetTotalBrowserCount()); 215010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 216