15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "chrome/browser/ui/webui/quota_internals/quota_internals_proxy.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <set>
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h"
1190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "chrome/browser/ui/webui/quota_internals/quota_internals_handler.h"
1290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "chrome/browser/ui/webui/quota_internals/quota_internals_types.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/net_util.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::BrowserThread;
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace quota_internals {
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)QuotaInternalsProxy::QuotaInternalsProxy(QuotaInternalsHandler* handler)
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : handler_(handler),
21c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      weak_factory_(this) {
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void QuotaInternalsProxy::RequestInfo(
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scoped_refptr<quota::QuotaManager> quota_manager) {
26868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  DCHECK(quota_manager.get());
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!BrowserThread::CurrentlyOn(BrowserThread::IO)) {
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    BrowserThread::PostTask(
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        BrowserThread::IO, FROM_HERE,
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::Bind(&QuotaInternalsProxy::RequestInfo, this, quota_manager));
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  quota_manager_ = quota_manager;
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  quota_manager_->GetAvailableSpace(
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&QuotaInternalsProxy::DidGetAvailableSpace,
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 weak_factory_.GetWeakPtr()));
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  quota_manager_->GetTemporaryGlobalQuota(
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&QuotaInternalsProxy::DidGetGlobalQuota,
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 weak_factory_.GetWeakPtr(), quota::kStorageTypeTemporary));
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  quota_manager_->GetGlobalUsage(
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      quota::kStorageTypeTemporary,
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&QuotaInternalsProxy::DidGetGlobalUsage,
4690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                 weak_factory_.GetWeakPtr(),
4790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                 quota::kStorageTypeTemporary));
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  quota_manager_->GetGlobalUsage(
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      quota::kStorageTypePersistent,
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&QuotaInternalsProxy::DidGetGlobalUsage,
5290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                 weak_factory_.GetWeakPtr(),
5390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                 quota::kStorageTypePersistent));
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  quota_manager_->GetGlobalUsage(
56c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      quota::kStorageTypeSyncable,
57c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      base::Bind(&QuotaInternalsProxy::DidGetGlobalUsage,
5890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                 weak_factory_.GetWeakPtr(),
5990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                 quota::kStorageTypeSyncable));
60c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  quota_manager_->DumpQuotaTable(
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&QuotaInternalsProxy::DidDumpQuotaTable,
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 weak_factory_.GetWeakPtr()));
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  quota_manager_->DumpOriginInfoTable(
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&QuotaInternalsProxy::DidDumpOriginInfoTable,
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 weak_factory_.GetWeakPtr()));
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::map<std::string, std::string> stats;
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  quota_manager_->GetStatistics(&stats);
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ReportStatistics(stats);
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)QuotaInternalsProxy::~QuotaInternalsProxy() {}
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define RELAY_TO_HANDLER(func, arg_t) \
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void QuotaInternalsProxy::func(arg_t arg) {                 \
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!handler_)                                            \
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;                                                 \
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!BrowserThread::CurrentlyOn(BrowserThread::UI)) {     \
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      BrowserThread::PostTask(                                \
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          BrowserThread::UI, FROM_HERE,                       \
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          base::Bind(&QuotaInternalsProxy::func, this, arg)); \
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;                                                 \
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }                                                         \
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                              \
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    handler_->func(arg);                                      \
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RELAY_TO_HANDLER(ReportAvailableSpace, int64)
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RELAY_TO_HANDLER(ReportGlobalInfo, const GlobalStorageInfo&)
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RELAY_TO_HANDLER(ReportPerHostInfo, const std::vector<PerHostStorageInfo>&)
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RELAY_TO_HANDLER(ReportPerOriginInfo, const std::vector<PerOriginStorageInfo>&)
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RELAY_TO_HANDLER(ReportStatistics, const Statistics&)
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#undef RELAY_TO_HANDLER
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void QuotaInternalsProxy::DidGetAvailableSpace(quota::QuotaStatusCode status,
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                               int64 space) {
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (status == quota::kQuotaStatusOk)
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ReportAvailableSpace(space);
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void QuotaInternalsProxy::DidGetGlobalQuota(quota::StorageType type,
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                            quota::QuotaStatusCode status,
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                            int64 quota) {
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (status == quota::kQuotaStatusOk) {
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GlobalStorageInfo info(type);
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    info.set_quota(quota);
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ReportGlobalInfo(info);
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void QuotaInternalsProxy::DidGetGlobalUsage(quota::StorageType type,
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                            int64 usage,
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                            int64 unlimited_usage) {
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GlobalStorageInfo info(type);
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  info.set_usage(usage);
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  info.set_unlimited_usage(unlimited_usage);
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ReportGlobalInfo(info);
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RequestPerOriginInfo(type);
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void QuotaInternalsProxy::DidDumpQuotaTable(const QuotaTableEntries& entries) {
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<PerHostStorageInfo> host_info;
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  host_info.reserve(entries.size());
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef QuotaTableEntries::const_iterator iterator;
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (iterator itr(entries.begin()); itr != entries.end(); ++itr) {
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PerHostStorageInfo info(itr->host, itr->type);
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    info.set_quota(itr->quota);
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    host_info.push_back(info);
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ReportPerHostInfo(host_info);
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void QuotaInternalsProxy::DidDumpOriginInfoTable(
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const OriginInfoTableEntries& entries) {
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<PerOriginStorageInfo> origin_info;
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  origin_info.reserve(entries.size());
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef OriginInfoTableEntries::const_iterator iterator;
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (iterator itr(entries.begin()); itr != entries.end(); ++itr) {
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PerOriginStorageInfo info(itr->origin, itr->type);
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    info.set_used_count(itr->used_count);
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    info.set_last_access_time(itr->last_access_time);
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    info.set_last_modified_time(itr->last_modified_time);
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    origin_info.push_back(info);
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ReportPerOriginInfo(origin_info);
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void QuotaInternalsProxy::DidGetHostUsage(const std::string& host,
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                          quota::StorageType type,
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                          int64 usage) {
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(type == quota::kStorageTypeTemporary ||
161c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)         type == quota::kStorageTypePersistent ||
162c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)         type == quota::kStorageTypeSyncable);
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PerHostStorageInfo info(host, type);
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  info.set_usage(usage);
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  report_pending_.push_back(info);
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  hosts_pending_.erase(make_pair(host, type));
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (report_pending_.size() >= 10 || hosts_pending_.empty()) {
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ReportPerHostInfo(report_pending_);
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    report_pending_.clear();
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!hosts_pending_.empty())
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetHostUsage(hosts_pending_.begin()->first,
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 hosts_pending_.begin()->second);
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void QuotaInternalsProxy::RequestPerOriginInfo(quota::StorageType type) {
180868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  DCHECK(quota_manager_.get());
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::set<GURL> origins;
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  quota_manager_->GetCachedOrigins(type, &origins);
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<PerOriginStorageInfo> origin_info;
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  origin_info.reserve(origins.size());
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::set<std::string> hosts;
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<PerHostStorageInfo> host_info;
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (std::set<GURL>::iterator itr(origins.begin());
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       itr != origins.end(); ++itr) {
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PerOriginStorageInfo info(*itr, type);
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    info.set_in_use(quota_manager_->IsOriginInUse(*itr));
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    origin_info.push_back(info);
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string host(net::GetHostOrSpecFromURL(*itr));
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (hosts.insert(host).second) {
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PerHostStorageInfo info(host, type);
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      host_info.push_back(info);
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      VisitHost(host, type);
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ReportPerOriginInfo(origin_info);
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ReportPerHostInfo(host_info);
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void QuotaInternalsProxy::VisitHost(const std::string& host,
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    quota::StorageType type) {
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (hosts_visited_.insert(std::make_pair(host, type)).second) {
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    hosts_pending_.insert(std::make_pair(host, type));
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (hosts_pending_.size() == 1) {
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GetHostUsage(host, type);
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void QuotaInternalsProxy::GetHostUsage(const std::string& host,
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       quota::StorageType type) {
220868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  DCHECK(quota_manager_.get());
221868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  quota_manager_->GetHostUsage(host,
222868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                               type,
223868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                               base::Bind(&QuotaInternalsProxy::DidGetHostUsage,
224868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                          weak_factory_.GetWeakPtr(),
225868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                          host,
226868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                          type));
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace quota_internals
230