blob: f4e6e5110775c1acda8b67383bae890b9ead7130 [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.
#ifndef CHROME_TEST_BASE_BROWSER_WITH_TEST_WINDOW_TEST_H_
#define CHROME_TEST_BASE_BROWSER_WITH_TEST_WINDOW_TEST_H_
#include "base/at_exit.h"
#include "base/message_loop/message_loop.h"
#include "chrome/browser/ui/browser.h"
#include "chrome/browser/ui/host_desktop.h"
#include "chrome/test/base/test_browser_window.h"
#include "chrome/test/base/testing_profile.h"
#include "content/public/test/test_browser_thread_bundle.h"
#include "content/public/test/test_renderer_host.h"
#include "testing/gtest/include/gtest/gtest.h"
#if defined(OS_CHROMEOS)
#include "chrome/browser/chromeos/login/user_manager.h"
#include "chrome/browser/chromeos/settings/cros_settings.h"
#include "chrome/browser/chromeos/settings/device_settings_service.h"
#endif
#if defined(OS_WIN)
#include "ui/base/win/scoped_ole_initializer.h"
#endif
class GURL;
#if defined(USE_ASH)
namespace ash {
namespace test {
class AshTestHelper;
}
}
#endif
#if defined(USE_AURA)
namespace aura {
namespace test {
class AuraTestHelper;
}
}
#endif
namespace content {
class NavigationController;
class WebContents;
}
// Base class for browser based unit tests. BrowserWithTestWindowTest creates a
// Browser with a TestingProfile and TestBrowserWindow. To add a tab use
// AddTab. For example, the following adds a tab and navigates to
// two URLs that target the TestWebContents:
//
// // Add a new tab and navigate it. This will be at index 0.
// AddTab(browser(), GURL("http://foo/1"));
// NavigationController* controller =
// &browser()->tab_strip_model()->GetWebContentsAt(0)->GetController();
//
// // Navigate somewhere else.
// GURL url2("http://foo/2");
// NavigateAndCommit(controller, url2);
//
// // This is equivalent to the above, and lets you test pending navigations.
// browser()->OpenURL(OpenURLParams(
// GURL("http://foo/2"), GURL(), CURRENT_TAB,
// content::PAGE_TRANSITION_TYPED, false));
// CommitPendingLoad(controller);
//
// Subclasses must invoke BrowserWithTestWindowTest::SetUp as it is responsible
// for creating the various objects of this class.
class BrowserWithTestWindowTest : public testing::Test {
public:
// Creates a BrowserWithTestWindowTest for which the initial window will be
// created on the native desktop.
BrowserWithTestWindowTest();
virtual ~BrowserWithTestWindowTest();
// Sets the desktop on which the initial window will be created. Must be
// called before SetUp().
void SetHostDesktopType(chrome::HostDesktopType host_desktop_type);
virtual void SetUp() OVERRIDE;
virtual void TearDown() OVERRIDE;
protected:
BrowserWindow* window() const { return window_.get(); }
Browser* browser() const { return browser_.get(); }
void set_browser(Browser* browser) {
browser_.reset(browser);
}
Browser* release_browser() WARN_UNUSED_RESULT {
return browser_.release();
}
TestingProfile* profile() const { return profile_.get(); }
TestingProfile* GetProfile() { return profile_.get(); }
BrowserWindow* release_browser_window() WARN_UNUSED_RESULT {
return window_.release();
}
// Adds a tab to |browser| with the given URL and commits the load.
// This is a convenience function. The new tab will be added at index 0.
void AddTab(Browser* browser, const GURL& url);
// Commits the pending load on the given controller. It will keep the
// URL of the pending load. If there is no pending load, this does nothing.
void CommitPendingLoad(content::NavigationController* controller);
// Creates a pending navigation on the given navigation controller to the
// given URL with the default parameters and the commits the load with a page
// ID one larger than any seen. This emulates what happens on a new
// navigation.
void NavigateAndCommit(content::NavigationController* controller,
const GURL& url);
// Navigates the current tab. This is a wrapper around NavigateAndCommit.
void NavigateAndCommitActiveTab(const GURL& url);
// Set the |title| of the current tab.
void NavigateAndCommitActiveTabWithTitle(
Browser* browser,
const GURL& url,
const string16& title);
// Destroys the browser, window, and profile created by this class. This is
// invoked from the destructor.
void DestroyBrowserAndProfile();
// Creates the profile used by this test. The caller owns the return value.
virtual TestingProfile* CreateProfile();
// Creates the BrowserWindow used by this test. The caller owns the return
// value. Can return NULL to use the default window created by Browser.
virtual BrowserWindow* CreateBrowserWindow();
private:
// We need to create a MessageLoop, otherwise a bunch of things fails.
content::TestBrowserThreadBundle thread_bundle_;
base::ShadowingAtExitManager at_exit_manager_;
#if defined(OS_CHROMEOS)
chromeos::ScopedTestDeviceSettingsService test_device_settings_service_;
chromeos::ScopedTestCrosSettings test_cros_settings_;
chromeos::ScopedTestUserManager test_user_manager_;
#endif
scoped_ptr<TestingProfile> profile_;
scoped_ptr<BrowserWindow> window_; // Usually a TestBrowserWindow.
scoped_ptr<Browser> browser_;
// The existence of this object enables tests via
// RenderViewHostTester.
content::RenderViewHostTestEnabler rvh_test_enabler_;
#if defined(USE_ASH)
scoped_ptr<ash::test::AshTestHelper> ash_test_helper_;
#endif
#if defined(USE_AURA)
scoped_ptr<aura::test::AuraTestHelper> aura_test_helper_;
#endif
#if defined(OS_WIN)
ui::ScopedOleInitializer ole_initializer_;
#endif
// The desktop to create the initial window on.
chrome::HostDesktopType host_desktop_type_;
DISALLOW_COPY_AND_ASSIGN(BrowserWithTestWindowTest);
};
#endif // CHROME_TEST_BASE_BROWSER_WITH_TEST_WINDOW_TEST_H_