| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "content/browser/devtools/protocol/usage_and_quota_query.h" | 5 #include "content/browser/devtools/protocol/usage_and_quota_query.h" |
| 6 | 6 |
| 7 #include "net/base/net_util.h" | 7 #include "net/base/net_util.h" |
| 8 | 8 |
| 9 namespace content { | 9 namespace content { |
| 10 namespace devtools { | 10 namespace devtools { |
| 11 namespace page { | 11 namespace page { |
| 12 | 12 |
| 13 namespace { | |
| 14 | |
| 15 class UsageQuery : public base::RefCounted<UsageQuery> { | |
| 16 public: | |
| 17 using Callback = base::Callback<void(const std::vector<UsageItem>&)>; | |
| 18 | |
| 19 UsageQuery(scoped_refptr<storage::QuotaManager> quota_manager, | |
| 20 const std::string& host, | |
| 21 storage::StorageType storage_type, | |
| 22 const Callback& callback) | |
| 23 : quota_manager_(quota_manager), | |
| 24 host_(host), | |
| 25 storage_type_(storage_type), | |
| 26 callback_(callback) { | |
| 27 AddRef(); | |
| 28 GetForClient(storage::QuotaClient::kFileSystem, | |
| 29 usage_item::kIdFilesystem); | |
| 30 GetForClient(storage::QuotaClient::kDatabase, | |
| 31 usage_item::kIdDatabase); | |
| 32 GetForClient(storage::QuotaClient::kAppcache, | |
| 33 usage_item::kIdAppcache); | |
| 34 GetForClient(storage::QuotaClient::kIndexedDatabase, | |
| 35 usage_item::kIdIndexeddatabase); | |
| 36 Release(); | |
| 37 } | |
| 38 | |
| 39 private: | |
| 40 friend class base::RefCounted<UsageQuery>; | |
| 41 | |
| 42 ~UsageQuery() { | |
| 43 callback_.Run(usage_list_); | |
| 44 } | |
| 45 | |
| 46 void GetForClient(storage::QuotaClient::ID client_id, | |
| 47 const std::string& client_name) { | |
| 48 if (!quota_manager_->IsTrackingHostUsage(storage_type_, client_id)) | |
| 49 return; | |
| 50 quota_manager_->GetHostUsage( | |
| 51 host_, storage_type_, client_id, | |
| 52 base::Bind(&UsageQuery::DidGetForClient, this, client_name)); | |
| 53 } | |
| 54 | |
| 55 void DidGetForClient(const std::string& client_name, int64 value) { | |
| 56 UsageItem usage_item; | |
| 57 usage_item.set_id(client_name); | |
| 58 usage_item.set_value(value); | |
| 59 usage_list_.push_back(usage_item); | |
| 60 } | |
| 61 | |
| 62 scoped_refptr<storage::QuotaManager> quota_manager_; | |
| 63 std::string host_; | |
| 64 storage::StorageType storage_type_; | |
| 65 std::vector<UsageItem> usage_list_; | |
| 66 Callback callback_; | |
| 67 }; | |
| 68 | |
| 69 } // namespace | |
| 70 | |
| 71 UsageAndQuotaQuery::UsageAndQuotaQuery( | 13 UsageAndQuotaQuery::UsageAndQuotaQuery( |
| 72 scoped_refptr<storage::QuotaManager> quota_manager, | 14 scoped_refptr<storage::QuotaManager> quota_manager, |
| 73 const GURL& security_origin, | 15 const GURL& security_origin, |
| 74 const Callback& callback) | 16 const Callback& callback) |
| 75 : quota_manager_(quota_manager), | 17 : quota_manager_(quota_manager), |
| 76 security_origin_(security_origin), | 18 security_origin_(security_origin), |
| 77 callback_(callback) { | 19 callback_(callback), |
| 20 temporary_quota_(0.0), |
| 21 persistent_quota_(0.0) { |
| 78 AddRef(); | 22 AddRef(); |
| 79 quota_manager->GetUsageAndQuotaForWebApps( | 23 quota_manager->GetUsageAndQuotaForWebApps( |
| 80 security_origin, | 24 security_origin, |
| 81 storage::kStorageTypeTemporary, | 25 storage::kStorageTypeTemporary, |
| 82 base::Bind(&UsageAndQuotaQuery::DidGetTemporaryQuota, this)); | 26 base::Bind(&UsageAndQuotaQuery::DidGetTemporaryQuota, this)); |
| 83 quota_manager->GetPersistentHostQuota( | 27 quota_manager->GetPersistentHostQuota( |
| 84 net::GetHostOrSpecFromURL(security_origin), | 28 net::GetHostOrSpecFromURL(security_origin), |
| 85 base::Bind(&UsageAndQuotaQuery::DidGetPersistentQuota, this)); | 29 base::Bind(&UsageAndQuotaQuery::DidGetPersistentQuota, this)); |
| 86 GetHostUsage(storage::kStorageTypeTemporary, | 30 GetHostUsage(&temporary_usage_, storage::kStorageTypeTemporary); |
| 87 base::Bind(&Usage::set_temporary, base::Unretained(&usage_))); | 31 GetHostUsage(&persistent_usage_, storage::kStorageTypePersistent); |
| 88 GetHostUsage(storage::kStorageTypePersistent, | 32 GetHostUsage(&syncable_usage_, storage::kStorageTypeSyncable); |
| 89 base::Bind(&Usage::set_persistent, base::Unretained(&usage_))); | |
| 90 GetHostUsage(storage::kStorageTypeSyncable, | |
| 91 base::Bind(&Usage::set_syncable, base::Unretained(&usage_))); | |
| 92 Release(); | 33 Release(); |
| 93 } | 34 } |
| 94 | 35 |
| 95 UsageAndQuotaQuery::~UsageAndQuotaQuery() { | 36 UsageAndQuotaQuery::~UsageAndQuotaQuery() { |
| 96 scoped_ptr<QueryUsageAndQuotaResponse> response( | 37 callback_.Run(QueryUsageAndQuotaResponse::Create() |
| 97 new QueryUsageAndQuotaResponse); | 38 ->set_quota(Quota::Create()->set_temporary(temporary_quota_) |
| 98 response->set_quota(quota_); | 39 ->set_persistent(persistent_quota_)) |
| 99 response->set_usage(usage_); | 40 ->set_usage(Usage::Create()->set_temporary(temporary_usage_) |
| 100 callback_.Run(response.Pass()); | 41 ->set_persistent(persistent_usage_) |
| 42 ->set_syncable(syncable_usage_))); |
| 101 } | 43 } |
| 102 | 44 |
| 103 void UsageAndQuotaQuery::DidGetTemporaryQuota(storage::QuotaStatusCode status, | 45 void UsageAndQuotaQuery::DidGetTemporaryQuota(storage::QuotaStatusCode status, |
| 104 int64 used_bytes, | 46 int64 used_bytes, |
| 105 int64 quota_in_bytes) { | 47 int64 quota_in_bytes) { |
| 106 if (status == storage::kQuotaStatusOk) | 48 if (status == storage::kQuotaStatusOk) |
| 107 quota_.set_temporary(quota_in_bytes); | 49 temporary_quota_ = quota_in_bytes; |
| 108 } | 50 } |
| 109 | 51 |
| 110 void UsageAndQuotaQuery::DidGetPersistentQuota(storage::QuotaStatusCode status, | 52 void UsageAndQuotaQuery::DidGetPersistentQuota(storage::QuotaStatusCode status, |
| 111 int64 value) { | 53 int64 value) { |
| 112 if (status == storage::kQuotaStatusOk) | 54 if (status == storage::kQuotaStatusOk) |
| 113 quota_.set_persistent(value); | 55 persistent_quota_ = value; |
| 114 } | 56 } |
| 115 | 57 |
| 116 void UsageAndQuotaQuery::GetHostUsage( | 58 void UsageAndQuotaQuery::GetHostUsage(UsageItems* list, |
| 117 storage::StorageType storage_type, | 59 storage::StorageType storage_type) { |
| 118 const UsageItemsCallback& items_callback) { | 60 GetUsageForClient(list, storage_type, storage::QuotaClient::kFileSystem, |
| 119 // |base::Bind| is used instead of passing |items_callback| directly | 61 usage_item::kIdFilesystem); |
| 120 // so that |this| is retained. | 62 GetUsageForClient(list, storage_type, storage::QuotaClient::kDatabase, |
| 121 new UsageQuery(quota_manager_, | 63 usage_item::kIdDatabase); |
| 122 net::GetHostOrSpecFromURL(security_origin_), | 64 GetUsageForClient(list, storage_type, storage::QuotaClient::kAppcache, |
| 123 storage_type, | 65 usage_item::kIdAppcache); |
| 124 base::Bind(&UsageAndQuotaQuery::DidGetHostUsage, | 66 GetUsageForClient(list, storage_type, storage::QuotaClient::kIndexedDatabase, |
| 125 this, items_callback)); | 67 usage_item::kIdIndexeddatabase); |
| 126 } | 68 } |
| 127 | 69 |
| 128 void UsageAndQuotaQuery::DidGetHostUsage( | 70 void UsageAndQuotaQuery::GetUsageForClient(UsageItems* list, |
| 129 const UsageItemsCallback& items_callback, | 71 storage::StorageType storage_type, |
| 130 const std::vector<UsageItem>& usage_list) { | 72 storage::QuotaClient::ID client_id, |
| 131 items_callback.Run(usage_list); | 73 const std::string& client_name) { |
| 74 if (!quota_manager_->IsTrackingHostUsage(storage_type, client_id)) |
| 75 return; |
| 76 quota_manager_->GetHostUsage( |
| 77 net::GetHostOrSpecFromURL(security_origin_), |
| 78 storage_type, |
| 79 client_id, |
| 80 base::Bind(&UsageAndQuotaQuery::DidGetUsageForClient, |
| 81 this, list, client_name)); |
| 82 } |
| 83 |
| 84 void UsageAndQuotaQuery::DidGetUsageForClient(UsageItems* list, |
| 85 const std::string& client_name, |
| 86 int64 value) { |
| 87 list->push_back(UsageItem::Create()->set_id(client_name)->set_value(value)); |
| 132 } | 88 } |
| 133 | 89 |
| 134 } // namespace page | 90 } // namespace page |
| 135 } // namespace devtools | 91 } // namespace devtools |
| 136 } // namespace content | 92 } // namespace content |
| OLD | NEW |