blob: f308d400fbbc9965aaa212216babdc6ca5915741 [file] [log] [blame]
// Copyright (c) 2013 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 <vector>
#include "base/command_line.h"
#include "base/files/file_path.h"
#include "base/run_loop.h"
#include "base/threading/thread_restrictions.h"
#include "build/build_config.h"
#include "chrome/browser/browser_process.h"
#include "chrome/browser/chrome_browser_main.h"
#include "chrome/browser/chrome_browser_main_extra_parts.h"
#include "chrome/browser/prefs/session_startup_pref.h"
#include "chrome/browser/profiles/profile_manager.h"
#include "chrome/browser/sessions/session_restore.h"
#include "chrome/browser/ui/browser.h"
#include "chrome/browser/ui/browser_finder.h"
#include "chrome/browser/ui/browser_window.h"
#include "chrome/browser/ui/startup/startup_browser_creator.h"
#include "chrome/browser/ui/tabs/tab_strip_model.h"
#include "chrome/test/base/in_process_browser_test.h"
#include "chrome/test/base/ui_test_utils.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "url/gurl.h"
#if defined(USE_AURA)
#include "ui/aura/window.h"
#endif
using StartupBrowserCreatorTest = InProcessBrowserTest;
// Chrome OS doesn't support multiprofile.
// And BrowserWindow::IsActive() always returns false in tests on MAC.
// And this test is useless without that functionality.
#if !defined(OS_CHROMEOS) && !defined(OS_MACOSX)
IN_PROC_BROWSER_TEST_F(StartupBrowserCreatorTest, LastUsedProfileActivated) {
base::ScopedAllowBlockingForTesting allow_blocking;
ProfileManager* profile_manager = g_browser_process->profile_manager();
// Create 4 profiles, they will be scheduled for destruction when the last
// browser window they are associated to will be closed.
Profile* profile_1 = profile_manager->GetProfile(
profile_manager->user_data_dir().Append(FILE_PATH_LITERAL(
"New Profile 1")));
ASSERT_TRUE(profile_1);
Profile* profile_2 = profile_manager->GetProfile(
profile_manager->user_data_dir().Append(FILE_PATH_LITERAL(
"New Profile 2")));
ASSERT_TRUE(profile_2);
Profile* profile_3 = profile_manager->GetProfile(
profile_manager->user_data_dir().Append(FILE_PATH_LITERAL(
"New Profile 3")));
ASSERT_TRUE(profile_3);
Profile* profile_4 = profile_manager->GetProfile(
profile_manager->user_data_dir().Append(FILE_PATH_LITERAL(
"New Profile 4")));
ASSERT_TRUE(profile_4);
SessionStartupPref pref_urls(SessionStartupPref::URLS);
pref_urls.urls.push_back(ui_test_utils::GetTestUrl(
base::FilePath(base::FilePath::kCurrentDirectory),
base::FilePath(FILE_PATH_LITERAL("title1.html"))));
SessionStartupPref::SetStartupPref(profile_1, pref_urls);
SessionStartupPref::SetStartupPref(profile_2, pref_urls);
SessionStartupPref::SetStartupPref(profile_3, pref_urls);
SessionStartupPref::SetStartupPref(profile_4, pref_urls);
// Do a simple non-process-startup browser launch.
base::CommandLine dummy(base::CommandLine::NO_PROGRAM);
StartupBrowserCreator browser_creator;
std::vector<Profile*> last_opened_profiles;
last_opened_profiles.push_back(profile_1);
last_opened_profiles.push_back(profile_2);
last_opened_profiles.push_back(profile_3);
last_opened_profiles.push_back(profile_4);
browser_creator.Start(dummy, profile_manager->user_data_dir(), profile_2,
last_opened_profiles);
while (!browser_creator.ActivatedProfile())
base::RunLoop().RunUntilIdle();
Browser* new_browser = NULL;
// The last used profile (the profile_2 in this case) must be active.
ASSERT_EQ(1u, chrome::GetBrowserCount(profile_2));
new_browser = chrome::FindBrowserWithProfile(profile_2);
ASSERT_TRUE(new_browser);
EXPECT_TRUE(new_browser->window()->IsActive());
// All other profiles browser should not be active.
ASSERT_EQ(1u, chrome::GetBrowserCount(profile_1));
new_browser = chrome::FindBrowserWithProfile(profile_1);
ASSERT_TRUE(new_browser);
EXPECT_FALSE(new_browser->window()->IsActive());
ASSERT_EQ(1u, chrome::GetBrowserCount(profile_3));
new_browser = chrome::FindBrowserWithProfile(profile_3);
ASSERT_TRUE(new_browser);
EXPECT_FALSE(new_browser->window()->IsActive());
ASSERT_EQ(1u, chrome::GetBrowserCount(profile_4));
new_browser = chrome::FindBrowserWithProfile(profile_4);
ASSERT_TRUE(new_browser);
EXPECT_FALSE(new_browser->window()->IsActive());
}
#endif // !OS_MACOSX && !OS_CHROMEOS
#if defined(USE_AURA)
class StartupPagePrefSetterMainExtraParts : public ChromeBrowserMainExtraParts {
public:
explicit StartupPagePrefSetterMainExtraParts(const std::vector<GURL>& urls)
: urls_(urls) {}
// ChromeBrowserMainExtraParts:
void PreBrowserStart() override {
Profile* profile =
g_browser_process->profile_manager()->GetActiveUserProfile();
SessionStartupPref pref_urls(SessionStartupPref::URLS);
pref_urls.urls = std::move(urls_);
SessionStartupPref::SetStartupPref(profile, pref_urls);
}
private:
std::vector<GURL> urls_;
DISALLOW_COPY_AND_ASSIGN(StartupPagePrefSetterMainExtraParts);
};
class StartupPageTest : public InProcessBrowserTest {
public:
StartupPageTest() {
// Don't open about:blank since we want to test startup urls.
set_open_about_blank_on_browser_launch(false);
}
~StartupPageTest() override = default;
// InProcessBrowserTest:
void CreatedBrowserMainParts(
content::BrowserMainParts* browser_main_parts) override {
const std::vector<GURL> urls = {ui_test_utils::GetTestUrl(
base::FilePath(FILE_PATH_LITERAL("focus")),
base::FilePath(FILE_PATH_LITERAL("page_with_focus.html")))};
ChromeBrowserMainParts* chrome_browser_main_parts =
static_cast<ChromeBrowserMainParts*>(browser_main_parts);
chrome_browser_main_parts->AddParts(
new StartupPagePrefSetterMainExtraParts(urls));
}
private:
DISALLOW_COPY_AND_ASSIGN(StartupPageTest);
};
IN_PROC_BROWSER_TEST_F(StartupPageTest, StartupPageFocus) {
// Browser window should be active.
EXPECT_TRUE(browser()->window()->IsActive());
// Focus should land in the content area.
content::WebContents* contents =
browser()->tab_strip_model()->GetActiveWebContents();
EXPECT_TRUE(contents->GetContentNativeView()->HasFocus());
}
#endif // defined(USE_AURA)