#include "extensions/browser/api/storage/storage_frontend.h"
#include <memory>
#include <utility>
#include "base/barrier_closure.h"
#include "base/containers/contains.h"
#include "base/files/file_path.h"
#include "base/functional/bind.h"
#include "base/functional/callback_helpers.h"
#include "base/json/json_reader.h"
#include "base/lazy_instance.h"
#include "base/memory/ptr_util.h"
#include "base/memory/raw_ptr.h"
#include "base/strings/string_util.h"
#include "base/strings/stringprintf.h"
#include "base/trace_event/trace_event.h"
#include "components/value_store/value_store_factory.h"
#include "content/public/browser/browser_context.h"
#include "content/public/browser/browser_thread.h"
#include "extensions/browser/api/extensions_api_client.h"
#include "extensions/browser/api/storage/backend_task_runner.h"
#include "extensions/browser/api/storage/local_value_store_cache.h"
#include "extensions/browser/api/storage/storage_area_namespace.h"
#include "extensions/browser/api/storage/storage_utils.h"
#include "extensions/browser/event_router.h"
#include "extensions/browser/extension_registry.h"
#include "extensions/browser/extension_system.h"
#include "extensions/common/api/storage.h"
#include "extensions/common/extension_id.h"
BrowserContext;
BrowserThread;
ValueStore;
namespace extensions {
namespace {
base::LazyInstance<BrowserContextKeyedAPIFactory<StorageFrontend>>::
DestructorAtExit g_factory = …;
events::HistogramValue StorageAreaToEventHistogram(
StorageAreaNamespace storage_area) { … }
void GetWithValueStore(
std::optional<std::vector<std::string>> keys,
base::OnceCallback<void(ValueStore::ReadResult)> callback,
ValueStore* store) { … }
void GetBytesInUseWithValueStore(std::optional<std::vector<std::string>> keys,
base::OnceCallback<void(size_t)> callback,
ValueStore* store) { … }
void SetWithValueStore(
const base::Value::Dict& values,
base::OnceCallback<void(ValueStore::WriteResult)> callback,
ValueStore* store) { … }
void RemoveWithValueStore(
std::vector<std::string> keys,
base::OnceCallback<void(ValueStore::WriteResult)> callback,
ValueStore* store) { … }
void ClearWithValueStore(
base::OnceCallback<void(ValueStore::WriteResult)> callback,
ValueStore* store) { … }
base::Value::List KeysFromDict(base::Value::Dict dict) { … }
}
StorageFrontend* StorageFrontend::Get(BrowserContext* context) { … }
std::unique_ptr<StorageFrontend> StorageFrontend::CreateForTesting(
scoped_refptr<value_store::ValueStoreFactory> storage_factory,
BrowserContext* context) { … }
StorageFrontend::ResultStatus::ResultStatus() = default;
StorageFrontend::ResultStatus::ResultStatus(const ResultStatus&) = default;
StorageFrontend::ResultStatus::~ResultStatus() = default;
StorageFrontend::GetKeysResult::GetKeysResult() = default;
StorageFrontend::GetKeysResult::GetKeysResult(GetKeysResult&& other) = default;
StorageFrontend::GetKeysResult::~GetKeysResult() = default;
StorageFrontend::GetResult::GetResult() = default;
StorageFrontend::GetResult::GetResult(GetResult&& other) = default;
StorageFrontend::GetResult::~GetResult() = default;
StorageFrontend::StorageFrontend(BrowserContext* context)
: … { … }
StorageFrontend::StorageFrontend(
scoped_refptr<value_store::ValueStoreFactory> factory,
BrowserContext* context)
: … { … }
void StorageFrontend::Init(
scoped_refptr<value_store::ValueStoreFactory> factory) { … }
StorageFrontend::~StorageFrontend() { … }
void StorageFrontend::OnReadFinished(
const ExtensionId& extension_id,
StorageAreaNamespace storage_area,
base::OnceCallback<void(StorageFrontend::GetResult)> callback,
ValueStore::ReadResult result) { … }
void StorageFrontend::OnReadKeysFinished(
base::OnceCallback<void(GetKeysResult)> callback,
GetResult get_result) { … }
void StorageFrontend::OnWriteFinished(
const ExtensionId& extension_id,
StorageAreaNamespace storage_area,
base::OnceCallback<void(StorageFrontend::ResultStatus)> callback,
ValueStore::WriteResult result) { … }
void StorageFrontend::GetValues(scoped_refptr<const Extension> extension,
StorageAreaNamespace storage_area,
std::optional<std::vector<std::string>> keys,
base::OnceCallback<void(GetResult)> callback) { … }
void StorageFrontend::GetKeys(
scoped_refptr<const Extension> extension,
StorageAreaNamespace storage_area,
base::OnceCallback<void(GetKeysResult)> callback) { … }
void StorageFrontend::GetBytesInUse(
scoped_refptr<const Extension> extension,
StorageAreaNamespace storage_area,
std::optional<std::vector<std::string>> keys,
base::OnceCallback<void(size_t)> callback) { … }
void StorageFrontend::Set(scoped_refptr<const Extension> extension,
StorageAreaNamespace storage_area,
base::Value::Dict values,
base::OnceCallback<void(ResultStatus)> callback) { … }
void StorageFrontend::Remove(scoped_refptr<const Extension> extension,
StorageAreaNamespace storage_area,
const std::vector<std::string>& keys,
base::OnceCallback<void(ResultStatus)> callback) { … }
void StorageFrontend::Clear(
scoped_refptr<const Extension> extension,
StorageAreaNamespace storage_area,
base::OnceCallback<void(StorageFrontend::ResultStatus)> callback) { … }
ValueStoreCache* StorageFrontend::GetValueStoreCache(
settings_namespace::Namespace settings_namespace) const { … }
bool StorageFrontend::IsStorageEnabled(
settings_namespace::Namespace settings_namespace) const { … }
void StorageFrontend::RunWithStorage(
scoped_refptr<const Extension> extension,
settings_namespace::Namespace settings_namespace,
ValueStoreCache::StorageCallback callback) { … }
void StorageFrontend::DeleteStorageSoon(const ExtensionId& extension_id,
base::OnceClosure done_callback) { … }
SettingsChangedCallback StorageFrontend::GetObserver() { … }
void StorageFrontend::SetCacheForTesting(
settings_namespace::Namespace settings_namespace,
std::unique_ptr<ValueStoreCache> cache) { … }
void StorageFrontend::DisableStorageForTesting(
settings_namespace::Namespace settings_namespace) { … }
void StorageFrontend::OnSettingsChanged(
const ExtensionId& extension_id,
StorageAreaNamespace storage_area,
std::optional<api::storage::AccessLevel> session_access_level,
base::Value changes) { … }
BrowserContextKeyedAPIFactory<StorageFrontend>*
StorageFrontend::GetFactoryInstance() { … }
const char* StorageFrontend::service_name() { … }
}