blob: b6ae3ed6a0df1d299f51b0866b31e6b7ab3e2a83 [file] [log] [blame]
// Copyright (c) 2012 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/test/base/browser_with_test_window_test.h"
#include "base/location.h"
#include "base/run_loop.h"
#include "base/single_thread_task_runner.h"
#include "base/threading/thread_task_runner_handle.h"
#include "build/build_config.h"
#include "chrome/browser/profiles/profile_destroyer.h"
#include "chrome/browser/ui/browser.h"
#include "chrome/browser/ui/browser_navigator.h"
#include "chrome/browser/ui/browser_navigator_params.h"
#include "chrome/browser/ui/tabs/tab_strip_model.h"
#include "chrome/test/base/testing_browser_process.h"
#include "chrome/test/base/testing_profile.h"
#include "chrome/test/base/testing_profile_manager.h"
#include "components/sync_preferences/pref_service_syncable.h"
#include "content/public/browser/navigation_controller.h"
#include "content/public/browser/navigation_entry.h"
#include "content/public/browser/web_contents.h"
#include "content/public/test/browser_side_navigation_test_utils.h"
#include "content/public/test/test_renderer_host.h"
#include "ui/base/page_transition_types.h"
#include "ui/views/test/test_views_delegate.h"
#if defined(TOOLKIT_VIEWS)
#include "chrome/browser/ui/views/chrome_constrained_window_views_client.h"
#include "chrome/browser/ui/views/chrome_layout_provider.h"
#include "components/constrained_window/constrained_window_views.h"
#if defined(OS_CHROMEOS)
#include "ash/public/cpp/mus_property_mirror_ash.h"
#include "ash/test/ash_test_views_delegate.h"
#include "content/public/browser/context_factory.h"
#include "ui/aura/mus/window_tree_client.h"
#include "ui/aura/test/env_test_helper.h"
#include "ui/views/mus/mus_client.h"
#else
#include "ui/views/test/test_views_delegate.h"
#endif
#endif
using content::NavigationController;
using content::RenderFrameHost;
using content::RenderFrameHostTester;
using content::WebContents;
BrowserWithTestWindowTest::BrowserWithTestWindowTest()
: BrowserWithTestWindowTest(Browser::TYPE_TABBED,
false,
content::TestBrowserThreadBundle::DEFAULT) {}
BrowserWithTestWindowTest::BrowserWithTestWindowTest(
content::TestBrowserThreadBundle::Options thread_bundle_options)
: BrowserWithTestWindowTest(Browser::TYPE_TABBED,
false,
thread_bundle_options) {}
BrowserWithTestWindowTest::BrowserWithTestWindowTest(Browser::Type browser_type,
bool hosted_app)
: BrowserWithTestWindowTest(browser_type,
hosted_app,
content::TestBrowserThreadBundle::DEFAULT) {}
BrowserWithTestWindowTest::BrowserWithTestWindowTest(
Browser::Type browser_type,
bool hosted_app,
content::TestBrowserThreadBundle::Options thread_bundle_options)
: thread_bundle_(thread_bundle_options),
#if defined(OS_CHROMEOS)
ash_test_helper_(&ash_test_environment_),
#endif
browser_type_(browser_type),
hosted_app_(hosted_app) {
}
BrowserWithTestWindowTest::~BrowserWithTestWindowTest() {}
void BrowserWithTestWindowTest::SetUp() {
testing::Test::SetUp();
#if defined(OS_CHROMEOS)
ash_test_helper_.SetUp(true);
ash_test_helper_.SetRunningOutsideAsh();
#elif defined(TOOLKIT_VIEWS)
views_test_helper_.reset(new views::ScopedViewsTestHelper());
#endif
// This must be created after ash_test_helper_ is set up so that it doesn't
// create an InputDeviceManager.
rvh_test_enabler_ = std::make_unique<content::RenderViewHostTestEnabler>();
#if defined(TOOLKIT_VIEWS)
SetConstrainedWindowViewsClient(CreateChromeConstrainedWindowViewsClient());
test_views_delegate()->set_layout_provider(
ChromeLayoutProvider::CreateLayoutProvider());
#endif
content::BrowserSideNavigationSetUp();
profile_manager_ = std::make_unique<TestingProfileManager>(
TestingBrowserProcess::GetGlobal());
ASSERT_TRUE(profile_manager_->SetUp());
// Subclasses can provide their own Profile.
profile_ = CreateProfile();
// Subclasses can provide their own test BrowserWindow. If they return NULL
// then Browser will create the a production BrowserWindow and the subclass
// is responsible for cleaning it up (usually by NativeWidget destruction).
window_.reset(CreateBrowserWindow());
#if defined(OS_CHROMEOS)
if (aura::Env::GetInstance()->mode() == aura::Env::Mode::MUS) {
views::MusClient::InitParams mus_client_init_params;
mus_client_init_params.connector =
ash_test_helper()->GetWindowServiceConnector();
mus_client_init_params.create_wm_state = false;
mus_client_init_params.running_in_ws_process = true;
mus_client_init_params.window_tree_client =
aura::test::EnvTestHelper().GetWindowTreeClient();
mus_client_ = std::make_unique<views::MusClient>(mus_client_init_params);
mus_client_->SetMusPropertyMirror(
std::make_unique<ash::MusPropertyMirrorAsh>());
aura::Env::GetInstance()->set_context_factory(content::GetContextFactory());
}
#endif
browser_.reset(
CreateBrowser(profile(), browser_type_, hosted_app_, window_.get()));
}
void BrowserWithTestWindowTest::TearDown() {
// Some tests end up posting tasks to the DB thread that must be completed
// before the profile can be destroyed and the test safely shut down.
base::RunLoop().RunUntilIdle();
// Close the browser tabs and destroy the browser and window instances.
if (browser_)
browser_->tab_strip_model()->CloseAllTabs();
browser_.reset();
window_.reset();
content::BrowserSideNavigationTearDown();
#if defined(TOOLKIT_VIEWS)
constrained_window::SetConstrainedWindowViewsClient(nullptr);
#endif
profile_manager_->DeleteAllTestingProfiles();
profile_ = nullptr;
profile_manager_.reset();
#if defined(OS_CHROMEOS)
ash_test_helper_.TearDown();
#elif defined(TOOLKIT_VIEWS)
views_test_helper_.reset();
#endif
testing::Test::TearDown();
// A Task is leaked if we don't destroy everything, then run the message loop.
base::ThreadTaskRunnerHandle::Get()->PostTask(
FROM_HERE, base::RunLoop::QuitCurrentWhenIdleClosureDeprecated());
base::RunLoop().Run();
}
gfx::NativeWindow BrowserWithTestWindowTest::GetContext() {
#if defined(OS_CHROMEOS)
return ash_test_helper_.CurrentContext();
#elif defined(TOOLKIT_VIEWS)
return views_test_helper_->GetContext();
#else
return nullptr;
#endif
}
void BrowserWithTestWindowTest::AddTab(Browser* browser, const GURL& url) {
NavigateParams params(browser, url, ui::PAGE_TRANSITION_TYPED);
params.tabstrip_index = 0;
params.disposition = WindowOpenDisposition::NEW_FOREGROUND_TAB;
Navigate(&params);
CommitPendingLoad(&params.navigated_or_inserted_contents->GetController());
}
void BrowserWithTestWindowTest::CommitPendingLoad(
NavigationController* controller) {
if (!controller->GetPendingEntry())
return; // Nothing to commit.
RenderFrameHostTester::CommitPendingLoad(controller);
}
void BrowserWithTestWindowTest::NavigateAndCommit(
NavigationController* controller,
const GURL& url) {
controller->LoadURL(
url, content::Referrer(), ui::PAGE_TRANSITION_LINK, std::string());
CommitPendingLoad(controller);
}
void BrowserWithTestWindowTest::NavigateAndCommitActiveTab(const GURL& url) {
NavigateAndCommit(&browser()->tab_strip_model()->GetActiveWebContents()->
GetController(),
url);
}
void BrowserWithTestWindowTest::NavigateAndCommitActiveTabWithTitle(
Browser* navigating_browser,
const GURL& url,
const base::string16& title) {
WebContents* contents =
navigating_browser->tab_strip_model()->GetActiveWebContents();
NavigationController* controller = &contents->GetController();
NavigateAndCommit(controller, url);
contents->UpdateTitleForEntry(controller->GetActiveEntry(), title);
}
TestingProfile* BrowserWithTestWindowTest::CreateProfile() {
return profile_manager_->CreateTestingProfile(
"testing_profile", nullptr, base::string16(), 0, std::string(),
GetTestingFactories());
}
TestingProfile::TestingFactories
BrowserWithTestWindowTest::GetTestingFactories() {
return {};
}
BrowserWindow* BrowserWithTestWindowTest::CreateBrowserWindow() {
return new TestBrowserWindow();
}
Browser* BrowserWithTestWindowTest::CreateBrowser(
Profile* profile,
Browser::Type browser_type,
bool hosted_app,
BrowserWindow* browser_window) {
Browser::CreateParams params(profile, true);
if (hosted_app) {
params = Browser::CreateParams::CreateForApp(
"Test", true /* trusted_source */, gfx::Rect(), profile, true);
} else {
params.type = browser_type;
}
params.window = browser_window;
return new Browser(params);
}