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

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: test and nicer 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 110 matching lines...) Expand 10 before | Expand all | Expand 10 after
121 : data_path.AppendASCII(kSessionStorageDirectory), 121 : data_path.AppendASCII(kSessionStorageDirectory),
122 special_storage_policy, 122 special_storage_policy,
123 new DOMStorageWorkerPoolTaskRunner(std::move(primary_sequence), 123 new DOMStorageWorkerPoolTaskRunner(std::move(primary_sequence),
124 std::move(commit_sequence))); 124 std::move(commit_sequence)));
125 125
126 if (base::CommandLine::ForCurrentProcess()->HasSwitch( 126 if (base::CommandLine::ForCurrentProcess()->HasSwitch(
127 switches::kMojoLocalStorage)) { 127 switches::kMojoLocalStorage)) {
128 base::FilePath storage_dir; 128 base::FilePath storage_dir;
129 if (!profile_path.empty()) 129 if (!profile_path.empty())
130 storage_dir = local_partition_path.AppendASCII(kLocalStorageDirectory); 130 storage_dir = local_partition_path.AppendASCII(kLocalStorageDirectory);
131 // TODO(michaeln): Enable writing to disk when db is versioned, 131 // TODO(mek): Use a SequencedTaskRunner once mojo supports that.
132 // for now using an empty subdirectory to use an in-memory db. 132 mojo_task_runner_ =
133 // subdirectory_(subdirectory), 133 BrowserThread::GetTaskRunnerForThread(BrowserThread::IO);
134 mojo_state_.reset(new LocalStorageContextMojo( 134 mojo_state_ = new LocalStorageContextMojo(
135 connector, context_->task_runner(), 135 connector, context_->task_runner(),
136 data_path.empty() ? data_path 136 data_path.empty() ? data_path
137 : data_path.AppendASCII(kLocalStorageDirectory), 137 : data_path.AppendASCII(kLocalStorageDirectory),
138 storage_dir)); 138 storage_dir, special_storage_policy);
139 } 139 }
140 140
141 if (base::FeatureList::IsEnabled(features::kMemoryCoordinator)) { 141 if (base::FeatureList::IsEnabled(features::kMemoryCoordinator)) {
142 base::MemoryCoordinatorClientRegistry::GetInstance()->Register(this); 142 base::MemoryCoordinatorClientRegistry::GetInstance()->Register(this);
143 } else { 143 } else {
144 memory_pressure_listener_.reset(new base::MemoryPressureListener( 144 memory_pressure_listener_.reset(new base::MemoryPressureListener(
145 base::Bind(&DOMStorageContextWrapper::OnMemoryPressure, this))); 145 base::Bind(&DOMStorageContextWrapper::OnMemoryPressure, this)));
146 } 146 }
147 } 147 }
148 148
149 DOMStorageContextWrapper::~DOMStorageContextWrapper() {} 149 DOMStorageContextWrapper::~DOMStorageContextWrapper() {}
150 150
151 void DOMStorageContextWrapper::GetLocalStorageUsage( 151 void DOMStorageContextWrapper::GetLocalStorageUsage(
152 const GetLocalStorageUsageCallback& callback) { 152 const GetLocalStorageUsageCallback& callback) {
153 DCHECK(context_.get()); 153 DCHECK(context_.get());
154 if (mojo_state_) { 154 if (mojo_state_) {
155 mojo_state_->GetStorageUsage(base::BindOnce( 155 mojo_task_runner_->PostTask(
156 &DOMStorageContextWrapper::GotMojoLocalStorageUsage, this, callback)); 156 FROM_HERE,
157 base::BindOnce(
158 &LocalStorageContextMojo::GetStorageUsage, mojo_state_,
159 base::BindOnce(
160 &DOMStorageContextWrapper::GotMojoLocalStorageUsage, this,
161 callback,
162 base::RetainedRef(base::ThreadTaskRunnerHandle::Get()))));
157 return; 163 return;
158 } 164 }
159 context_->task_runner()->PostShutdownBlockingTask( 165 context_->task_runner()->PostShutdownBlockingTask(
160 FROM_HERE, DOMStorageTaskRunner::PRIMARY_SEQUENCE, 166 FROM_HERE, DOMStorageTaskRunner::PRIMARY_SEQUENCE,
161 base::Bind(&GetLocalStorageUsageHelper, 167 base::Bind(&GetLocalStorageUsageHelper,
162 std::vector<LocalStorageUsageInfo>(), 168 std::vector<LocalStorageUsageInfo>(),
163 base::RetainedRef(base::ThreadTaskRunnerHandle::Get()), 169 base::RetainedRef(base::ThreadTaskRunnerHandle::Get()),
164 base::RetainedRef(context_), callback)); 170 base::RetainedRef(context_), callback));
165 } 171 }
166 172
167 void DOMStorageContextWrapper::GetSessionStorageUsage( 173 void DOMStorageContextWrapper::GetSessionStorageUsage(
168 const GetSessionStorageUsageCallback& callback) { 174 const GetSessionStorageUsageCallback& callback) {
169 DCHECK(context_.get()); 175 DCHECK(context_.get());
170 context_->task_runner()->PostShutdownBlockingTask( 176 context_->task_runner()->PostShutdownBlockingTask(
171 FROM_HERE, DOMStorageTaskRunner::PRIMARY_SEQUENCE, 177 FROM_HERE, DOMStorageTaskRunner::PRIMARY_SEQUENCE,
172 base::Bind(&GetSessionStorageUsageHelper, 178 base::Bind(&GetSessionStorageUsageHelper,
173 base::RetainedRef(base::ThreadTaskRunnerHandle::Get()), 179 base::RetainedRef(base::ThreadTaskRunnerHandle::Get()),
174 base::RetainedRef(context_), callback)); 180 base::RetainedRef(context_), callback));
175 } 181 }
176 182
177 void DOMStorageContextWrapper::DeleteLocalStorageForPhysicalOrigin( 183 void DOMStorageContextWrapper::DeleteLocalStorageForPhysicalOrigin(
178 const GURL& origin) { 184 const GURL& origin) {
179 DCHECK(context_.get()); 185 DCHECK(context_.get());
180 context_->task_runner()->PostShutdownBlockingTask( 186 context_->task_runner()->PostShutdownBlockingTask(
181 FROM_HERE, DOMStorageTaskRunner::PRIMARY_SEQUENCE, 187 FROM_HERE, DOMStorageTaskRunner::PRIMARY_SEQUENCE,
182 base::Bind(&DOMStorageContextImpl::DeleteLocalStorageForPhysicalOrigin, 188 base::Bind(&DOMStorageContextImpl::DeleteLocalStorageForPhysicalOrigin,
183 context_, origin)); 189 context_, origin));
184 if (mojo_state_) 190 if (mojo_state_)
185 mojo_state_->DeleteStorageForPhysicalOrigin(url::Origin(origin)); 191 mojo_task_runner_->PostTask(
192 FROM_HERE,
193 base::BindOnce(&LocalStorageContextMojo::DeleteStorageForPhysicalOrigin,
194 mojo_state_, url::Origin(origin)));
186 } 195 }
187 196
188 void DOMStorageContextWrapper::DeleteLocalStorage(const GURL& origin) { 197 void DOMStorageContextWrapper::DeleteLocalStorage(const GURL& origin) {
189 DCHECK(context_.get()); 198 DCHECK(context_.get());
190 context_->task_runner()->PostShutdownBlockingTask( 199 context_->task_runner()->PostShutdownBlockingTask(
191 FROM_HERE, 200 FROM_HERE,
192 DOMStorageTaskRunner::PRIMARY_SEQUENCE, 201 DOMStorageTaskRunner::PRIMARY_SEQUENCE,
193 base::Bind(&DOMStorageContextImpl::DeleteLocalStorage, context_, origin)); 202 base::Bind(&DOMStorageContextImpl::DeleteLocalStorage, context_, origin));
194 if (mojo_state_) 203 if (mojo_state_)
195 mojo_state_->DeleteStorage(url::Origin(origin)); 204 mojo_task_runner_->PostTask(
205 FROM_HERE, base::BindOnce(&LocalStorageContextMojo::DeleteStorage,
206 mojo_state_, url::Origin(origin)));
196 } 207 }
197 208
198 void DOMStorageContextWrapper::DeleteSessionStorage( 209 void DOMStorageContextWrapper::DeleteSessionStorage(
199 const SessionStorageUsageInfo& usage_info) { 210 const SessionStorageUsageInfo& usage_info) {
200 DCHECK(context_.get()); 211 DCHECK(context_.get());
201 context_->task_runner()->PostShutdownBlockingTask( 212 context_->task_runner()->PostShutdownBlockingTask(
202 FROM_HERE, 213 FROM_HERE,
203 DOMStorageTaskRunner::PRIMARY_SEQUENCE, 214 DOMStorageTaskRunner::PRIMARY_SEQUENCE,
204 base::Bind(&DOMStorageContextImpl::DeleteSessionStorage, 215 base::Bind(&DOMStorageContextImpl::DeleteSessionStorage,
205 context_, usage_info)); 216 context_, usage_info));
(...skipping 19 matching lines...) Expand all
225 base::Bind(&DOMStorageContextImpl::StartScavengingUnusedSessionStorage, 236 base::Bind(&DOMStorageContextImpl::StartScavengingUnusedSessionStorage,
226 context_)); 237 context_));
227 } 238 }
228 239
229 void DOMStorageContextWrapper::SetForceKeepSessionState() { 240 void DOMStorageContextWrapper::SetForceKeepSessionState() {
230 DCHECK(context_.get()); 241 DCHECK(context_.get());
231 context_->task_runner()->PostShutdownBlockingTask( 242 context_->task_runner()->PostShutdownBlockingTask(
232 FROM_HERE, 243 FROM_HERE,
233 DOMStorageTaskRunner::PRIMARY_SEQUENCE, 244 DOMStorageTaskRunner::PRIMARY_SEQUENCE,
234 base::Bind(&DOMStorageContextImpl::SetForceKeepSessionState, context_)); 245 base::Bind(&DOMStorageContextImpl::SetForceKeepSessionState, context_));
246 if (mojo_state_)
247 mojo_task_runner_->PostTask(
248 FROM_HERE,
249 base::BindOnce(&LocalStorageContextMojo::SetForceKeepSessionState,
250 mojo_state_));
235 } 251 }
236 252
237 void DOMStorageContextWrapper::Shutdown() { 253 void DOMStorageContextWrapper::Shutdown() {
238 DCHECK(context_.get()); 254 DCHECK(context_.get());
239 mojo_state_.reset(); 255 if (mojo_state_) {
256 mojo_task_runner_->PostTask(
257 FROM_HERE,
258 base::BindOnce(&LocalStorageContextMojo::Shutdown, mojo_state_));
259 }
240 memory_pressure_listener_.reset(); 260 memory_pressure_listener_.reset();
241 context_->task_runner()->PostShutdownBlockingTask( 261 context_->task_runner()->PostShutdownBlockingTask(
242 FROM_HERE, 262 FROM_HERE,
243 DOMStorageTaskRunner::PRIMARY_SEQUENCE, 263 DOMStorageTaskRunner::PRIMARY_SEQUENCE,
244 base::Bind(&DOMStorageContextImpl::Shutdown, context_)); 264 base::Bind(&DOMStorageContextImpl::Shutdown, context_));
245 if (base::FeatureList::IsEnabled(features::kMemoryCoordinator)) { 265 if (base::FeatureList::IsEnabled(features::kMemoryCoordinator)) {
246 base::MemoryCoordinatorClientRegistry::GetInstance()->Unregister(this); 266 base::MemoryCoordinatorClientRegistry::GetInstance()->Unregister(this);
247 } 267 }
248 268
249 } 269 }
250 270
251 void DOMStorageContextWrapper::Flush() { 271 void DOMStorageContextWrapper::Flush() {
252 DCHECK(context_.get()); 272 DCHECK(context_.get());
273
253 context_->task_runner()->PostShutdownBlockingTask( 274 context_->task_runner()->PostShutdownBlockingTask(
254 FROM_HERE, DOMStorageTaskRunner::PRIMARY_SEQUENCE, 275 FROM_HERE, DOMStorageTaskRunner::PRIMARY_SEQUENCE,
255 base::Bind(&DOMStorageContextImpl::Flush, context_)); 276 base::Bind(&DOMStorageContextImpl::Flush, context_));
256 if (mojo_state_) 277 if (mojo_state_)
257 mojo_state_->Flush(); 278 mojo_task_runner_->PostTask(
279 FROM_HERE,
280 base::BindOnce(&LocalStorageContextMojo::Flush, mojo_state_));
258 } 281 }
259 282
260 void DOMStorageContextWrapper::OpenLocalStorage( 283 void DOMStorageContextWrapper::OpenLocalStorage(
261 const url::Origin& origin, 284 const url::Origin& origin,
262 mojom::LevelDBWrapperRequest request) { 285 mojom::LevelDBWrapperRequest request) {
263 if (!mojo_state_) 286 if (!mojo_state_)
264 return; 287 return;
265 mojo_state_->OpenLocalStorage(origin, std::move(request)); 288 mojo_task_runner_->PostTask(
289 FROM_HERE, base::BindOnce(&LocalStorageContextMojo::OpenLocalStorage,
290 mojo_state_, origin, std::move(request)));
266 } 291 }
267 292
268 void DOMStorageContextWrapper::OnMemoryPressure( 293 void DOMStorageContextWrapper::OnMemoryPressure(
269 base::MemoryPressureListener::MemoryPressureLevel memory_pressure_level) { 294 base::MemoryPressureListener::MemoryPressureLevel memory_pressure_level) {
270 DOMStorageContextImpl::PurgeOption purge_option = 295 DOMStorageContextImpl::PurgeOption purge_option =
271 DOMStorageContextImpl::PURGE_UNOPENED; 296 DOMStorageContextImpl::PURGE_UNOPENED;
272 if (memory_pressure_level == 297 if (memory_pressure_level ==
273 base::MemoryPressureListener::MEMORY_PRESSURE_LEVEL_CRITICAL) { 298 base::MemoryPressureListener::MEMORY_PRESSURE_LEVEL_CRITICAL) {
274 purge_option = DOMStorageContextImpl::PURGE_AGGRESSIVE; 299 purge_option = DOMStorageContextImpl::PURGE_AGGRESSIVE;
275 } 300 }
276 PurgeMemory(purge_option); 301 PurgeMemory(purge_option);
277 } 302 }
278 303
279 void DOMStorageContextWrapper::OnPurgeMemory() { 304 void DOMStorageContextWrapper::OnPurgeMemory() {
280 PurgeMemory(DOMStorageContextImpl::PURGE_AGGRESSIVE); 305 PurgeMemory(DOMStorageContextImpl::PURGE_AGGRESSIVE);
281 } 306 }
282 307
283 void DOMStorageContextWrapper::PurgeMemory(DOMStorageContextImpl::PurgeOption 308 void DOMStorageContextWrapper::PurgeMemory(DOMStorageContextImpl::PurgeOption
284 purge_option) { 309 purge_option) {
285 context_->task_runner()->PostTask( 310 context_->task_runner()->PostTask(
286 FROM_HERE, 311 FROM_HERE,
287 base::Bind(&DOMStorageContextImpl::PurgeMemory, context_, purge_option)); 312 base::Bind(&DOMStorageContextImpl::PurgeMemory, context_, purge_option));
288 if (mojo_state_ && purge_option == DOMStorageContextImpl::PURGE_AGGRESSIVE) 313 if (mojo_state_ && purge_option == DOMStorageContextImpl::PURGE_AGGRESSIVE)
289 mojo_state_->PurgeMemory(); 314 mojo_task_runner_->PostTask(
315 FROM_HERE,
316 base::BindOnce(&LocalStorageContextMojo::PurgeMemory, mojo_state_));
290 } 317 }
291 318
292 void DOMStorageContextWrapper::GotMojoLocalStorageUsage( 319 void DOMStorageContextWrapper::GotMojoLocalStorageUsage(
293 GetLocalStorageUsageCallback callback, 320 GetLocalStorageUsageCallback callback,
321 base::SingleThreadTaskRunner* reply_task_runner,
294 std::vector<LocalStorageUsageInfo> usage) { 322 std::vector<LocalStorageUsageInfo> usage) {
295 context_->task_runner()->PostShutdownBlockingTask( 323 context_->task_runner()->PostShutdownBlockingTask(
296 FROM_HERE, DOMStorageTaskRunner::PRIMARY_SEQUENCE, 324 FROM_HERE, DOMStorageTaskRunner::PRIMARY_SEQUENCE,
297 base::Bind(&GetLocalStorageUsageHelper, base::Passed(&usage), 325 base::Bind(&GetLocalStorageUsageHelper, base::Passed(&usage),
298 base::RetainedRef(base::ThreadTaskRunnerHandle::Get()), 326 base::RetainedRef(reply_task_runner),
299 base::RetainedRef(context_), callback)); 327 base::RetainedRef(context_), callback));
300 } 328 }
301 329
302 } // namespace content 330 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698