summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--base/file_util.h4
-rw-r--r--base/file_util_posix.cc5
-rw-r--r--base/file_util_win.cc7
-rw-r--r--chrome/browser/browsing_data_remover.cc2
-rw-r--r--chrome/browser/in_process_webkit/dom_storage_context.cc17
-rw-r--r--chrome/browser/in_process_webkit/dom_storage_context.h5
-rw-r--r--chrome/browser/in_process_webkit/webkit_context.cc14
-rw-r--r--chrome/browser/in_process_webkit/webkit_context.h5
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();