diff options
author | jorlow@chromium.org <jorlow@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-11-26 00:37:06 +0000 |
---|---|---|
committer | jorlow@chromium.org <jorlow@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-11-26 00:37:06 +0000 |
commit | 35b9be0331299803c6fa724cbe8e416ec593c6fc (patch) | |
tree | e5928c2df4255e4efe6c08399e661892c6d5c28a | |
parent | 182c44faa58c15e474682f2ad349eca5a6a2235f (diff) | |
download | chromium_src-35b9be0331299803c6fa724cbe8e416ec593c6fc.zip chromium_src-35b9be0331299803c6fa724cbe8e416ec593c6fc.tar.gz chromium_src-35b9be0331299803c6fa724cbe8e416ec593c6fc.tar.bz2 |
For now, let's clear local storage whenever we clear cookies.
BUG=28788
TEST="Clear private data..." from the menu, check cookies, and tell it ok. Data in "Local Storage" inside the profile's data dir should be deleted and any open websites that were using that data should no longer be able to see it.
Review URL: http://codereview.chromium.org/441012
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@33162 0039d316-1c4b-4281-b951-d872f2087c98
-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(); |