Index: content/browser/in_process_webkit/dom_storage_context.cc |
diff --git a/content/browser/in_process_webkit/dom_storage_context.cc b/content/browser/in_process_webkit/dom_storage_context.cc |
index cbae12e80d24f81f0ab7dc24d7c78165438e5908..065d8cff7d8905283ddbe57b258619e5f6766a83 100644 |
--- a/content/browser/in_process_webkit/dom_storage_context.cc |
+++ b/content/browser/in_process_webkit/dom_storage_context.cc |
@@ -27,7 +27,8 @@ using WebKit::WebSecurityOrigin; |
namespace { |
void ClearLocalState(const FilePath& domstorage_path, |
- quota::SpecialStoragePolicy* special_storage_policy) { |
+ quota::SpecialStoragePolicy* special_storage_policy, |
+ bool clear_all_databases) { |
file_util::FileEnumerator file_enumerator( |
domstorage_path, false, file_util::FileEnumerator::FILES); |
for (FilePath file_path = file_enumerator.Next(); !file_path.empty(); |
@@ -35,8 +36,13 @@ void ClearLocalState(const FilePath& domstorage_path, |
if (file_path.Extension() == DOMStorageContext::kLocalStorageExtension) { |
GURL origin(WebSecurityOrigin::createFromDatabaseIdentifier( |
webkit_glue::FilePathToWebString(file_path.BaseName())).toString()); |
- if (!special_storage_policy->IsStorageProtected(origin)) |
- file_util::Delete(file_path, false); |
+ if (special_storage_policy->IsStorageProtected(origin)) |
+ continue; |
+ if (!clear_all_databases && |
+ !special_storage_policy->IsStorageSessionOnly(origin)) { |
+ continue; |
+ } |
+ file_util::Delete(file_path, false); |
} |
} |
} |
@@ -56,6 +62,7 @@ DOMStorageContext::DOMStorageContext( |
last_session_storage_namespace_id_on_ui_thread_(kLocalStorageNamespaceId), |
last_session_storage_namespace_id_on_io_thread_(kLocalStorageNamespaceId), |
clear_local_state_on_exit_(false), |
+ save_session_state_(false), |
special_storage_policy_(special_storage_policy) { |
data_path_ = webkit_context->data_path(); |
} |
@@ -70,12 +77,23 @@ DOMStorageContext::~DOMStorageContext() { |
delete iter->second; |
} |
+ if (save_session_state_) |
+ return; |
+ |
+ bool has_session_only_databases = |
+ special_storage_policy_.get() && |
+ special_storage_policy_->HasSessionOnlyOrigins(); |
+ |
+ // Clearning only session-only databases, and there are none. |
+ if (!clear_local_state_on_exit_ && !has_session_only_databases) |
+ return; |
+ |
// Not being on the WEBKIT thread here means we are running in a unit test |
// where no clean up is needed. |
- if (clear_local_state_on_exit_ && |
- BrowserThread::CurrentlyOn(BrowserThread::WEBKIT)) { |
+ if (BrowserThread::CurrentlyOn(BrowserThread::WEBKIT)) { |
ClearLocalState(data_path_.Append(kLocalStorageDirectory), |
- special_storage_policy_); |
+ special_storage_policy_, |
+ clear_local_state_on_exit_); |
} |
} |
@@ -201,29 +219,6 @@ void DOMStorageContext::DeleteDataModifiedSince(const base::Time& cutoff) { |
} |
} |
-void DOMStorageContext::DeleteSessionOnlyData() { |
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::WEBKIT)); |
- |
- // 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( |
- data_path_.Append(kLocalStorageDirectory), false, |
- file_util::FileEnumerator::FILES); |
- for (FilePath path = file_enumerator.Next(); !path.value().empty(); |
- path = file_enumerator.Next()) { |
- GURL origin(WebSecurityOrigin::createFromDatabaseIdentifier( |
- webkit_glue::FilePathToWebString(path.BaseName())).toString()); |
- if (!special_storage_policy_->IsStorageSessionOnly(origin)) |
- continue; |
- if (special_storage_policy_->IsStorageProtected(origin)) |
- continue; |
- |
- file_util::Delete(path, false); |
- } |
-} |
- |
void DOMStorageContext::DeleteLocalStorageFile(const FilePath& file_path) { |
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::WEBKIT)); |