blob: fcc3906d42e3b4ce1b7eb0b93bb4c69eef127a31 [file] [log] [blame]
// Copyright 2015 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_EXTENSION_SERVICE_TEST_WITH_INSTALL_H_
#define CHROME_BROWSER_EXTENSIONS_EXTENSION_SERVICE_TEST_WITH_INSTALL_H_
#include <stddef.h>
#include <string>
#include "base/memory/raw_ptr.h"
#include "base/scoped_observation.h"
#include "chrome/browser/extensions/extension_service_user_test_base.h"
#include "extensions/browser/extension_registry.h"
#include "extensions/browser/extension_registry_observer.h"
#include "extensions/common/extension.h"
#include "extensions/common/feature_switch.h"
#include "extensions/common/mojom/manifest.mojom-shared.h"
namespace base {
class FilePath;
}
namespace content {
class BrowserTaskEnvironment;
}
namespace extensions {
// An enhancement of ExtensionServiceUserTestBase that provides helpers to
// install, update, and uninstall extensions.
class ExtensionServiceTestWithInstall : public ExtensionServiceUserTestBase,
public ExtensionRegistryObserver {
public:
ExtensionServiceTestWithInstall();
explicit ExtensionServiceTestWithInstall(
std::unique_ptr<content::BrowserTaskEnvironment> task_environment);
ExtensionServiceTestWithInstall(const ExtensionServiceTestWithInstall&) =
delete;
ExtensionServiceTestWithInstall& operator=(
const ExtensionServiceTestWithInstall&) = delete;
~ExtensionServiceTestWithInstall() override;
protected:
void InitializeExtensionService(
const ExtensionServiceInitParams& params) override;
static std::vector<std::u16string> GetErrors();
void PackCRX(const base::FilePath& dir_path,
const base::FilePath& pem_path,
const base::FilePath& crx_path);
enum InstallState {
INSTALL_FAILED,
INSTALL_UPDATED,
INSTALL_NEW,
INSTALL_WITHOUT_LOAD,
};
const Extension* PackAndInstallCRX(const base::FilePath& dir_path,
const base::FilePath& pem_path,
InstallState install_state,
int creation_flags,
mojom::ManifestLocation install_location);
const Extension* PackAndInstallCRX(const base::FilePath& dir_path,
const base::FilePath& pem_path,
InstallState install_state);
const Extension* PackAndInstallCRX(const base::FilePath& dir_path,
InstallState install_state);
const Extension* PackAndInstallCRX(const base::FilePath& dir_path,
mojom::ManifestLocation install_location,
InstallState install_state);
const Extension* InstallCRX(const base::FilePath& path,
InstallState install_state,
int creation_flags,
const std::string& expected_old_name);
const Extension* InstallCRX(const base::FilePath& path,
mojom::ManifestLocation install_location,
InstallState install_state,
int creation_flags);
const Extension* InstallCRX(const base::FilePath& path,
InstallState install_state,
int creation_flags);
const Extension* InstallCRX(const base::FilePath& path,
InstallState install_state);
const Extension* InstallCRXFromWebStore(const base::FilePath& path,
InstallState install_state);
// Verifies the result of a CRX installation. Used by InstallCRX. Set the
// |install_state| to INSTALL_FAILED if the installation is expected to fail.
// Returns an Extension pointer if the install succeeded, null otherwise.
const Extension* VerifyCrxInstall(const base::FilePath& path,
InstallState install_state);
// Verifies the result of a CRX installation. Used by InstallCRX. Set the
// |install_state| to INSTALL_FAILED if the installation is expected to fail.
// If |install_state| is INSTALL_UPDATED, and |expected_old_name| is
// non-empty, expects that the existing extension's title was
// |expected_old_name|.
// Returns an Extension pointer if the install succeeded, null otherwise.
const Extension* VerifyCrxInstall(const base::FilePath& path,
InstallState install_state,
const std::string& expected_old_name);
enum UpdateState {
FAILED_SILENTLY,
FAILED,
UPDATED,
INSTALLED,
DISABLED,
ENABLED
};
void PackCRXAndUpdateExtension(const std::string& id,
const base::FilePath& dir_path,
const base::FilePath& pem_path,
UpdateState expected_state);
void UpdateExtension(const std::string& id,
const base::FilePath& in_path,
UpdateState expected_state);
void UninstallExtension(const std::string& id);
void TerminateExtension(const std::string& id);
void BlockAllExtensions();
void ClearLoadedExtensions();
const ExtensionList& loaded_extensions() const { return loaded_extensions_; }
const Extension* installed_extension() const { return installed_extension_; }
bool was_update() const { return was_update_; }
UnloadedExtensionReason unloaded_reason() const { return unloaded_reason_; }
// ExtensionRegistryObserver:
void OnExtensionLoaded(content::BrowserContext* browser_context,
const Extension* extension) override;
void OnExtensionUnloaded(content::BrowserContext* browser_context,
const Extension* extension,
UnloadedExtensionReason reason) override;
void OnExtensionWillBeInstalled(content::BrowserContext* browser_context,
const Extension* extension,
bool is_update,
const std::string& old_name) override;
private:
void InstallCRXInternal(const base::FilePath& crx_path,
mojom::ManifestLocation install_location,
InstallState install_state,
int creation_flags);
extensions::ExtensionList loaded_extensions_;
raw_ptr<const Extension> installed_extension_;
bool was_update_;
std::string old_name_;
std::string unloaded_id_;
UnloadedExtensionReason unloaded_reason_;
size_t expected_extensions_count_;
FeatureSwitch::ScopedOverride override_external_install_prompt_;
base::ScopedObservation<ExtensionRegistry, ExtensionRegistryObserver>
registry_observation_{this};
};
} // namespace extensions
#endif // CHROME_BROWSER_EXTENSIONS_EXTENSION_SERVICE_TEST_WITH_INSTALL_H_