| 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 | 
|---|