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

Side by Side Diff: content/browser/dom_storage/dom_storage_context_impl_unittest.cc

Issue 1102263003: Discard uncommitted changes when shutting down DOMStorageArea Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 7 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
« no previous file with comments | « content/browser/dom_storage/dom_storage_area_unittest.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 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 "base/bind.h" 5 #include "base/bind.h"
6 #include "base/files/file_util.h" 6 #include "base/files/file_util.h"
7 #include "base/files/scoped_temp_dir.h" 7 #include "base/files/scoped_temp_dir.h"
8 #include "base/message_loop/message_loop.h" 8 #include "base/message_loop/message_loop.h"
9 #include "base/message_loop/message_loop_proxy.h" 9 #include "base/message_loop/message_loop_proxy.h"
10 #include "base/strings/utf_string_conversions.h" 10 #include "base/strings/utf_string_conversions.h"
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after
95 TEST_F(DOMStorageContextImplTest, UsageInfo) { 95 TEST_F(DOMStorageContextImplTest, UsageInfo) {
96 // Should be empty initially 96 // Should be empty initially
97 std::vector<LocalStorageUsageInfo> infos; 97 std::vector<LocalStorageUsageInfo> infos;
98 context_->GetLocalStorageUsage(&infos, kDontIncludeFileInfo); 98 context_->GetLocalStorageUsage(&infos, kDontIncludeFileInfo);
99 EXPECT_TRUE(infos.empty()); 99 EXPECT_TRUE(infos.empty());
100 context_->GetLocalStorageUsage(&infos, kDoIncludeFileInfo); 100 context_->GetLocalStorageUsage(&infos, kDoIncludeFileInfo);
101 EXPECT_TRUE(infos.empty()); 101 EXPECT_TRUE(infos.empty());
102 102
103 // Put some data into local storage and shutdown the context 103 // Put some data into local storage and shutdown the context
104 // to ensure data is written to disk. 104 // to ensure data is written to disk.
105 auto* area = context_->GetStorageNamespace(kLocalStorageNamespaceId)->
106 OpenStorageArea(kOrigin);
105 base::NullableString16 old_value; 107 base::NullableString16 old_value;
106 EXPECT_TRUE(context_->GetStorageNamespace(kLocalStorageNamespaceId)-> 108 EXPECT_TRUE(area->SetItem(kKey, kValue, &old_value));
107 OpenStorageArea(kOrigin)->SetItem(kKey, kValue, &old_value)); 109 area->ScheduleImmediateCommit();
108 context_->Shutdown(); 110 context_->Shutdown();
109 context_ = NULL; 111 context_ = NULL;
110 base::MessageLoop::current()->RunUntilIdle(); 112 base::MessageLoop::current()->RunUntilIdle();
111 113
112 // Create a new context that points to the same directory, see that 114 // Create a new context that points to the same directory, see that
113 // it knows about the origin that we stored data for. 115 // it knows about the origin that we stored data for.
114 context_ = new DOMStorageContextImpl(temp_dir_.path(), base::FilePath(), 116 context_ = new DOMStorageContextImpl(temp_dir_.path(), base::FilePath(),
115 NULL, NULL); 117 NULL, NULL);
116 context_->GetLocalStorageUsage(&infos, kDontIncludeFileInfo); 118 context_->GetLocalStorageUsage(&infos, kDontIncludeFileInfo);
117 EXPECT_EQ(1u, infos.size()); 119 EXPECT_EQ(1u, infos.size());
118 EXPECT_EQ(kOrigin, infos[0].origin); 120 EXPECT_EQ(kOrigin, infos[0].origin);
119 EXPECT_EQ(0u, infos[0].data_size); 121 EXPECT_EQ(0u, infos[0].data_size);
120 EXPECT_EQ(base::Time(), infos[0].last_modified); 122 EXPECT_EQ(base::Time(), infos[0].last_modified);
121 infos.clear(); 123 infos.clear();
122 context_->GetLocalStorageUsage(&infos, kDoIncludeFileInfo); 124 context_->GetLocalStorageUsage(&infos, kDoIncludeFileInfo);
123 EXPECT_EQ(1u, infos.size()); 125 EXPECT_EQ(1u, infos.size());
124 EXPECT_EQ(kOrigin, infos[0].origin); 126 EXPECT_EQ(kOrigin, infos[0].origin);
125 EXPECT_NE(0u, infos[0].data_size); 127 EXPECT_NE(0u, infos[0].data_size);
126 EXPECT_NE(base::Time(), infos[0].last_modified); 128 EXPECT_NE(base::Time(), infos[0].last_modified);
127 } 129 }
128 130
129 TEST_F(DOMStorageContextImplTest, SessionOnly) { 131 TEST_F(DOMStorageContextImplTest, SessionOnly) {
130 const GURL kSessionOnlyOrigin("http://www.sessiononly.com/"); 132 const GURL kSessionOnlyOrigin("http://www.sessiononly.com/");
131 storage_policy_->AddSessionOnly(kSessionOnlyOrigin); 133 storage_policy_->AddSessionOnly(kSessionOnlyOrigin);
132 134
133 // Store data for a normal and a session-only origin and then 135 // Store data for a normal and a session-only origin and then
134 // invoke Shutdown() which should delete data for session-only 136 // invoke Shutdown() which should delete data for session-only
135 // origins. 137 // origins.
138 auto* dom_namespace = context_->GetStorageNamespace(kLocalStorageNamespaceId);
136 base::NullableString16 old_value; 139 base::NullableString16 old_value;
137 EXPECT_TRUE(context_->GetStorageNamespace(kLocalStorageNamespaceId)-> 140 auto* area = dom_namespace->OpenStorageArea(kOrigin);
138 OpenStorageArea(kOrigin)->SetItem(kKey, kValue, &old_value)); 141 EXPECT_TRUE(area->SetItem(kKey, kValue, &old_value));
139 EXPECT_TRUE(context_->GetStorageNamespace(kLocalStorageNamespaceId)-> 142 area->ScheduleImmediateCommit();
140 OpenStorageArea(kSessionOnlyOrigin)->SetItem(kKey, kValue, &old_value)); 143 auto* session_only_area = dom_namespace->OpenStorageArea(kSessionOnlyOrigin);
144 EXPECT_TRUE(session_only_area->SetItem(kKey, kValue, &old_value));
145 session_only_area->ScheduleImmediateCommit();
141 context_->Shutdown(); 146 context_->Shutdown();
142 context_ = NULL; 147 context_ = NULL;
143 base::MessageLoop::current()->RunUntilIdle(); 148 base::MessageLoop::current()->RunUntilIdle();
144 149
145 // Verify that the session-only origin data is gone. 150 // Verify that the session-only origin data is gone.
146 VerifySingleOriginRemains(kOrigin); 151 VerifySingleOriginRemains(kOrigin);
147 } 152 }
148 153
149 TEST_F(DOMStorageContextImplTest, SetForceKeepSessionState) { 154 TEST_F(DOMStorageContextImplTest, SetForceKeepSessionState) {
150 const GURL kSessionOnlyOrigin("http://www.sessiononly.com/"); 155 const GURL kSessionOnlyOrigin("http://www.sessiononly.com/");
151 storage_policy_->AddSessionOnly(kSessionOnlyOrigin); 156 storage_policy_->AddSessionOnly(kSessionOnlyOrigin);
152 157
153 // Store data for a session-only origin, setup to save session data, then 158 // Store data for a session-only origin, setup to save session data, then
154 // shutdown. 159 // shutdown.
160 auto* area = context_->GetStorageNamespace(kLocalStorageNamespaceId)->
161 OpenStorageArea(kSessionOnlyOrigin);
155 base::NullableString16 old_value; 162 base::NullableString16 old_value;
156 EXPECT_TRUE(context_->GetStorageNamespace(kLocalStorageNamespaceId)-> 163 EXPECT_TRUE(area->SetItem(kKey, kValue, &old_value));
157 OpenStorageArea(kSessionOnlyOrigin)->SetItem(kKey, kValue, &old_value)); 164 area->ScheduleImmediateCommit();
158 context_->SetForceKeepSessionState(); // Should override clear behavior. 165 context_->SetForceKeepSessionState(); // Should override clear behavior.
159 context_->Shutdown(); 166 context_->Shutdown();
160 context_ = NULL; 167 context_ = NULL;
161 base::MessageLoop::current()->RunUntilIdle(); 168 base::MessageLoop::current()->RunUntilIdle();
162 169
163 VerifySingleOriginRemains(kSessionOnlyOrigin); 170 VerifySingleOriginRemains(kSessionOnlyOrigin);
164 } 171 }
165 172
166 TEST_F(DOMStorageContextImplTest, PersistentIds) { 173 TEST_F(DOMStorageContextImplTest, PersistentIds) {
167 const int kFirstSessionStorageNamespaceId = 1 + session_id_offset(); 174 const int kFirstSessionStorageNamespaceId = 1 + session_id_offset();
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
206 const std::string kPersistentId = "persistent"; 213 const std::string kPersistentId = "persistent";
207 context_->CreateSessionNamespace(kSessionStorageNamespaceId, 214 context_->CreateSessionNamespace(kSessionStorageNamespaceId,
208 kPersistentId); 215 kPersistentId);
209 DOMStorageNamespace* dom_namespace = 216 DOMStorageNamespace* dom_namespace =
210 context_->GetStorageNamespace(kSessionStorageNamespaceId); 217 context_->GetStorageNamespace(kSessionStorageNamespaceId);
211 DOMStorageArea* area = dom_namespace->OpenStorageArea(kOrigin); 218 DOMStorageArea* area = dom_namespace->OpenStorageArea(kOrigin);
212 const base::string16 kKey(ASCIIToUTF16("foo")); 219 const base::string16 kKey(ASCIIToUTF16("foo"));
213 const base::string16 kValue(ASCIIToUTF16("bar")); 220 const base::string16 kValue(ASCIIToUTF16("bar"));
214 base::NullableString16 old_nullable_value; 221 base::NullableString16 old_nullable_value;
215 area->SetItem(kKey, kValue, &old_nullable_value); 222 area->SetItem(kKey, kValue, &old_nullable_value);
223 area->ScheduleImmediateCommit();
216 dom_namespace->CloseStorageArea(area); 224 dom_namespace->CloseStorageArea(area);
217 225
218 // Destroy and recreate the DOMStorageContextImpl. 226 // Destroy and recreate the DOMStorageContextImpl.
219 context_->Shutdown(); 227 context_->Shutdown();
220 context_ = NULL; 228 context_ = NULL;
221 base::MessageLoop::current()->RunUntilIdle(); 229 base::MessageLoop::current()->RunUntilIdle();
222 context_ = new DOMStorageContextImpl( 230 context_ = new DOMStorageContextImpl(
223 temp_dir_.path(), temp_dir_.path(), 231 temp_dir_.path(), temp_dir_.path(),
224 storage_policy_.get(), task_runner_.get()); 232 storage_policy_.get(), task_runner_.get());
225 context_->SetSaveSessionStorageOnDisk(); 233 context_->SetSaveSessionStorageOnDisk();
226 234
227 // Read the data back. 235 // Read the data back.
228 context_->CreateSessionNamespace(kSessionStorageNamespaceId, 236 context_->CreateSessionNamespace(kSessionStorageNamespaceId,
229 kPersistentId); 237 kPersistentId);
230 dom_namespace = context_->GetStorageNamespace(kSessionStorageNamespaceId); 238 dom_namespace = context_->GetStorageNamespace(kSessionStorageNamespaceId);
231 area = dom_namespace->OpenStorageArea(kOrigin); 239 area = dom_namespace->OpenStorageArea(kOrigin);
232 base::NullableString16 read_value; 240 base::NullableString16 read_value;
233 read_value = area->GetItem(kKey); 241 read_value = area->GetItem(kKey);
234 EXPECT_EQ(kValue, read_value.string()); 242 EXPECT_EQ(kValue, read_value.string());
235 dom_namespace->CloseStorageArea(area); 243 dom_namespace->CloseStorageArea(area);
236 244
237 SessionStorageUsageInfo info; 245 SessionStorageUsageInfo info;
238 info.origin = kOrigin; 246 info.origin = kOrigin;
239 info.persistent_namespace_id = kPersistentId; 247 info.persistent_namespace_id = kPersistentId;
240 context_->DeleteSessionStorage(info); 248 context_->DeleteSessionStorage(info);
249 area->ScheduleImmediateCommit();
241 250
242 // Destroy and recreate again. 251 // Destroy and recreate again.
243 context_->Shutdown(); 252 context_->Shutdown();
244 context_ = NULL; 253 context_ = NULL;
245 base::MessageLoop::current()->RunUntilIdle(); 254 base::MessageLoop::current()->RunUntilIdle();
246 context_ = new DOMStorageContextImpl( 255 context_ = new DOMStorageContextImpl(
247 temp_dir_.path(), temp_dir_.path(), 256 temp_dir_.path(), temp_dir_.path(),
248 storage_policy_.get(), task_runner_.get()); 257 storage_policy_.get(), task_runner_.get());
249 context_->SetSaveSessionStorageOnDisk(); 258 context_->SetSaveSessionStorageOnDisk();
250 259
251 // Now there should be no data. 260 // Now there should be no data.
252 context_->CreateSessionNamespace(kSessionStorageNamespaceId, 261 context_->CreateSessionNamespace(kSessionStorageNamespaceId,
253 kPersistentId); 262 kPersistentId);
254 dom_namespace = context_->GetStorageNamespace(kSessionStorageNamespaceId); 263 dom_namespace = context_->GetStorageNamespace(kSessionStorageNamespaceId);
255 area = dom_namespace->OpenStorageArea(kOrigin); 264 area = dom_namespace->OpenStorageArea(kOrigin);
256 read_value = area->GetItem(kKey); 265 read_value = area->GetItem(kKey);
257 EXPECT_TRUE(read_value.is_null()); 266 EXPECT_TRUE(read_value.is_null());
258 dom_namespace->CloseStorageArea(area); 267 dom_namespace->CloseStorageArea(area);
259 context_->Shutdown(); 268 context_->Shutdown();
260 context_ = NULL; 269 context_ = NULL;
261 base::MessageLoop::current()->RunUntilIdle(); 270 base::MessageLoop::current()->RunUntilIdle();
262 } 271 }
263 272
264 } // namespace content 273 } // namespace content
OLDNEW
« no previous file with comments | « content/browser/dom_storage/dom_storage_area_unittest.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698