Fix Win8 metro startup crash from window switcher button
[chromium-blink-merge.git] / webkit / quota / mock_quota_manager.cc
blob5d0e9babe22ec0f9391b2618368cc28cb491e858
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.
5 #include "webkit/quota/mock_quota_manager.h"
7 #include <set>
8 #include <string>
9 #include <vector>
11 #include "base/memory/ref_counted.h"
12 #include "base/memory/scoped_ptr.h"
13 #include "base/message_loop.h"
14 #include "base/single_thread_task_runner.h"
15 #include "googleurl/src/gurl.h"
17 namespace quota {
19 MockQuotaManager::OriginInfo::OriginInfo(
20 const GURL& origin,
21 StorageType type,
22 int quota_client_mask,
23 base::Time modified)
24 : origin(origin),
25 type(type),
26 quota_client_mask(quota_client_mask),
27 modified(modified) {
30 MockQuotaManager::OriginInfo::~OriginInfo() {}
32 MockQuotaManager::StorageInfo::StorageInfo() : usage(0), quota(kint64max) {}
33 MockQuotaManager::StorageInfo::~StorageInfo() {}
35 // MockQuotaManager ----------------------------------------------------------
37 MockQuotaManager::MockQuotaManager(
38 bool is_incognito,
39 const base::FilePath& profile_path,
40 base::SingleThreadTaskRunner* io_thread,
41 base::SequencedTaskRunner* db_thread,
42 SpecialStoragePolicy* special_storage_policy)
43 : QuotaManager(is_incognito, profile_path, io_thread, db_thread,
44 special_storage_policy),
45 weak_factory_(this) {
48 void MockQuotaManager::GetUsageAndQuota(
49 const GURL& origin,
50 quota::StorageType type,
51 const GetUsageAndQuotaCallback& callback) {
52 StorageInfo& info = usage_and_quota_map_[std::make_pair(origin, type)];
53 callback.Run(quota::kQuotaStatusOk, info.usage, info.quota);
56 void MockQuotaManager::SetQuota(const GURL& origin, StorageType type,
57 int64 quota) {
58 usage_and_quota_map_[std::make_pair(origin, type)].quota = quota;
61 bool MockQuotaManager::AddOrigin(
62 const GURL& origin,
63 StorageType type,
64 int quota_client_mask,
65 base::Time modified) {
66 origins_.push_back(OriginInfo(origin, type, quota_client_mask, modified));
67 return true;
70 bool MockQuotaManager::OriginHasData(
71 const GURL& origin,
72 StorageType type,
73 QuotaClient::ID quota_client) const {
74 for (std::vector<OriginInfo>::const_iterator current = origins_.begin();
75 current != origins_.end();
76 ++current) {
77 if (current->origin == origin &&
78 current->type == type &&
79 current->quota_client_mask & quota_client)
80 return true;
82 return false;
85 void MockQuotaManager::GetOriginsModifiedSince(
86 StorageType type,
87 base::Time modified_since,
88 const GetOriginsCallback& callback) {
89 std::set<GURL>* origins_to_return = new std::set<GURL>();
90 for (std::vector<OriginInfo>::const_iterator current = origins_.begin();
91 current != origins_.end();
92 ++current) {
93 if (current->type == type && current->modified >= modified_since)
94 origins_to_return->insert(current->origin);
97 base::MessageLoop::current()->PostTask(
98 FROM_HERE,
99 base::Bind(&MockQuotaManager::DidGetModifiedSince,
100 weak_factory_.GetWeakPtr(),
101 callback,
102 base::Owned(origins_to_return),
103 type));
106 void MockQuotaManager::DeleteOriginData(
107 const GURL& origin,
108 StorageType type,
109 int quota_client_mask,
110 const StatusCallback& callback) {
111 for (std::vector<OriginInfo>::iterator current = origins_.begin();
112 current != origins_.end();
113 ++current) {
114 if (current->origin == origin && current->type == type) {
115 // Modify the mask: if it's 0 after "deletion", remove the origin.
116 current->quota_client_mask &= ~quota_client_mask;
117 if (current->quota_client_mask == 0)
118 origins_.erase(current);
119 break;
123 base::MessageLoop::current()->PostTask(
124 FROM_HERE,
125 base::Bind(&MockQuotaManager::DidDeleteOriginData,
126 weak_factory_.GetWeakPtr(),
127 callback,
128 kQuotaStatusOk));
131 MockQuotaManager::~MockQuotaManager() {}
133 void MockQuotaManager::UpdateUsage(
134 const GURL& origin, StorageType type, int64 delta) {
135 usage_and_quota_map_[std::make_pair(origin, type)].usage += delta;
138 void MockQuotaManager::DidGetModifiedSince(
139 const GetOriginsCallback& callback,
140 std::set<GURL>* origins,
141 StorageType storage_type) {
142 callback.Run(*origins, storage_type);
145 void MockQuotaManager::DidDeleteOriginData(
146 const StatusCallback& callback,
147 QuotaStatusCode status) {
148 callback.Run(status);
151 // MockQuotaManagerProxy -----------------------------------------------------
153 MockQuotaManagerProxy::MockQuotaManagerProxy(
154 MockQuotaManager* quota_manager,
155 base::SingleThreadTaskRunner* task_runner)
156 : QuotaManagerProxy(quota_manager, task_runner),
157 storage_accessed_count_(0),
158 storage_modified_count_(0),
159 last_notified_type_(kStorageTypeUnknown),
160 last_notified_delta_(0),
161 registered_client_(NULL) {}
163 void MockQuotaManagerProxy::RegisterClient(QuotaClient* client) {
164 DCHECK(!registered_client_);
165 registered_client_ = client;
168 void MockQuotaManagerProxy::SimulateQuotaManagerDestroyed() {
169 if (registered_client_) {
170 // We cannot call this in the destructor as the client (indirectly)
171 // holds a refptr of the proxy.
172 registered_client_->OnQuotaManagerDestroyed();
173 registered_client_ = NULL;
177 void MockQuotaManagerProxy::NotifyStorageAccessed(
178 QuotaClient::ID client_id, const GURL& origin, StorageType type) {
179 ++storage_accessed_count_;
180 last_notified_origin_ = origin;
181 last_notified_type_ = type;
184 void MockQuotaManagerProxy::NotifyStorageModified(
185 QuotaClient::ID client_id, const GURL& origin,
186 StorageType type, int64 delta) {
187 ++storage_modified_count_;
188 last_notified_origin_ = origin;
189 last_notified_type_ = type;
190 last_notified_delta_ = delta;
191 if (mock_manager())
192 mock_manager()->UpdateUsage(origin, type, delta);
195 MockQuotaManagerProxy::~MockQuotaManagerProxy() {
196 DCHECK(!registered_client_);
199 } // namespace quota