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

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

Issue 2861473002: Clear up session only storage on localstorage shutdown (Closed)
Patch Set: address comments Created 3 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
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 "content/browser/dom_storage/dom_storage_context_wrapper.h" 5 #include "content/browser/dom_storage/dom_storage_context_wrapper.h"
6 6
7 #include <string> 7 #include <string>
8 #include <vector> 8 #include <vector>
9 9
10 #include "base/bind.h" 10 #include "base/bind.h"
(...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after
119 : data_path.AppendASCII(kSessionStorageDirectory), 119 : data_path.AppendASCII(kSessionStorageDirectory),
120 special_storage_policy, 120 special_storage_policy,
121 new DOMStorageWorkerPoolTaskRunner(std::move(primary_sequence), 121 new DOMStorageWorkerPoolTaskRunner(std::move(primary_sequence),
122 std::move(commit_sequence))); 122 std::move(commit_sequence)));
123 123
124 if (base::CommandLine::ForCurrentProcess()->HasSwitch( 124 if (base::CommandLine::ForCurrentProcess()->HasSwitch(
125 switches::kMojoLocalStorage)) { 125 switches::kMojoLocalStorage)) {
126 base::FilePath storage_dir; 126 base::FilePath storage_dir;
127 if (!profile_path.empty()) 127 if (!profile_path.empty())
128 storage_dir = local_partition_path.AppendASCII(kLocalStorageDirectory); 128 storage_dir = local_partition_path.AppendASCII(kLocalStorageDirectory);
129 // TODO(michaeln): Enable writing to disk when db is versioned, 129 // TODO(mek): Use a SequencedTaskRunner once mojo no longer requires a
130 // for now using an empty subdirectory to use an in-memory db. 130 // SingleThreadTaskRunner (http://crbug.com/678155).
131 // subdirectory_(subdirectory), 131 mojo_task_runner_ =
132 mojo_state_.reset(new LocalStorageContextMojo( 132 BrowserThread::GetTaskRunnerForThread(BrowserThread::IO);
133 mojo_state_ = new LocalStorageContextMojo(
133 connector, context_->task_runner(), 134 connector, context_->task_runner(),
134 data_path.empty() ? data_path 135 data_path.empty() ? data_path
135 : data_path.AppendASCII(kLocalStorageDirectory), 136 : data_path.AppendASCII(kLocalStorageDirectory),
136 storage_dir)); 137 storage_dir, special_storage_policy);
137 } 138 }
138 139
139 if (base::FeatureList::IsEnabled(features::kMemoryCoordinator)) { 140 if (base::FeatureList::IsEnabled(features::kMemoryCoordinator)) {
140 base::MemoryCoordinatorClientRegistry::GetInstance()->Register(this); 141 base::MemoryCoordinatorClientRegistry::GetInstance()->Register(this);
141 } else { 142 } else {
142 memory_pressure_listener_.reset(new base::MemoryPressureListener( 143 memory_pressure_listener_.reset(new base::MemoryPressureListener(
143 base::Bind(&DOMStorageContextWrapper::OnMemoryPressure, this))); 144 base::Bind(&DOMStorageContextWrapper::OnMemoryPressure, this)));
144 } 145 }
145 } 146 }
146 147
147 DOMStorageContextWrapper::~DOMStorageContextWrapper() {} 148 DOMStorageContextWrapper::~DOMStorageContextWrapper() {
149 DCHECK(!mojo_state_) << "Shutdown should be called before destruction";
150 }
148 151
149 void DOMStorageContextWrapper::GetLocalStorageUsage( 152 void DOMStorageContextWrapper::GetLocalStorageUsage(
150 const GetLocalStorageUsageCallback& callback) { 153 const GetLocalStorageUsageCallback& callback) {
151 DCHECK(context_.get()); 154 DCHECK(context_.get());
152 if (mojo_state_) { 155 if (mojo_state_) {
153 mojo_state_->GetStorageUsage(base::BindOnce( 156 // base::Unretained is safe here, because the mojo_state_ won't be deleted
154 &DOMStorageContextWrapper::GotMojoLocalStorageUsage, this, callback)); 157 // until a ShutdownAndDelete task has been ran on the mojo_task_runner_, and
158 // as soon as that task is posted, mojo_state_ is set to null, preventing
159 // further tasks from being queued.
160 mojo_task_runner_->PostTask(
161 FROM_HERE,
162 base::BindOnce(
163 &LocalStorageContextMojo::GetStorageUsage,
164 base::Unretained(mojo_state_),
165 base::BindOnce(
166 &DOMStorageContextWrapper::GotMojoLocalStorageUsage, this,
167 callback,
168 base::RetainedRef(base::ThreadTaskRunnerHandle::Get()))));
155 return; 169 return;
156 } 170 }
157 context_->task_runner()->PostShutdownBlockingTask( 171 context_->task_runner()->PostShutdownBlockingTask(
158 FROM_HERE, DOMStorageTaskRunner::PRIMARY_SEQUENCE, 172 FROM_HERE, DOMStorageTaskRunner::PRIMARY_SEQUENCE,
159 base::Bind(&GetLocalStorageUsageHelper, 173 base::Bind(&GetLocalStorageUsageHelper,
160 std::vector<LocalStorageUsageInfo>(), 174 std::vector<LocalStorageUsageInfo>(),
161 base::RetainedRef(base::ThreadTaskRunnerHandle::Get()), 175 base::RetainedRef(base::ThreadTaskRunnerHandle::Get()),
162 base::RetainedRef(context_), callback)); 176 base::RetainedRef(context_), callback));
163 } 177 }
164 178
165 void DOMStorageContextWrapper::GetSessionStorageUsage( 179 void DOMStorageContextWrapper::GetSessionStorageUsage(
166 const GetSessionStorageUsageCallback& callback) { 180 const GetSessionStorageUsageCallback& callback) {
167 DCHECK(context_.get()); 181 DCHECK(context_.get());
168 context_->task_runner()->PostShutdownBlockingTask( 182 context_->task_runner()->PostShutdownBlockingTask(
169 FROM_HERE, DOMStorageTaskRunner::PRIMARY_SEQUENCE, 183 FROM_HERE, DOMStorageTaskRunner::PRIMARY_SEQUENCE,
170 base::Bind(&GetSessionStorageUsageHelper, 184 base::Bind(&GetSessionStorageUsageHelper,
171 base::RetainedRef(base::ThreadTaskRunnerHandle::Get()), 185 base::RetainedRef(base::ThreadTaskRunnerHandle::Get()),
172 base::RetainedRef(context_), callback)); 186 base::RetainedRef(context_), callback));
173 } 187 }
174 188
175 void DOMStorageContextWrapper::DeleteLocalStorageForPhysicalOrigin( 189 void DOMStorageContextWrapper::DeleteLocalStorageForPhysicalOrigin(
176 const GURL& origin) { 190 const GURL& origin) {
177 DCHECK(context_.get()); 191 DCHECK(context_.get());
178 context_->task_runner()->PostShutdownBlockingTask( 192 context_->task_runner()->PostShutdownBlockingTask(
179 FROM_HERE, DOMStorageTaskRunner::PRIMARY_SEQUENCE, 193 FROM_HERE, DOMStorageTaskRunner::PRIMARY_SEQUENCE,
180 base::Bind(&DOMStorageContextImpl::DeleteLocalStorageForPhysicalOrigin, 194 base::Bind(&DOMStorageContextImpl::DeleteLocalStorageForPhysicalOrigin,
181 context_, origin)); 195 context_, origin));
182 if (mojo_state_) 196 if (mojo_state_) {
183 mojo_state_->DeleteStorageForPhysicalOrigin(url::Origin(origin)); 197 // base::Unretained is safe here, because the mojo_state_ won't be deleted
198 // until a ShutdownAndDelete task has been ran on the mojo_task_runner_, and
199 // as soon as that task is posted, mojo_state_ is set to null, preventing
200 // further tasks from being queued.
201 mojo_task_runner_->PostTask(
202 FROM_HERE,
203 base::BindOnce(&LocalStorageContextMojo::DeleteStorageForPhysicalOrigin,
204 base::Unretained(mojo_state_), url::Origin(origin)));
205 }
184 } 206 }
185 207
186 void DOMStorageContextWrapper::DeleteLocalStorage(const GURL& origin) { 208 void DOMStorageContextWrapper::DeleteLocalStorage(const GURL& origin) {
187 DCHECK(context_.get()); 209 DCHECK(context_.get());
188 context_->task_runner()->PostShutdownBlockingTask( 210 context_->task_runner()->PostShutdownBlockingTask(
189 FROM_HERE, 211 FROM_HERE,
190 DOMStorageTaskRunner::PRIMARY_SEQUENCE, 212 DOMStorageTaskRunner::PRIMARY_SEQUENCE,
191 base::Bind(&DOMStorageContextImpl::DeleteLocalStorage, context_, origin)); 213 base::Bind(&DOMStorageContextImpl::DeleteLocalStorage, context_, origin));
192 if (mojo_state_) 214 if (mojo_state_) {
193 mojo_state_->DeleteStorage(url::Origin(origin)); 215 // base::Unretained is safe here, because the mojo_state_ won't be deleted
216 // until a ShutdownAndDelete task has been ran on the mojo_task_runner_, and
217 // as soon as that task is posted, mojo_state_ is set to null, preventing
218 // further tasks from being queued.
219 mojo_task_runner_->PostTask(
220 FROM_HERE,
221 base::BindOnce(&LocalStorageContextMojo::DeleteStorage,
222 base::Unretained(mojo_state_), url::Origin(origin)));
223 }
194 } 224 }
195 225
196 void DOMStorageContextWrapper::DeleteSessionStorage( 226 void DOMStorageContextWrapper::DeleteSessionStorage(
197 const SessionStorageUsageInfo& usage_info) { 227 const SessionStorageUsageInfo& usage_info) {
198 DCHECK(context_.get()); 228 DCHECK(context_.get());
199 context_->task_runner()->PostShutdownBlockingTask( 229 context_->task_runner()->PostShutdownBlockingTask(
200 FROM_HERE, 230 FROM_HERE,
201 DOMStorageTaskRunner::PRIMARY_SEQUENCE, 231 DOMStorageTaskRunner::PRIMARY_SEQUENCE,
202 base::Bind(&DOMStorageContextImpl::DeleteSessionStorage, 232 base::Bind(&DOMStorageContextImpl::DeleteSessionStorage,
203 context_, usage_info)); 233 context_, usage_info));
(...skipping 19 matching lines...) Expand all
223 base::Bind(&DOMStorageContextImpl::StartScavengingUnusedSessionStorage, 253 base::Bind(&DOMStorageContextImpl::StartScavengingUnusedSessionStorage,
224 context_)); 254 context_));
225 } 255 }
226 256
227 void DOMStorageContextWrapper::SetForceKeepSessionState() { 257 void DOMStorageContextWrapper::SetForceKeepSessionState() {
228 DCHECK(context_.get()); 258 DCHECK(context_.get());
229 context_->task_runner()->PostShutdownBlockingTask( 259 context_->task_runner()->PostShutdownBlockingTask(
230 FROM_HERE, 260 FROM_HERE,
231 DOMStorageTaskRunner::PRIMARY_SEQUENCE, 261 DOMStorageTaskRunner::PRIMARY_SEQUENCE,
232 base::Bind(&DOMStorageContextImpl::SetForceKeepSessionState, context_)); 262 base::Bind(&DOMStorageContextImpl::SetForceKeepSessionState, context_));
263 if (mojo_state_) {
264 // base::Unretained is safe here, because the mojo_state_ won't be deleted
265 // until a ShutdownAndDelete task has been ran on the mojo_task_runner_, and
266 // as soon as that task is posted, mojo_state_ is set to null, preventing
267 // further tasks from being queued.
268 mojo_task_runner_->PostTask(
269 FROM_HERE,
270 base::BindOnce(&LocalStorageContextMojo::SetForceKeepSessionState,
271 base::Unretained(mojo_state_)));
272 }
233 } 273 }
234 274
235 void DOMStorageContextWrapper::Shutdown() { 275 void DOMStorageContextWrapper::Shutdown() {
236 DCHECK(context_.get()); 276 DCHECK(context_.get());
237 mojo_state_.reset(); 277 if (mojo_state_) {
278 mojo_task_runner_->PostTask(
279 FROM_HERE, base::BindOnce(&LocalStorageContextMojo::ShutdownAndDelete,
280 base::Unretained(mojo_state_)));
281 mojo_state_ = nullptr;
282 }
238 memory_pressure_listener_.reset(); 283 memory_pressure_listener_.reset();
239 context_->task_runner()->PostShutdownBlockingTask( 284 context_->task_runner()->PostShutdownBlockingTask(
240 FROM_HERE, 285 FROM_HERE,
241 DOMStorageTaskRunner::PRIMARY_SEQUENCE, 286 DOMStorageTaskRunner::PRIMARY_SEQUENCE,
242 base::Bind(&DOMStorageContextImpl::Shutdown, context_)); 287 base::Bind(&DOMStorageContextImpl::Shutdown, context_));
243 if (base::FeatureList::IsEnabled(features::kMemoryCoordinator)) { 288 if (base::FeatureList::IsEnabled(features::kMemoryCoordinator)) {
244 base::MemoryCoordinatorClientRegistry::GetInstance()->Unregister(this); 289 base::MemoryCoordinatorClientRegistry::GetInstance()->Unregister(this);
245 } 290 }
246 291
247 } 292 }
248 293
249 void DOMStorageContextWrapper::Flush() { 294 void DOMStorageContextWrapper::Flush() {
250 DCHECK(context_.get()); 295 DCHECK(context_.get());
296
251 context_->task_runner()->PostShutdownBlockingTask( 297 context_->task_runner()->PostShutdownBlockingTask(
252 FROM_HERE, DOMStorageTaskRunner::PRIMARY_SEQUENCE, 298 FROM_HERE, DOMStorageTaskRunner::PRIMARY_SEQUENCE,
253 base::Bind(&DOMStorageContextImpl::Flush, context_)); 299 base::Bind(&DOMStorageContextImpl::Flush, context_));
254 if (mojo_state_) 300 if (mojo_state_) {
255 mojo_state_->Flush(); 301 // base::Unretained is safe here, because the mojo_state_ won't be deleted
302 // until a ShutdownAndDelete task has been ran on the mojo_task_runner_, and
303 // as soon as that task is posted, mojo_state_ is set to null, preventing
304 // further tasks from being queued.
305 mojo_task_runner_->PostTask(FROM_HERE,
306 base::BindOnce(&LocalStorageContextMojo::Flush,
307 base::Unretained(mojo_state_)));
308 }
256 } 309 }
257 310
258 void DOMStorageContextWrapper::OpenLocalStorage( 311 void DOMStorageContextWrapper::OpenLocalStorage(
259 const url::Origin& origin, 312 const url::Origin& origin,
260 mojom::LevelDBWrapperRequest request) { 313 mojom::LevelDBWrapperRequest request) {
261 if (!mojo_state_) 314 if (!mojo_state_)
262 return; 315 return;
263 mojo_state_->OpenLocalStorage(origin, std::move(request)); 316 // base::Unretained is safe here, because the mojo_state_ won't be deleted
317 // until a ShutdownAndDelete task has been ran on the mojo_task_runner_, and
318 // as soon as that task is posted, mojo_state_ is set to null, preventing
319 // further tasks from being queued.
320 mojo_task_runner_->PostTask(
321 FROM_HERE, base::BindOnce(&LocalStorageContextMojo::OpenLocalStorage,
322 base::Unretained(mojo_state_), origin,
323 std::move(request)));
264 } 324 }
265 325
266 void DOMStorageContextWrapper::OnMemoryPressure( 326 void DOMStorageContextWrapper::OnMemoryPressure(
267 base::MemoryPressureListener::MemoryPressureLevel memory_pressure_level) { 327 base::MemoryPressureListener::MemoryPressureLevel memory_pressure_level) {
268 DOMStorageContextImpl::PurgeOption purge_option = 328 DOMStorageContextImpl::PurgeOption purge_option =
269 DOMStorageContextImpl::PURGE_UNOPENED; 329 DOMStorageContextImpl::PURGE_UNOPENED;
270 if (memory_pressure_level == 330 if (memory_pressure_level ==
271 base::MemoryPressureListener::MEMORY_PRESSURE_LEVEL_CRITICAL) { 331 base::MemoryPressureListener::MEMORY_PRESSURE_LEVEL_CRITICAL) {
272 purge_option = DOMStorageContextImpl::PURGE_AGGRESSIVE; 332 purge_option = DOMStorageContextImpl::PURGE_AGGRESSIVE;
273 } 333 }
274 PurgeMemory(purge_option); 334 PurgeMemory(purge_option);
275 } 335 }
276 336
277 void DOMStorageContextWrapper::OnPurgeMemory() { 337 void DOMStorageContextWrapper::OnPurgeMemory() {
278 PurgeMemory(DOMStorageContextImpl::PURGE_AGGRESSIVE); 338 PurgeMemory(DOMStorageContextImpl::PURGE_AGGRESSIVE);
279 } 339 }
280 340
281 void DOMStorageContextWrapper::PurgeMemory(DOMStorageContextImpl::PurgeOption 341 void DOMStorageContextWrapper::PurgeMemory(DOMStorageContextImpl::PurgeOption
282 purge_option) { 342 purge_option) {
283 context_->task_runner()->PostTask( 343 context_->task_runner()->PostTask(
284 FROM_HERE, 344 FROM_HERE,
285 base::Bind(&DOMStorageContextImpl::PurgeMemory, context_, purge_option)); 345 base::Bind(&DOMStorageContextImpl::PurgeMemory, context_, purge_option));
286 if (mojo_state_ && purge_option == DOMStorageContextImpl::PURGE_AGGRESSIVE) 346 if (mojo_state_ && purge_option == DOMStorageContextImpl::PURGE_AGGRESSIVE) {
287 mojo_state_->PurgeMemory(); 347 // base::Unretained is safe here, because the mojo_state_ won't be deleted
348 // until a ShutdownAndDelete task has been ran on the mojo_task_runner_, and
349 // as soon as that task is posted, mojo_state_ is set to null, preventing
350 // further tasks from being queued.
351 mojo_task_runner_->PostTask(
352 FROM_HERE, base::BindOnce(&LocalStorageContextMojo::PurgeMemory,
353 base::Unretained(mojo_state_)));
354 }
288 } 355 }
289 356
290 void DOMStorageContextWrapper::GotMojoLocalStorageUsage( 357 void DOMStorageContextWrapper::GotMojoLocalStorageUsage(
291 GetLocalStorageUsageCallback callback, 358 GetLocalStorageUsageCallback callback,
359 base::SingleThreadTaskRunner* reply_task_runner,
292 std::vector<LocalStorageUsageInfo> usage) { 360 std::vector<LocalStorageUsageInfo> usage) {
293 context_->task_runner()->PostShutdownBlockingTask( 361 context_->task_runner()->PostShutdownBlockingTask(
294 FROM_HERE, DOMStorageTaskRunner::PRIMARY_SEQUENCE, 362 FROM_HERE, DOMStorageTaskRunner::PRIMARY_SEQUENCE,
295 base::Bind(&GetLocalStorageUsageHelper, base::Passed(&usage), 363 base::Bind(&GetLocalStorageUsageHelper, base::Passed(&usage),
296 base::RetainedRef(base::ThreadTaskRunnerHandle::Get()), 364 base::RetainedRef(reply_task_runner),
297 base::RetainedRef(context_), callback)); 365 base::RetainedRef(context_), callback));
298 } 366 }
299 367
300 } // namespace content 368 } // namespace content
OLDNEW
« no previous file with comments | « content/browser/dom_storage/dom_storage_context_wrapper.h ('k') | content/browser/dom_storage/local_storage_context_mojo.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698