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
|
// Copyright 2023 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/web_applications/extensions_manager.h"
#include <memory>
#include "base/functional/callback_forward.h"
#include "chrome/browser/extensions/chrome_extension_system_factory.h"
#include "chrome/browser/extensions/extension_service.h"
#include "chrome/browser/extensions/extension_util.h"
#include "chrome/browser/profiles/profile.h"
#include "content/public/browser/storage_partition.h"
#include "extensions/browser/delayed_install_manager.h"
#include "extensions/browser/extension_prefs.h"
#include "extensions/browser/extension_registry.h"
#include "extensions/browser/extension_system.h"
#include "extensions/browser/extension_util.h"
#include "extensions/browser/install_gate.h"
#include "extensions/browser/pref_names.h"
#include "extensions/common/extension.h"
#include "extensions/common/extension_set.h"
namespace web_app {
// This class registers itself to DelayedInstallManager on construction and
// unregisters itself on destruction. It always delays extension install.
class ExtensionInstallGateImpl : public extensions::InstallGate,
public ExtensionInstallGate {
public:
explicit ExtensionInstallGateImpl(Profile* profile) : profile_(profile) {
CHECK(profile);
extensions::DelayedInstallManager::Get(profile)->RegisterInstallGate(
extensions::ExtensionPrefs::DelayReason::kGc,
static_cast<ExtensionInstallGateImpl*>(this));
}
~ExtensionInstallGateImpl() override {
extensions::DelayedInstallManager::Get(profile_)->UnregisterInstallGate(
this);
}
extensions::InstallGate::Action ShouldDelay(
const extensions::Extension* extension,
bool install_immediately) override {
return extensions::InstallGate::DELAY;
}
private:
raw_ptr<Profile> profile_ = nullptr;
};
ExtensionInstallGate::~ExtensionInstallGate() = default;
ExtensionsManager::ExtensionsManager(Profile* profile)
: profile_(profile),
registry_(extensions::ExtensionRegistry::Get(profile)) {}
ExtensionsManager::~ExtensionsManager() = default;
std::unordered_set<base::FilePath>
ExtensionsManager::GetIsolatedStoragePaths() {
std::unordered_set<base::FilePath> allowlist;
extensions::ExtensionSet extensions =
registry_->GenerateInstalledExtensionsSet();
for (const auto& ext : extensions) {
if (extensions::util::HasIsolatedStorage(*ext.get(), profile_)) {
allowlist.insert(extensions::util::GetStoragePartitionForExtensionId(
ext->id(), profile_)
->GetPath());
}
}
return allowlist;
}
bool ExtensionsManager::ShouldGarbageCollectStoragePartitions() {
// `ExtensionPrefs` can be created lazily, so we don't need to wait on
// extension service.
extensions::ExtensionPrefs* extension_prefs =
extensions::ExtensionPrefs::Get(profile_);
return extension_prefs && extension_prefs->NeedsStorageGarbageCollection();
}
void ExtensionsManager::ResetStorageGarbageCollectPref(
base::OnceClosure callback) {
// `ExtensionPrefs` can be created lazily, so we don't need to wait on
// extension service.
extensions::ExtensionPrefs* extension_prefs =
extensions::ExtensionPrefs::Get(profile_);
if (extension_prefs) {
extension_prefs->pref_service()->SetBoolean(
extensions::pref_names::kStorageGarbageCollect, false);
extension_prefs->pref_service()->CommitPendingWrite(std::move(callback));
}
}
std::unique_ptr<ExtensionInstallGate>
ExtensionsManager::RegisterGarbageCollectionInstallGate() {
return std::make_unique<web_app::ExtensionInstallGateImpl>(profile_);
}
KeyedServiceBaseFactory* ExtensionsManager::GetExtensionSystemSharedFactory() {
return extensions::ChromeExtensionSystemSharedFactory::GetInstance();
}
} // namespace web_app
|