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 14using content::BrowserContext; 15using content::BrowserThread; 16using content::DOMStorageContext; 17 18BrowsingDataLocalStorageHelper::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 22BrowsingDataLocalStorageHelper::LocalStorageInfo::~LocalStorageInfo() {} 23 24BrowsingDataLocalStorageHelper::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 33BrowsingDataLocalStorageHelper::~BrowsingDataLocalStorageHelper() { 34} 35 36void 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 49void BrowsingDataLocalStorageHelper::DeleteOrigin(const GURL& origin) { 50 DCHECK_CURRENTLY_ON(BrowserThread::UI); 51 dom_storage_context_->DeleteLocalStorage(origin); 52} 53 54void 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 73void 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 82CannedBrowsingDataLocalStorageHelper::CannedBrowsingDataLocalStorageHelper( 83 Profile* profile) 84 : BrowsingDataLocalStorageHelper(profile) { 85} 86 87void CannedBrowsingDataLocalStorageHelper::AddLocalStorage( 88 const GURL& origin) { 89 if (BrowsingDataHelper::HasWebScheme(origin)) 90 pending_local_storage_info_.insert(origin); 91} 92 93void CannedBrowsingDataLocalStorageHelper::Reset() { 94 pending_local_storage_info_.clear(); 95} 96 97bool CannedBrowsingDataLocalStorageHelper::empty() const { 98 return pending_local_storage_info_.empty(); 99} 100 101size_t CannedBrowsingDataLocalStorageHelper::GetLocalStorageCount() const { 102 return pending_local_storage_info_.size(); 103} 104 105const std::set<GURL>& 106CannedBrowsingDataLocalStorageHelper::GetLocalStorageInfo() const { 107 return pending_local_storage_info_; 108} 109 110void 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 126void CannedBrowsingDataLocalStorageHelper::DeleteOrigin(const GURL& origin) { 127 pending_local_storage_info_.erase(origin); 128 BrowsingDataLocalStorageHelper::DeleteOrigin(origin); 129} 130 131CannedBrowsingDataLocalStorageHelper::~CannedBrowsingDataLocalStorageHelper() {} 132