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

Side by Side Diff: webkit/dom_storage/dom_storage_namespace.cc

Issue 9963107: Persist sessionStorage on disk. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: . Created 8 years, 8 months 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) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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 "webkit/dom_storage/dom_storage_namespace.h" 5 #include "webkit/dom_storage/dom_storage_namespace.h"
6 6
7 #include "base/basictypes.h" 7 #include "base/basictypes.h"
8 #include "base/logging.h" 8 #include "base/logging.h"
9 #include "webkit/dom_storage/dom_storage_area.h" 9 #include "webkit/dom_storage/dom_storage_area.h"
10 #include "webkit/dom_storage/dom_storage_task_runner.h" 10 #include "webkit/dom_storage/dom_storage_task_runner.h"
11 #include "webkit/dom_storage/dom_storage_types.h" 11 #include "webkit/dom_storage/dom_storage_types.h"
12 #include "webkit/dom_storage/session_storage_database.h"
12 13
13 namespace dom_storage { 14 namespace dom_storage {
14 15
15 DomStorageNamespace::DomStorageNamespace( 16 DomStorageNamespace::DomStorageNamespace(
16 const FilePath& directory, 17 const FilePath& directory,
17 DomStorageTaskRunner* task_runner) 18 DomStorageTaskRunner* task_runner)
18 : namespace_id_(kLocalStorageNamespaceId), 19 : namespace_id_(kLocalStorageNamespaceId),
19 directory_(directory), 20 directory_(directory),
20 task_runner_(task_runner) { 21 task_runner_(task_runner) {
21 } 22 }
22 23
23 DomStorageNamespace::DomStorageNamespace( 24 DomStorageNamespace::DomStorageNamespace(
24 int64 namespace_id, 25 int64 namespace_id,
25 DomStorageTaskRunner* task_runner) 26 DomStorageTaskRunner* task_runner)
26 : namespace_id_(namespace_id), 27 : namespace_id_(namespace_id),
27 task_runner_(task_runner) { 28 task_runner_(task_runner) {
28 DCHECK_NE(kLocalStorageNamespaceId, namespace_id); 29 DCHECK_NE(kLocalStorageNamespaceId, namespace_id);
29 } 30 }
30 31
32 DomStorageNamespace::DomStorageNamespace(
33 int64 namespace_id,
34 SessionStorageDatabase* session_storage_database,
35 DomStorageTaskRunner* task_runner)
36 : namespace_id_(namespace_id),
37 task_runner_(task_runner),
38 session_storage_database_(session_storage_database) {
39 DCHECK_NE(kLocalStorageNamespaceId, namespace_id);
40 }
41
31 DomStorageNamespace::~DomStorageNamespace() { 42 DomStorageNamespace::~DomStorageNamespace() {
43 if (session_storage_database_.get())
44 session_storage_database_->DeleteNamespace(namespace_id_);
32 } 45 }
33 46
34 DomStorageArea* DomStorageNamespace::OpenStorageArea(const GURL& origin) { 47 DomStorageArea* DomStorageNamespace::OpenStorageArea(const GURL& origin) {
35 if (AreaHolder* holder = GetAreaHolder(origin)) { 48 if (AreaHolder* holder = GetAreaHolder(origin)) {
36 ++(holder->open_count_); 49 ++(holder->open_count_);
37 return holder->area_; 50 return holder->area_;
38 } 51 }
39 DomStorageArea* area = new DomStorageArea(namespace_id_, origin, 52 DomStorageArea* area;
40 directory_, task_runner_); 53 if (!directory_.empty()) {
54 // Local storage backed on disk.
55 area = new DomStorageArea(namespace_id_, origin, directory_, task_runner_);
56 } else if (session_storage_database_.get()) {
57 // Session storage backed on disk.
58 area = new DomStorageArea(namespace_id_, origin, session_storage_database_,
59 task_runner_);
60 } else {
61 // In-memory.
62 area = new DomStorageArea(namespace_id_, origin, task_runner_);
63 }
41 areas_[origin] = AreaHolder(area, 1); 64 areas_[origin] = AreaHolder(area, 1);
42 return area; 65 return area;
43 } 66 }
44 67
45 void DomStorageNamespace::CloseStorageArea(DomStorageArea* area) { 68 void DomStorageNamespace::CloseStorageArea(DomStorageArea* area) {
46 AreaHolder* holder = GetAreaHolder(area->origin()); 69 AreaHolder* holder = GetAreaHolder(area->origin());
47 DCHECK(holder); 70 DCHECK(holder);
48 DCHECK_EQ(holder->area_.get(), area); 71 DCHECK_EQ(holder->area_.get(), area);
49 --(holder->open_count_); 72 --(holder->open_count_);
50 // TODO(michaeln): Clean up areas that aren't needed in memory anymore. 73 // TODO(michaeln): Clean up areas that aren't needed in memory anymore.
51 // The in-process-webkit based impl didn't do this either, but would be nice. 74 // The in-process-webkit based impl didn't do this either, but would be nice.
52 } 75 }
53 76
54 DomStorageNamespace* DomStorageNamespace::Clone(int64 clone_namespace_id) { 77 DomStorageNamespace* DomStorageNamespace::Clone(int64 clone_namespace_id) {
55 DCHECK_NE(kLocalStorageNamespaceId, namespace_id_); 78 DCHECK_NE(kLocalStorageNamespaceId, namespace_id_);
56 DCHECK_NE(kLocalStorageNamespaceId, clone_namespace_id); 79 DCHECK_NE(kLocalStorageNamespaceId, clone_namespace_id);
57 DomStorageNamespace* clone = 80 DomStorageNamespace* clone = new DomStorageNamespace(
58 new DomStorageNamespace(clone_namespace_id, task_runner_); 81 clone_namespace_id, session_storage_database_, task_runner_);
59 AreaMap::const_iterator it = areas_.begin(); 82 AreaMap::const_iterator it = areas_.begin();
60 for (; it != areas_.end(); ++it) { 83 for (; it != areas_.end(); ++it) {
61 DomStorageArea* area = it->second.area_->ShallowCopy(clone_namespace_id); 84 DomStorageArea* area = it->second.area_->ShallowCopy(clone_namespace_id);
62 clone->areas_[it->first] = AreaHolder(area, 0); 85 clone->areas_[it->first] = AreaHolder(area, 0);
63 } 86 }
64 return clone; 87 return clone;
65 } 88 }
66 89
67 void DomStorageNamespace::DeleteOrigin(const GURL& origin) { 90 void DomStorageNamespace::DeleteOrigin(const GURL& origin) {
68 AreaHolder* holder = GetAreaHolder(origin); 91 AreaHolder* holder = GetAreaHolder(origin);
69 if (holder) { 92 if (holder) {
70 holder->area_->DeleteOrigin(); 93 holder->area_->DeleteOrigin();
71 return; 94 return;
72 } 95 }
73 if (!directory_.empty()) { 96 if (!directory_.empty()) {
74 scoped_refptr<DomStorageArea> area = 97 scoped_refptr<DomStorageArea> area =
75 new DomStorageArea(namespace_id_, origin, directory_, task_runner_); 98 new DomStorageArea(namespace_id_, origin, directory_, task_runner_);
76 area->DeleteOrigin(); 99 area->DeleteOrigin();
100 } else if (session_storage_database_.get()) {
101 scoped_refptr<DomStorageArea> area =
102 new DomStorageArea(namespace_id_, origin,
103 session_storage_database_.get(), task_runner_);
104 area->DeleteOrigin();
77 } 105 }
78 } 106 }
79 107
80 void DomStorageNamespace::PurgeMemory() { 108 void DomStorageNamespace::PurgeMemory() {
81 if (directory_.empty()) 109 if (directory_.empty())
82 return; // We can't purge w/o backing on disk. 110 return; // We can't purge w/o backing on disk.
83 AreaMap::iterator it = areas_.begin(); 111 AreaMap::iterator it = areas_.begin();
84 while (it != areas_.end()) { 112 while (it != areas_.end()) {
85 // Leave it alone if changes are pending 113 // Leave it alone if changes are pending
86 if (it->second.area_->HasUncommittedChanges()) { 114 if (it->second.area_->HasUncommittedChanges()) {
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
125 153
126 DomStorageNamespace::AreaHolder::AreaHolder( 154 DomStorageNamespace::AreaHolder::AreaHolder(
127 DomStorageArea* area, int count) 155 DomStorageArea* area, int count)
128 : area_(area), open_count_(count) { 156 : area_(area), open_count_(count) {
129 } 157 }
130 158
131 DomStorageNamespace::AreaHolder::~AreaHolder() { 159 DomStorageNamespace::AreaHolder::~AreaHolder() {
132 } 160 }
133 161
134 } // namespace dom_storage 162 } // namespace dom_storage
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698