Index: chrome/browser/ui/startup/startup_browser_creator_triggered_reset_browsertest_win.cc |
diff --git a/chrome/browser/ui/startup/startup_browser_creator_triggered_reset_browsertest_win.cc b/chrome/browser/ui/startup/startup_browser_creator_triggered_reset_browsertest_win.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..099bf731e46154e8216e648929ee82eb462d4946 |
--- /dev/null |
+++ b/chrome/browser/ui/startup/startup_browser_creator_triggered_reset_browsertest_win.cc |
@@ -0,0 +1,160 @@ |
+// Copyright (c) 2015 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "base/callback_list.h" |
+#include "base/command_line.h" |
+#include "base/macros.h" |
+#include "base/memory/scoped_ptr.h" |
+#include "base/win/windows_version.h" |
+#include "chrome/browser/browser_process.h" |
+#include "chrome/browser/profile_resetter/triggered_profile_resetter.h" |
+#include "chrome/browser/profile_resetter/triggered_profile_resetter_factory.h" |
+#include "chrome/browser/ui/browser.h" |
+#include "chrome/browser/ui/browser_finder.h" |
+#include "chrome/browser/ui/browser_iterator.h" |
+#include "chrome/browser/ui/startup/startup_browser_creator.h" |
+#include "chrome/browser/ui/startup/startup_browser_creator_impl.h" |
+#include "chrome/browser/ui/tabs/tab_strip_model.h" |
+#include "chrome/common/url_constants.h" |
+#include "chrome/test/base/in_process_browser_test.h" |
+#include "components/keyed_service/content/browser_context_dependency_manager.h" |
+#include "testing/gtest/include/gtest/gtest.h" |
+ |
+namespace { |
+ |
+// Check that there are two browsers. Find the one that is not |browser|. |
+Browser* FindOneOtherBrowser(Browser* browser) { |
+ // There should only be one other browser. |
+ EXPECT_EQ(2u, chrome::GetBrowserCount(browser->profile(), |
+ browser->host_desktop_type())); |
+ |
+ // Find the new browser. |
+ for (chrome::BrowserIterator it; !it.done(); it.Next()) { |
+ if (*it != browser) |
+ return *it; |
+ } |
+ |
+ return nullptr; |
+} |
+ |
+class MockTriggeredProfileResetter : public TriggeredProfileResetter { |
+ public: |
+ MockTriggeredProfileResetter() : TriggeredProfileResetter(nullptr) {} |
+ |
+ void Activate() override {} |
+ bool HasResetTrigger() override { return true; } |
+ |
+ private: |
+ DISALLOW_COPY_AND_ASSIGN(MockTriggeredProfileResetter); |
+}; |
+ |
+scoped_ptr<KeyedService> BuildMockTriggeredProfileResetter( |
+ content::BrowserContext* context) { |
+ return make_scoped_ptr(new MockTriggeredProfileResetter); |
+} |
+ |
+} // namespace |
+ |
+class StartupBrowserCreatorTriggeredResetTest : public InProcessBrowserTest { |
+ public: |
+ StartupBrowserCreatorTriggeredResetTest() {} |
+ |
+ protected: |
+ void SetUpInProcessBrowserTestFixture() override { |
+ will_create_browser_context_services_subscription_ = |
+ BrowserContextDependencyManager::GetInstance() |
+ ->RegisterWillCreateBrowserContextServicesCallbackForTesting( |
+ base::Bind(&StartupBrowserCreatorTriggeredResetTest:: |
+ OnWillCreateBrowserContextServices, |
+ base::Unretained(this))) |
+ .Pass(); |
+ } |
+ |
+ private: |
+ void OnWillCreateBrowserContextServices(content::BrowserContext* context) { |
+ TriggeredProfileResetterFactory::GetInstance()->SetTestingFactory( |
+ context, &BuildMockTriggeredProfileResetter); |
+ } |
+ |
+ scoped_ptr<base::CallbackList<void(content::BrowserContext*)>::Subscription> |
+ will_create_browser_context_services_subscription_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(StartupBrowserCreatorTriggeredResetTest); |
+}; |
+ |
+IN_PROC_BROWSER_TEST_F(StartupBrowserCreatorTriggeredResetTest, |
+ TestTriggeredReset) { |
+ // Use a couple same-site HTTP URLs. |
+ ASSERT_TRUE(test_server()->Start()); |
+ std::vector<GURL> urls; |
+ urls.push_back(test_server()->GetURL("files/title1.html")); |
+ urls.push_back(test_server()->GetURL("files/title2.html")); |
+ |
+ Profile* profile = browser()->profile(); |
+ chrome::HostDesktopType host_desktop_type = browser()->host_desktop_type(); |
+ |
+ // Set the startup preference to open these URLs. |
+ SessionStartupPref pref(SessionStartupPref::URLS); |
+ pref.urls = urls; |
+ SessionStartupPref::SetStartupPref(profile, pref); |
+ |
+ // Keep the browser process running while browsers are closed. |
+ g_browser_process->AddRefModule(); |
+ |
+ // Close the browser. |
+ CloseBrowserAsynchronously(browser()); |
+ |
+ // Do a simple non-process-startup browser launch. |
+ base::CommandLine dummy(base::CommandLine::NO_PROGRAM); |
+ StartupBrowserCreatorImpl launch(base::FilePath(), dummy, |
+ chrome::startup::IS_NOT_FIRST_RUN); |
+ ASSERT_TRUE( |
+ launch.Launch(profile, std::vector<GURL>(), false, host_desktop_type)); |
+ |
+ // This should have created a new browser window. |browser()| is still |
+ // around at this point, even though we've closed its window. |
+ Browser* new_browser = FindOneOtherBrowser(browser()); |
+ ASSERT_TRUE(new_browser); |
+ |
+ std::vector<GURL> expected_urls(urls); |
+ if (base::win::GetVersion() >= base::win::VERSION_WIN10) |
+ expected_urls.insert(expected_urls.begin(), internals::GetWelcomePageURL()); |
+ expected_urls.insert(expected_urls.begin(), internals::GetResetSettingsURL()); |
+ |
+ TabStripModel* tab_strip = new_browser->tab_strip_model(); |
+ ASSERT_EQ(static_cast<int>(expected_urls.size()), tab_strip->count()); |
+ for (size_t i = 0; i < expected_urls.size(); i++) |
+ EXPECT_EQ(expected_urls[i], tab_strip->GetWebContentsAt(i)->GetURL()); |
+ |
+ g_browser_process->ReleaseModule(); |
+} |
+ |
+IN_PROC_BROWSER_TEST_F(StartupBrowserCreatorTriggeredResetTest, |
+ TestTriggeredResetDoesNotShowWithFirstRunURLs) { |
+ // The presence of First Run tabs (in production code, these commonly come |
+ // from master_preferences) should suppress the reset UI. Check that this is |
+ // the case. |
+ StartupBrowserCreator browser_creator; |
+ browser_creator.AddFirstRunTab(GURL("http://new_tab_page")); |
+ browser_creator.AddFirstRunTab(test_server()->GetURL("files/title1.html")); |
+ |
+ // Do a process-startup browser launch. |
+ base::CommandLine dummy(base::CommandLine::NO_PROGRAM); |
+ StartupBrowserCreatorImpl launch(base::FilePath(), dummy, &browser_creator, |
+ chrome::startup::IS_FIRST_RUN); |
+ ASSERT_TRUE(launch.Launch(browser()->profile(), std::vector<GURL>(), true, |
+ browser()->host_desktop_type())); |
+ |
+ // This should have created a new browser window. |
+ Browser* new_browser = FindOneOtherBrowser(browser()); |
+ ASSERT_TRUE(new_browser); |
+ |
+ // Verify that only the first-run tabs are shown. |
+ TabStripModel* tab_strip = new_browser->tab_strip_model(); |
+ ASSERT_EQ(2, tab_strip->count()); |
+ EXPECT_EQ(GURL(chrome::kChromeUINewTabURL), |
+ tab_strip->GetWebContentsAt(0)->GetURL()); |
+ EXPECT_EQ("title1.html", |
+ tab_strip->GetWebContentsAt(1)->GetURL().ExtractFileName()); |
+} |