blob: a447f5b726cdf39416c591719776ea4487e60197 [file] [log] [blame]
// Copyright 2014 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "storage/browser/quota/quota_manager_proxy.h"
#include <stdint.h>
#include <memory>
#include <string>
#include <utility>
#include <vector>
#include "base/bind.h"
#include "base/callback.h"
#include "base/location.h"
#include "base/memory/scoped_refptr.h"
#include "base/sequence_checker.h"
#include "base/strings/string_number_conversions.h"
#include "base/synchronization/waitable_event.h"
#include "base/task/bind_post_task.h"
#include "base/task/sequenced_task_runner.h"
#include "base/threading/thread_task_runner_handle.h"
#include "base/time/time.h"
#include "components/services/storage/public/cpp/buckets/bucket_locator.h"
#include "components/services/storage/public/cpp/constants.h"
#include "components/services/storage/public/mojom/quota_client.mojom.h"
#include "mojo/public/cpp/bindings/pending_remote.h"
#include "storage/browser/quota/quota_client_type.h"
#include "storage/browser/quota/quota_manager_impl.h"
#include "storage/browser/quota/quota_override_handle.h"
#include "storage/browser/quota/storage_directory_util.h"
#include "third_party/blink/public/common/storage_key/storage_key.h"
#include "third_party/blink/public/mojom/quota/quota_types.mojom.h"
using ::blink::StorageKey;
namespace storage {
QuotaManagerProxy::QuotaManagerProxy(
QuotaManagerImpl* quota_manager_impl,
scoped_refptr<base::SequencedTaskRunner> quota_manager_impl_task_runner,
const base::FilePath& profile_path)
: quota_manager_impl_(quota_manager_impl),
quota_manager_impl_task_runner_(
std::move(quota_manager_impl_task_runner)),
profile_path_(profile_path) {
DCHECK(quota_manager_impl_task_runner_.get());
DETACH_FROM_SEQUENCE(quota_manager_impl_sequence_checker_);
}
base::FilePath QuotaManagerProxy::GetBucketPath(const BucketLocator& bucket) {
return CreateBucketPath(profile_path_, bucket);
}
base::FilePath QuotaManagerProxy::GetClientBucketPath(
const BucketLocator& bucket,
QuotaClientType client_type) {
return CreateClientBucketPath(profile_path_, bucket, client_type);
}
void QuotaManagerProxy::RegisterClient(
mojo::PendingRemote<mojom::QuotaClient> client,
QuotaClientType client_type,
const std::vector<blink::mojom::StorageType>& storage_types) {
if (!quota_manager_impl_task_runner_->RunsTasksInCurrentSequence()) {
quota_manager_impl_task_runner_->PostTask(
FROM_HERE,
base::BindOnce(&QuotaManagerProxy::RegisterClient, this,
std::move(client), client_type, storage_types));
return;
}
DCHECK_CALLED_ON_VALID_SEQUENCE(quota_manager_impl_sequence_checker_);
if (quota_manager_impl_) {
quota_manager_impl_->RegisterClient(std::move(client), client_type,
storage_types);
}
}
void QuotaManagerProxy::BindInternalsHandler(
mojo::PendingReceiver<mojom::QuotaInternalsHandler> receiver) {
if (!quota_manager_impl_task_runner_->RunsTasksInCurrentSequence()) {
quota_manager_impl_task_runner_->PostTask(
FROM_HERE, base::BindOnce(&QuotaManagerProxy::BindInternalsHandler,
this, std::move(receiver)));
return;
}
DCHECK_CALLED_ON_VALID_SEQUENCE(quota_manager_impl_sequence_checker_);
if (quota_manager_impl_)
quota_manager_impl_->BindInternalsHandler(std::move(receiver));
}
void QuotaManagerProxy::UpdateOrCreateBucket(
const BucketInitParams& bucket_params,
scoped_refptr<base::SequencedTaskRunner> callback_task_runner,
base::OnceCallback<void(QuotaErrorOr<BucketInfo>)> callback) {
DCHECK(callback_task_runner);
DCHECK(callback);
if (!quota_manager_impl_task_runner_->RunsTasksInCurrentSequence()) {
quota_manager_impl_task_runner_->PostTask(
FROM_HERE,
base::BindOnce(&QuotaManagerProxy::UpdateOrCreateBucket, this,
bucket_params, std::move(callback_task_runner),
std::move(callback)));
return;
}
DCHECK_CALLED_ON_VALID_SEQUENCE(quota_manager_impl_sequence_checker_);
auto respond =
base::BindPostTask(std::move(callback_task_runner), std::move(callback));
if (!quota_manager_impl_) {
std::move(respond).Run(QuotaError::kUnknownError);
return;
}
quota_manager_impl_->UpdateOrCreateBucket(bucket_params, std::move(respond));
}
QuotaErrorOr<BucketInfo> QuotaManagerProxy::GetOrCreateBucketSync(
const BucketInitParams& params) {
// Ensure that the task runner we want is free and can be blocked on.
DCHECK(!quota_manager_impl_task_runner_->RunsTasksInCurrentSequence());
QuotaErrorOr<BucketInfo> bucket;
base::WaitableEvent waiter(base::WaitableEvent::ResetPolicy::AUTOMATIC,
base::WaitableEvent::InitialState::NOT_SIGNALED);
// Asynchronously call UpdateOrCreateBucket and block until it completes.
quota_manager_impl_task_runner_->PostTask(
FROM_HERE,
base::BindOnce(
[](const scoped_refptr<QuotaManagerProxy>& self,
const BucketInitParams& params, base::WaitableEvent* waiter,
QuotaErrorOr<BucketInfo>* sync_bucket) {
DCHECK_CALLED_ON_VALID_SEQUENCE(
self->quota_manager_impl_sequence_checker_);
// If the database is still bootstrapping, return an error rather
// than risking deadlock.
if (!self->quota_manager_impl_ ||
self->quota_manager_impl_->is_bootstrapping_database_) {
*sync_bucket = QuotaError::kUnknownError;
waiter->Signal();
return;
}
// Otherwise, return the bucket value and resolve the waiter.
self->quota_manager_impl_->UpdateOrCreateBucket(
params, base::BindOnce(
[](base::WaitableEvent* waiter,
QuotaErrorOr<BucketInfo>* sync_bucket,
QuotaErrorOr<BucketInfo> result_bucket) {
*sync_bucket = std::move(result_bucket);
waiter->Signal();
},
waiter, sync_bucket));
},
base::WrapRefCounted(this), params, &waiter, &bucket));
waiter.Wait();
return bucket;
}
void QuotaManagerProxy::GetOrCreateBucketDeprecated(
const BucketInitParams& params,
blink::mojom::StorageType storage_type,
scoped_refptr<base::SequencedTaskRunner> callback_task_runner,
base::OnceCallback<void(QuotaErrorOr<BucketInfo>)> callback) {
DCHECK(callback_task_runner);
DCHECK(callback);
if (!quota_manager_impl_task_runner_->RunsTasksInCurrentSequence()) {
quota_manager_impl_task_runner_->PostTask(
FROM_HERE,
base::BindOnce(&QuotaManagerProxy::GetOrCreateBucketDeprecated, this,
params, storage_type, std::move(callback_task_runner),
std::move(callback)));
return;
}
DCHECK_CALLED_ON_VALID_SEQUENCE(quota_manager_impl_sequence_checker_);
auto respond =
base::BindPostTask(std::move(callback_task_runner), std::move(callback));
if (!quota_manager_impl_) {
std::move(respond).Run(QuotaError::kUnknownError);
return;
}
quota_manager_impl_->GetOrCreateBucketDeprecated(params, storage_type,
std::move(respond));
}
void QuotaManagerProxy::CreateBucketForTesting(
const StorageKey& storage_key,
const std::string& bucket_name,
blink::mojom::StorageType storage_type,
scoped_refptr<base::SequencedTaskRunner> callback_task_runner,
base::OnceCallback<void(QuotaErrorOr<BucketInfo>)> callback) {
DCHECK(callback_task_runner);
DCHECK(callback);
if (!quota_manager_impl_task_runner_->RunsTasksInCurrentSequence()) {
quota_manager_impl_task_runner_->PostTask(
FROM_HERE,
base::BindOnce(&QuotaManagerProxy::CreateBucketForTesting, this,
storage_key, bucket_name, storage_type,
std::move(callback_task_runner), std::move(callback)));
return;
}
DCHECK_CALLED_ON_VALID_SEQUENCE(quota_manager_impl_sequence_checker_);
auto respond =
base::BindPostTask(std::move(callback_task_runner), std::move(callback));
if (!quota_manager_impl_) {
std::move(respond).Run(QuotaError::kUnknownError);
return;
}
quota_manager_impl_->CreateBucketForTesting( // IN-TEST
storage_key, bucket_name, storage_type, std::move(respond));
}
void QuotaManagerProxy::GetBucket(
const StorageKey& storage_key,
const std::string& bucket_name,
blink::mojom::StorageType type,
scoped_refptr<base::SequencedTaskRunner> callback_task_runner,
base::OnceCallback<void(QuotaErrorOr<BucketInfo>)> callback) {
DCHECK(callback_task_runner);
DCHECK(callback);
if (!quota_manager_impl_task_runner_->RunsTasksInCurrentSequence()) {
quota_manager_impl_task_runner_->PostTask(
FROM_HERE,
base::BindOnce(&QuotaManagerProxy::GetBucket, this, storage_key,
bucket_name, type, std::move(callback_task_runner),
std::move(callback)));
return;
}
DCHECK_CALLED_ON_VALID_SEQUENCE(quota_manager_impl_sequence_checker_);
auto respond =
base::BindPostTask(std::move(callback_task_runner), std::move(callback));
if (!quota_manager_impl_) {
std::move(respond).Run(QuotaError::kUnknownError);
return;
}
quota_manager_impl_->GetBucket(storage_key, bucket_name, type,
std::move(respond));
}
void QuotaManagerProxy::GetBucketsForStorageKey(
const blink::StorageKey& storage_key,
blink::mojom::StorageType type,
bool delete_expired,
scoped_refptr<base::SequencedTaskRunner> callback_task_runner,
base::OnceCallback<void(QuotaErrorOr<std::set<BucketInfo>>)> callback) {
DCHECK(callback_task_runner);
DCHECK(callback);
if (!quota_manager_impl_task_runner_->RunsTasksInCurrentSequence()) {
quota_manager_impl_task_runner_->PostTask(
FROM_HERE,
base::BindOnce(&QuotaManagerProxy::GetBucketsForStorageKey, this,
storage_key, type, delete_expired,
std::move(callback_task_runner), std::move(callback)));
return;
}
DCHECK_CALLED_ON_VALID_SEQUENCE(quota_manager_impl_sequence_checker_);
auto respond =
base::BindPostTask(std::move(callback_task_runner), std::move(callback));
if (!quota_manager_impl_) {
std::move(respond).Run(QuotaError::kUnknownError);
return;
}
quota_manager_impl_->GetBucketsForStorageKey(
storage_key, type, std::move(respond), delete_expired);
}
void QuotaManagerProxy::GetBucketById(
const BucketId& bucket_id,
scoped_refptr<base::SequencedTaskRunner> callback_task_runner,
base::OnceCallback<void(QuotaErrorOr<BucketInfo>)> callback) {
DCHECK(callback_task_runner);
DCHECK(callback);
if (!quota_manager_impl_task_runner_->RunsTasksInCurrentSequence()) {
quota_manager_impl_task_runner_->PostTask(
FROM_HERE,
base::BindOnce(&QuotaManagerProxy::GetBucketById, this, bucket_id,
std::move(callback_task_runner), std::move(callback)));
return;
}
DCHECK_CALLED_ON_VALID_SEQUENCE(quota_manager_impl_sequence_checker_);
auto respond =
base::BindPostTask(std::move(callback_task_runner), std::move(callback));
if (!quota_manager_impl_) {
std::move(respond).Run(QuotaError::kUnknownError);
return;
}
quota_manager_impl_->GetBucketById(bucket_id, std::move(respond));
}
void QuotaManagerProxy::DeleteBucket(
const StorageKey& storage_key,
const std::string& bucket_name,
scoped_refptr<base::SequencedTaskRunner> callback_task_runner,
base::OnceCallback<void(blink::mojom::QuotaStatusCode)> callback) {
DCHECK(callback_task_runner);
DCHECK(callback);
if (!quota_manager_impl_task_runner_->RunsTasksInCurrentSequence()) {
quota_manager_impl_task_runner_->PostTask(
FROM_HERE,
base::BindOnce(&QuotaManagerProxy::DeleteBucket, this, storage_key,
bucket_name, std::move(callback_task_runner),
std::move(callback)));
return;
}
DCHECK_CALLED_ON_VALID_SEQUENCE(quota_manager_impl_sequence_checker_);
auto respond =
base::BindPostTask(std::move(callback_task_runner), std::move(callback));
if (!quota_manager_impl_) {
std::move(respond).Run(blink::mojom::QuotaStatusCode::kUnknown);
return;
}
quota_manager_impl_->FindAndDeleteBucketData(storage_key, bucket_name,
std::move(respond));
}
void QuotaManagerProxy::UpdateBucketExpiration(
BucketId bucket,
const base::Time& expiration,
scoped_refptr<base::SequencedTaskRunner> callback_task_runner,
base::OnceCallback<void(QuotaErrorOr<BucketInfo>)> callback) {
DCHECK(callback_task_runner);
DCHECK(callback);
if (!quota_manager_impl_task_runner_->RunsTasksInCurrentSequence()) {
quota_manager_impl_task_runner_->PostTask(
FROM_HERE,
base::BindOnce(&QuotaManagerProxy::UpdateBucketExpiration, this, bucket,
expiration, std::move(callback_task_runner),
std::move(callback)));
return;
}
DCHECK_CALLED_ON_VALID_SEQUENCE(quota_manager_impl_sequence_checker_);
auto respond =
base::BindPostTask(std::move(callback_task_runner), std::move(callback));
if (!quota_manager_impl_) {
std::move(respond).Run(QuotaError::kUnknownError);
return;
}
quota_manager_impl_->UpdateBucketExpiration(bucket, expiration,
std::move(respond));
}
void QuotaManagerProxy::UpdateBucketPersistence(
BucketId bucket,
bool persistent,
scoped_refptr<base::SequencedTaskRunner> callback_task_runner,
base::OnceCallback<void(QuotaErrorOr<BucketInfo>)> callback) {
DCHECK(callback_task_runner);
DCHECK(callback);
if (!quota_manager_impl_task_runner_->RunsTasksInCurrentSequence()) {
quota_manager_impl_task_runner_->PostTask(
FROM_HERE,
base::BindOnce(&QuotaManagerProxy::UpdateBucketPersistence, this,
bucket, persistent, std::move(callback_task_runner),
std::move(callback)));
return;
}
DCHECK_CALLED_ON_VALID_SEQUENCE(quota_manager_impl_sequence_checker_);
auto respond =
base::BindPostTask(std::move(callback_task_runner), std::move(callback));
if (!quota_manager_impl_) {
std::move(respond).Run(QuotaError::kUnknownError);
return;
}
quota_manager_impl_->UpdateBucketPersistence(bucket, persistent,
std::move(respond));
}
void QuotaManagerProxy::NotifyStorageAccessed(const StorageKey& storage_key,
blink::mojom::StorageType type,
base::Time access_time) {
if (!quota_manager_impl_task_runner_->RunsTasksInCurrentSequence()) {
quota_manager_impl_task_runner_->PostTask(
FROM_HERE, base::BindOnce(&QuotaManagerProxy::NotifyStorageAccessed,
this, storage_key, type, access_time));
return;
}
DCHECK_CALLED_ON_VALID_SEQUENCE(quota_manager_impl_sequence_checker_);
if (quota_manager_impl_)
quota_manager_impl_->NotifyStorageAccessed(storage_key, type, access_time);
}
void QuotaManagerProxy::NotifyBucketAccessed(BucketId bucket_id,
base::Time access_time) {
if (!quota_manager_impl_task_runner_->RunsTasksInCurrentSequence()) {
quota_manager_impl_task_runner_->PostTask(
FROM_HERE, base::BindOnce(&QuotaManagerProxy::NotifyBucketAccessed,
this, bucket_id, access_time));
return;
}
DCHECK_CALLED_ON_VALID_SEQUENCE(quota_manager_impl_sequence_checker_);
if (quota_manager_impl_)
quota_manager_impl_->NotifyBucketAccessed(bucket_id, access_time);
}
void QuotaManagerProxy::NotifyStorageModified(
QuotaClientType client_id,
const StorageKey& storage_key,
blink::mojom::StorageType type,
int64_t delta,
base::Time modification_time,
scoped_refptr<base::SequencedTaskRunner> callback_task_runner,
base::OnceClosure callback) {
DCHECK(callback_task_runner);
DCHECK(callback);
if (!quota_manager_impl_task_runner_->RunsTasksInCurrentSequence()) {
quota_manager_impl_task_runner_->PostTask(
FROM_HERE,
base::BindOnce(&QuotaManagerProxy::NotifyStorageModified, this,
client_id, storage_key, type, delta, modification_time,
std::move(callback_task_runner), std::move(callback)));
return;
}
DCHECK_CALLED_ON_VALID_SEQUENCE(quota_manager_impl_sequence_checker_);
if (quota_manager_impl_) {
base::OnceClosure manager_callback;
if (callback) {
manager_callback = base::BindPostTask(std::move(callback_task_runner),
std::move(callback));
}
quota_manager_impl_->NotifyStorageModified(client_id, storage_key, type,
delta, modification_time,
std::move(manager_callback));
}
}
void QuotaManagerProxy::NotifyBucketModified(
QuotaClientType client_id,
BucketId bucket_id,
int64_t delta,
base::Time modification_time,
scoped_refptr<base::SequencedTaskRunner> callback_task_runner,
base::OnceClosure callback) {
DCHECK(callback_task_runner);
DCHECK(callback);
if (!quota_manager_impl_task_runner_->RunsTasksInCurrentSequence()) {
quota_manager_impl_task_runner_->PostTask(
FROM_HERE,
base::BindOnce(&QuotaManagerProxy::NotifyBucketModified, this,
client_id, bucket_id, delta, modification_time,
std::move(callback_task_runner), std::move(callback)));
return;
}
DCHECK_CALLED_ON_VALID_SEQUENCE(quota_manager_impl_sequence_checker_);
if (quota_manager_impl_) {
base::OnceClosure manager_callback;
if (callback) {
manager_callback = base::BindPostTask(std::move(callback_task_runner),
std::move(callback));
}
quota_manager_impl_->NotifyBucketModified(client_id, bucket_id, delta,
modification_time,
std::move(manager_callback));
}
}
void QuotaManagerProxy::NotifyWriteFailed(const StorageKey& storage_key) {
if (!quota_manager_impl_task_runner_->RunsTasksInCurrentSequence()) {
quota_manager_impl_task_runner_->PostTask(
FROM_HERE, base::BindOnce(&QuotaManagerProxy::NotifyWriteFailed, this,
storage_key));
return;
}
DCHECK_CALLED_ON_VALID_SEQUENCE(quota_manager_impl_sequence_checker_);
if (quota_manager_impl_)
quota_manager_impl_->NotifyWriteFailed(storage_key);
}
void QuotaManagerProxy::SetUsageCacheEnabled(QuotaClientType client_id,
const StorageKey& storage_key,
blink::mojom::StorageType type,
bool enabled) {
if (!quota_manager_impl_task_runner_->RunsTasksInCurrentSequence()) {
quota_manager_impl_task_runner_->PostTask(
FROM_HERE, base::BindOnce(&QuotaManagerProxy::SetUsageCacheEnabled,
this, client_id, storage_key, type, enabled));
return;
}
DCHECK_CALLED_ON_VALID_SEQUENCE(quota_manager_impl_sequence_checker_);
if (quota_manager_impl_)
quota_manager_impl_->SetUsageCacheEnabled(client_id, storage_key, type,
enabled);
}
void QuotaManagerProxy::GetUsageAndQuota(
const StorageKey& storage_key,
blink::mojom::StorageType type,
scoped_refptr<base::SequencedTaskRunner> callback_task_runner,
UsageAndQuotaCallback callback) {
DCHECK(callback_task_runner);
DCHECK(callback);
if (!quota_manager_impl_task_runner_->RunsTasksInCurrentSequence()) {
quota_manager_impl_task_runner_->PostTask(
FROM_HERE,
base::BindOnce(&QuotaManagerProxy::GetUsageAndQuota, this, storage_key,
type, std::move(callback_task_runner),
std::move(callback)));
return;
}
DCHECK_CALLED_ON_VALID_SEQUENCE(quota_manager_impl_sequence_checker_);
auto respond =
base::BindPostTask(std::move(callback_task_runner), std::move(callback));
if (!quota_manager_impl_) {
std::move(respond).Run(blink::mojom::QuotaStatusCode::kErrorAbort, 0, 0);
return;
}
quota_manager_impl_->GetUsageAndQuota(storage_key, type, std::move(respond));
}
void QuotaManagerProxy::GetBucketUsageAndQuota(
const BucketInfo& bucket,
scoped_refptr<base::SequencedTaskRunner> callback_task_runner,
UsageAndQuotaCallback callback) {
DCHECK(callback_task_runner);
DCHECK(callback);
if (!quota_manager_impl_task_runner_->RunsTasksInCurrentSequence()) {
quota_manager_impl_task_runner_->PostTask(
FROM_HERE,
base::BindOnce(&QuotaManagerProxy::GetBucketUsageAndQuota, this, bucket,
std::move(callback_task_runner), std::move(callback)));
return;
}
DCHECK_CALLED_ON_VALID_SEQUENCE(quota_manager_impl_sequence_checker_);
auto respond =
base::BindPostTask(std::move(callback_task_runner), std::move(callback));
if (!quota_manager_impl_) {
std::move(respond).Run(blink::mojom::QuotaStatusCode::kErrorAbort, 0, 0);
return;
}
quota_manager_impl_->GetBucketUsageAndQuota(bucket, std::move(respond));
}
void QuotaManagerProxy::IsStorageUnlimited(
const StorageKey& storage_key,
blink::mojom::StorageType type,
scoped_refptr<base::SequencedTaskRunner> callback_task_runner,
base::OnceCallback<void(bool)> callback) {
DCHECK(callback_task_runner);
DCHECK(callback);
if (!quota_manager_impl_task_runner_->RunsTasksInCurrentSequence()) {
quota_manager_impl_task_runner_->PostTask(
FROM_HERE,
base::BindOnce(&QuotaManagerProxy::IsStorageUnlimited, this,
storage_key, type, std::move(callback_task_runner),
std::move(callback)));
return;
}
DCHECK_CALLED_ON_VALID_SEQUENCE(quota_manager_impl_sequence_checker_);
bool is_storage_unlimited =
quota_manager_impl_
? quota_manager_impl_->IsStorageUnlimited(storage_key, type)
: false;
auto respond =
base::BindPostTask(std::move(callback_task_runner), std::move(callback));
std::move(respond).Run(is_storage_unlimited);
}
std::unique_ptr<QuotaOverrideHandle>
QuotaManagerProxy::GetQuotaOverrideHandle() {
return std::make_unique<QuotaOverrideHandle>(this);
}
void QuotaManagerProxy::OverrideQuotaForStorageKey(
int handle_id,
const StorageKey& storage_key,
absl::optional<int64_t> quota_size,
scoped_refptr<base::SequencedTaskRunner> callback_task_runner,
base::OnceClosure callback) {
DCHECK(callback_task_runner);
DCHECK(callback);
if (!quota_manager_impl_task_runner_->RunsTasksInCurrentSequence()) {
quota_manager_impl_task_runner_->PostTask(
FROM_HERE,
base::BindOnce(&QuotaManagerProxy::OverrideQuotaForStorageKey, this,
handle_id, storage_key, quota_size,
std::move(callback_task_runner), std::move(callback)));
return;
}
DCHECK_CALLED_ON_VALID_SEQUENCE(quota_manager_impl_sequence_checker_);
if (quota_manager_impl_)
quota_manager_impl_->OverrideQuotaForStorageKey(handle_id, storage_key,
quota_size);
auto respond =
base::BindPostTask(std::move(callback_task_runner), std::move(callback));
std::move(respond).Run();
}
void QuotaManagerProxy::WithdrawOverridesForHandle(int handle_id) {
if (!quota_manager_impl_task_runner_->RunsTasksInCurrentSequence()) {
quota_manager_impl_task_runner_->PostTask(
FROM_HERE,
base::BindOnce(&QuotaManagerProxy::WithdrawOverridesForHandle, this,
handle_id));
return;
}
DCHECK_CALLED_ON_VALID_SEQUENCE(quota_manager_impl_sequence_checker_);
if (quota_manager_impl_)
quota_manager_impl_->WithdrawOverridesForHandle(handle_id);
}
void QuotaManagerProxy::GetOverrideHandleId(
scoped_refptr<base::SequencedTaskRunner> callback_task_runner,
base::OnceCallback<void(int)> callback) {
if (!quota_manager_impl_task_runner_->RunsTasksInCurrentSequence()) {
quota_manager_impl_task_runner_->PostTask(
FROM_HERE,
base::BindOnce(&QuotaManagerProxy::GetOverrideHandleId, this,
std::move(callback_task_runner), std::move(callback)));
return;
}
DCHECK_CALLED_ON_VALID_SEQUENCE(quota_manager_impl_sequence_checker_);
int handle_id =
quota_manager_impl_ ? quota_manager_impl_->GetOverrideHandleId() : 0;
auto respond =
base::BindPostTask(std::move(callback_task_runner), std::move(callback));
std::move(respond).Run(handle_id);
}
QuotaManagerProxy::~QuotaManagerProxy() = default;
void QuotaManagerProxy::InvalidateQuotaManagerImpl(
base::PassKey<QuotaManagerImpl>) {
DCHECK_CALLED_ON_VALID_SEQUENCE(quota_manager_impl_sequence_checker_);
DCHECK(quota_manager_impl_) << __func__ << " called multiple times";
quota_manager_impl_ = nullptr;
}
} // namespace storage