Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(130)

Side by Side Diff: content/browser/in_process_webkit/dom_storage_context.cc

Issue 8820009: Appcache, local storage, indexed db, databases: skip exit-time deletion when restarting. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: . Created 9 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "content/browser/in_process_webkit/dom_storage_context.h" 5 #include "content/browser/in_process_webkit/dom_storage_context.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 8
9 #include "base/bind.h" 9 #include "base/bind.h"
10 #include "base/file_path.h" 10 #include "base/file_path.h"
11 #include "base/file_util.h" 11 #include "base/file_util.h"
12 #include "base/string_util.h" 12 #include "base/string_util.h"
13 #include "content/browser/in_process_webkit/dom_storage_area.h" 13 #include "content/browser/in_process_webkit/dom_storage_area.h"
14 #include "content/browser/in_process_webkit/dom_storage_namespace.h" 14 #include "content/browser/in_process_webkit/dom_storage_namespace.h"
15 #include "content/browser/in_process_webkit/webkit_context.h" 15 #include "content/browser/in_process_webkit/webkit_context.h"
16 #include "content/common/dom_storage_common.h" 16 #include "content/common/dom_storage_common.h"
17 #include "content/public/browser/browser_thread.h" 17 #include "content/public/browser/browser_thread.h"
18 #include "third_party/WebKit/Source/WebKit/chromium/public/WebSecurityOrigin.h" 18 #include "third_party/WebKit/Source/WebKit/chromium/public/WebSecurityOrigin.h"
19 #include "third_party/WebKit/Source/WebKit/chromium/public/platform/WebString.h" 19 #include "third_party/WebKit/Source/WebKit/chromium/public/platform/WebString.h"
20 #include "webkit/glue/webkit_glue.h" 20 #include "webkit/glue/webkit_glue.h"
21 #include "webkit/quota/special_storage_policy.h" 21 #include "webkit/quota/special_storage_policy.h"
22 22
23 using content::BrowserThread; 23 using content::BrowserThread;
24 24
25 using WebKit::WebSecurityOrigin; 25 using WebKit::WebSecurityOrigin;
26 26
27 namespace { 27 namespace {
28 28
29 void ClearLocalState(const FilePath& domstorage_path, 29 void ClearLocalState(const FilePath& domstorage_path,
30 quota::SpecialStoragePolicy* special_storage_policy) { 30 quota::SpecialStoragePolicy* special_storage_policy,
31 bool clear_all_databases) {
31 file_util::FileEnumerator file_enumerator( 32 file_util::FileEnumerator file_enumerator(
32 domstorage_path, false, file_util::FileEnumerator::FILES); 33 domstorage_path, false, file_util::FileEnumerator::FILES);
33 for (FilePath file_path = file_enumerator.Next(); !file_path.empty(); 34 for (FilePath file_path = file_enumerator.Next(); !file_path.empty();
34 file_path = file_enumerator.Next()) { 35 file_path = file_enumerator.Next()) {
35 if (file_path.Extension() == DOMStorageContext::kLocalStorageExtension) { 36 if (file_path.Extension() == DOMStorageContext::kLocalStorageExtension) {
36 GURL origin(WebSecurityOrigin::createFromDatabaseIdentifier( 37 GURL origin(WebSecurityOrigin::createFromDatabaseIdentifier(
37 webkit_glue::FilePathToWebString(file_path.BaseName())).toString()); 38 webkit_glue::FilePathToWebString(file_path.BaseName())).toString());
38 if (!special_storage_policy->IsStorageProtected(origin)) 39 if (special_storage_policy->IsStorageProtected(origin))
39 file_util::Delete(file_path, false); 40 continue;
41 if (!clear_all_databases &&
42 !special_storage_policy->IsStorageSessionOnly(origin)) {
43 continue;
44 }
45 file_util::Delete(file_path, false);
40 } 46 }
41 } 47 }
42 } 48 }
43 49
44 } // namespace 50 } // namespace
45 51
46 const FilePath::CharType DOMStorageContext::kLocalStorageDirectory[] = 52 const FilePath::CharType DOMStorageContext::kLocalStorageDirectory[] =
47 FILE_PATH_LITERAL("Local Storage"); 53 FILE_PATH_LITERAL("Local Storage");
48 54
49 const FilePath::CharType DOMStorageContext::kLocalStorageExtension[] = 55 const FilePath::CharType DOMStorageContext::kLocalStorageExtension[] =
50 FILE_PATH_LITERAL(".localstorage"); 56 FILE_PATH_LITERAL(".localstorage");
51 57
52 DOMStorageContext::DOMStorageContext( 58 DOMStorageContext::DOMStorageContext(
53 WebKitContext* webkit_context, 59 WebKitContext* webkit_context,
54 quota::SpecialStoragePolicy* special_storage_policy) 60 quota::SpecialStoragePolicy* special_storage_policy)
55 : last_storage_area_id_(0), 61 : last_storage_area_id_(0),
56 last_session_storage_namespace_id_on_ui_thread_(kLocalStorageNamespaceId), 62 last_session_storage_namespace_id_on_ui_thread_(kLocalStorageNamespaceId),
57 last_session_storage_namespace_id_on_io_thread_(kLocalStorageNamespaceId), 63 last_session_storage_namespace_id_on_io_thread_(kLocalStorageNamespaceId),
58 clear_local_state_on_exit_(false), 64 clear_local_state_on_exit_(false),
65 save_session_state_(false),
59 special_storage_policy_(special_storage_policy) { 66 special_storage_policy_(special_storage_policy) {
60 data_path_ = webkit_context->data_path(); 67 data_path_ = webkit_context->data_path();
61 } 68 }
62 69
63 DOMStorageContext::~DOMStorageContext() { 70 DOMStorageContext::~DOMStorageContext() {
64 // This should not go away until all DOM Storage message filters have gone 71 // This should not go away until all DOM Storage message filters have gone
65 // away. And they remove themselves from this list. 72 // away. And they remove themselves from this list.
66 DCHECK(message_filter_set_.empty()); 73 DCHECK(message_filter_set_.empty());
67 74
68 for (StorageNamespaceMap::iterator iter(storage_namespace_map_.begin()); 75 for (StorageNamespaceMap::iterator iter(storage_namespace_map_.begin());
69 iter != storage_namespace_map_.end(); ++iter) { 76 iter != storage_namespace_map_.end(); ++iter) {
70 delete iter->second; 77 delete iter->second;
71 } 78 }
72 79
80 if (save_session_state_)
81 return;
82
83 bool has_session_only_databases =
84 special_storage_policy_.get() &&
85 special_storage_policy_->HasSessionOnlyOrigins();
86
87 // Clearning only session-only databases, and there are none.
88 if (!clear_local_state_on_exit_ && !has_session_only_databases)
89 return;
90
73 // Not being on the WEBKIT thread here means we are running in a unit test 91 // Not being on the WEBKIT thread here means we are running in a unit test
74 // where no clean up is needed. 92 // where no clean up is needed.
75 if (clear_local_state_on_exit_ && 93 if (BrowserThread::CurrentlyOn(BrowserThread::WEBKIT)) {
76 BrowserThread::CurrentlyOn(BrowserThread::WEBKIT)) {
77 ClearLocalState(data_path_.Append(kLocalStorageDirectory), 94 ClearLocalState(data_path_.Append(kLocalStorageDirectory),
78 special_storage_policy_); 95 special_storage_policy_,
96 clear_local_state_on_exit_);
79 } 97 }
80 } 98 }
81 99
82 int64 DOMStorageContext::AllocateStorageAreaId() { 100 int64 DOMStorageContext::AllocateStorageAreaId() {
83 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::WEBKIT)); 101 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::WEBKIT));
84 return ++last_storage_area_id_; 102 return ++last_storage_area_id_;
85 } 103 }
86 104
87 int64 DOMStorageContext::AllocateSessionStorageNamespaceId() { 105 int64 DOMStorageContext::AllocateSessionStorageNamespaceId() {
88 if (BrowserThread::CurrentlyOn(BrowserThread::UI)) 106 if (BrowserThread::CurrentlyOn(BrowserThread::UI))
(...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after
194 if (special_storage_policy_->IsStorageProtected(origin)) 212 if (special_storage_policy_->IsStorageProtected(origin))
195 continue; 213 continue;
196 214
197 file_util::FileEnumerator::FindInfo find_info; 215 file_util::FileEnumerator::FindInfo find_info;
198 file_enumerator.GetFindInfo(&find_info); 216 file_enumerator.GetFindInfo(&find_info);
199 if (file_util::HasFileBeenModifiedSince(find_info, cutoff)) 217 if (file_util::HasFileBeenModifiedSince(find_info, cutoff))
200 file_util::Delete(path, false); 218 file_util::Delete(path, false);
201 } 219 }
202 } 220 }
203 221
204 void DOMStorageContext::DeleteSessionOnlyData() {
205 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::WEBKIT));
206
207 // Make sure that we don't delete a database that's currently being accessed
208 // by unloading all of the databases temporarily.
209 PurgeMemory();
210
211 file_util::FileEnumerator file_enumerator(
212 data_path_.Append(kLocalStorageDirectory), false,
213 file_util::FileEnumerator::FILES);
214 for (FilePath path = file_enumerator.Next(); !path.value().empty();
215 path = file_enumerator.Next()) {
216 GURL origin(WebSecurityOrigin::createFromDatabaseIdentifier(
217 webkit_glue::FilePathToWebString(path.BaseName())).toString());
218 if (!special_storage_policy_->IsStorageSessionOnly(origin))
219 continue;
220 if (special_storage_policy_->IsStorageProtected(origin))
221 continue;
222
223 file_util::Delete(path, false);
224 }
225 }
226
227 void DOMStorageContext::DeleteLocalStorageFile(const FilePath& file_path) { 222 void DOMStorageContext::DeleteLocalStorageFile(const FilePath& file_path) {
228 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::WEBKIT)); 223 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::WEBKIT));
229 224
230 // Make sure that we don't delete a database that's currently being accessed 225 // Make sure that we don't delete a database that's currently being accessed
231 // by unloading all of the databases temporarily. 226 // by unloading all of the databases temporarily.
232 // TODO(bulach): both this method and DeleteDataModifiedSince could purge 227 // TODO(bulach): both this method and DeleteDataModifiedSince could purge
233 // only the memory used by the specific file instead of all memory at once. 228 // only the memory used by the specific file instead of all memory at once.
234 // See http://crbug.com/32000 229 // See http://crbug.com/32000
235 PurgeMemory(); 230 PurgeMemory();
236 file_util::Delete(file_path, false); 231 file_util::Delete(file_path, false);
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
296 } 291 }
297 292
298 FilePath DOMStorageContext::GetLocalStorageFilePath( 293 FilePath DOMStorageContext::GetLocalStorageFilePath(
299 const string16& origin_id) const { 294 const string16& origin_id) const {
300 FilePath storageDir = data_path_.Append( 295 FilePath storageDir = data_path_.Append(
301 DOMStorageContext::kLocalStorageDirectory); 296 DOMStorageContext::kLocalStorageDirectory);
302 FilePath::StringType id = 297 FilePath::StringType id =
303 webkit_glue::WebStringToFilePathString(origin_id); 298 webkit_glue::WebStringToFilePathString(origin_id);
304 return storageDir.Append(id.append(kLocalStorageExtension)); 299 return storageDir.Append(id.append(kLocalStorageExtension));
305 } 300 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698