1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "chrome/browser/browsing_data/browsing_data_local_storage_helper.h" 6 7 #include "base/bind.h" 8 #include "chrome/browser/browsing_data/browsing_data_helper.h" 9 #include "chrome/browser/profiles/profile.h" 10 #include "content/public/browser/browser_thread.h" 11 #include "content/public/browser/local_storage_usage_info.h" 12 #include "content/public/browser/storage_partition.h" 13 14 using content::BrowserContext; 15 using content::BrowserThread; 16 using content::DOMStorageContext; 17 18 BrowsingDataLocalStorageHelper::LocalStorageInfo::LocalStorageInfo( 19 const GURL& origin_url, int64 size, base::Time last_modified) 20 : origin_url(origin_url), size(size), last_modified(last_modified) {} 21 22 BrowsingDataLocalStorageHelper::LocalStorageInfo::~LocalStorageInfo() {} 23 24 BrowsingDataLocalStorageHelper::BrowsingDataLocalStorageHelper( 25 Profile* profile) 26 : dom_storage_context_( 27 BrowserContext::GetDefaultStoragePartition(profile)-> 28 GetDOMStorageContext()), 29 is_fetching_(false) { 30 DCHECK(dom_storage_context_); 31 } 32 33 BrowsingDataLocalStorageHelper::~BrowsingDataLocalStorageHelper() { 34 } 35 36 void BrowsingDataLocalStorageHelper::StartFetching( 37 const base::Callback<void(const std::list<LocalStorageInfo>&)>& callback) { 38 DCHECK_CURRENTLY_ON(BrowserThread::UI); 39 DCHECK(!is_fetching_); 40 DCHECK(!callback.is_null()); 41 42 is_fetching_ = true; 43 completion_callback_ = callback; 44 dom_storage_context_->GetLocalStorageUsage( 45 base::Bind( 46 &BrowsingDataLocalStorageHelper::GetUsageInfoCallback, this)); 47 } 48 49 void BrowsingDataLocalStorageHelper::DeleteOrigin(const GURL& origin) { 50 DCHECK_CURRENTLY_ON(BrowserThread::UI); 51 dom_storage_context_->DeleteLocalStorage(origin); 52 } 53 54 void BrowsingDataLocalStorageHelper::GetUsageInfoCallback( 55 const std::vector<content::LocalStorageUsageInfo>& infos) { 56 DCHECK_CURRENTLY_ON(BrowserThread::UI); 57 58 for (size_t i = 0; i < infos.size(); ++i) { 59 // Non-websafe state is not considered browsing data. 60 const content::LocalStorageUsageInfo& info = infos[i]; 61 if (BrowsingDataHelper::HasWebScheme(info.origin)) { 62 local_storage_info_.push_back( 63 LocalStorageInfo(info.origin, info.data_size, info.last_modified)); 64 } 65 } 66 67 BrowserThread::PostTask( 68 BrowserThread::UI, FROM_HERE, 69 base::Bind(&BrowsingDataLocalStorageHelper::CallCompletionCallback, 70 this)); 71 } 72 73 void BrowsingDataLocalStorageHelper::CallCompletionCallback() { 74 DCHECK(is_fetching_); 75 completion_callback_.Run(local_storage_info_); 76 completion_callback_.Reset(); 77 is_fetching_ = false; 78 } 79 80 //--------------------------------------------------------- 81 82 CannedBrowsingDataLocalStorageHelper::CannedBrowsingDataLocalStorageHelper( 83 Profile* profile) 84 : BrowsingDataLocalStorageHelper(profile) { 85 } 86 87 void CannedBrowsingDataLocalStorageHelper::AddLocalStorage( 88 const GURL& origin) { 89 if (BrowsingDataHelper::HasWebScheme(origin)) 90 pending_local_storage_info_.insert(origin); 91 } 92 93 void CannedBrowsingDataLocalStorageHelper::Reset() { 94 pending_local_storage_info_.clear(); 95 } 96 97 bool CannedBrowsingDataLocalStorageHelper::empty() const { 98 return pending_local_storage_info_.empty(); 99 } 100 101 size_t CannedBrowsingDataLocalStorageHelper::GetLocalStorageCount() const { 102 return pending_local_storage_info_.size(); 103 } 104 105 const std::set<GURL>& 106 CannedBrowsingDataLocalStorageHelper::GetLocalStorageInfo() const { 107 return pending_local_storage_info_; 108 } 109 110 void CannedBrowsingDataLocalStorageHelper::StartFetching( 111 const base::Callback<void(const std::list<LocalStorageInfo>&)>& callback) { 112 DCHECK_CURRENTLY_ON(BrowserThread::UI); 113 DCHECK(!callback.is_null()); 114 115 std::list<LocalStorageInfo> result; 116 for (std::set<GURL>::iterator iter = pending_local_storage_info_.begin(); 117 iter != pending_local_storage_info_.end(); ++iter) { 118 result.push_back( 119 LocalStorageInfo(*iter, 0, base::Time())); 120 } 121 122 BrowserThread::PostTask( 123 BrowserThread::UI, FROM_HERE, base::Bind(callback, result)); 124 } 125 126 void CannedBrowsingDataLocalStorageHelper::DeleteOrigin(const GURL& origin) { 127 pending_local_storage_info_.erase(origin); 128 BrowsingDataLocalStorageHelper::DeleteOrigin(origin); 129 } 130 131 CannedBrowsingDataLocalStorageHelper::~CannedBrowsingDataLocalStorageHelper() {} 132