| // Copyright 2016 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 "chrome/browser/storage/storage_info_fetcher.h" | 
 |  | 
 | #include "chrome/browser/profiles/profile.h" | 
 | #include "content/public/browser/browser_context.h" | 
 | #include "content/public/browser/browser_thread.h" | 
 | #include "content/public/browser/storage_partition.h" | 
 | #include "storage/browser/quota/quota_manager.h" | 
 |  | 
 | using content::BrowserContext; | 
 | using content::BrowserThread; | 
 |  | 
 | StorageInfoFetcher::StorageInfoFetcher(Profile* profile) { | 
 |   quota_manager_ = content::BrowserContext::GetDefaultStoragePartition( | 
 |       profile)->GetQuotaManager(); | 
 | } | 
 |  | 
 | StorageInfoFetcher::~StorageInfoFetcher() { | 
 | } | 
 |  | 
 | void StorageInfoFetcher::FetchStorageInfo(const FetchCallback& fetch_callback) { | 
 |   // Balanced in OnFetchCompleted. | 
 |   AddRef(); | 
 |  | 
 |   fetch_callback_ = fetch_callback; | 
 |  | 
 |   // QuotaManager must be called on IO thread, but the callback must then be | 
 |   // called on the UI thread. | 
 |   BrowserThread::PostTask( | 
 |       BrowserThread::IO, FROM_HERE, | 
 |       base::Bind(&StorageInfoFetcher::GetUsageInfo, this, | 
 |           base::Bind(&StorageInfoFetcher::OnGetUsageInfoInternal, this))); | 
 | } | 
 |  | 
 | void StorageInfoFetcher::ClearStorage( | 
 |     const std::string& host, | 
 |     storage::StorageType type, | 
 |     const ClearCallback& clear_callback) { | 
 |   // Balanced in OnUsageCleared. | 
 |   AddRef(); | 
 |  | 
 |   clear_callback_ = clear_callback; | 
 |   type_to_delete_ = type; | 
 |  | 
 |   BrowserThread::PostTask( | 
 |       BrowserThread::IO, FROM_HERE, | 
 |       base::Bind(&storage::QuotaManager::DeleteHostData, | 
 |                  quota_manager_, | 
 |                  host, | 
 |                  type, | 
 |                  storage::QuotaClient::kAllClientsMask, | 
 |                  base::Bind(&StorageInfoFetcher::OnUsageClearedInternal, | 
 |                             this))); | 
 | } | 
 |  | 
 | void StorageInfoFetcher::GetUsageInfo( | 
 |     const storage::GetUsageInfoCallback& callback) { | 
 |   DCHECK_CURRENTLY_ON(content::BrowserThread::IO); | 
 |   quota_manager_->GetUsageInfo(callback); | 
 | } | 
 |  | 
 | void StorageInfoFetcher::OnGetUsageInfoInternal( | 
 |     const storage::UsageInfoEntries& entries) { | 
 |   DCHECK_CURRENTLY_ON(content::BrowserThread::IO); | 
 |  | 
 |   entries_.insert(entries_.begin(), entries.begin(), entries.end()); | 
 |   BrowserThread::PostTask( | 
 |       BrowserThread::UI, FROM_HERE, | 
 |       base::Bind(&StorageInfoFetcher::OnFetchCompleted, this)); | 
 | } | 
 |  | 
 | void StorageInfoFetcher::OnFetchCompleted() { | 
 |   DCHECK_CURRENTLY_ON(content::BrowserThread::UI); | 
 |  | 
 |   fetch_callback_.Run(entries_); | 
 |  | 
 |   Release(); | 
 | } | 
 |  | 
 | void StorageInfoFetcher::OnUsageClearedInternal(blink::QuotaStatusCode code) { | 
 |   DCHECK_CURRENTLY_ON(content::BrowserThread::IO); | 
 |  | 
 |   quota_manager_->ResetUsageTracker(type_to_delete_); | 
 |  | 
 |   BrowserThread::PostTask( | 
 |       BrowserThread::UI, FROM_HERE, | 
 |       base::Bind(&StorageInfoFetcher::OnClearCompleted, this, code)); | 
 | } | 
 |  | 
 | void StorageInfoFetcher::OnClearCompleted(blink::QuotaStatusCode code) { | 
 |   DCHECK_CURRENTLY_ON(content::BrowserThread::UI); | 
 |  | 
 |   clear_callback_.Run(code); | 
 |  | 
 |   Release(); | 
 | } |