| // 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::GetUsageAndQuotaCallback& callback, | 
 |     QuotaStatusCode status, | 
 |     int64_t usage, | 
 |     int64_t quota) { | 
 |   if (!original_task_runner->RunsTasksOnCurrentThread()) { | 
 |     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 GetUsageAndQuotaCallback& 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 |