blob: f5bbe4a044345e273135a4f46c9883ed9345ed82 [file] [log] [blame]
// Copyright 2012 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "content/browser/indexed_db/indexed_db_quota_client.h"
#include <stdint.h>
#include <utility>
#include <vector>
#include "base/bind.h"
#include "base/check.h"
#include "base/sequence_checker.h"
#include "base/task/sequenced_task_runner.h"
#include "base/threading/sequenced_task_runner_handle.h"
#include "components/services/storage/public/cpp/buckets/bucket_locator.h"
#include "content/browser/indexed_db/indexed_db_context_impl.h"
#include "storage/browser/database/database_util.h"
#include "third_party/blink/public/common/storage_key/storage_key.h"
#include "third_party/blink/public/mojom/quota/quota_types.mojom-shared.h"
#include "third_party/blink/public/mojom/quota/quota_types.mojom.h"
#include "url/origin.h"
using ::blink::StorageKey;
using ::blink::mojom::StorageType;
using ::storage::DatabaseUtil;
using ::storage::mojom::QuotaClient;
namespace content {
IndexedDBQuotaClient::IndexedDBQuotaClient(
IndexedDBContextImpl& indexed_db_context)
: indexed_db_context_(indexed_db_context) {
DETACH_FROM_SEQUENCE(sequence_checker_);
}
IndexedDBQuotaClient::~IndexedDBQuotaClient() {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
}
void IndexedDBQuotaClient::GetBucketUsage(const storage::BucketLocator& bucket,
GetBucketUsageCallback callback) {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
DCHECK_EQ(bucket.type, StorageType::kTemporary);
// Skip non-default buckets until Storage Buckets are supported for IndexedDB.
if (!bucket.is_default) {
std::move(callback).Run(0);
return;
}
std::move(callback).Run(indexed_db_context_.GetBucketDiskUsage(bucket));
}
void IndexedDBQuotaClient::GetStorageKeysForType(
StorageType type,
GetStorageKeysForTypeCallback callback) {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
DCHECK_EQ(type, StorageType::kTemporary);
const auto& bucket_locators = indexed_db_context_.GetAllBuckets();
std::vector<StorageKey> storage_keys;
for (const auto& bucket_locator : bucket_locators)
storage_keys.push_back(bucket_locator.storage_key);
std::move(callback).Run(std::move(storage_keys));
}
void IndexedDBQuotaClient::DeleteBucketData(
const storage::BucketLocator& bucket,
DeleteBucketDataCallback callback) {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
DCHECK_EQ(bucket.type, StorageType::kTemporary);
DCHECK(!callback.is_null());
// Skip non-default buckets until Storage Buckets are supported for IndexedDB.
if (!bucket.is_default) {
std::move(callback).Run(blink::mojom::QuotaStatusCode::kOk);
return;
}
indexed_db_context_.DeleteBucketData(
bucket,
base::BindOnce(
[](DeleteBucketDataCallback callback, bool success) {
blink::mojom::QuotaStatusCode status =
success ? blink::mojom::QuotaStatusCode::kOk
: blink::mojom::QuotaStatusCode::kUnknown;
std::move(callback).Run(status);
},
std::move(callback)));
}
void IndexedDBQuotaClient::PerformStorageCleanup(
blink::mojom::StorageType type,
PerformStorageCleanupCallback callback) {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
DCHECK_EQ(type, StorageType::kTemporary);
std::move(callback).Run();
}
} // namespace content