|  | // 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, | 
|  | blink::mojom::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(storage::GetUsageInfoCallback callback) { | 
|  | DCHECK_CURRENTLY_ON(content::BrowserThread::IO); | 
|  | quota_manager_->GetUsageInfo(std::move(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::mojom::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::mojom::QuotaStatusCode code) { | 
|  | DCHECK_CURRENTLY_ON(content::BrowserThread::UI); | 
|  |  | 
|  | clear_callback_.Run(code); | 
|  |  | 
|  | Release(); | 
|  | } |