Index: webkit/quota/quota_manager.cc |
diff --git a/webkit/quota/quota_manager.cc b/webkit/quota/quota_manager.cc |
index 60d7c323c682683a8c2b5fb6e90c7854c5c33eb2..e6c4de89646a2a3e5a7a98db79f87bd975415706 100644 |
--- a/webkit/quota/quota_manager.cc |
+++ b/webkit/quota/quota_manager.cc |
@@ -290,6 +290,71 @@ class QuotaManager::UsageAndQuotaDispatcherTask : public QuotaTask { |
DISALLOW_COPY_AND_ASSIGN(UsageAndQuotaDispatcherTask); |
}; |
+class QuotaManager::GetUsageTask : public QuotaTask { |
+ private: |
+ typedef QuotaManager::GetUsageTask self_type; |
+ |
+ public: |
+ GetUsageTask( |
+ QuotaManager* manager, |
+ GetUsageCallback* callback) |
+ : QuotaTask(manager), |
+ callback_(callback), |
+ callback_factory_(ALLOW_THIS_IN_INITIALIZER_LIST(this)) { |
+ } |
+ protected: |
+ virtual void Run() OVERRIDE { |
+ remaining_trackers_ = 2; |
+ // This will populate cached hosts and usage info. |
+ manager()->temporary_usage_tracker_->GetGlobalUsage( |
+ callback_factory_.NewCallback(&GetUsageTask::DidGetGlobalUsage)); |
+ manager()->persistent_usage_tracker_->GetGlobalUsage( |
+ callback_factory_.NewCallback(&GetUsageTask::DidGetGlobalUsage)); |
+ } |
+ |
+ virtual void Completed() OVERRIDE { |
+ } |
+ |
+ virtual void Aborted() OVERRIDE { |
+ callback_->Run(UsageInfoEntries()); |
+ DeleteSoon(); |
+ } |
+ |
+ private: |
+ void AddEntries(StorageType type, UsageTracker* tracker) { |
+ std::map<std::string, int64> host_usage; |
+ tracker->GetCachedHostsUsage(&host_usage); |
+ for (std::map<std::string, int64>::const_iterator iter = host_usage.begin(); |
+ iter != host_usage.end(); |
+ ++iter) { |
+ entries_.push_back(UsageInfo(iter->first, type, iter->second)); |
+ } |
+ if (--remaining_trackers_ == 0) { |
+ callback_->Run(entries_); |
+ DeleteSoon(); |
+ } |
+ } |
+ |
+ void DidGetGlobalUsage(StorageType type, int64, int64) { |
+ if (type == kStorageTypeTemporary) { |
+ AddEntries(type, manager()->temporary_usage_tracker_.get()); |
+ } else if (type == kStorageTypePersistent) { |
+ AddEntries(type, manager()->persistent_usage_tracker_.get()); |
kinuko
2011/10/03 07:49:20
You can use manager()->GetUsageTracker(type) here
mnaganov (inactive)
2011/10/04 03:00:40
Neat! Thanks.
|
+ } |
+ } |
+ |
+ QuotaManager* manager() const { |
+ return static_cast<QuotaManager*>(observer()); |
+ } |
+ |
+ scoped_ptr<GetUsageCallback> callback_; |
+ UsageInfoEntries entries_; |
+ base::ScopedCallbackFactory<GetUsageTask> callback_factory_; |
+ int remaining_trackers_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(GetUsageTask); |
+}; |
+ |
class QuotaManager::UsageAndQuotaDispatcherTaskForTemporary |
: public QuotaManager::UsageAndQuotaDispatcherTask { |
public: |
@@ -964,6 +1029,12 @@ QuotaManager::~QuotaManager() { |
db_thread_->DeleteSoon(FROM_HERE, database_.release()); |
} |
+void QuotaManager::GetUsage(GetUsageCallback* callback) { |
+ LazyInitialize(); |
+ GetUsageTask* get_usage = new GetUsageTask(this, callback); |
+ get_usage->Start(); |
+} |
+ |
void QuotaManager::GetUsageAndQuota( |
const GURL& origin, StorageType type, |
GetUsageAndQuotaCallback* callback_ptr) { |