blob: fbd46c59d95ddc3273763098a8a0fc2b795b687e [file] [log] [blame]
// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "content/browser/service_worker/service_worker_quota_client.h"
#include "base/bind.h"
#include "content/browser/service_worker/service_worker_context_wrapper.h"
#include "content/public/browser/browser_thread.h"
#include "content/public/browser/storage_usage_info.h"
using blink::mojom::StorageType;
using storage::QuotaClient;
namespace content {
namespace {
void ReportOrigins(QuotaClient::GetOriginsCallback callback,
bool restrict_on_host,
const std::string host,
const std::vector<StorageUsageInfo>& usage_info) {
std::set<url::Origin> origins;
for (const StorageUsageInfo& info : usage_info) {
if (restrict_on_host && info.origin.host() != host) {
continue;
}
origins.insert(info.origin);
}
std::move(callback).Run(origins);
}
void ReportToQuotaStatus(QuotaClient::DeletionCallback callback, bool status) {
std::move(callback).Run(status ? blink::mojom::QuotaStatusCode::kOk
: blink::mojom::QuotaStatusCode::kUnknown);
}
void FindUsageForOrigin(QuotaClient::GetUsageCallback callback,
const GURL& origin,
const std::vector<StorageUsageInfo>& usage_info) {
for (const auto& info : usage_info) {
if (info.origin.GetURL() == origin) {
std::move(callback).Run(info.total_size_bytes);
return;
}
}
std::move(callback).Run(0);
}
} // namespace
ServiceWorkerQuotaClient::ServiceWorkerQuotaClient(
ServiceWorkerContextWrapper* context)
: context_(context) {
}
ServiceWorkerQuotaClient::~ServiceWorkerQuotaClient() {
}
QuotaClient::ID ServiceWorkerQuotaClient::id() const {
return QuotaClient::kServiceWorker;
}
void ServiceWorkerQuotaClient::OnQuotaManagerDestroyed() {
delete this;
}
void ServiceWorkerQuotaClient::GetOriginUsage(const url::Origin& origin,
StorageType type,
GetUsageCallback callback) {
if (type != StorageType::kTemporary) {
std::move(callback).Run(0);
return;
}
context_->GetAllOriginsInfo(base::BindOnce(
&FindUsageForOrigin, std::move(callback), origin.GetURL()));
}
void ServiceWorkerQuotaClient::GetOriginsForType(StorageType type,
GetOriginsCallback callback) {
if (type != StorageType::kTemporary) {
std::move(callback).Run(std::set<url::Origin>());
return;
}
context_->GetAllOriginsInfo(
base::BindOnce(&ReportOrigins, std::move(callback), false, ""));
}
void ServiceWorkerQuotaClient::GetOriginsForHost(StorageType type,
const std::string& host,
GetOriginsCallback callback) {
if (type != StorageType::kTemporary) {
std::move(callback).Run(std::set<url::Origin>());
return;
}
context_->GetAllOriginsInfo(
base::BindOnce(&ReportOrigins, std::move(callback), true, host));
}
void ServiceWorkerQuotaClient::DeleteOriginData(const url::Origin& origin,
StorageType type,
DeletionCallback callback) {
if (type != StorageType::kTemporary) {
std::move(callback).Run(blink::mojom::QuotaStatusCode::kOk);
return;
}
context_->DeleteForOrigin(
origin.GetURL(),
base::BindOnce(&ReportToQuotaStatus, std::move(callback)));
}
void ServiceWorkerQuotaClient::PerformStorageCleanup(
blink::mojom::StorageType type,
base::OnceClosure callback) {
if (type != StorageType::kTemporary) {
std::move(callback).Run();
return;
}
context_->PerformStorageCleanup(std::move(callback));
}
bool ServiceWorkerQuotaClient::DoesSupport(StorageType type) const {
return type == StorageType::kTemporary;
}
} // namespace content