Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(162)

Side by Side Diff: webkit/quota/quota_manager.cc

Issue 8070001: Use base::Callback in Quota related code. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: choke lint Created 9 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "webkit/quota/quota_manager.h" 5 #include "webkit/quota/quota_manager.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <deque> 8 #include <deque>
9 #include <set> 9 #include <set>
10 10
11 #include "base/bind.h" 11 #include "base/bind.h"
12 #include "base/callback.h" 12 #include "base/callback.h"
13 #include "base/command_line.h" 13 #include "base/command_line.h"
14 #include "base/file_path.h" 14 #include "base/file_path.h"
15 #include "base/memory/ref_counted.h" 15 #include "base/memory/ref_counted.h"
16 #include "base/message_loop_proxy.h" 16 #include "base/message_loop_proxy.h"
17 #include "base/metrics/histogram.h" 17 #include "base/metrics/histogram.h"
18 #include "base/stl_util.h"
19 #include "base/string_number_conversions.h" 18 #include "base/string_number_conversions.h"
20 #include "base/sys_info.h" 19 #include "base/sys_info.h"
21 #include "base/time.h" 20 #include "base/time.h"
22 #include "net/base/net_util.h" 21 #include "net/base/net_util.h"
23 #include "webkit/quota/quota_database.h" 22 #include "webkit/quota/quota_database.h"
24 #include "webkit/quota/quota_temporary_storage_evictor.h" 23 #include "webkit/quota/quota_temporary_storage_evictor.h"
25 #include "webkit/quota/quota_types.h" 24 #include "webkit/quota/quota_types.h"
26 #include "webkit/quota/usage_tracker.h" 25 #include "webkit/quota/usage_tracker.h"
27 26
28 #define UMA_HISTOGRAM_MBYTES(name, sample) \ 27 #define UMA_HISTOGRAM_MBYTES(name, sample) \
29 UMA_HISTOGRAM_CUSTOM_COUNTS( \ 28 UMA_HISTOGRAM_CUSTOM_COUNTS( \
30 (name), static_cast<int>((sample) / kMBytes), \ 29 (name), static_cast<int>((sample) / kMBytes), \
31 1, 10 * 1024 * 1024 /* 10TB */, 100) 30 1, 10 * 1024 * 1024 /* 10TB */, 100)
32 31
33 using base::ScopedCallbackFactory;
34
35 namespace quota { 32 namespace quota {
36 33
37 namespace { 34 namespace {
38 35
39 const char kEnableQuotaEviction[] = "enable-quota-eviction"; 36 const char kEnableQuotaEviction[] = "enable-quota-eviction";
40 const int64 kMBytes = 1024 * 1024; 37 const int64 kMBytes = 1024 * 1024;
41 const int kMinutesInMilliSeconds = 60 * 1000; 38 const int kMinutesInMilliSeconds = 60 * 1000;
42 39
43 // Returns the initial size of the temporary storage quota. 40 // Returns the initial size of the temporary storage quota.
44 // (This just gives a default initial size; once its initial size is determined 41 // (This just gives a default initial size; once its initial size is determined
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
107 30 * kMinutesInMilliSeconds; 104 30 * kMinutesInMilliSeconds;
108 105
109 const base::TimeDelta QuotaManager::kReportHistogramInterval = 106 const base::TimeDelta QuotaManager::kReportHistogramInterval =
110 base::TimeDelta::FromMilliseconds(60 * 60 * 1000); // 1 hour 107 base::TimeDelta::FromMilliseconds(60 * 60 * 1000); // 1 hour
111 108
112 // This class is for posting GetUsage/GetQuota tasks, gathering 109 // This class is for posting GetUsage/GetQuota tasks, gathering
113 // results and dispatching GetAndQuota callbacks. 110 // results and dispatching GetAndQuota callbacks.
114 // This class is self-destructed. 111 // This class is self-destructed.
115 class QuotaManager::UsageAndQuotaDispatcherTask : public QuotaTask { 112 class QuotaManager::UsageAndQuotaDispatcherTask : public QuotaTask {
116 public: 113 public:
117 typedef std::deque<GetUsageAndQuotaCallback*> CallbackList; 114 typedef std::deque<GetUsageAndQuotaCallback> CallbackList;
118 115
119 static UsageAndQuotaDispatcherTask* Create( 116 static UsageAndQuotaDispatcherTask* Create(
120 QuotaManager* manager, const std::string& host, StorageType type); 117 QuotaManager* manager, const std::string& host, StorageType type);
121 118
122 // Returns true if it is the first call for this task; which means 119 // Returns true if it is the first call for this task; which means
123 // the caller needs to call Start(). 120 // the caller needs to call Start().
124 bool AddCallback(GetUsageAndQuotaCallback* callback, bool unlimited) { 121 bool AddCallback(GetUsageAndQuotaCallback callback, bool unlimited) {
125 if (unlimited) 122 if (unlimited)
126 unlimited_callbacks_.push_back(callback); 123 unlimited_callbacks_.push_back(callback);
127 else 124 else
128 callbacks_.push_back(callback); 125 callbacks_.push_back(callback);
129 return (callbacks_.size() + unlimited_callbacks_.size() == 1); 126 return (callbacks_.size() + unlimited_callbacks_.size() == 1);
130 } 127 }
131 128
132 void DidGetGlobalUsage(StorageType type, int64 usage, 129 void DidGetGlobalUsage(StorageType type, int64 usage,
133 int64 unlimited_usage) { 130 int64 unlimited_usage) {
134 DCHECK_EQ(type_, type); 131 DCHECK_EQ(type_, type);
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
174 StorageType type) 171 StorageType type)
175 : QuotaTask(manager), 172 : QuotaTask(manager),
176 host_(host), 173 host_(host),
177 type_(type), 174 type_(type),
178 quota_(-1), 175 quota_(-1),
179 global_usage_(-1), 176 global_usage_(-1),
180 global_unlimited_usage_(-1), 177 global_unlimited_usage_(-1),
181 host_usage_(-1), 178 host_usage_(-1),
182 quota_status_(kQuotaStatusUnknown), 179 quota_status_(kQuotaStatusUnknown),
183 waiting_callbacks_(1), 180 waiting_callbacks_(1),
184 callback_factory_(ALLOW_THIS_IN_INITIALIZER_LIST(this)) {} 181 weak_factory_(ALLOW_THIS_IN_INITIALIZER_LIST(this)) {}
185 182
186 virtual ~UsageAndQuotaDispatcherTask() { 183 virtual ~UsageAndQuotaDispatcherTask() {}
187 STLDeleteContainerPointers(callbacks_.begin(), callbacks_.end());
188 STLDeleteContainerPointers(unlimited_callbacks_.begin(),
189 unlimited_callbacks_.end());
190 }
191 184
192 // Subclasses must implement them. 185 // Subclasses must implement them.
193 virtual void RunBody() = 0; 186 virtual void RunBody() = 0;
194 virtual void DispatchCallbacks() = 0; 187 virtual void DispatchCallbacks() = 0;
195 188
196 virtual void Run() OVERRIDE { 189 virtual void Run() OVERRIDE {
197 RunBody(); 190 RunBody();
198 // We initialize waiting_callbacks to 1 so that we won't run 191 // We initialize waiting_callbacks to 1 so that we won't run
199 // the completion callback until here even some of the callbacks 192 // the completion callback until here even some of the callbacks
200 // are dispatched synchronously. 193 // are dispatched synchronously.
201 CheckCompleted(); 194 CheckCompleted();
202 } 195 }
203 196
204 virtual void Aborted() OVERRIDE { 197 virtual void Aborted() OVERRIDE {
205 CallCallbacksAndClear(&callbacks_, kQuotaErrorAbort, 0, 0); 198 CallCallbacksAndClear(&callbacks_, kQuotaErrorAbort, 0, 0);
206 CallCallbacksAndClear(&unlimited_callbacks_, kQuotaErrorAbort, 0, 0); 199 CallCallbacksAndClear(&unlimited_callbacks_, kQuotaErrorAbort, 0, 0);
207 DeleteSoon(); 200 DeleteSoon();
208 } 201 }
209 202
210 virtual void Completed() OVERRIDE { 203 virtual void Completed() OVERRIDE {
211 DeleteSoon(); 204 DeleteSoon();
212 } 205 }
213 206
214 void CallCallbacksAndClear( 207 void CallCallbacksAndClear(
215 CallbackList* callbacks, QuotaStatusCode status, 208 CallbackList* callbacks, QuotaStatusCode status,
216 int64 usage, int64 quota) { 209 int64 usage, int64 quota) {
217 for (CallbackList::iterator iter = callbacks->begin(); 210 for (CallbackList::iterator iter = callbacks->begin();
218 iter != callbacks->end(); ++iter) { 211 iter != callbacks->end(); ++iter) {
219 (*iter)->Run(status, usage, quota); 212 iter->Run(status, usage, quota);
220 delete *iter;
221 } 213 }
222 callbacks->clear(); 214 callbacks->clear();
223 } 215 }
224 216
225 QuotaManager* manager() const { 217 QuotaManager* manager() const {
226 return static_cast<QuotaManager*>(observer()); 218 return static_cast<QuotaManager*>(observer());
227 } 219 }
228 220
229 std::string host() const { return host_; } 221 std::string host() const { return host_; }
230 StorageType type() const { return type_; } 222 StorageType type() const { return type_; }
231 int64 quota() const { return quota_; } 223 int64 quota() const { return quota_; }
232 int64 global_usage() const { return global_usage_; } 224 int64 global_usage() const { return global_usage_; }
233 int64 global_unlimited_usage() const { return global_unlimited_usage_; } 225 int64 global_unlimited_usage() const { return global_unlimited_usage_; }
234 int64 host_usage() const { return host_usage_; } 226 int64 host_usage() const { return host_usage_; }
235 QuotaStatusCode quota_status() const { return quota_status_; } 227 QuotaStatusCode quota_status() const { return quota_status_; }
236 CallbackList& callbacks() { return callbacks_; } 228 CallbackList& callbacks() { return callbacks_; }
237 CallbackList& unlimited_callbacks() { return unlimited_callbacks_; } 229 CallbackList& unlimited_callbacks() { return unlimited_callbacks_; }
238 230
239 // Subclasses must call following methods to create a new 'waitable' 231 // Subclasses must call following methods to create a new 'waitable'
240 // callback, which decrements waiting_callbacks when it is called. 232 // callback, which decrements waiting_callbacks when it is called.
241 GlobalUsageCallback* NewWaitableGlobalUsageCallback() { 233 GlobalUsageCallback NewWaitableGlobalUsageCallback() {
242 ++waiting_callbacks_; 234 ++waiting_callbacks_;
243 return callback_factory_.NewCallback( 235 return base::Bind(&UsageAndQuotaDispatcherTask::DidGetGlobalUsage,
244 &UsageAndQuotaDispatcherTask::DidGetGlobalUsage); 236 weak_factory_.GetWeakPtr());
245 } 237 }
246 HostUsageCallback* NewWaitableHostUsageCallback() { 238 HostUsageCallback NewWaitableHostUsageCallback() {
247 ++waiting_callbacks_; 239 ++waiting_callbacks_;
248 return callback_factory_.NewCallback( 240 return base::Bind(&UsageAndQuotaDispatcherTask::DidGetHostUsage,
249 &UsageAndQuotaDispatcherTask::DidGetHostUsage); 241 weak_factory_.GetWeakPtr());
250 } 242 }
251 QuotaCallback* NewWaitableGlobalQuotaCallback() { 243 QuotaCallback NewWaitableGlobalQuotaCallback() {
252 ++waiting_callbacks_; 244 ++waiting_callbacks_;
253 return callback_factory_.NewCallback( 245 return base::Bind(&UsageAndQuotaDispatcherTask::DidGetGlobalQuota,
254 &UsageAndQuotaDispatcherTask::DidGetGlobalQuota); 246 weak_factory_.GetWeakPtr());
255 } 247 }
256 HostQuotaCallback* NewWaitableHostQuotaCallback() { 248 HostQuotaCallback NewWaitableHostQuotaCallback() {
257 ++waiting_callbacks_; 249 ++waiting_callbacks_;
258 return callback_factory_.NewCallback( 250 return base::Bind(&UsageAndQuotaDispatcherTask::DidGetHostQuota,
259 &UsageAndQuotaDispatcherTask::DidGetHostQuota); 251 weak_factory_.GetWeakPtr());
260 } 252 }
261 253
262 private: 254 private:
263 void CheckCompleted() { 255 void CheckCompleted() {
264 if (--waiting_callbacks_ <= 0) { 256 if (--waiting_callbacks_ <= 0) {
265 DispatchCallbacks(); 257 DispatchCallbacks();
266 DCHECK(callbacks_.empty()); 258 DCHECK(callbacks_.empty());
267 DCHECK(unlimited_callbacks_.empty()); 259 DCHECK(unlimited_callbacks_.empty());
268 260
269 UsageAndQuotaDispatcherTaskMap& dispatcher_map = 261 UsageAndQuotaDispatcherTaskMap& dispatcher_map =
270 manager()->usage_and_quota_dispatchers_; 262 manager()->usage_and_quota_dispatchers_;
271 DCHECK(dispatcher_map.find(std::make_pair(host_, type_)) != 263 DCHECK(dispatcher_map.find(std::make_pair(host_, type_)) !=
272 dispatcher_map.end()); 264 dispatcher_map.end());
273 dispatcher_map.erase(std::make_pair(host_, type_)); 265 dispatcher_map.erase(std::make_pair(host_, type_));
274 CallCompleted(); 266 CallCompleted();
275 } 267 }
276 } 268 }
277 269
278 const std::string host_; 270 const std::string host_;
279 const StorageType type_; 271 const StorageType type_;
280 int64 quota_; 272 int64 quota_;
281 int64 global_usage_; 273 int64 global_usage_;
282 int64 global_unlimited_usage_; 274 int64 global_unlimited_usage_;
283 int64 host_usage_; 275 int64 host_usage_;
284 QuotaStatusCode quota_status_; 276 QuotaStatusCode quota_status_;
285 CallbackList callbacks_; 277 CallbackList callbacks_;
286 CallbackList unlimited_callbacks_; 278 CallbackList unlimited_callbacks_;
287 int waiting_callbacks_; 279 int waiting_callbacks_;
288 ScopedCallbackFactory<UsageAndQuotaDispatcherTask> callback_factory_; 280 base::WeakPtrFactory<UsageAndQuotaDispatcherTask> weak_factory_;
289 281
290 DISALLOW_COPY_AND_ASSIGN(UsageAndQuotaDispatcherTask); 282 DISALLOW_COPY_AND_ASSIGN(UsageAndQuotaDispatcherTask);
291 }; 283 };
292 284
293 class QuotaManager::UsageAndQuotaDispatcherTaskForTemporary 285 class QuotaManager::UsageAndQuotaDispatcherTaskForTemporary
294 : public QuotaManager::UsageAndQuotaDispatcherTask { 286 : public QuotaManager::UsageAndQuotaDispatcherTask {
295 public: 287 public:
296 UsageAndQuotaDispatcherTaskForTemporary( 288 UsageAndQuotaDispatcherTaskForTemporary(
297 QuotaManager* manager, const std::string& host) 289 QuotaManager* manager, const std::string& host)
298 : UsageAndQuotaDispatcherTask(manager, host, kStorageTypeTemporary) {} 290 : UsageAndQuotaDispatcherTask(manager, host, kStorageTypeTemporary) {}
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after
372 NOTREACHED(); 364 NOTREACHED();
373 } 365 }
374 return NULL; 366 return NULL;
375 } 367 }
376 368
377 class QuotaManager::OriginDataDeleter : public QuotaTask { 369 class QuotaManager::OriginDataDeleter : public QuotaTask {
378 public: 370 public:
379 OriginDataDeleter(QuotaManager* manager, 371 OriginDataDeleter(QuotaManager* manager,
380 const GURL& origin, 372 const GURL& origin,
381 StorageType type, 373 StorageType type,
382 StatusCallback* callback) 374 StatusCallback callback)
383 : QuotaTask(manager), 375 : QuotaTask(manager),
384 origin_(origin), 376 origin_(origin),
385 type_(type), 377 type_(type),
386 error_count_(0), 378 error_count_(0),
387 remaining_clients_(-1), 379 remaining_clients_(-1),
388 callback_(callback), 380 callback_(callback),
389 callback_factory_(ALLOW_THIS_IN_INITIALIZER_LIST(this)) {} 381 weak_factory_(ALLOW_THIS_IN_INITIALIZER_LIST(this)) {}
390 382
391 protected: 383 protected:
392 virtual void Run() OVERRIDE { 384 virtual void Run() OVERRIDE {
393 error_count_ = 0; 385 error_count_ = 0;
394 remaining_clients_ = manager()->clients_.size(); 386 remaining_clients_ = manager()->clients_.size();
395 for (QuotaClientList::iterator iter = manager()->clients_.begin(); 387 for (QuotaClientList::iterator iter = manager()->clients_.begin();
396 iter != manager()->clients_.end(); ++iter) { 388 iter != manager()->clients_.end(); ++iter) {
397 (*iter)->DeleteOriginData(origin_, type_, callback_factory_.NewCallback( 389 (*iter)->DeleteOriginData(
398 &OriginDataDeleter::DidDeleteOriginData)); 390 origin_, type_,
391 base::Bind(&OriginDataDeleter::DidDeleteOriginData,
392 weak_factory_.GetWeakPtr()));
399 } 393 }
400 } 394 }
401 395
402 virtual void Completed() OVERRIDE { 396 virtual void Completed() OVERRIDE {
403 if (error_count_ == 0) { 397 if (error_count_ == 0) {
404 manager()->DeleteOriginFromDatabase(origin_, type_); 398 manager()->DeleteOriginFromDatabase(origin_, type_);
405 callback_->Run(kQuotaStatusOk); 399 callback_.Run(kQuotaStatusOk);
406 } else { 400 } else {
407 callback_->Run(kQuotaErrorInvalidModification); 401 callback_.Run(kQuotaErrorInvalidModification);
408 } 402 }
409 DeleteSoon(); 403 DeleteSoon();
410 } 404 }
411 405
412 virtual void Aborted() OVERRIDE { 406 virtual void Aborted() OVERRIDE {
413 callback_->Run(kQuotaErrorAbort); 407 callback_.Run(kQuotaErrorAbort);
414 DeleteSoon(); 408 DeleteSoon();
415 } 409 }
416 410
417 void DidDeleteOriginData(QuotaStatusCode status) { 411 void DidDeleteOriginData(QuotaStatusCode status) {
418 DCHECK_GT(remaining_clients_, 0); 412 DCHECK_GT(remaining_clients_, 0);
419 413
420 if (status != kQuotaStatusOk) 414 if (status != kQuotaStatusOk)
421 ++error_count_; 415 ++error_count_;
422 416
423 if (--remaining_clients_ == 0) 417 if (--remaining_clients_ == 0)
424 CallCompleted(); 418 CallCompleted();
425 } 419 }
426 420
427 QuotaManager* manager() const { 421 QuotaManager* manager() const {
428 return static_cast<QuotaManager*>(observer()); 422 return static_cast<QuotaManager*>(observer());
429 } 423 }
430 424
431 GURL origin_; 425 GURL origin_;
432 StorageType type_; 426 StorageType type_;
433 int error_count_; 427 int error_count_;
434 int remaining_clients_; 428 int remaining_clients_;
435 scoped_ptr<StatusCallback> callback_; 429 StatusCallback callback_;
436 430
437 ScopedCallbackFactory<OriginDataDeleter> callback_factory_; 431 base::WeakPtrFactory<OriginDataDeleter> weak_factory_;
438 DISALLOW_COPY_AND_ASSIGN(OriginDataDeleter); 432 DISALLOW_COPY_AND_ASSIGN(OriginDataDeleter);
439 }; 433 };
440 434
441 class QuotaManager::DatabaseTaskBase : public QuotaThreadTask { 435 class QuotaManager::DatabaseTaskBase : public QuotaThreadTask {
442 public: 436 public:
443 explicit DatabaseTaskBase(QuotaManager* manager) 437 explicit DatabaseTaskBase(QuotaManager* manager)
444 : QuotaThreadTask(manager, manager->db_thread_), 438 : QuotaThreadTask(manager, manager->db_thread_),
445 manager_(manager), 439 manager_(manager),
446 database_(manager->database_.get()), 440 database_(manager->database_.get()),
447 db_disabled_(false) { 441 db_disabled_(false) {
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after
519 bool need_initialize_origins_; 513 bool need_initialize_origins_;
520 int64 temporary_storage_quota_; 514 int64 temporary_storage_quota_;
521 }; 515 };
522 516
523 class QuotaManager::UpdateTemporaryGlobalQuotaTask 517 class QuotaManager::UpdateTemporaryGlobalQuotaTask
524 : public QuotaManager::DatabaseTaskBase { 518 : public QuotaManager::DatabaseTaskBase {
525 public: 519 public:
526 UpdateTemporaryGlobalQuotaTask( 520 UpdateTemporaryGlobalQuotaTask(
527 QuotaManager* manager, 521 QuotaManager* manager,
528 int64 new_quota, 522 int64 new_quota,
529 QuotaCallback* callback) 523 QuotaCallback callback)
530 : DatabaseTaskBase(manager), 524 : DatabaseTaskBase(manager),
531 new_quota_(new_quota), 525 new_quota_(new_quota),
532 callback_(callback) { 526 callback_(callback) {
533 DCHECK_GE(new_quota, 0); 527 DCHECK_GE(new_quota, 0);
534 } 528 }
535 529
536 protected: 530 protected:
537 virtual void RunOnTargetThread() OVERRIDE { 531 virtual void RunOnTargetThread() OVERRIDE {
538 if (!database()->SetGlobalQuota(kStorageTypeTemporary, new_quota_)) { 532 if (!database()->SetGlobalQuota(kStorageTypeTemporary, new_quota_)) {
539 set_db_disabled(true); 533 set_db_disabled(true);
540 new_quota_ = 0; 534 new_quota_ = 0;
541 } 535 }
542 } 536 }
543 537
544 virtual void DatabaseTaskCompleted() OVERRIDE { 538 virtual void DatabaseTaskCompleted() OVERRIDE {
545 callback_->Run(db_disabled() ? kQuotaErrorInvalidAccess : kQuotaStatusOk, 539 callback_.Run(db_disabled() ? kQuotaErrorInvalidAccess : kQuotaStatusOk,
546 kStorageTypeTemporary, new_quota_); 540 kStorageTypeTemporary, new_quota_);
547 if (!db_disabled()) { 541 if (!db_disabled()) {
548 manager()->temporary_global_quota_ = new_quota_; 542 manager()->temporary_global_quota_ = new_quota_;
549 } 543 }
550 } 544 }
551 545
552 private: 546 private:
553 int64 new_quota_; 547 int64 new_quota_;
554 scoped_ptr<QuotaCallback> callback_; 548 QuotaCallback callback_;
555 }; 549 };
556 550
557 class QuotaManager::GetPersistentHostQuotaTask 551 class QuotaManager::GetPersistentHostQuotaTask
558 : public QuotaManager::DatabaseTaskBase { 552 : public QuotaManager::DatabaseTaskBase {
559 public: 553 public:
560 GetPersistentHostQuotaTask( 554 GetPersistentHostQuotaTask(
561 QuotaManager* manager, 555 QuotaManager* manager,
562 const std::string& host, 556 const std::string& host,
563 HostQuotaCallback* callback) 557 HostQuotaCallback callback)
564 : DatabaseTaskBase(manager), 558 : DatabaseTaskBase(manager),
565 host_(host), 559 host_(host),
566 quota_(-1), 560 quota_(-1),
567 callback_(callback) { 561 callback_(callback) {
568 } 562 }
569 protected: 563 protected:
570 virtual void RunOnTargetThread() OVERRIDE { 564 virtual void RunOnTargetThread() OVERRIDE {
571 if (!database()->GetHostQuota(host_, kStorageTypePersistent, &quota_)) 565 if (!database()->GetHostQuota(host_, kStorageTypePersistent, &quota_))
572 quota_ = 0; 566 quota_ = 0;
573 } 567 }
574 virtual void DatabaseTaskCompleted() OVERRIDE { 568 virtual void DatabaseTaskCompleted() OVERRIDE {
575 callback_->Run(kQuotaStatusOk, 569 callback_.Run(kQuotaStatusOk,
576 host_, kStorageTypePersistent, quota_); 570 host_, kStorageTypePersistent, quota_);
577 } 571 }
578 private: 572 private:
579 std::string host_; 573 std::string host_;
580 int64 quota_; 574 int64 quota_;
581 scoped_ptr<HostQuotaCallback> callback_; 575 HostQuotaCallback callback_;
582 }; 576 };
583 577
584 class QuotaManager::UpdatePersistentHostQuotaTask 578 class QuotaManager::UpdatePersistentHostQuotaTask
585 : public QuotaManager::DatabaseTaskBase { 579 : public QuotaManager::DatabaseTaskBase {
586 public: 580 public:
587 UpdatePersistentHostQuotaTask( 581 UpdatePersistentHostQuotaTask(
588 QuotaManager* manager, 582 QuotaManager* manager,
589 const std::string& host, 583 const std::string& host,
590 int new_quota, 584 int new_quota,
591 HostQuotaCallback* callback) 585 HostQuotaCallback callback)
592 : DatabaseTaskBase(manager), 586 : DatabaseTaskBase(manager),
593 host_(host), 587 host_(host),
594 new_quota_(new_quota), 588 new_quota_(new_quota),
595 callback_(callback) { 589 callback_(callback) {
596 DCHECK_GE(new_quota_, 0); 590 DCHECK_GE(new_quota_, 0);
597 } 591 }
598 protected: 592 protected:
599 virtual void RunOnTargetThread() OVERRIDE { 593 virtual void RunOnTargetThread() OVERRIDE {
600 if (!database()->SetHostQuota(host_, kStorageTypePersistent, new_quota_)) { 594 if (!database()->SetHostQuota(host_, kStorageTypePersistent, new_quota_)) {
601 set_db_disabled(true); 595 set_db_disabled(true);
602 new_quota_ = 0; 596 new_quota_ = 0;
603 } 597 }
604 } 598 }
605 599
606 virtual void DatabaseTaskCompleted() OVERRIDE { 600 virtual void DatabaseTaskCompleted() OVERRIDE {
607 callback_->Run(db_disabled() ? kQuotaErrorInvalidAccess : kQuotaStatusOk, 601 callback_.Run(db_disabled() ? kQuotaErrorInvalidAccess : kQuotaStatusOk,
608 host_, kStorageTypePersistent, new_quota_); 602 host_, kStorageTypePersistent, new_quota_);
609 } 603 }
610 604
611 virtual void Aborted() OVERRIDE { 605 virtual void Aborted() OVERRIDE {
612 callback_.reset(); 606 callback_.Reset();
613 } 607 }
614 608
615 private: 609 private:
616 std::string host_; 610 std::string host_;
617 int64 new_quota_; 611 int64 new_quota_;
618 scoped_ptr<HostQuotaCallback> callback_; 612 HostQuotaCallback callback_;
619 }; 613 };
620 614
621 class QuotaManager::GetLRUOriginTask 615 class QuotaManager::GetLRUOriginTask
622 : public QuotaManager::DatabaseTaskBase { 616 : public QuotaManager::DatabaseTaskBase {
623 public: 617 public:
624 GetLRUOriginTask( 618 GetLRUOriginTask(
625 QuotaManager* manager, 619 QuotaManager* manager,
626 StorageType type, 620 StorageType type,
627 const std::map<GURL, int>& origins_in_use, 621 const std::map<GURL, int>& origins_in_use,
628 const std::map<GURL, int>& origins_in_error, 622 const std::map<GURL, int>& origins_in_error,
629 GetLRUOriginCallback *callback) 623 GetLRUOriginCallback callback)
630 : DatabaseTaskBase(manager), 624 : DatabaseTaskBase(manager),
631 type_(type), 625 type_(type),
632 callback_(callback), 626 callback_(callback),
633 special_storage_policy_(manager->special_storage_policy_) { 627 special_storage_policy_(manager->special_storage_policy_) {
634 for (std::map<GURL, int>::const_iterator p = origins_in_use.begin(); 628 for (std::map<GURL, int>::const_iterator p = origins_in_use.begin();
635 p != origins_in_use.end(); 629 p != origins_in_use.end();
636 ++p) { 630 ++p) {
637 if (p->second > 0) 631 if (p->second > 0)
638 exceptions_.insert(p->first); 632 exceptions_.insert(p->first);
639 } 633 }
640 for (std::map<GURL, int>::const_iterator p = origins_in_error.begin(); 634 for (std::map<GURL, int>::const_iterator p = origins_in_error.begin();
641 p != origins_in_error.end(); 635 p != origins_in_error.end();
642 ++p) { 636 ++p) {
643 if (p->second > QuotaManager::kThresholdOfErrorsToBeBlacklisted) 637 if (p->second > QuotaManager::kThresholdOfErrorsToBeBlacklisted)
644 exceptions_.insert(p->first); 638 exceptions_.insert(p->first);
645 } 639 }
646 } 640 }
647 641
648 protected: 642 protected:
649 virtual void RunOnTargetThread() OVERRIDE { 643 virtual void RunOnTargetThread() OVERRIDE {
650 if (!database()->GetLRUOrigin(type_, exceptions_, 644 if (!database()->GetLRUOrigin(type_, exceptions_,
651 special_storage_policy_, &url_)) 645 special_storage_policy_, &url_))
652 set_db_disabled(true); 646 set_db_disabled(true);
653 } 647 }
654 648
655 virtual void DatabaseTaskCompleted() OVERRIDE { 649 virtual void DatabaseTaskCompleted() OVERRIDE {
656 callback_->Run(url_); 650 callback_.Run(url_);
657 } 651 }
658 652
659 virtual void Aborted() OVERRIDE { 653 virtual void Aborted() OVERRIDE {
660 callback_.reset(); 654 callback_.Reset();
661 } 655 }
662 656
663 private: 657 private:
664 StorageType type_; 658 StorageType type_;
665 std::set<GURL> exceptions_; 659 std::set<GURL> exceptions_;
666 scoped_ptr<GetLRUOriginCallback> callback_; 660 GetLRUOriginCallback callback_;
667 scoped_refptr<SpecialStoragePolicy> special_storage_policy_; 661 scoped_refptr<SpecialStoragePolicy> special_storage_policy_;
668 GURL url_; 662 GURL url_;
669 }; 663 };
670 664
671 class QuotaManager::DeleteOriginInfo 665 class QuotaManager::DeleteOriginInfo
672 : public QuotaManager::DatabaseTaskBase { 666 : public QuotaManager::DatabaseTaskBase {
673 public: 667 public:
674 DeleteOriginInfo( 668 DeleteOriginInfo(
675 QuotaManager* manager, 669 QuotaManager* manager,
676 const GURL& origin, 670 const GURL& origin,
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
726 std::set<GURL> origins_; 720 std::set<GURL> origins_;
727 bool has_registered_origins_; 721 bool has_registered_origins_;
728 }; 722 };
729 723
730 class QuotaManager::AvailableSpaceQueryTask : public QuotaThreadTask { 724 class QuotaManager::AvailableSpaceQueryTask : public QuotaThreadTask {
731 public: 725 public:
732 AvailableSpaceQueryTask( 726 AvailableSpaceQueryTask(
733 QuotaManager* manager, 727 QuotaManager* manager,
734 scoped_refptr<base::MessageLoopProxy> db_message_loop, 728 scoped_refptr<base::MessageLoopProxy> db_message_loop,
735 const FilePath& profile_path, 729 const FilePath& profile_path,
736 AvailableSpaceCallback* callback) 730 AvailableSpaceCallback callback)
737 : QuotaThreadTask(manager, db_message_loop), 731 : QuotaThreadTask(manager, db_message_loop),
738 profile_path_(profile_path), 732 profile_path_(profile_path),
739 space_(-1), 733 space_(-1),
740 callback_(callback) {} 734 callback_(callback) {}
741 virtual ~AvailableSpaceQueryTask() {} 735 virtual ~AvailableSpaceQueryTask() {}
742 736
743 protected: 737 protected:
744 virtual void RunOnTargetThread() OVERRIDE { 738 virtual void RunOnTargetThread() OVERRIDE {
745 space_ = base::SysInfo::AmountOfFreeDiskSpace(profile_path_); 739 space_ = base::SysInfo::AmountOfFreeDiskSpace(profile_path_);
746 } 740 }
747 741
748 virtual void Aborted() OVERRIDE { 742 virtual void Aborted() OVERRIDE {
749 callback_->Run(kQuotaErrorAbort, -1); 743 callback_.Run(kQuotaErrorAbort, -1);
750 } 744 }
751 745
752 virtual void Completed() OVERRIDE { 746 virtual void Completed() OVERRIDE {
753 callback_->Run(kQuotaStatusOk, space_); 747 callback_.Run(kQuotaStatusOk, space_);
754 } 748 }
755 749
756 private: 750 private:
757 FilePath profile_path_; 751 FilePath profile_path_;
758 int64 space_; 752 int64 space_;
759 scoped_ptr<AvailableSpaceCallback> callback_; 753 AvailableSpaceCallback callback_;
760 }; 754 };
761 755
762 class QuotaManager::UpdateAccessTimeTask 756 class QuotaManager::UpdateAccessTimeTask
763 : public QuotaManager::DatabaseTaskBase { 757 : public QuotaManager::DatabaseTaskBase {
764 public: 758 public:
765 UpdateAccessTimeTask( 759 UpdateAccessTimeTask(
766 QuotaManager* manager, 760 QuotaManager* manager,
767 const GURL& origin, 761 const GURL& origin,
768 StorageType type, 762 StorageType type,
769 base::Time accessed_time) 763 base::Time accessed_time)
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
814 base::Time modified_time_; 808 base::Time modified_time_;
815 }; 809 };
816 810
817 class QuotaManager::GetModifiedSinceTask 811 class QuotaManager::GetModifiedSinceTask
818 : public QuotaManager::DatabaseTaskBase { 812 : public QuotaManager::DatabaseTaskBase {
819 public: 813 public:
820 GetModifiedSinceTask( 814 GetModifiedSinceTask(
821 QuotaManager* manager, 815 QuotaManager* manager,
822 StorageType type, 816 StorageType type,
823 base::Time modified_since, 817 base::Time modified_since,
824 GetOriginsCallback* callback) 818 GetOriginsCallback callback)
825 : DatabaseTaskBase(manager), 819 : DatabaseTaskBase(manager),
826 type_(type), 820 type_(type),
827 modified_since_(modified_since), 821 modified_since_(modified_since),
828 callback_(callback) {} 822 callback_(callback) {}
829 823
830 protected: 824 protected:
831 virtual void RunOnTargetThread() OVERRIDE { 825 virtual void RunOnTargetThread() OVERRIDE {
832 if (!database()->GetOriginsModifiedSince( 826 if (!database()->GetOriginsModifiedSince(
833 type_, &origins_, modified_since_)) { 827 type_, &origins_, modified_since_)) {
834 set_db_disabled(true); 828 set_db_disabled(true);
835 } 829 }
836 } 830 }
837 831
838 virtual void DatabaseTaskCompleted() OVERRIDE { 832 virtual void DatabaseTaskCompleted() OVERRIDE {
839 callback_->Run(origins_, type_); 833 callback_.Run(origins_, type_);
840 } 834 }
841 835
842 virtual void Aborted() OVERRIDE { 836 virtual void Aborted() OVERRIDE {
843 callback_->Run(std::set<GURL>(), type_); 837 callback_.Run(std::set<GURL>(), type_);
844 } 838 }
845 839
846 private: 840 private:
847 StorageType type_; 841 StorageType type_;
848 base::Time modified_since_; 842 base::Time modified_since_;
849 std::set<GURL> origins_; 843 std::set<GURL> origins_;
850 scoped_ptr<GetOriginsCallback> callback_; 844 GetOriginsCallback callback_;
851 }; 845 };
852 846
853 class QuotaManager::DumpQuotaTableTask 847 class QuotaManager::DumpQuotaTableTask
854 : public QuotaManager::DatabaseTaskBase { 848 : public QuotaManager::DatabaseTaskBase {
855 private: 849 private:
856 typedef QuotaManager::DumpQuotaTableTask self_type; 850 typedef QuotaManager::DumpQuotaTableTask self_type;
857 typedef QuotaManager::DumpQuotaTableCallback Callback; 851 typedef QuotaManager::DumpQuotaTableCallback Callback;
858 typedef QuotaManager::QuotaTableEntry TableEntry; 852 typedef QuotaManager::QuotaTableEntry TableEntry;
859 typedef QuotaManager::QuotaTableEntries TableEntries; 853 typedef QuotaManager::QuotaTableEntries TableEntries;
860 typedef QuotaDatabase::QuotaTableCallback TableCallback; 854 typedef QuotaDatabase::QuotaTableCallback TableCallback;
861 855
862 public: 856 public:
863 DumpQuotaTableTask( 857 DumpQuotaTableTask(
864 QuotaManager* manager, 858 QuotaManager* manager,
865 Callback* callback) 859 Callback callback)
866 : DatabaseTaskBase(manager), 860 : DatabaseTaskBase(manager),
867 callback_(callback) { 861 callback_(callback) {
868 } 862 }
869 protected: 863 protected:
870 virtual void RunOnTargetThread() OVERRIDE { 864 virtual void RunOnTargetThread() OVERRIDE {
871 if (!database()->DumpQuotaTable( 865 if (!database()->DumpQuotaTable(
872 new TableCallback( 866 new TableCallback(
873 base::Bind(&self_type::AppendEntry, this)))) 867 base::Bind(&self_type::AppendEntry, this))))
874 set_db_disabled(true); 868 set_db_disabled(true);
875 } 869 }
876 870
877 virtual void Aborted() OVERRIDE { 871 virtual void Aborted() OVERRIDE {
878 callback_->Run(TableEntries()); 872 callback_.Run(TableEntries());
879 } 873 }
880 874
881 virtual void DatabaseTaskCompleted() OVERRIDE { 875 virtual void DatabaseTaskCompleted() OVERRIDE {
882 callback_->Run(entries_); 876 callback_.Run(entries_);
883 } 877 }
884 878
885 private: 879 private:
886 bool AppendEntry(const TableEntry& entry) { 880 bool AppendEntry(const TableEntry& entry) {
887 entries_.push_back(entry); 881 entries_.push_back(entry);
888 return true; 882 return true;
889 } 883 }
890 884
891 scoped_ptr<Callback> callback_; 885 Callback callback_;
892 TableEntries entries_; 886 TableEntries entries_;
893 }; 887 };
894 888
895 class QuotaManager::DumpOriginInfoTableTask 889 class QuotaManager::DumpOriginInfoTableTask
896 : public QuotaManager::DatabaseTaskBase { 890 : public QuotaManager::DatabaseTaskBase {
897 private: 891 private:
898 typedef QuotaManager::DumpOriginInfoTableTask self_type; 892 typedef QuotaManager::DumpOriginInfoTableTask self_type;
899 typedef QuotaManager::DumpOriginInfoTableCallback Callback; 893 typedef QuotaManager::DumpOriginInfoTableCallback Callback;
900 typedef QuotaManager::OriginInfoTableEntry TableEntry; 894 typedef QuotaManager::OriginInfoTableEntry TableEntry;
901 typedef QuotaManager::OriginInfoTableEntries TableEntries; 895 typedef QuotaManager::OriginInfoTableEntries TableEntries;
902 typedef QuotaDatabase::OriginInfoTableCallback TableCallback; 896 typedef QuotaDatabase::OriginInfoTableCallback TableCallback;
903 897
904 public: 898 public:
905 DumpOriginInfoTableTask( 899 DumpOriginInfoTableTask(
906 QuotaManager* manager, 900 QuotaManager* manager,
907 Callback* callback) 901 Callback callback)
908 : DatabaseTaskBase(manager), 902 : DatabaseTaskBase(manager),
909 callback_(callback) { 903 callback_(callback) {
910 } 904 }
911 protected: 905 protected:
912 virtual void RunOnTargetThread() OVERRIDE { 906 virtual void RunOnTargetThread() OVERRIDE {
913 if (!database()->DumpOriginInfoTable( 907 if (!database()->DumpOriginInfoTable(
914 new TableCallback( 908 new TableCallback(
915 base::Bind(&self_type::AppendEntry, this)))) 909 base::Bind(&self_type::AppendEntry, this))))
916 set_db_disabled(true); 910 set_db_disabled(true);
917 } 911 }
918 912
919 virtual void Aborted() OVERRIDE { 913 virtual void Aborted() OVERRIDE {
920 callback_->Run(TableEntries()); 914 callback_.Run(TableEntries());
921 } 915 }
922 916
923 virtual void DatabaseTaskCompleted() OVERRIDE { 917 virtual void DatabaseTaskCompleted() OVERRIDE {
924 callback_->Run(entries_); 918 callback_.Run(entries_);
925 } 919 }
926 920
927 private: 921 private:
928 bool AppendEntry(const TableEntry& entry) { 922 bool AppendEntry(const TableEntry& entry) {
929 entries_.push_back(entry); 923 entries_.push_back(entry);
930 return true; 924 return true;
931 } 925 }
932 926
933 scoped_ptr<Callback> callback_; 927 Callback callback_;
934 TableEntries entries_; 928 TableEntries entries_;
935 }; 929 };
936 930
937 // QuotaManager --------------------------------------------------------------- 931 // QuotaManager ---------------------------------------------------------------
938 932
939 QuotaManager::QuotaManager(bool is_incognito, 933 QuotaManager::QuotaManager(bool is_incognito,
940 const FilePath& profile_path, 934 const FilePath& profile_path,
941 base::MessageLoopProxy* io_thread, 935 base::MessageLoopProxy* io_thread,
942 base::MessageLoopProxy* db_thread, 936 base::MessageLoopProxy* db_thread,
943 SpecialStoragePolicy* special_storage_policy) 937 SpecialStoragePolicy* special_storage_policy)
944 : is_incognito_(is_incognito), 938 : is_incognito_(is_incognito),
945 profile_path_(profile_path), 939 profile_path_(profile_path),
946 proxy_(new QuotaManagerProxy( 940 proxy_(new QuotaManagerProxy(
947 ALLOW_THIS_IN_INITIALIZER_LIST(this), io_thread)), 941 ALLOW_THIS_IN_INITIALIZER_LIST(this), io_thread)),
948 db_disabled_(false), 942 db_disabled_(false),
949 eviction_disabled_(false), 943 eviction_disabled_(false),
950 io_thread_(io_thread), 944 io_thread_(io_thread),
951 db_thread_(db_thread), 945 db_thread_(db_thread),
952 need_initialize_origins_(false), 946 need_initialize_origins_(false),
953 temporary_global_quota_(-1), 947 temporary_global_quota_(-1),
954 special_storage_policy_(special_storage_policy), 948 special_storage_policy_(special_storage_policy),
955 callback_factory_(ALLOW_THIS_IN_INITIALIZER_LIST(this)) { 949 weak_factory_(ALLOW_THIS_IN_INITIALIZER_LIST(this)) {
956 } 950 }
957 951
958 QuotaManager::~QuotaManager() { 952 QuotaManager::~QuotaManager() {
959 DCHECK(io_thread_->BelongsToCurrentThread()); 953 DCHECK(io_thread_->BelongsToCurrentThread());
960 proxy_->manager_ = NULL; 954 proxy_->manager_ = NULL;
961 std::for_each(clients_.begin(), clients_.end(), 955 std::for_each(clients_.begin(), clients_.end(),
962 std::mem_fun(&QuotaClient::OnQuotaManagerDestroyed)); 956 std::mem_fun(&QuotaClient::OnQuotaManagerDestroyed));
963 if (database_.get()) 957 if (database_.get())
964 db_thread_->DeleteSoon(FROM_HERE, database_.release()); 958 db_thread_->DeleteSoon(FROM_HERE, database_.release());
965 } 959 }
966 960
967 void QuotaManager::GetUsageAndQuota( 961 void QuotaManager::GetUsageAndQuota(
968 const GURL& origin, StorageType type, 962 const GURL& origin, StorageType type,
969 GetUsageAndQuotaCallback* callback_ptr) { 963 GetUsageAndQuotaCallback callback) {
970 scoped_ptr<GetUsageAndQuotaCallback> callback(callback_ptr);
971 LazyInitialize(); 964 LazyInitialize();
972 965
973 if (type == kStorageTypeUnknown) { 966 if (type == kStorageTypeUnknown) {
974 // Quota only supports temporary/persistent types. 967 // Quota only supports temporary/persistent types.
975 callback->Run(kQuotaErrorNotSupported, 0, 0); 968 callback.Run(kQuotaErrorNotSupported, 0, 0);
976 return; 969 return;
977 } 970 }
978 971
979 // note: returns host usage and quota 972 // note: returns host usage and quota
980 std::string host = net::GetHostOrSpecFromURL(origin); 973 std::string host = net::GetHostOrSpecFromURL(origin);
981 UsageAndQuotaDispatcherTaskMap::iterator found = 974 UsageAndQuotaDispatcherTaskMap::iterator found =
982 usage_and_quota_dispatchers_.find(std::make_pair(host, type)); 975 usage_and_quota_dispatchers_.find(std::make_pair(host, type));
983 if (found == usage_and_quota_dispatchers_.end()) { 976 if (found == usage_and_quota_dispatchers_.end()) {
984 UsageAndQuotaDispatcherTask* dispatcher = 977 UsageAndQuotaDispatcherTask* dispatcher =
985 UsageAndQuotaDispatcherTask::Create(this, host, type); 978 UsageAndQuotaDispatcherTask::Create(this, host, type);
986 found = usage_and_quota_dispatchers_.insert( 979 found = usage_and_quota_dispatchers_.insert(
987 std::make_pair(std::make_pair(host, type), dispatcher)).first; 980 std::make_pair(std::make_pair(host, type), dispatcher)).first;
988 } 981 }
989 if (found->second->AddCallback( 982 if (found->second->AddCallback(callback, IsStorageUnlimited(origin))) {
990 callback.release(), IsStorageUnlimited(origin))) {
991 found->second->Start(); 983 found->second->Start();
992 } 984 }
993 } 985 }
994 986
995 void QuotaManager::GetAvailableSpace(AvailableSpaceCallback* callback) { 987 void QuotaManager::GetAvailableSpace(AvailableSpaceCallback callback) {
996 scoped_refptr<AvailableSpaceQueryTask> task( 988 scoped_refptr<AvailableSpaceQueryTask> task(
997 new AvailableSpaceQueryTask(this, db_thread_, profile_path_, callback)); 989 new AvailableSpaceQueryTask(this, db_thread_, profile_path_, callback));
998 task->Start(); 990 task->Start();
999 } 991 }
1000 992
1001 void QuotaManager::GetTemporaryGlobalQuota(QuotaCallback* callback) { 993 void QuotaManager::GetTemporaryGlobalQuota(QuotaCallback callback) {
1002 LazyInitialize(); 994 LazyInitialize();
1003 if (temporary_global_quota_ >= 0) { 995 if (temporary_global_quota_ >= 0) {
1004 // TODO(kinuko): We may want to adjust the quota when the current 996 // TODO(kinuko): We may want to adjust the quota when the current
1005 // available space in the hard drive is getting tight. 997 // available space in the hard drive is getting tight.
1006 callback->Run(kQuotaStatusOk, 998 callback.Run(kQuotaStatusOk,
1007 kStorageTypeTemporary, temporary_global_quota_); 999 kStorageTypeTemporary, temporary_global_quota_);
1008 delete callback;
1009 return; 1000 return;
1010 } 1001 }
1011 // They are called upon completion of InitializeTask. 1002 // They are called upon completion of InitializeTask.
1012 temporary_global_quota_callbacks_.Add(callback); 1003 temporary_global_quota_callbacks_.Add(callback);
1013 } 1004 }
1014 1005
1015 void QuotaManager::SetTemporaryGlobalQuota(int64 new_quota, 1006 void QuotaManager::SetTemporaryGlobalQuota(int64 new_quota,
1016 QuotaCallback* callback) { 1007 QuotaCallback callback) {
1017 LazyInitialize(); 1008 LazyInitialize();
1018 if (new_quota < 0) { 1009 if (new_quota < 0) {
1019 callback->Run(kQuotaErrorInvalidModification, 1010 callback.Run(kQuotaErrorInvalidModification,
1020 kStorageTypeTemporary, -1); 1011 kStorageTypeTemporary, -1);
1021 delete callback;
1022 return; 1012 return;
1023 } 1013 }
1024 1014
1025 if (!db_disabled_) { 1015 if (!db_disabled_) {
1026 scoped_refptr<UpdateTemporaryGlobalQuotaTask> task( 1016 scoped_refptr<UpdateTemporaryGlobalQuotaTask> task(
1027 new UpdateTemporaryGlobalQuotaTask(this, new_quota, callback)); 1017 new UpdateTemporaryGlobalQuotaTask(this, new_quota, callback));
1028 task->Start(); 1018 task->Start();
1029 } else { 1019 } else {
1030 callback->Run(kQuotaErrorInvalidAccess, 1020 callback.Run(kQuotaErrorInvalidAccess,
1031 kStorageTypeTemporary, -1); 1021 kStorageTypeTemporary, -1);
1032 delete callback;
1033 } 1022 }
1034 } 1023 }
1035 1024
1036 void QuotaManager::GetPersistentHostQuota(const std::string& host, 1025 void QuotaManager::GetPersistentHostQuota(const std::string& host,
1037 HostQuotaCallback* callback_ptr) { 1026 HostQuotaCallback callback) {
1038 scoped_ptr<HostQuotaCallback> callback(callback_ptr);
1039 LazyInitialize(); 1027 LazyInitialize();
1040 if (host.empty()) { 1028 if (host.empty()) {
1041 // This could happen if we are called on file:///. 1029 // This could happen if we are called on file:///.
1042 // TODO(kinuko) We may want to respect --allow-file-access-from-files 1030 // TODO(kinuko) We may want to respect --allow-file-access-from-files
1043 // command line switch. 1031 // command line switch.
1044 callback->Run(kQuotaStatusOk, host, kStorageTypePersistent, 0); 1032 callback.Run(kQuotaStatusOk, host, kStorageTypePersistent, 0);
1045 return; 1033 return;
1046 } 1034 }
1047 scoped_refptr<GetPersistentHostQuotaTask> task( 1035 scoped_refptr<GetPersistentHostQuotaTask> task(
1048 new GetPersistentHostQuotaTask(this, host, callback.release())); 1036 new GetPersistentHostQuotaTask(this, host, callback));
1049 task->Start(); 1037 task->Start();
1050 } 1038 }
1051 1039
1052 void QuotaManager::SetPersistentHostQuota(const std::string& host, 1040 void QuotaManager::SetPersistentHostQuota(const std::string& host,
1053 int64 new_quota, 1041 int64 new_quota,
1054 HostQuotaCallback* callback_ptr) { 1042 HostQuotaCallback callback) {
1055 scoped_ptr<HostQuotaCallback> callback(callback_ptr);
1056 LazyInitialize(); 1043 LazyInitialize();
1057 if (host.empty()) { 1044 if (host.empty()) {
1058 // This could happen if we are called on file:///. 1045 // This could happen if we are called on file:///.
1059 callback->Run(kQuotaErrorNotSupported, host, kStorageTypePersistent, 0); 1046 callback.Run(kQuotaErrorNotSupported, host, kStorageTypePersistent, 0);
1060 return; 1047 return;
1061 } 1048 }
1062 if (new_quota < 0) { 1049 if (new_quota < 0) {
1063 callback->Run(kQuotaErrorInvalidModification, 1050 callback.Run(kQuotaErrorInvalidModification,
1064 host, kStorageTypePersistent, -1); 1051 host, kStorageTypePersistent, -1);
1065 return; 1052 return;
1066 } 1053 }
1067 1054
1068 if (!db_disabled_) { 1055 if (!db_disabled_) {
1069 scoped_refptr<UpdatePersistentHostQuotaTask> task( 1056 scoped_refptr<UpdatePersistentHostQuotaTask> task(
1070 new UpdatePersistentHostQuotaTask( 1057 new UpdatePersistentHostQuotaTask(
1071 this, host, new_quota, callback.release())); 1058 this, host, new_quota, callback));
1072 task->Start(); 1059 task->Start();
1073 } else { 1060 } else {
1074 callback->Run(kQuotaErrorInvalidAccess, 1061 callback.Run(kQuotaErrorInvalidAccess,
1075 host, kStorageTypePersistent, -1); 1062 host, kStorageTypePersistent, -1);
1076 } 1063 }
1077 } 1064 }
1078 1065
1079 void QuotaManager::GetGlobalUsage( 1066 void QuotaManager::GetGlobalUsage(
1080 StorageType type, 1067 StorageType type,
1081 GlobalUsageCallback* callback) { 1068 GlobalUsageCallback callback) {
1082 LazyInitialize(); 1069 LazyInitialize();
1083 GetUsageTracker(type)->GetGlobalUsage(callback); 1070 GetUsageTracker(type)->GetGlobalUsage(callback);
1084 } 1071 }
1085 1072
1086 void QuotaManager::GetHostUsage(const std::string& host, StorageType type, 1073 void QuotaManager::GetHostUsage(const std::string& host, StorageType type,
1087 HostUsageCallback* callback) { 1074 HostUsageCallback callback) {
1088 LazyInitialize(); 1075 LazyInitialize();
1089 GetUsageTracker(type)->GetHostUsage(host, callback); 1076 GetUsageTracker(type)->GetHostUsage(host, callback);
1090 } 1077 }
1091 1078
1092 void QuotaManager::GetStatistics( 1079 void QuotaManager::GetStatistics(
1093 std::map<std::string, std::string>* statistics) { 1080 std::map<std::string, std::string>* statistics) {
1094 DCHECK(statistics); 1081 DCHECK(statistics);
1095 if (temporary_storage_evictor_.get()) { 1082 if (temporary_storage_evictor_.get()) {
1096 std::map<std::string, int64> stats; 1083 std::map<std::string, int64> stats;
1097 temporary_storage_evictor_->GetStatistics(&stats); 1084 temporary_storage_evictor_->GetStatistics(&stats);
1098 for (std::map<std::string, int64>::iterator p = stats.begin(); 1085 for (std::map<std::string, int64>::iterator p = stats.begin();
1099 p != stats.end(); 1086 p != stats.end();
1100 ++p) 1087 ++p)
1101 (*statistics)[p->first] = base::Int64ToString(p->second); 1088 (*statistics)[p->first] = base::Int64ToString(p->second);
1102 } 1089 }
1103 } 1090 }
1104 1091
1105 void QuotaManager::GetOriginsModifiedSince( 1092 void QuotaManager::GetOriginsModifiedSince(
1106 StorageType type, 1093 StorageType type,
1107 base::Time modified_since, 1094 base::Time modified_since,
1108 GetOriginsCallback* callback) { 1095 GetOriginsCallback callback) {
1109 LazyInitialize(); 1096 LazyInitialize();
1110 make_scoped_refptr(new GetModifiedSinceTask( 1097 make_scoped_refptr(new GetModifiedSinceTask(
1111 this, type, modified_since, callback))->Start(); 1098 this, type, modified_since, callback))->Start();
1112 } 1099 }
1113 1100
1114 void QuotaManager::LazyInitialize() { 1101 void QuotaManager::LazyInitialize() {
1115 DCHECK(io_thread_->BelongsToCurrentThread()); 1102 DCHECK(io_thread_->BelongsToCurrentThread());
1116 if (database_.get()) { 1103 if (database_.get()) {
1117 // Initialization seems to be done already. 1104 // Initialization seems to be done already.
1118 return; 1105 return;
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
1160 1147
1161 void QuotaManager::NotifyOriginNoLongerInUse(const GURL& origin) { 1148 void QuotaManager::NotifyOriginNoLongerInUse(const GURL& origin) {
1162 DCHECK(io_thread_->BelongsToCurrentThread()); 1149 DCHECK(io_thread_->BelongsToCurrentThread());
1163 DCHECK(IsOriginInUse(origin)); 1150 DCHECK(IsOriginInUse(origin));
1164 int& count = origins_in_use_[origin]; 1151 int& count = origins_in_use_[origin];
1165 if (--count == 0) 1152 if (--count == 0)
1166 origins_in_use_.erase(origin); 1153 origins_in_use_.erase(origin);
1167 } 1154 }
1168 1155
1169 void QuotaManager::DeleteOriginData( 1156 void QuotaManager::DeleteOriginData(
1170 const GURL& origin, StorageType type, StatusCallback* callback) { 1157 const GURL& origin, StorageType type, StatusCallback callback) {
1171 LazyInitialize(); 1158 LazyInitialize();
1172 1159
1173 if (origin.is_empty() || clients_.empty()) { 1160 if (origin.is_empty() || clients_.empty()) {
1174 callback->Run(kQuotaStatusOk); 1161 callback.Run(kQuotaStatusOk);
1175 delete callback;
1176 return; 1162 return;
1177 } 1163 }
1178 1164
1179 OriginDataDeleter* deleter = 1165 OriginDataDeleter* deleter =
1180 new OriginDataDeleter(this, origin, type, callback); 1166 new OriginDataDeleter(this, origin, type, callback);
1181 deleter->Start(); 1167 deleter->Start();
1182 } 1168 }
1183 1169
1184 bool QuotaManager::ResetUsageTracker(StorageType type) { 1170 bool QuotaManager::ResetUsageTracker(StorageType type) {
1185 switch (type) { 1171 switch (type) {
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
1231 default: 1217 default:
1232 NOTREACHED(); 1218 NOTREACHED();
1233 } 1219 }
1234 } 1220 }
1235 1221
1236 void QuotaManager::NotifyStorageAccessedInternal( 1222 void QuotaManager::NotifyStorageAccessedInternal(
1237 QuotaClient::ID client_id, 1223 QuotaClient::ID client_id,
1238 const GURL& origin, StorageType type, 1224 const GURL& origin, StorageType type,
1239 base::Time accessed_time) { 1225 base::Time accessed_time) {
1240 LazyInitialize(); 1226 LazyInitialize();
1241 if (type == kStorageTypeTemporary && lru_origin_callback_.get()) { 1227 if (type == kStorageTypeTemporary && !lru_origin_callback_.is_null()) {
1242 // Record the accessed origins while GetLRUOrigin task is runing 1228 // Record the accessed origins while GetLRUOrigin task is runing
1243 // to filter out them from eviction. 1229 // to filter out them from eviction.
1244 access_notified_origins_.insert(origin); 1230 access_notified_origins_.insert(origin);
1245 } 1231 }
1246 1232
1247 if (db_disabled_) 1233 if (db_disabled_)
1248 return; 1234 return;
1249 make_scoped_refptr(new UpdateAccessTimeTask( 1235 make_scoped_refptr(new UpdateAccessTimeTask(
1250 this, origin, type, accessed_time))->Start(); 1236 this, origin, type, accessed_time))->Start();
1251 } 1237 }
1252 1238
1253 void QuotaManager::NotifyStorageModifiedInternal( 1239 void QuotaManager::NotifyStorageModifiedInternal(
1254 QuotaClient::ID client_id, 1240 QuotaClient::ID client_id,
1255 const GURL& origin, 1241 const GURL& origin,
1256 StorageType type, 1242 StorageType type,
1257 int64 delta, 1243 int64 delta,
1258 base::Time modified_time) { 1244 base::Time modified_time) {
1259 LazyInitialize(); 1245 LazyInitialize();
1260 GetUsageTracker(type)->UpdateUsageCache(client_id, origin, delta); 1246 GetUsageTracker(type)->UpdateUsageCache(client_id, origin, delta);
1261 make_scoped_refptr(new UpdateModifiedTimeTask( 1247 make_scoped_refptr(new UpdateModifiedTimeTask(
1262 this, origin, type, modified_time))->Start(); 1248 this, origin, type, modified_time))->Start();
1263 } 1249 }
1264 1250
1265 void QuotaManager::DumpQuotaTable(DumpQuotaTableCallback* callback) { 1251 void QuotaManager::DumpQuotaTable(DumpQuotaTableCallback callback) {
1266 make_scoped_refptr(new DumpQuotaTableTask(this, callback))->Start(); 1252 make_scoped_refptr(new DumpQuotaTableTask(this, callback))->Start();
1267 } 1253 }
1268 1254
1269 void QuotaManager::DumpOriginInfoTable( 1255 void QuotaManager::DumpOriginInfoTable(
1270 DumpOriginInfoTableCallback* callback) { 1256 DumpOriginInfoTableCallback callback) {
1271 make_scoped_refptr(new DumpOriginInfoTableTask(this, callback))->Start(); 1257 make_scoped_refptr(new DumpOriginInfoTableTask(this, callback))->Start();
1272 } 1258 }
1273 1259
1274 1260
1275 void QuotaManager::DeleteOriginFromDatabase( 1261 void QuotaManager::DeleteOriginFromDatabase(
1276 const GURL& origin, StorageType type) { 1262 const GURL& origin, StorageType type) {
1277 LazyInitialize(); 1263 LazyInitialize();
1278 if (db_disabled_) 1264 if (db_disabled_)
1279 return; 1265 return;
1280 scoped_refptr<DeleteOriginInfo> task = 1266 scoped_refptr<DeleteOriginInfo> task =
1281 new DeleteOriginInfo(this, origin, type); 1267 new DeleteOriginInfo(this, origin, type);
1282 task->Start(); 1268 task->Start();
1283 } 1269 }
1284 1270
1285 void QuotaManager::GetLRUOrigin( 1271 void QuotaManager::GetLRUOrigin(
1286 StorageType type, 1272 StorageType type,
1287 GetLRUOriginCallback* callback) { 1273 GetLRUOriginCallback callback) {
1288 LazyInitialize(); 1274 LazyInitialize();
1289 // This must not be called while there's an in-flight task. 1275 // This must not be called while there's an in-flight task.
1290 DCHECK(!lru_origin_callback_.get()); 1276 DCHECK(lru_origin_callback_.is_null());
1291 lru_origin_callback_.reset(callback); 1277 lru_origin_callback_ = callback;
1292 if (db_disabled_) { 1278 if (db_disabled_) {
1293 lru_origin_callback_->Run(GURL()); 1279 lru_origin_callback_.Run(GURL());
1294 lru_origin_callback_.reset(); 1280 lru_origin_callback_.Reset();
1295 return; 1281 return;
1296 } 1282 }
1297 scoped_refptr<GetLRUOriginTask> task(new GetLRUOriginTask( 1283 scoped_refptr<GetLRUOriginTask> task(new GetLRUOriginTask(
1298 this, type, origins_in_use_, 1284 this, type, origins_in_use_,
1299 origins_in_error_, callback_factory_.NewCallback( 1285 origins_in_error_,
1300 &QuotaManager::DidGetDatabaseLRUOrigin))); 1286 base::Bind(&QuotaManager::DidGetDatabaseLRUOrigin,
1287 weak_factory_.GetWeakPtr())));
1301 task->Start(); 1288 task->Start();
1302 } 1289 }
1303 1290
1304 void QuotaManager::DidOriginDataEvicted( 1291 void QuotaManager::DidOriginDataEvicted(
1305 QuotaStatusCode status) { 1292 QuotaStatusCode status) {
1306 DCHECK(io_thread_->BelongsToCurrentThread()); 1293 DCHECK(io_thread_->BelongsToCurrentThread());
1307 1294
1308 // We only try evict origins that are not in use, so basically 1295 // We only try evict origins that are not in use, so basically
1309 // deletion attempt for eviction should not fail. Let's record 1296 // deletion attempt for eviction should not fail. Let's record
1310 // the origin if we get error and exclude it from future eviction 1297 // the origin if we get error and exclude it from future eviction
1311 // if the error happens consistently (> kThresholdOfErrorsToBeBlacklisted). 1298 // if the error happens consistently (> kThresholdOfErrorsToBeBlacklisted).
1312 if (status != kQuotaStatusOk) 1299 if (status != kQuotaStatusOk)
1313 origins_in_error_[eviction_context_.evicted_origin]++; 1300 origins_in_error_[eviction_context_.evicted_origin]++;
1314 1301
1315 eviction_context_.evict_origin_data_callback->Run(status); 1302 eviction_context_.evict_origin_data_callback.Run(status);
1316 eviction_context_.evict_origin_data_callback.reset(); 1303 eviction_context_.evict_origin_data_callback.Reset();
1317 } 1304 }
1318 1305
1319 void QuotaManager::EvictOriginData( 1306 void QuotaManager::EvictOriginData(
1320 const GURL& origin, 1307 const GURL& origin,
1321 StorageType type, 1308 StorageType type,
1322 EvictOriginDataCallback* callback) { 1309 EvictOriginDataCallback callback) {
1323 DCHECK(io_thread_->BelongsToCurrentThread()); 1310 DCHECK(io_thread_->BelongsToCurrentThread());
1324 DCHECK_EQ(type, kStorageTypeTemporary); 1311 DCHECK_EQ(type, kStorageTypeTemporary);
1325 1312
1326 eviction_context_.evicted_origin = origin; 1313 eviction_context_.evicted_origin = origin;
1327 eviction_context_.evicted_type = type; 1314 eviction_context_.evicted_type = type;
1328 eviction_context_.evict_origin_data_callback.reset(callback); 1315 eviction_context_.evict_origin_data_callback = callback;
1329 1316
1330 DeleteOriginData(origin, type, callback_factory_.NewCallback( 1317 DeleteOriginData(origin, type,
1331 &QuotaManager::DidOriginDataEvicted)); 1318 base::Bind(&QuotaManager::DidOriginDataEvicted,
1319 weak_factory_.GetWeakPtr()));
1332 } 1320 }
1333 1321
1334 void QuotaManager::DidGetAvailableSpaceForEviction( 1322 void QuotaManager::DidGetAvailableSpaceForEviction(
1335 QuotaStatusCode status, 1323 QuotaStatusCode status,
1336 int64 available_space) { 1324 int64 available_space) {
1337 eviction_context_.get_usage_and_quota_callback->Run(status, 1325 eviction_context_.get_usage_and_quota_callback.Run(status,
1338 eviction_context_.usage, 1326 eviction_context_.usage,
1339 eviction_context_.unlimited_usage, 1327 eviction_context_.unlimited_usage,
1340 eviction_context_.quota, available_space); 1328 eviction_context_.quota, available_space);
1341 eviction_context_.get_usage_and_quota_callback.reset(); 1329 eviction_context_.get_usage_and_quota_callback.Reset();
1342 } 1330 }
1343 1331
1344 void QuotaManager::DidGetGlobalQuotaForEviction( 1332 void QuotaManager::DidGetGlobalQuotaForEviction(
1345 QuotaStatusCode status, 1333 QuotaStatusCode status,
1346 StorageType type, 1334 StorageType type,
1347 int64 quota) { 1335 int64 quota) {
1348 DCHECK_EQ(type, kStorageTypeTemporary); 1336 DCHECK_EQ(type, kStorageTypeTemporary);
1349 if (status != kQuotaStatusOk) { 1337 if (status != kQuotaStatusOk) {
1350 eviction_context_.get_usage_and_quota_callback->Run( 1338 eviction_context_.get_usage_and_quota_callback.Run(
1351 status, 0, 0, 0, 0); 1339 status, 0, 0, 0, 0);
1352 eviction_context_.get_usage_and_quota_callback.reset(); 1340 eviction_context_.get_usage_and_quota_callback.Reset();
1353 return; 1341 return;
1354 } 1342 }
1355 1343
1356 eviction_context_.quota = quota; 1344 eviction_context_.quota = quota;
1357 GetAvailableSpace(callback_factory_. 1345 GetAvailableSpace(
1358 NewCallback(&QuotaManager::DidGetAvailableSpaceForEviction)); 1346 base::Bind(&QuotaManager::DidGetAvailableSpaceForEviction,
1347 weak_factory_.GetWeakPtr()));
1359 } 1348 }
1360 1349
1361 void QuotaManager::DidGetGlobalUsageForEviction( 1350 void QuotaManager::DidGetGlobalUsageForEviction(
1362 StorageType type, int64 usage, int64 unlimited_usage) { 1351 StorageType type, int64 usage, int64 unlimited_usage) {
1363 DCHECK_EQ(type, kStorageTypeTemporary); 1352 DCHECK_EQ(type, kStorageTypeTemporary);
1364 DCHECK_GE(usage, unlimited_usage); 1353 DCHECK_GE(usage, unlimited_usage);
1365 eviction_context_.usage = usage; 1354 eviction_context_.usage = usage;
1366 eviction_context_.unlimited_usage = unlimited_usage; 1355 eviction_context_.unlimited_usage = unlimited_usage;
1367 GetTemporaryGlobalQuota(callback_factory_. 1356 GetTemporaryGlobalQuota(
1368 NewCallback(&QuotaManager::DidGetGlobalQuotaForEviction)); 1357 base::Bind(&QuotaManager::DidGetGlobalQuotaForEviction,
1358 weak_factory_.GetWeakPtr()));
1369 } 1359 }
1370 1360
1371 void QuotaManager::GetUsageAndQuotaForEviction( 1361 void QuotaManager::GetUsageAndQuotaForEviction(
1372 GetUsageAndQuotaForEvictionCallback* callback) { 1362 GetUsageAndQuotaForEvictionCallback callback) {
1373 DCHECK(io_thread_->BelongsToCurrentThread()); 1363 DCHECK(io_thread_->BelongsToCurrentThread());
1374 DCHECK(!eviction_context_.get_usage_and_quota_callback.get()); 1364 DCHECK(eviction_context_.get_usage_and_quota_callback.is_null());
1375 1365
1376 eviction_context_.get_usage_and_quota_callback.reset(callback); 1366 eviction_context_.get_usage_and_quota_callback = callback;
1377 // TODO(dmikurube): Make kStorageTypeTemporary an argument. 1367 // TODO(dmikurube): Make kStorageTypeTemporary an argument.
1378 GetGlobalUsage(kStorageTypeTemporary, callback_factory_. 1368 GetGlobalUsage(kStorageTypeTemporary,
1379 NewCallback(&QuotaManager::DidGetGlobalUsageForEviction)); 1369 base::Bind(&QuotaManager::DidGetGlobalUsageForEviction,
1370 weak_factory_.GetWeakPtr()));
1380 } 1371 }
1381 1372
1382 void QuotaManager::StartEviction() { 1373 void QuotaManager::StartEviction() {
1383 DCHECK(!temporary_storage_evictor_.get()); 1374 DCHECK(!temporary_storage_evictor_.get());
1384 temporary_storage_evictor_.reset(new QuotaTemporaryStorageEvictor(this, 1375 temporary_storage_evictor_.reset(new QuotaTemporaryStorageEvictor(this,
1385 kEvictionIntervalInMilliSeconds)); 1376 kEvictionIntervalInMilliSeconds));
1386 temporary_storage_evictor_->Start(); 1377 temporary_storage_evictor_->Start();
1387 } 1378 }
1388 1379
1389 void QuotaManager::ReportHistogram() { 1380 void QuotaManager::ReportHistogram() {
1390 GetGlobalUsage(kStorageTypeTemporary, 1381 GetGlobalUsage(kStorageTypeTemporary,
1391 callback_factory_.NewCallback( 1382 base::Bind(
1392 &QuotaManager::DidGetTemporaryGlobalUsageForHistogram)); 1383 &QuotaManager::DidGetTemporaryGlobalUsageForHistogram,
1384 weak_factory_.GetWeakPtr()));
1393 GetGlobalUsage(kStorageTypePersistent, 1385 GetGlobalUsage(kStorageTypePersistent,
1394 callback_factory_.NewCallback( 1386 base::Bind(
1395 &QuotaManager::DidGetPersistentGlobalUsageForHistogram)); 1387 &QuotaManager::DidGetPersistentGlobalUsageForHistogram,
1388 weak_factory_.GetWeakPtr()));
1396 } 1389 }
1397 1390
1398 void QuotaManager::DidGetTemporaryGlobalUsageForHistogram( 1391 void QuotaManager::DidGetTemporaryGlobalUsageForHistogram(
1399 StorageType type, 1392 StorageType type,
1400 int64 usage, 1393 int64 usage,
1401 int64 unlimited_usage) { 1394 int64 unlimited_usage) {
1402 UMA_HISTOGRAM_MBYTES("Quota.GlobalUsageOfTemporaryStorage", usage); 1395 UMA_HISTOGRAM_MBYTES("Quota.GlobalUsageOfTemporaryStorage", usage);
1403 1396
1404 std::set<GURL> origins; 1397 std::set<GURL> origins;
1405 GetCachedOrigins(type, &origins); 1398 GetCachedOrigins(type, &origins);
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
1453 if (!need_initialize_origins_) { 1446 if (!need_initialize_origins_) {
1454 StartEviction(); 1447 StartEviction();
1455 return; 1448 return;
1456 } 1449 }
1457 1450
1458 // We seem to need to initialize the origin table in the database. 1451 // We seem to need to initialize the origin table in the database.
1459 // Kick the first GetGlobalUsage for temporary storage to cache a list 1452 // Kick the first GetGlobalUsage for temporary storage to cache a list
1460 // of origins that have data in temporary storage to register them 1453 // of origins that have data in temporary storage to register them
1461 // in the database. (We'll need the global temporary usage anyway 1454 // in the database. (We'll need the global temporary usage anyway
1462 // for eviction later.) 1455 // for eviction later.)
1463 temporary_usage_tracker_->GetGlobalUsage(callback_factory_.NewCallback( 1456 temporary_usage_tracker_->GetGlobalUsage(
1464 &QuotaManager::DidRunInitialGetTemporaryGlobalUsage)); 1457 base::Bind(&QuotaManager::DidRunInitialGetTemporaryGlobalUsage,
1458 weak_factory_.GetWeakPtr()));
1465 } 1459 }
1466 1460
1467 void QuotaManager::DidRunInitialGetTemporaryGlobalUsage( 1461 void QuotaManager::DidRunInitialGetTemporaryGlobalUsage(
1468 StorageType type, int64 usage_unused, int64 unlimited_usage_unused) { 1462 StorageType type, int64 usage_unused, int64 unlimited_usage_unused) {
1469 DCHECK_EQ(type, kStorageTypeTemporary); 1463 DCHECK_EQ(type, kStorageTypeTemporary);
1470 // This will call the StartEviction() when initial origin registration 1464 // This will call the StartEviction() when initial origin registration
1471 // is completed. 1465 // is completed.
1472 scoped_refptr<InitializeTemporaryOriginsInfoTask> task( 1466 scoped_refptr<InitializeTemporaryOriginsInfoTask> task(
1473 new InitializeTemporaryOriginsInfoTask( 1467 new InitializeTemporaryOriginsInfoTask(
1474 this, temporary_usage_tracker_.get())); 1468 this, temporary_usage_tracker_.get()));
1475 task->Start(); 1469 task->Start();
1476 } 1470 }
1477 1471
1478 void QuotaManager::DidGetDatabaseLRUOrigin(const GURL& origin) { 1472 void QuotaManager::DidGetDatabaseLRUOrigin(const GURL& origin) {
1479 // Make sure the returned origin is (still) not in the origin_in_use_ set 1473 // Make sure the returned origin is (still) not in the origin_in_use_ set
1480 // and has not been accessed since we posted the task. 1474 // and has not been accessed since we posted the task.
1481 if (origins_in_use_.find(origin) != origins_in_use_.end() || 1475 if (origins_in_use_.find(origin) != origins_in_use_.end() ||
1482 access_notified_origins_.find(origin) != access_notified_origins_.end()) 1476 access_notified_origins_.find(origin) != access_notified_origins_.end())
1483 lru_origin_callback_->Run(GURL()); 1477 lru_origin_callback_.Run(GURL());
1484 else 1478 else
1485 lru_origin_callback_->Run(origin); 1479 lru_origin_callback_.Run(origin);
1486 access_notified_origins_.clear(); 1480 access_notified_origins_.clear();
1487 lru_origin_callback_.reset(); 1481 lru_origin_callback_.Reset();
1488 } 1482 }
1489 1483
1490 void QuotaManager::DeleteOnCorrectThread() const { 1484 void QuotaManager::DeleteOnCorrectThread() const {
1491 if (!io_thread_->BelongsToCurrentThread()) { 1485 if (!io_thread_->BelongsToCurrentThread()) {
1492 io_thread_->DeleteSoon(FROM_HERE, this); 1486 io_thread_->DeleteSoon(FROM_HERE, this);
1493 return; 1487 return;
1494 } 1488 }
1495 delete this; 1489 delete this;
1496 } 1490 }
1497 1491
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after
1567 1561
1568 QuotaManagerProxy::QuotaManagerProxy( 1562 QuotaManagerProxy::QuotaManagerProxy(
1569 QuotaManager* manager, base::MessageLoopProxy* io_thread) 1563 QuotaManager* manager, base::MessageLoopProxy* io_thread)
1570 : manager_(manager), io_thread_(io_thread) { 1564 : manager_(manager), io_thread_(io_thread) {
1571 } 1565 }
1572 1566
1573 QuotaManagerProxy::~QuotaManagerProxy() { 1567 QuotaManagerProxy::~QuotaManagerProxy() {
1574 } 1568 }
1575 1569
1576 } // namespace quota 1570 } // namespace quota
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698