blob: 6f8b15f2adfe1631ee0df6f9bbf03c3d68d53cd1 [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 "storage/browser/quota/quota_manager_proxy.h"
#include <stdint.h>
#include "base/bind.h"
#include "base/bind_helpers.h"
#include "base/sequenced_task_runner.h"
#include "base/single_thread_task_runner.h"
#include "base/strings/string_number_conversions.h"
#include "base/task_runner_util.h"
#include "base/trace_event/trace_event.h"
namespace storage {
namespace {
void DidGetUsageAndQuota(
base::SequencedTaskRunner* original_task_runner,
const QuotaManagerProxy::UsageAndQuotaCallback& callback,
QuotaStatusCode status,
int64_t usage,
int64_t quota) {
if (!original_task_runner->RunsTasksInCurrentSequence()) {
original_task_runner->PostTask(
FROM_HERE, base::Bind(&DidGetUsageAndQuota,
base::RetainedRef(original_task_runner), callback,
status, usage, quota));
return;
}
// crbug.com/349708
TRACE_EVENT0("io", "QuotaManagerProxy DidGetUsageAndQuota");
callback.Run(status, usage, quota);
}
} // namespace
void QuotaManagerProxy::RegisterClient(QuotaClient* client) {
if (!io_thread_->BelongsToCurrentThread() &&
io_thread_->PostTask(
FROM_HERE,
base::Bind(&QuotaManagerProxy::RegisterClient, this, client))) {
return;
}
if (manager_)
manager_->RegisterClient(client);
else
client->OnQuotaManagerDestroyed();
}
void QuotaManagerProxy::NotifyStorageAccessed(
QuotaClient::ID client_id,
const GURL& origin,
StorageType type) {
if (!io_thread_->BelongsToCurrentThread()) {
io_thread_->PostTask(
FROM_HERE,
base::Bind(&QuotaManagerProxy::NotifyStorageAccessed, this, client_id,
origin, type));
return;
}
if (manager_)
manager_->NotifyStorageAccessed(client_id, origin, type);
}
void QuotaManagerProxy::NotifyStorageModified(QuotaClient::ID client_id,
const GURL& origin,
StorageType type,
int64_t delta) {
if (!io_thread_->BelongsToCurrentThread()) {
io_thread_->PostTask(
FROM_HERE,
base::Bind(&QuotaManagerProxy::NotifyStorageModified, this, client_id,
origin, type, delta));
return;
}
if (manager_)
manager_->NotifyStorageModified(client_id, origin, type, delta);
}
void QuotaManagerProxy::NotifyOriginInUse(
const GURL& origin) {
if (!io_thread_->BelongsToCurrentThread()) {
io_thread_->PostTask(
FROM_HERE,
base::Bind(&QuotaManagerProxy::NotifyOriginInUse, this, origin));
return;
}
if (manager_)
manager_->NotifyOriginInUse(origin);
}
void QuotaManagerProxy::NotifyOriginNoLongerInUse(
const GURL& origin) {
if (!io_thread_->BelongsToCurrentThread()) {
io_thread_->PostTask(
FROM_HERE,
base::Bind(&QuotaManagerProxy::NotifyOriginNoLongerInUse, this,
origin));
return;
}
if (manager_)
manager_->NotifyOriginNoLongerInUse(origin);
}
void QuotaManagerProxy::SetUsageCacheEnabled(QuotaClient::ID client_id,
const GURL& origin,
StorageType type,
bool enabled) {
if (!io_thread_->BelongsToCurrentThread()) {
io_thread_->PostTask(
FROM_HERE,
base::Bind(&QuotaManagerProxy::SetUsageCacheEnabled, this,
client_id, origin, type, enabled));
return;
}
if (manager_)
manager_->SetUsageCacheEnabled(client_id, origin, type, enabled);
}
void QuotaManagerProxy::GetUsageAndQuota(
base::SequencedTaskRunner* original_task_runner,
const GURL& origin,
StorageType type,
const UsageAndQuotaCallback& callback) {
if (!io_thread_->BelongsToCurrentThread()) {
io_thread_->PostTask(
FROM_HERE, base::Bind(&QuotaManagerProxy::GetUsageAndQuota, this,
base::RetainedRef(original_task_runner), origin,
type, callback));
return;
}
if (!manager_) {
DidGetUsageAndQuota(original_task_runner, callback, kQuotaErrorAbort, 0, 0);
return;
}
// crbug.com/349708
TRACE_EVENT0("io", "QuotaManagerProxy::GetUsageAndQuota");
manager_->GetUsageAndQuota(
origin, type,
base::Bind(&DidGetUsageAndQuota, base::RetainedRef(original_task_runner),
callback));
}
QuotaManager* QuotaManagerProxy::quota_manager() const {
DCHECK(!io_thread_.get() || io_thread_->BelongsToCurrentThread());
return manager_;
}
QuotaManagerProxy::QuotaManagerProxy(
QuotaManager* manager,
const scoped_refptr<base::SingleThreadTaskRunner>& io_thread)
: manager_(manager), io_thread_(io_thread) {
}
QuotaManagerProxy::~QuotaManagerProxy() {
}
} // namespace storage