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

Side by Side Diff: chrome/browser/browsing_data_remover.cc

Issue 7129018: Time-based removal of temporary file systems via BrowsingDataRemover (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Marja's feedback. Created 9 years, 5 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 "chrome/browser/browsing_data_remover.h" 5 #include "chrome/browser/browsing_data_remover.h"
6 6
7 #include <map> 7 #include <map>
8 #include <set> 8 #include <set>
9 9
10 #include "base/callback.h" 10 #include "base/callback.h"
11 #include "base/file_util.h" 11 #include "base/file_util.h"
12 #include "base/logging.h"
12 #include "base/platform_file.h" 13 #include "base/platform_file.h"
13 #include "chrome/browser/autofill/personal_data_manager.h" 14 #include "chrome/browser/autofill/personal_data_manager.h"
14 #include "chrome/browser/browser_process.h" 15 #include "chrome/browser/browser_process.h"
15 #include "chrome/browser/download/download_manager.h" 16 #include "chrome/browser/download/download_manager.h"
16 #include "chrome/browser/extensions/extension_service.h" 17 #include "chrome/browser/extensions/extension_service.h"
17 #include "chrome/browser/extensions/extension_special_storage_policy.h" 18 #include "chrome/browser/extensions/extension_special_storage_policy.h"
18 #include "chrome/browser/history/history.h" 19 #include "chrome/browser/history/history.h"
19 #include "chrome/browser/io_thread.h" 20 #include "chrome/browser/io_thread.h"
20 #include "chrome/browser/net/chrome_net_log.h" 21 #include "chrome/browser/net/chrome_net_log.h"
21 #include "chrome/browser/net/chrome_url_request_context.h" 22 #include "chrome/browser/net/chrome_url_request_context.h"
(...skipping 17 matching lines...) Expand all
39 #include "content/common/notification_source.h" 40 #include "content/common/notification_source.h"
40 #include "net/base/cookie_monster.h" 41 #include "net/base/cookie_monster.h"
41 #include "net/base/net_errors.h" 42 #include "net/base/net_errors.h"
42 #include "net/base/transport_security_state.h" 43 #include "net/base/transport_security_state.h"
43 #include "net/disk_cache/disk_cache.h" 44 #include "net/disk_cache/disk_cache.h"
44 #include "net/http/http_cache.h" 45 #include "net/http/http_cache.h"
45 #include "net/url_request/url_request_context.h" 46 #include "net/url_request/url_request_context.h"
46 #include "net/url_request/url_request_context_getter.h" 47 #include "net/url_request/url_request_context_getter.h"
47 #include "webkit/database/database_tracker.h" 48 #include "webkit/database/database_tracker.h"
48 #include "webkit/database/database_util.h" 49 #include "webkit/database/database_util.h"
49 #include "webkit/fileapi/file_system_context.h" 50 #include "webkit/quota/quota_manager.h"
50 #include "webkit/fileapi/file_system_operation_context.h" 51 #include "webkit/quota/quota_types.h"
51 #include "webkit/fileapi/sandbox_mount_point_provider.h"
52 52
53 // Done so that we can use PostTask on BrowsingDataRemovers and not have 53 // Done so that we can use PostTask on BrowsingDataRemovers and not have
54 // BrowsingDataRemover implement RefCounted. 54 // BrowsingDataRemover implement RefCounted.
55 DISABLE_RUNNABLE_METHOD_REFCOUNT(BrowsingDataRemover); 55 DISABLE_RUNNABLE_METHOD_REFCOUNT(BrowsingDataRemover);
56 56
57 bool BrowsingDataRemover::removing_ = false; 57 bool BrowsingDataRemover::removing_ = false;
58 58
59 BrowsingDataRemover::BrowsingDataRemover(Profile* profile, 59 BrowsingDataRemover::BrowsingDataRemover(Profile* profile,
60 base::Time delete_begin, 60 base::Time delete_begin,
61 base::Time delete_end) 61 base::Time delete_end)
62 : profile_(profile), 62 : profile_(profile),
63 quota_manager_(NULL),
63 special_storage_policy_(profile->GetExtensionSpecialStoragePolicy()), 64 special_storage_policy_(profile->GetExtensionSpecialStoragePolicy()),
64 delete_begin_(delete_begin), 65 delete_begin_(delete_begin),
65 delete_end_(delete_end), 66 delete_end_(delete_end),
66 ALLOW_THIS_IN_INITIALIZER_LIST(database_cleared_callback_( 67 ALLOW_THIS_IN_INITIALIZER_LIST(database_cleared_callback_(
67 this, &BrowsingDataRemover::OnClearedDatabases)), 68 this, &BrowsingDataRemover::OnClearedDatabases)),
68 ALLOW_THIS_IN_INITIALIZER_LIST(cache_callback_( 69 ALLOW_THIS_IN_INITIALIZER_LIST(cache_callback_(
69 this, &BrowsingDataRemover::DoClearCache)), 70 this, &BrowsingDataRemover::DoClearCache)),
70 ALLOW_THIS_IN_INITIALIZER_LIST(appcache_got_info_callback_(
71 this, &BrowsingDataRemover::OnGotAppCacheInfo)),
72 ALLOW_THIS_IN_INITIALIZER_LIST(appcache_deleted_callback_(
73 this, &BrowsingDataRemover::OnAppCacheDeleted)),
74 appcaches_to_be_deleted_count_(0),
75 next_cache_state_(STATE_NONE), 71 next_cache_state_(STATE_NONE),
76 cache_(NULL), 72 cache_(NULL),
77 main_context_getter_(profile->GetRequestContext()), 73 main_context_getter_(profile->GetRequestContext()),
78 media_context_getter_(profile->GetRequestContextForMedia()), 74 media_context_getter_(profile->GetRequestContextForMedia()),
79 waiting_for_clear_databases_(false), 75 waiting_for_clear_databases_(false),
80 waiting_for_clear_history_(false), 76 waiting_for_clear_history_(false),
77 waiting_for_clear_temporary_quota_managed_data_(false),
78 waiting_for_clear_persistent_quota_managed_data_(false),
81 waiting_for_clear_networking_history_(false), 79 waiting_for_clear_networking_history_(false),
82 waiting_for_clear_cache_(false), 80 waiting_for_clear_cache_(false),
83 waiting_for_clear_appcache_(false),
84 waiting_for_clear_gears_data_(false), 81 waiting_for_clear_gears_data_(false),
85 waiting_for_clear_file_systems_(false) { 82 temporary_quota_origins_to_delete_count_(0) {
86 DCHECK(profile); 83 DCHECK(profile);
87 } 84 }
88 85
89 BrowsingDataRemover::BrowsingDataRemover(Profile* profile, 86 BrowsingDataRemover::BrowsingDataRemover(Profile* profile,
90 TimePeriod time_period, 87 TimePeriod time_period,
91 base::Time delete_end) 88 base::Time delete_end)
92 : profile_(profile), 89 : profile_(profile),
90 quota_manager_(NULL),
93 special_storage_policy_(profile->GetExtensionSpecialStoragePolicy()), 91 special_storage_policy_(profile->GetExtensionSpecialStoragePolicy()),
94 delete_begin_(CalculateBeginDeleteTime(time_period)), 92 delete_begin_(CalculateBeginDeleteTime(time_period)),
95 delete_end_(delete_end), 93 delete_end_(delete_end),
96 ALLOW_THIS_IN_INITIALIZER_LIST(database_cleared_callback_( 94 ALLOW_THIS_IN_INITIALIZER_LIST(database_cleared_callback_(
97 this, &BrowsingDataRemover::OnClearedDatabases)), 95 this, &BrowsingDataRemover::OnClearedDatabases)),
98 ALLOW_THIS_IN_INITIALIZER_LIST(cache_callback_( 96 ALLOW_THIS_IN_INITIALIZER_LIST(cache_callback_(
99 this, &BrowsingDataRemover::DoClearCache)), 97 this, &BrowsingDataRemover::DoClearCache)),
100 ALLOW_THIS_IN_INITIALIZER_LIST(appcache_got_info_callback_(
101 this, &BrowsingDataRemover::OnGotAppCacheInfo)),
102 ALLOW_THIS_IN_INITIALIZER_LIST(appcache_deleted_callback_(
103 this, &BrowsingDataRemover::OnAppCacheDeleted)),
104 appcaches_to_be_deleted_count_(0),
105 next_cache_state_(STATE_NONE), 98 next_cache_state_(STATE_NONE),
106 cache_(NULL), 99 cache_(NULL),
107 main_context_getter_(profile->GetRequestContext()), 100 main_context_getter_(profile->GetRequestContext()),
108 media_context_getter_(profile->GetRequestContextForMedia()), 101 media_context_getter_(profile->GetRequestContextForMedia()),
109 waiting_for_clear_databases_(false), 102 waiting_for_clear_databases_(false),
110 waiting_for_clear_history_(false), 103 waiting_for_clear_history_(false),
104 waiting_for_clear_temporary_quota_managed_data_(false),
105 waiting_for_clear_persistent_quota_managed_data_(false),
111 waiting_for_clear_networking_history_(false), 106 waiting_for_clear_networking_history_(false),
112 waiting_for_clear_cache_(false), 107 waiting_for_clear_cache_(false),
113 waiting_for_clear_appcache_(false), 108 waiting_for_clear_gears_data_(false) {
114 waiting_for_clear_lso_data_(false),
115 waiting_for_clear_gears_data_(false),
116 waiting_for_clear_file_systems_(false) {
117 DCHECK(profile); 109 DCHECK(profile);
118 } 110 }
119 111
120 BrowsingDataRemover::~BrowsingDataRemover() { 112 BrowsingDataRemover::~BrowsingDataRemover() {
121 DCHECK(all_done()); 113 DCHECK(all_done());
122 } 114 }
123 115
124 void BrowsingDataRemover::Remove(int remove_mask) { 116 void BrowsingDataRemover::Remove(int remove_mask) {
125 DCHECK(!removing_); 117 DCHECK(!removing_);
126 removing_ = true; 118 removing_ = true;
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after
208 cookie_monster->DeleteAllCreatedBetween(delete_begin_, delete_end_, true); 200 cookie_monster->DeleteAllCreatedBetween(delete_begin_, delete_end_, true);
209 201
210 // REMOVE_COOKIES is actually "cookies and other site data" so we make sure 202 // REMOVE_COOKIES is actually "cookies and other site data" so we make sure
211 // to remove other data such local databases, STS state, etc. These only can 203 // to remove other data such local databases, STS state, etc. These only can
212 // be removed if a WEBKIT thread exists, so check that first: 204 // be removed if a WEBKIT thread exists, so check that first:
213 if (BrowserThread::IsMessageLoopValid(BrowserThread::WEBKIT)) { 205 if (BrowserThread::IsMessageLoopValid(BrowserThread::WEBKIT)) {
214 // We assume the end time is now. 206 // We assume the end time is now.
215 profile_->GetWebKitContext()->DeleteDataModifiedSince(delete_begin_); 207 profile_->GetWebKitContext()->DeleteDataModifiedSince(delete_begin_);
216 } 208 }
217 209
210 // We'll start by using the quota system to clear out AppCaches, WebSQL DBs,
211 // and File Systems.
212 quota_manager_ = profile_->GetQuotaManager();
213 if (quota_manager_) {
214 waiting_for_clear_temporary_quota_managed_data_ = true;
215 waiting_for_clear_persistent_quota_managed_data_ = true;
216 BrowserThread::PostTask(
217 BrowserThread::IO, FROM_HERE,
218 NewRunnableMethod(
219 this,
220 &BrowsingDataRemover::ClearQuotaManagedDataOnIOThread));
221 }
222
218 database_tracker_ = profile_->GetDatabaseTracker(); 223 database_tracker_ = profile_->GetDatabaseTracker();
219 if (database_tracker_.get()) { 224 if (database_tracker_.get()) {
220 waiting_for_clear_databases_ = true; 225 waiting_for_clear_databases_ = true;
221 BrowserThread::PostTask( 226 BrowserThread::PostTask(
222 BrowserThread::FILE, FROM_HERE, 227 BrowserThread::FILE, FROM_HERE,
223 NewRunnableMethod( 228 NewRunnableMethod(
224 this, 229 this,
225 &BrowsingDataRemover::ClearDatabasesOnFILEThread)); 230 &BrowsingDataRemover::ClearDatabasesOnFILEThread));
226 } 231 }
227 232
228 appcache_service_ = profile_->GetAppCacheService();
229 if (appcache_service_.get()) {
230 waiting_for_clear_appcache_ = true;
231 BrowserThread::PostTask(
232 BrowserThread::IO, FROM_HERE,
233 NewRunnableMethod(
234 this,
235 &BrowsingDataRemover::ClearAppCacheOnIOThread));
236 }
237
238 waiting_for_clear_gears_data_ = true; 233 waiting_for_clear_gears_data_ = true;
239 BrowserThread::PostTask( 234 BrowserThread::PostTask(
240 BrowserThread::FILE, FROM_HERE, 235 BrowserThread::FILE, FROM_HERE,
241 NewRunnableMethod( 236 NewRunnableMethod(
242 this, 237 this,
243 &BrowsingDataRemover::ClearGearsDataOnFILEThread, 238 &BrowsingDataRemover::ClearGearsDataOnFILEThread,
244 profile_->GetPath())); 239 profile_->GetPath()));
245 240
246 waiting_for_clear_file_systems_ = true;
247 BrowserThread::PostTask(
248 BrowserThread::FILE, FROM_HERE,
249 NewRunnableMethod(
250 this,
251 &BrowsingDataRemover::ClearFileSystemsOnFILEThread));
252
253 if (profile_->GetTransportSecurityState()) { 241 if (profile_->GetTransportSecurityState()) {
254 BrowserThread::PostTask( 242 BrowserThread::PostTask(
255 BrowserThread::IO, FROM_HERE, 243 BrowserThread::IO, FROM_HERE,
256 NewRunnableMethod( 244 NewRunnableMethod(
257 profile_->GetTransportSecurityState(), 245 profile_->GetTransportSecurityState(),
258 &net::TransportSecurityState::DeleteSince, 246 &net::TransportSecurityState::DeleteSince,
259 delete_begin_)); 247 delete_begin_));
260 } 248 }
261 } 249 }
262 250
(...skipping 220 matching lines...) Expand 10 before | Expand all | Expand 10 after
483 } 471 }
484 default: { 472 default: {
485 NOTREACHED() << "bad state"; 473 NOTREACHED() << "bad state";
486 next_cache_state_ = STATE_NONE; // Stop looping. 474 next_cache_state_ = STATE_NONE; // Stop looping.
487 break; 475 break;
488 } 476 }
489 } 477 }
490 } 478 }
491 } 479 }
492 480
493 void BrowsingDataRemover::OnClearedDatabases(int rv) { 481 void BrowsingDataRemover::OnClearedDatabases(int rv) {
michaeln 2011/07/26 22:40:19 can be deleted?
Mike West 2011/07/27 12:49:18 Done.
494 if (!BrowserThread::CurrentlyOn(BrowserThread::UI)) { 482 if (!BrowserThread::CurrentlyOn(BrowserThread::UI)) {
495 bool result = BrowserThread::PostTask( 483 bool result = BrowserThread::PostTask(
496 BrowserThread::UI, FROM_HERE, 484 BrowserThread::UI, FROM_HERE,
497 NewRunnableMethod(this, &BrowsingDataRemover::OnClearedDatabases, rv)); 485 NewRunnableMethod(this, &BrowsingDataRemover::OnClearedDatabases, rv));
498 DCHECK(result); 486 DCHECK(result);
499 return; 487 return;
500 } 488 }
501 // Notify the UI thread that we are done. 489 // Notify the UI thread that we are done.
502 database_tracker_ = NULL; 490 database_tracker_ = NULL;
503 waiting_for_clear_databases_ = false; 491 waiting_for_clear_databases_ = false;
504 492
505 NotifyAndDeleteIfDone(); 493 NotifyAndDeleteIfDone();
506 } 494 }
507 495
508 void BrowsingDataRemover::ClearDatabasesOnFILEThread() { 496 void BrowsingDataRemover::ClearDatabasesOnFILEThread() {
michaeln 2011/07/26 22:40:19 ditto?
Mike West 2011/07/27 12:49:18 Done.
509 // This function should be called on the FILE thread. 497 // This function should be called on the FILE thread.
510 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE)); 498 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE));
511 int rv = database_tracker_->DeleteDataModifiedSince( 499 int rv = database_tracker_->DeleteDataModifiedSince(
512 delete_begin_, &database_cleared_callback_); 500 delete_begin_, &database_cleared_callback_);
513 if (rv != net::ERR_IO_PENDING) 501 if (rv != net::ERR_IO_PENDING)
514 OnClearedDatabases(rv); 502 OnClearedDatabases(rv);
515 } 503 }
516 504
517 void BrowsingDataRemover::OnClearedAppCache() { 505 void BrowsingDataRemover::ClearQuotaManagedDataOnIOThread() {
518 if (!BrowserThread::CurrentlyOn(BrowserThread::UI)) { 506 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
519 bool result = BrowserThread::PostTask( 507 DCHECK(waiting_for_clear_temporary_quota_managed_data_);
520 BrowserThread::UI, FROM_HERE, 508 DCHECK(waiting_for_clear_persistent_quota_managed_data_);
521 NewRunnableMethod(this, &BrowsingDataRemover::OnClearedAppCache)); 509
522 DCHECK(result); 510 // Ask the QuotaManager for all origins with temporary quota modified within
523 return; 511 // the user-specified timeframe, and deal with the resulting set in
512 // OnGotQuotaManagedOrigins().
513 temporary_quota_origins_to_delete_count_ = 0;
514 persistent_quota_origins_to_delete_count_ = 0;
515
516 // If we're deleting since the beginning of time, ask the QuotaManager for all
517 // origins with persistent quota modified within the user-specified timeframe,
518 // and deal with the resulting set in OnGotPersistentQuotaManagedOrigins.
519 if (delete_begin_ == base::Time()) {
520 profile_->GetQuotaManager()->GetOriginsModifiedSince(
521 quota::kStorageTypePersistent, delete_begin_, NewCallback(this,
522 &BrowsingDataRemover::OnGotPersistentQuotaManagedOrigins));
523 } else {
524 // If not deleting since the beginning of time, we're done with any
525 // persistent quota.
526 waiting_for_clear_persistent_quota_managed_data_ = false;
524 } 527 }
525 waiting_for_clear_appcache_ = false; 528
526 NotifyAndDeleteIfDone(); 529 // Do the same for temporary quota, regardless.
530 profile_->GetQuotaManager()->GetOriginsModifiedSince(
531 quota::kStorageTypeTemporary, delete_begin_, NewCallback(this,
532 &BrowsingDataRemover::OnGotTemporaryQuotaManagedOrigins));
527 } 533 }
528 534
529 void BrowsingDataRemover::ClearAppCacheOnIOThread() { 535 void BrowsingDataRemover::OnGotTemporaryQuotaManagedOrigins(
530 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 536 const std::set<GURL>& origins) {
531 DCHECK(waiting_for_clear_appcache_); 537 // Walk through the origins passed in, delete temporary quota from each that
532 appcache_info_ = new appcache::AppCacheInfoCollection; 538 // isn't protected.
533 appcache_service_->GetAllAppCacheInfo( 539 std::set<GURL>::const_iterator origin;
534 appcache_info_, &appcache_got_info_callback_); 540 for (origin = origins.begin(); origin != origins.end(); ++origin) {
535 // continues in OnGotAppCacheInfo. 541 if (special_storage_policy_->IsStorageProtected(origin->GetOrigin()))
542 continue;
543 ++temporary_quota_origins_to_delete_count_;
michaeln 2011/07/26 22:40:19 There is a codepath where the QuotaManager will in
Mike West 2011/07/27 12:49:18 I'll ping you about this. I'm not sure I understa
544 quota_manager_->DeleteOriginData(origin->GetOrigin(),
545 quota::kStorageTypeTemporary, NewCallback(this,
546 &BrowsingDataRemover::OnTemporaryQuotaManagedOriginDeletion));
547 }
548 if (temporary_quota_origins_to_delete_count_ == 0)
549 CheckTemporaryQuotaManagedDataDeletionStatus();
536 } 550 }
537 551
538 void BrowsingDataRemover::OnGotAppCacheInfo(int rv) { 552 void BrowsingDataRemover::OnGotPersistentQuotaManagedOrigins(
539 using appcache::AppCacheInfoVector; 553 const std::set<GURL>& origins) {
540 typedef std::map<GURL, AppCacheInfoVector> InfoByOrigin; 554 // Walk through the origins passed in, delete temporary quota from each that
555 // isn't protected.
556 std::set<GURL>::const_iterator origin;
557 for (origin = origins.begin(); origin != origins.end(); ++origin) {
558 if (special_storage_policy_->IsStorageProtected(origin->GetOrigin()))
559 continue;
560 ++persistent_quota_origins_to_delete_count_;
561 quota_manager_->DeleteOriginData(origin->GetOrigin(),
562 quota::kStorageTypePersistent, NewCallback(this,
563 &BrowsingDataRemover::OnPersistentQuotaManagedOriginDeletion));
564 }
565 if (persistent_quota_origins_to_delete_count_ == 0)
566 CheckPersistentQuotaManagedDataDeletionStatus();
567 }
541 568
542 for (InfoByOrigin::const_iterator origin = 569 void BrowsingDataRemover::OnTemporaryQuotaManagedOriginDeletion(
michaeln 2011/07/26 22:40:19 There's a fair amount of code duplication between
Mike West 2011/07/27 12:49:18 I agree in part, and I've made some changes here,
543 appcache_info_->infos_by_origin.begin(); 570 quota::QuotaStatusCode status) {
544 origin != appcache_info_->infos_by_origin.end(); ++origin) { 571 DCHECK_GT(temporary_quota_origins_to_delete_count_, 0);
545 if (special_storage_policy_->IsStorageProtected(origin->first)) 572 if (status != quota::kQuotaStatusOk) {
546 continue; 573 // TODO(mkwst): We should add the GURL to StatusCallback; this is a pretty
547 for (AppCacheInfoVector::const_iterator info = origin->second.begin(); 574 // worthless error message otherwise.
548 info != origin->second.end(); ++info) { 575 DLOG(ERROR) << "Couldn't remove origin. Status: " << status;
549 if (info->creation_time > delete_begin_) {
550 ++appcaches_to_be_deleted_count_;
551 appcache_service_->DeleteAppCacheGroup(
552 info->manifest_url, &appcache_deleted_callback_);
553 }
554 }
555 } 576 }
556 577
557 if (!appcaches_to_be_deleted_count_) 578 --temporary_quota_origins_to_delete_count_;
558 OnClearedAppCache(); 579 if (temporary_quota_origins_to_delete_count_ == 0)
559 // else continues in OnAppCacheDeleted 580 CheckTemporaryQuotaManagedDataDeletionStatus();
560 } 581 }
561 582
562 void BrowsingDataRemover::OnAppCacheDeleted(int rv) { 583 void BrowsingDataRemover::OnPersistentQuotaManagedOriginDeletion(
563 --appcaches_to_be_deleted_count_; 584 quota::QuotaStatusCode status) {
564 if (!appcaches_to_be_deleted_count_) 585 DCHECK_GT(persistent_quota_origins_to_delete_count_, 0);
565 OnClearedAppCache(); 586 if (status != quota::kQuotaStatusOk)
587 DLOG(ERROR) << "Couldn't remove origin. Status: " << status;
588
589 --persistent_quota_origins_to_delete_count_;
590 if (persistent_quota_origins_to_delete_count_ == 0)
591 CheckPersistentQuotaManagedDataDeletionStatus();
566 } 592 }
567 593
568 void BrowsingDataRemover::ClearFileSystemsOnFILEThread() { 594 void BrowsingDataRemover::CheckTemporaryQuotaManagedDataDeletionStatus() {
569 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE)); 595 DCHECK_EQ(temporary_quota_origins_to_delete_count_, 0);
570 DCHECK(waiting_for_clear_file_systems_); 596 DCHECK(waiting_for_clear_temporary_quota_managed_data_);
571 scoped_refptr<fileapi::FileSystemContext>
572 fs_context(profile_->GetFileSystemContext());
573 scoped_ptr<fileapi::SandboxMountPointProvider::OriginEnumerator>
574 origin_enumerator(fs_context->path_manager()->sandbox_provider()->
575 CreateOriginEnumerator());
576 597
577 GURL origin; 598 waiting_for_clear_temporary_quota_managed_data_ = false;
578 while (!(origin = origin_enumerator->Next()).is_empty()) { 599
579 if (special_storage_policy_->IsStorageProtected(origin)) 600 if (!waiting_for_clear_persistent_quota_managed_data_ &&
580 continue; 601 !waiting_for_clear_temporary_quota_managed_data_) {
581 if (delete_begin_ == base::Time()) { 602 BrowserThread::PostTask(
582 // If the user chooses to delete browsing data "since the beginning of 603 BrowserThread::UI, FROM_HERE,
583 // time" remove both temporary and persistent file systems entirely. 604 NewRunnableMethod(
584 fs_context->DeleteDataForOriginAndTypeOnFileThread(origin, 605 this,
585 fileapi::kFileSystemTypeTemporary); 606 &BrowsingDataRemover::NotifyAndDeleteIfDone));
586 fs_context->DeleteDataForOriginAndTypeOnFileThread(origin,
587 fileapi::kFileSystemTypePersistent);
588 }
589 // TODO(mkwst): Else? Decide what to do for time-based deletion: crbug/63700
590 } 607 }
591
592 BrowserThread::PostTask(
593 BrowserThread::UI, FROM_HERE,
594 NewRunnableMethod(this, &BrowsingDataRemover::OnClearedFileSystems));
595 } 608 }
596 609
597 void BrowsingDataRemover::OnClearedFileSystems() { 610 void BrowsingDataRemover::CheckPersistentQuotaManagedDataDeletionStatus() {
598 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 611 DCHECK_EQ(persistent_quota_origins_to_delete_count_, 0);
599 waiting_for_clear_file_systems_ = false; 612 DCHECK(waiting_for_clear_persistent_quota_managed_data_);
600 NotifyAndDeleteIfDone(); 613
614 waiting_for_clear_persistent_quota_managed_data_ = false;
615 if (!waiting_for_clear_persistent_quota_managed_data_ &&
616 !waiting_for_clear_temporary_quota_managed_data_) {
617 BrowserThread::PostTask(
618 BrowserThread::UI, FROM_HERE,
619 NewRunnableMethod(
620 this,
621 &BrowsingDataRemover::NotifyAndDeleteIfDone));
622 }
601 } 623 }
602 624
603 // static 625 // static
604 void BrowsingDataRemover::ClearGearsData(const FilePath& profile_dir) { 626 void BrowsingDataRemover::ClearGearsData(const FilePath& profile_dir) {
605 FilePath plugin_data = profile_dir.AppendASCII("Plugin Data"); 627 FilePath plugin_data = profile_dir.AppendASCII("Plugin Data");
606 if (file_util::DirectoryExists(plugin_data)) 628 if (file_util::DirectoryExists(plugin_data))
607 file_util::Delete(plugin_data, true); 629 file_util::Delete(plugin_data, true);
608 } 630 }
609 631
610 void BrowsingDataRemover::OnClearedGearsData() { 632 void BrowsingDataRemover::OnClearedGearsData() {
(...skipping 15 matching lines...) Expand all
626 648
627 ClearGearsData(profile_dir); 649 ClearGearsData(profile_dir);
628 OnClearedGearsData(); 650 OnClearedGearsData();
629 } 651 }
630 652
631 void BrowsingDataRemover::OnWaitableEventSignaled( 653 void BrowsingDataRemover::OnWaitableEventSignaled(
632 base::WaitableEvent* waitable_event) { 654 base::WaitableEvent* waitable_event) {
633 waiting_for_clear_lso_data_ = false; 655 waiting_for_clear_lso_data_ = false;
634 NotifyAndDeleteIfDone(); 656 NotifyAndDeleteIfDone();
635 } 657 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698