blob: 6a5bc4cda6ca045c2c8812b5df8b048d76eff609 [file] [log] [blame]
// Copyright 2013 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROME_BROWSER_EXTENSIONS_TEST_EXTENSION_ENVIRONMENT_H_
#define CHROME_BROWSER_EXTENSIONS_TEST_EXTENSION_ENVIRONMENT_H_
#include <memory>
#include <string>
#include "base/memory/raw_ptr.h"
#include "base/memory/scoped_refptr.h"
#include "build/build_config.h"
#include "build/chromeos_buildflags.h"
#include "extensions/common/extension.h"
#if BUILDFLAG(IS_WIN)
#include "ui/base/win/scoped_ole_initializer.h"
#endif
class TestingProfile;
namespace base {
class Value;
}
namespace content {
class BrowserTaskEnvironment;
class WebContents;
}
namespace extensions {
class Extension;
class ExtensionPrefs;
class ExtensionRegistrar;
class ExtensionService;
class TestExtensionSystem;
// This class provides a minimal environment in which to create
// extensions and tabs for extension-related unittests.
class TestExtensionEnvironment {
public:
// Fetches the TestExtensionSystem in `profile` and creates a default
// ExtensionService there,
static ExtensionService* CreateExtensionServiceForProfile(
TestingProfile* profile);
enum class Type {
// A TestExtensionEnvironment which will provide a BrowserTaskEnvironment
// in its scope.
kWithTaskEnvironment,
// A TestExtensionEnvironment which will run on top of the existing task
// environment without trying to provide one.
kInheritExistingTaskEnvironment,
};
enum class ProfileCreationType {
kNoCreate,
kCreate,
};
#if BUILDFLAG(IS_CHROMEOS)
enum class OSSetupType {
kNoSetUp,
kSetUp,
};
#endif
explicit TestExtensionEnvironment(
Type type = Type::kWithTaskEnvironment,
ProfileCreationType profile_creation_type = ProfileCreationType::kCreate
#if BUILDFLAG(IS_CHROMEOS)
,
OSSetupType os_setup_type = OSSetupType::kSetUp
#endif
);
TestExtensionEnvironment(const TestExtensionEnvironment&) = delete;
TestExtensionEnvironment& operator=(const TestExtensionEnvironment&) = delete;
~TestExtensionEnvironment();
void SetProfile(TestingProfile* profile);
TestingProfile* profile() const;
// Returns the TestExtensionSystem created by the TestingProfile.
TestExtensionSystem* GetExtensionSystem();
// Returns ExtensionPrefs created (and owned) by the
// TestExtensionSystem created by the TestingProfile.
ExtensionPrefs* GetExtensionPrefs();
// Returns ExtensionRegistrar created (and owned) by the
// TestExtensionSystem created by the TestingProfile.
ExtensionRegistrar* GetExtensionRegistrar();
// Creates an Extension and registers it with the ExtensionService.
// The Extension has a default manifest of {name: "Extension",
// version: "1.0", manifest_version: 2}, and values in
// manifest_extra override these defaults.
const Extension* MakeExtension(const base::Value::Dict& manifest_extra);
// Use a specific extension ID instead of the default generated in
// Extension::Create.
const Extension* MakeExtension(const base::Value::Dict& manifest_extra,
const std::string& id);
// Generates a valid packaged app manifest with the given ID. If `install`
// it gets added to the ExtensionService in `profile`.
scoped_refptr<const Extension> MakePackagedApp(const std::string& id,
bool install);
// Returns a test web contents that has a tab id.
std::unique_ptr<content::WebContents> MakeTab() const;
// Deletes the testing profile to test profile teardown.
void DeleteProfile();
void ProfileMarkedForPermanentDeletionForTest();
private:
class ChromeOSEnv;
void Init();
// Returns an ExtensionService created (and owned) by the
// TestExtensionSystem created by the TestingProfile.
ExtensionService* GetExtensionService();
// If `task_environment_` is needed, then it needs to constructed before
// `profile_` and destroyed after `profile_`.
const std::unique_ptr<content::BrowserTaskEnvironment> task_environment_;
#if BUILDFLAG(IS_CHROMEOS)
const std::unique_ptr<ChromeOSEnv> chromeos_env_;
#endif
#if BUILDFLAG(IS_WIN)
ui::ScopedOleInitializer ole_initializer_;
#endif
// TestingProfile may be created or not, depending on the caller's
// configuration passed to the constructor. This member keeps the ownership
// if the mode is kCreate.
std::unique_ptr<TestingProfile> profile_;
// Unowned pointer of Profile for this test environment. May be the pointer
// to `profile_`, or may be injected by SetProfile().
raw_ptr<TestingProfile, DanglingUntriaged> profile_ptr_;
raw_ptr<ExtensionService, DanglingUntriaged> extension_service_ = nullptr;
};
} // namespace extensions
#endif // CHROME_BROWSER_EXTENSIONS_TEST_EXTENSION_ENVIRONMENT_H_