| Index: chrome/browser/browsing_data_remover.cc
|
| diff --git a/chrome/browser/browsing_data_remover.cc b/chrome/browser/browsing_data_remover.cc
|
| index 70083fec65abd80c63ab05dcb2768e0dac006baf..21656b62754b6e06b3b336e12c0742039a62b535 100644
|
| --- a/chrome/browser/browsing_data_remover.cc
|
| +++ b/chrome/browser/browsing_data_remover.cc
|
| @@ -7,6 +7,8 @@
|
| #include <map>
|
| #include <set>
|
|
|
| +#include "base/logging.h"
|
| +
|
| #include "base/callback.h"
|
| #include "base/file_util.h"
|
| #include "base/platform_file.h"
|
| @@ -49,6 +51,8 @@
|
| #include "webkit/fileapi/file_system_context.h"
|
| #include "webkit/fileapi/file_system_operation_context.h"
|
| #include "webkit/fileapi/sandbox_mount_point_provider.h"
|
| +#include "webkit/quota/quota_types.h"
|
| +#include "webkit/quota/quota_manager.h"
|
|
|
| // Done so that we can use PostTask on BrowsingDataRemovers and not have
|
| // BrowsingDataRemover implement RefCounted.
|
| @@ -82,7 +86,8 @@ BrowsingDataRemover::BrowsingDataRemover(Profile* profile,
|
| waiting_for_clear_cache_(false),
|
| waiting_for_clear_appcache_(false),
|
| waiting_for_clear_gears_data_(false),
|
| - waiting_for_clear_file_systems_(false) {
|
| + waiting_for_clear_file_systems_(false),
|
| + temporary_quota_origins_to_delete_count_(0) {
|
| DCHECK(profile);
|
| }
|
|
|
| @@ -570,28 +575,35 @@ void BrowsingDataRemover::ClearFileSystemsOnFILEThread() {
|
| DCHECK(waiting_for_clear_file_systems_);
|
| scoped_refptr<fileapi::FileSystemContext>
|
| fs_context(profile_->GetFileSystemContext());
|
| +
|
| + // We own the reference to the OriginEnumerator, so we wrap it in a scoped_ptr
|
| + // to ensure that it's destroyed when we leave the FILE thread.
|
| scoped_ptr<fileapi::SandboxMountPointProvider::OriginEnumerator>
|
| - origin_enumerator(fs_context->path_manager()->sandbox_provider()->
|
| + origins(fs_context->path_manager()->sandbox_provider()->
|
| CreateOriginEnumerator());
|
|
|
| - GURL origin;
|
| - while (!(origin = origin_enumerator->Next()).is_empty()) {
|
| - if (special_storage_policy_->IsStorageProtected(origin))
|
| - continue;
|
| - if (delete_begin_ == base::Time()) {
|
| - // If the user chooses to delete browsing data "since the beginning of
|
| - // time" remove both temporary and persistent file systems entirely.
|
| - fs_context->DeleteDataForOriginAndTypeOnFileThread(origin,
|
| - fileapi::kFileSystemTypeTemporary);
|
| - fs_context->DeleteDataForOriginAndTypeOnFileThread(origin,
|
| - fileapi::kFileSystemTypePersistent);
|
| + if (delete_begin_ == base::Time()) {
|
| + // If the user chooses to delete browsing data "since the beginning of
|
| + // time" remove both temporary and persistent file systems entirely by
|
| + // walking through all origins and deleting them if they're unprotected.
|
| + GURL origin;
|
| + while (!(origin = origins->Next()).is_empty()) {
|
| + if (special_storage_policy_->IsStorageProtected(origin))
|
| + continue;
|
| + fs_context->DeleteDataForOriginOnFileThread(origin);
|
| }
|
| - // TODO(mkwst): Else? Decide what to do for time-based deletion: crbug/63700
|
| + BrowserThread::PostTask(
|
| + BrowserThread::UI, FROM_HERE,
|
| + NewRunnableMethod(this, &BrowsingDataRemover::OnClearedFileSystems));
|
| + } else {
|
| + // Otherwise, ask the QuotaManager for all origins with temporary quota
|
| + // modified within the user-specified timeframe, and deal with the resulting
|
| + // set in ProcessTemporaryQuotaModifiedInTimeframe().
|
| + temporary_quota_origins_to_delete_count_ = 0;
|
| + profile_->GetQuotaManager()->GetOriginsModifiedSince(
|
| + quota::kStorageTypeTemporary, delete_begin_, NewCallback(this,
|
| + &BrowsingDataRemover::ProcessTemporaryQuotaModifiedInTimeframe));
|
| }
|
| -
|
| - BrowserThread::PostTask(
|
| - BrowserThread::UI, FROM_HERE,
|
| - NewRunnableMethod(this, &BrowsingDataRemover::OnClearedFileSystems));
|
| }
|
|
|
| void BrowsingDataRemover::OnClearedFileSystems() {
|
| @@ -600,6 +612,44 @@ void BrowsingDataRemover::OnClearedFileSystems() {
|
| NotifyAndDeleteIfDone();
|
| }
|
|
|
| +void BrowsingDataRemover::ProcessTemporaryQuotaModifiedInTimeframe(
|
| + const std::set<GURL>& origins) {
|
| + // The QuotaManager is owned by the profile; we can use a raw pointer here,
|
| + // and rely on the profile to destroy the object whenever it's reasonable.
|
| + quota::QuotaManager* quota_manager = profile_->GetQuotaManager();
|
| +
|
| + // Walk through the origins passed in, delete temporary quota from each that
|
| + // isn't protected.
|
| + std::set<GURL>::iterator origin;
|
| + for (origin = origins.begin(); origin != origins.end(); ++origin) {
|
| + if (special_storage_policy_->IsStorageProtected(*origin))
|
| + continue;
|
| + ++temporary_quota_origins_to_delete_count_;
|
| + quota_manager->DeleteOriginData(*origin, quota::kStorageTypeTemporary,
|
| + NewCallback(this, &BrowsingDataRemover::DeleteOriginDataCallback));
|
| + }
|
| + if (temporary_quota_origins_to_delete_count_ == 0) {
|
| + BrowserThread::PostTask(
|
| + BrowserThread::UI, FROM_HERE,
|
| + NewRunnableMethod(this, &BrowsingDataRemover::OnClearedFileSystems));
|
| + }
|
| +}
|
| +
|
| +void BrowsingDataRemover::DeleteOriginDataCallback(
|
| + quota::QuotaStatusCode status) {
|
| + if (status != quota::kQuotaStatusOk) {
|
| + // TODO(mkwst): Not really anything pretty I can think of to do here.
|
| + }
|
| +
|
| + --temporary_quota_origins_to_delete_count_;
|
| +
|
| + if (temporary_quota_origins_to_delete_count_ == 0) {
|
| + BrowserThread::PostTask(
|
| + BrowserThread::UI, FROM_HERE,
|
| + NewRunnableMethod(this, &BrowsingDataRemover::OnClearedFileSystems));
|
| + }
|
| +}
|
| +
|
| // static
|
| void BrowsingDataRemover::ClearGearsData(const FilePath& profile_dir) {
|
| FilePath plugin_data = profile_dir.AppendASCII("Plugin Data");
|
|
|