blob: 73bcf80792cdd4065f7c47240acbcd1d5862954d [file] [log] [blame]
// Copyright 2012 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
//
// Provides a pre-defined browser test fixture for browser tests that run
// directly on top of `content_shell` (e.g. no functionality from //chrome, et
// cetera is needed), which is often the case for web platform features.
//
// Intended to be used in conjunction with //content/public/test/browser_test.h
// and one of the `IN_PROC_BROWSER_TEST_*` macros defined in that header; please
// see that header for more info about using those macros.
//
// Commonly overridden methods:
//
// - void SetUpCommandLine(base::CommandLine* command_line), e.g. to add
// command-line flags to enable / configure the feature being tested.
// NOTE: There is no need to call ContentBrowserTest::SetUpCommandLine() from
// the override method, as ContentBrowserTest::SetUpCommandLine() is empty.
//
// - void SetUpOnMainThread(), to run test set-up steps on the browser main
// thread, e.g. installing hooks in the browser process for testing. Note that
// this method cannot be used to configure renderer-side hooks, as renderers
// spawn in separate processes. Most often, renderers are configured via
// pre-existing IPCs or via command-line flags.
//
// As a hack, it *is* possible to use `--single-process`, which runs the
// renderer in the same process, but on a different thread. This is very
// strongly discouraged. :)
#ifndef CONTENT_PUBLIC_TEST_CONTENT_BROWSER_TEST_H_
#define CONTENT_PUBLIC_TEST_CONTENT_BROWSER_TEST_H_
#include "base/files/file_path.h"
#include "base/memory/raw_ptr.h"
#include "build/build_config.h"
#include "content/public/test/browser_test_base.h"
#if BUILDFLAG(IS_MAC)
#include <optional>
#include "base/apple/scoped_nsautorelease_pool.h"
#include "base/memory/stack_allocated.h"
#include "base/test/scoped_path_override.h"
#endif
namespace content {
class Shell;
class TestBrowserContext;
// Base class for browser tests which use content_shell.
class ContentBrowserTest : public BrowserTestBase {
protected:
ContentBrowserTest();
~ContentBrowserTest() override;
// testing::Test:
void SetUp() override;
void TearDown() override;
// BrowserTestBase:
void PreRunTestOnMainThread() override;
void PostRunTestOnMainThread() override;
protected:
// Creates a new window and loads about:blank.
Shell* CreateBrowser();
// Creates an off-the-record window and loads about:blank.
Shell* CreateOffTheRecordBrowser();
// Returns the window for the test.
Shell* shell() const { return shell_; }
// This is used in tests that rely on a ContentBrowserTestContentBrowserClient
// to register different binders in RegisterBrowserInterfaceBindersForFrame.
// The earliest point at which the ContentBrowserTestContentBrowserClient can
// be replaced is still later than the call to
// RegisterBrowserInterfaceBindersForFrame. Therefore, a new window has to be
// recreated so that RegisterBrowserInterfaceBindersForFrame is called on the
// right ContentBrowserTestContentBrowserClient.
void RecreateWindow();
// Creates a test browser context with a file path that's appropriate for
// browser tests.
std::unique_ptr<TestBrowserContext> CreateTestBrowserContext();
// File path to test data, relative to DIR_SRC_TEST_DATA_ROOT.
base::FilePath GetTestDataFilePath();
private:
raw_ptr<Shell, AcrossTasksDanglingUntriaged> shell_ = nullptr;
#if BUILDFLAG(IS_MAC)
// On Mac, without the following autorelease pool, code which is directly
// executed (as opposed to executed inside a message loop) would autorelease
// objects into a higher-level pool. This pool is not recycled in-sync with
// the message loops' pools and causes problems with code relying on
// deallocation via an autorelease pool (such as browser window closure and
// browser shutdown). To avoid this, the following pool is recycled after each
// time code is directly executed.
STACK_ALLOCATED_IGNORE("https://crbug.com/1424190")
std::optional<base::apple::ScopedNSAutoreleasePool> pool_;
std::optional<base::ScopedPathOverride> file_exe_override_;
#endif
// Used to detect incorrect overriding of PreRunTestOnMainThread() with
// missung call to base implementation.
bool pre_run_test_executed_ = false;
};
} // namespace content
#endif // CONTENT_PUBLIC_TEST_CONTENT_BROWSER_TEST_H_