summaryrefslogtreecommitdiffstats
path: root/chrome/browser/storage/storage_info_fetcher.cc
blob: e7ae2b620b5d88ec6c5abbae723c9f6f61da9019 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
// 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"

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(storage::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(storage::QuotaStatusCode code) {
  DCHECK_CURRENTLY_ON(content::BrowserThread::UI);

  clear_callback_.Run(code);

  Release();
}