| Index: chrome/browser/profiles/profile_window_browsertest.cc
|
| diff --git a/chrome/browser/profiles/profile_window_browsertest.cc b/chrome/browser/profiles/profile_window_browsertest.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..bc1da3a285a0b52d9ac17e7454e6cefdd0198345
|
| --- /dev/null
|
| +++ b/chrome/browser/profiles/profile_window_browsertest.cc
|
| @@ -0,0 +1,191 @@
|
| +// 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 "chrome/browser/profiles/profile_window.h"
|
| +
|
| +#include "base/command_line.h"
|
| +#include "base/strings/utf_string_conversions.h"
|
| +#include "chrome/browser/browser_process.h"
|
| +#include "chrome/browser/chrome_notification_types.h"
|
| +#include "chrome/browser/history/history_service.h"
|
| +#include "chrome/browser/history/history_service_factory.h"
|
| +#include "chrome/browser/profiles/profile_manager.h"
|
| +#include "chrome/browser/search_engines/template_url_service_factory.h"
|
| +#include "chrome/browser/signin/signin_manager_factory.h"
|
| +#include "chrome/browser/ui/browser.h"
|
| +#include "chrome/browser/ui/browser_finder.h"
|
| +#include "chrome/browser/ui/browser_list.h"
|
| +#include "chrome/test/base/in_process_browser_test.h"
|
| +#include "chrome/test/base/ui_test_utils.h"
|
| +#include "components/history/core/browser/history_db_task.h"
|
| +#include "components/search_engines/template_url_service.h"
|
| +#include "components/signin/core/common/profile_management_switches.h"
|
| +#include "content/public/browser/notification_service.h"
|
| +#include "content/public/test/browser_test_utils.h"
|
| +#include "content/public/test/test_utils.h"
|
| +#include "net/test/spawned_test_server/spawned_test_server.h"
|
| +
|
| +// This test verifies the Desktop implementation of Guest only.
|
| +#if !defined(OS_CHROMEOS) && !defined(OS_ANDROID) && !defined(OS_IOS)
|
| +
|
| +namespace {
|
| +
|
| +// Code related to history borrowed from:
|
| +// chrome/browser/history/history_browsertest.cc
|
| +
|
| +// Note: WaitableEvent is not used for synchronization between the main thread
|
| +// and history backend thread because the history subsystem posts tasks back
|
| +// to the main thread. Had we tried to Signal an event in such a task
|
| +// and Wait for it on the main thread, the task would not run at all because
|
| +// the main thread would be blocked on the Wait call, resulting in a deadlock.
|
| +
|
| +// A task to be scheduled on the history backend thread.
|
| +// Notifies the main thread after all history backend thread tasks have run.
|
| +class WaitForHistoryTask : public history::HistoryDBTask {
|
| + public:
|
| + WaitForHistoryTask() {}
|
| +
|
| + bool RunOnDBThread(history::HistoryBackend* backend,
|
| + history::HistoryDatabase* db) override {
|
| + return true;
|
| + }
|
| +
|
| + void DoneRunOnMainThread() override { base::MessageLoop::current()->Quit(); }
|
| +
|
| + private:
|
| + ~WaitForHistoryTask() override {}
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(WaitForHistoryTask);
|
| +};
|
| +
|
| +void WaitForHistoryBackendToRun(Profile* profile) {
|
| + base::CancelableTaskTracker task_tracker;
|
| + scoped_ptr<history::HistoryDBTask> task(new WaitForHistoryTask());
|
| + HistoryService* history = HistoryServiceFactory::GetForProfile(
|
| + profile, ServiceAccessType::EXPLICIT_ACCESS);
|
| + history->HistoryService::ScheduleDBTask(task.Pass(), &task_tracker);
|
| + content::RunMessageLoop();
|
| +}
|
| +
|
| +} // namespace
|
| +
|
| +class ProfileWindowBrowserTest : public InProcessBrowserTest {
|
| + public:
|
| + ProfileWindowBrowserTest() {}
|
| + ~ProfileWindowBrowserTest() override {}
|
| +
|
| + void SetUpCommandLine(base::CommandLine* command_line) override {
|
| + InProcessBrowserTest::SetUpCommandLine(command_line);
|
| + switches::EnableNewAvatarMenuForTesting(
|
| + base::CommandLine::ForCurrentProcess());
|
| + }
|
| +
|
| + Browser* OpenGuestBrowser();
|
| + void CloseBrowser(Browser* browser);
|
| +
|
| + private:
|
| + DISALLOW_COPY_AND_ASSIGN(ProfileWindowBrowserTest);
|
| +};
|
| +
|
| +Browser* ProfileWindowBrowserTest::OpenGuestBrowser() {
|
| + size_t num_browsers =
|
| + BrowserList::GetInstance(chrome::GetActiveDesktop())->size();
|
| +
|
| + // Create a guest browser nicely. Using CreateProfile() and CreateBrowser()
|
| + // does incomplete initialization that would lead to
|
| + // SystemUrlRequestContextGetter being leaked.
|
| + content::WindowedNotificationObserver browser_creation_observer(
|
| + chrome::NOTIFICATION_BROWSER_WINDOW_READY,
|
| + content::NotificationService::AllSources());
|
| + profiles::SwitchToGuestProfile(chrome::GetActiveDesktop(),
|
| + ProfileManager::CreateCallback());
|
| +
|
| + browser_creation_observer.Wait();
|
| + EXPECT_EQ(num_browsers + 1,
|
| + BrowserList::GetInstance(chrome::GetActiveDesktop())->size());
|
| +
|
| + Profile* guest = g_browser_process->profile_manager()->GetProfileByPath(
|
| + ProfileManager::GetGuestProfilePath());
|
| + Browser* browser = chrome::FindAnyBrowser(
|
| + guest, true, chrome::GetActiveDesktop());
|
| + EXPECT_TRUE(browser);
|
| +
|
| + // When |browser| closes a BrowsingDataRemover will be created and executed.
|
| + // It needs a loaded TemplateUrlService or else it hangs on to a
|
| + // CallbackList::Subscription forever.
|
| + ui_test_utils::WaitForTemplateURLServiceToLoad(
|
| + TemplateURLServiceFactory::GetForProfile(guest));
|
| +
|
| + return browser;
|
| +}
|
| +
|
| +void ProfileWindowBrowserTest::CloseBrowser(Browser* browser) {
|
| + content::WindowedNotificationObserver window_close_observer(
|
| + chrome::NOTIFICATION_BROWSER_CLOSED,
|
| + content::Source<Browser>(browser));
|
| + browser->window()->Close();
|
| + window_close_observer.Wait();
|
| +}
|
| +
|
| +IN_PROC_BROWSER_TEST_F(ProfileWindowBrowserTest, OpenGuestBrowser) {
|
| + EXPECT_TRUE(OpenGuestBrowser());
|
| +}
|
| +
|
| +IN_PROC_BROWSER_TEST_F(ProfileWindowBrowserTest, GuestIsIncognito) {
|
| + Browser* guest_browser = OpenGuestBrowser();
|
| + EXPECT_TRUE(guest_browser->profile()->IsOffTheRecord());
|
| +}
|
| +
|
| +IN_PROC_BROWSER_TEST_F(ProfileWindowBrowserTest, GuestIgnoresHistory) {
|
| + Browser* guest_browser = OpenGuestBrowser();
|
| +
|
| + ui_test_utils::WaitForHistoryToLoad(HistoryServiceFactory::GetForProfile(
|
| + guest_browser->profile(), ServiceAccessType::EXPLICIT_ACCESS));
|
| +
|
| + GURL test_url = ui_test_utils::GetTestUrl(
|
| + base::FilePath(base::FilePath::kCurrentDirectory),
|
| + base::FilePath(FILE_PATH_LITERAL("title2.html")));
|
| +
|
| + ui_test_utils::NavigateToURL(guest_browser, test_url);
|
| + WaitForHistoryBackendToRun(guest_browser->profile());
|
| +
|
| + std::vector<GURL> urls =
|
| + ui_test_utils::HistoryEnumerator(guest_browser->profile()).urls();
|
| + ASSERT_EQ(0U, urls.size());
|
| +}
|
| +
|
| +IN_PROC_BROWSER_TEST_F(ProfileWindowBrowserTest, GuestClearsCookies) {
|
| + Browser* guest_browser = OpenGuestBrowser();
|
| + Profile* guest_profile = guest_browser->profile();
|
| +
|
| + ASSERT_TRUE(test_server()->Start());
|
| + GURL url(test_server()->GetURL("set-cookie?cookie1"));
|
| +
|
| + // Before navigation there are no cookies for the URL.
|
| + std::string cookie = content::GetCookies(guest_profile, url);
|
| + ASSERT_EQ("", cookie);
|
| +
|
| + // After navigation there is a cookie for the URL.
|
| + ui_test_utils::NavigateToURL(guest_browser, url);
|
| + cookie = content::GetCookies(guest_profile, url);
|
| + EXPECT_EQ("cookie1", cookie);
|
| +
|
| + CloseBrowser(guest_browser);
|
| +
|
| + // Closing the browser has removed the cookie.
|
| + cookie = content::GetCookies(guest_profile, url);
|
| + ASSERT_EQ("", cookie);
|
| +}
|
| +
|
| +IN_PROC_BROWSER_TEST_F(ProfileWindowBrowserTest, GuestCannotSignin) {
|
| + Browser* guest_browser = OpenGuestBrowser();
|
| +
|
| + SigninManager* signin_manager = SigninManagerFactory::GetForProfile(
|
| + guest_browser->profile());
|
| +
|
| + // Guest profiles can't sign in without a SigninManager.
|
| + ASSERT_FALSE(signin_manager);
|
| +}
|
| +
|
| +#endif // !defined(OS_CHROMEOS) && !defined(OS_ANDROID) && !defined(OS_IOS)
|
|
|