OLD | NEW |
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 Loading... |
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 Loading... |
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 |
OLD | NEW |