diff options
-rw-r--r-- | base/file_util.h | 4 | ||||
-rw-r--r-- | base/file_util_posix.cc | 5 | ||||
-rw-r--r-- | base/file_util_win.cc | 7 | ||||
-rw-r--r-- | chrome/browser/browsing_data_remover.cc | 2 | ||||
-rw-r--r-- | chrome/browser/in_process_webkit/dom_storage_context.cc | 17 | ||||
-rw-r--r-- | chrome/browser/in_process_webkit/dom_storage_context.h | 5 | ||||
-rw-r--r-- | chrome/browser/in_process_webkit/webkit_context.cc | 14 | ||||
-rw-r--r-- | chrome/browser/in_process_webkit/webkit_context.h | 5 |
8 files changed, 59 insertions, 0 deletions
diff --git a/base/file_util.h b/base/file_util.h index bf5f5bf..a6914b7 100644 --- a/base/file_util.h +++ b/base/file_util.h @@ -531,6 +531,10 @@ bool RenameFileAndResetSecurityDescriptor( const FilePath& source_file_path, const FilePath& target_file_path); +// Returns whether the file has been modified since a particular date. +bool HasFileBeenModifiedSince(const FileEnumerator::FindInfo& find_info, + const base::Time& cutoff_time); + } // namespace file_util #endif // BASE_FILE_UTIL_H_ diff --git a/base/file_util_posix.cc b/base/file_util_posix.cc index a269d3f..dc9d793 100644 --- a/base/file_util_posix.cc +++ b/base/file_util_posix.cc @@ -699,4 +699,9 @@ void MemoryMappedFile::CloseHandles() { file_ = base::kInvalidPlatformFileValue; } +bool HasFileBeenModifiedSince(const FileEnumerator::FindInfo& find_info, + const base::Time& cutoff_time) { + return find_info.stat.st_mtime >= cutoff_time.ToTimeT(); +} + } // namespace file_util diff --git a/base/file_util_win.cc b/base/file_util_win.cc index a320aca..9722e31 100644 --- a/base/file_util_win.cc +++ b/base/file_util_win.cc @@ -793,4 +793,11 @@ void MemoryMappedFile::CloseHandles() { length_ = INVALID_FILE_SIZE; } +bool HasFileBeenModifiedSince(const FileEnumerator::FindInfo& find_info, + const base::Time& cutoff_time) { + long result = CompareFileTime(&find_info.ftLastWriteTime, + &cutoff_time.ToFileTime()); + return result == 1 || result == 0; +} + } // namespace file_util diff --git a/chrome/browser/browsing_data_remover.cc b/chrome/browser/browsing_data_remover.cc index 652251c..11581b9 100644 --- a/chrome/browser/browsing_data_remover.cc +++ b/chrome/browser/browsing_data_remover.cc @@ -7,6 +7,7 @@ #include "chrome/browser/chrome_thread.h" #include "chrome/browser/download/download_manager.h" #include "chrome/browser/history/history.h" +#include "chrome/browser/in_process_webkit/webkit_context.h" #include "chrome/browser/profile.h" #include "chrome/browser/metrics/user_metrics.h" #include "chrome/browser/net/url_request_context_getter.h" @@ -111,6 +112,7 @@ void BrowsingDataRemover::Remove(int remove_mask) { profile_->GetRequestContext()->GetCookieStore()->GetCookieMonster(); if (cookie_monster) cookie_monster->DeleteAllCreatedBetween(delete_begin_, delete_end_, true); + profile_->GetWebKitContext()->DeleteDataModifiedSince(delete_begin_); } if (remove_mask & REMOVE_PASSWORDS) { diff --git a/chrome/browser/in_process_webkit/dom_storage_context.cc b/chrome/browser/in_process_webkit/dom_storage_context.cc index 3de5f6d..36804f8 100644 --- a/chrome/browser/in_process_webkit/dom_storage_context.cc +++ b/chrome/browser/in_process_webkit/dom_storage_context.cc @@ -145,3 +145,20 @@ void DOMStorageContext::PurgeMemory() { if (local_storage) local_storage->PurgeMemory(); } + +void DOMStorageContext::DeleteDataModifiedSince(const base::Time& cutoff) { + // Make sure that we don't delete a database that's currently being accessed + // by unloading all of the databases temporarily. + PurgeMemory(); + + file_util::FileEnumerator file_enumerator( + webkit_context_->data_path().AppendASCII(kLocalStorageDirectory), false, + file_util::FileEnumerator::FILES); + for (FilePath path = file_enumerator.Next(); !path.value().empty(); + path = file_enumerator.Next()) { + file_util::FileEnumerator::FindInfo find_info; + file_enumerator.GetFindInfo(&find_info); + if (file_util::HasFileBeenModifiedSince(find_info, cutoff)) + file_util::Delete(path, false); + } +} diff --git a/chrome/browser/in_process_webkit/dom_storage_context.h b/chrome/browser/in_process_webkit/dom_storage_context.h index e652aa6..2d79117 100644 --- a/chrome/browser/in_process_webkit/dom_storage_context.h +++ b/chrome/browser/in_process_webkit/dom_storage_context.h @@ -9,6 +9,7 @@ #include <set> #include "base/file_path.h" +#include "base/time.h" class DOMStorageDispatcherHost; class StorageArea; @@ -60,6 +61,10 @@ class DOMStorageContext { // Tells storage namespaces to purge any memory they do not need. virtual void PurgeMemory(); + // Delete any local storage files that have been touched since the cutoff + // date that's supplied. + void DeleteDataModifiedSince(const base::Time& cutoff); + // The special ID used for local storage. static const int64 kLocalStorageNamespaceId = 0; diff --git a/chrome/browser/in_process_webkit/webkit_context.cc b/chrome/browser/in_process_webkit/webkit_context.cc index 384e491..5fdb358 100644 --- a/chrome/browser/in_process_webkit/webkit_context.cc +++ b/chrome/browser/in_process_webkit/webkit_context.cc @@ -42,3 +42,17 @@ void WebKitContext::PurgeMemory() { NewRunnableMethod(this, &WebKitContext::PurgeMemory)); } } + +void WebKitContext::DeleteDataModifiedSince(const base::Time& cutoff) { + // DOMStorageContext::DeleteDataModifiedSince() should only be called on the + // WebKit thread. + if (ChromeThread::CurrentlyOn(ChromeThread::WEBKIT)) { + dom_storage_context_->DeleteDataModifiedSince(cutoff); + } else { + bool result = ChromeThread::PostTask( + ChromeThread::WEBKIT, FROM_HERE, + NewRunnableMethod(this, &WebKitContext::DeleteDataModifiedSince, + cutoff)); + DCHECK(result); + } +} diff --git a/chrome/browser/in_process_webkit/webkit_context.h b/chrome/browser/in_process_webkit/webkit_context.h index d83d530..38d9d7d 100644 --- a/chrome/browser/in_process_webkit/webkit_context.h +++ b/chrome/browser/in_process_webkit/webkit_context.h @@ -8,6 +8,7 @@ #include "base/file_path.h" #include "base/ref_counted.h" #include "base/scoped_ptr.h" +#include "base/time.h" #include "chrome/browser/in_process_webkit/dom_storage_context.h" class WebKitThread; @@ -38,6 +39,10 @@ class WebKitContext : public base::RefCountedThreadSafe<WebKitContext> { // Tells the DOMStorageContext to purge any memory it does not need. void PurgeMemory(); + // Tell all children (where applicable) to delete any objects that were + // last modified on or after the following time. + void DeleteDataModifiedSince(const base::Time& cutoff); + private: friend class base::RefCountedThreadSafe<WebKitContext>; ~WebKitContext(); |