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