| 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 110 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 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 Loading... |
| 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 |
| OLD | NEW |