1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186
|
// 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/buildflags/buildflags.h"
#include "extensions/common/extension.h"
#include "extensions/common/feature_switch.h"
#include "extensions/common/mojom/manifest.mojom-shared.h"
static_assert(BUILDFLAG(ENABLE_EXTENSIONS_CORE));
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(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);
enum UninstallExtensionFileDeleteType {
kDeletePath, // Delete the exact path of the extension install.
kDeleteAllVersions, // Delete all version of the extension (e.g. delete the
// root of the install folder).
kDoNotDelete, // Do not delete any of the extension's files.
};
// Uninstalls extension with `id` and expects deletion of the extension's
// files according to `delete_type`.
void UninstallExtension(
const std::string& id,
UninstallExtensionFileDeleteType delete_type = kDeleteAllVersions);
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, DanglingUntriaged> 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_
|