Index: content/browser/dom_storage/dom_storage_context_wrapper.cc |
diff --git a/content/browser/dom_storage/dom_storage_context_wrapper.cc b/content/browser/dom_storage/dom_storage_context_wrapper.cc |
index 64964fe9e4fb6df6712067b3958b6b7836c66992..fbfda0dc61fb5cabb27ace3f32734d458e58f48a 100644 |
--- a/content/browser/dom_storage/dom_storage_context_wrapper.cc |
+++ b/content/browser/dom_storage/dom_storage_context_wrapper.cc |
@@ -126,14 +126,15 @@ DOMStorageContextWrapper::DOMStorageContextWrapper( |
base::FilePath storage_dir; |
if (!profile_path.empty()) |
storage_dir = local_partition_path.AppendASCII(kLocalStorageDirectory); |
- // TODO(michaeln): Enable writing to disk when db is versioned, |
- // for now using an empty subdirectory to use an in-memory db. |
- // subdirectory_(subdirectory), |
- mojo_state_.reset(new LocalStorageContextMojo( |
+ // TODO(mek): Use a SequencedTaskRunner once mojo no longer requires a |
+ // SingleThreadTaskRunner (http://crbug.com/678155). |
+ mojo_task_runner_ = |
+ BrowserThread::GetTaskRunnerForThread(BrowserThread::IO); |
+ mojo_state_ = new LocalStorageContextMojo( |
connector, context_->task_runner(), |
data_path.empty() ? data_path |
: data_path.AppendASCII(kLocalStorageDirectory), |
- storage_dir)); |
+ storage_dir, special_storage_policy); |
} |
if (base::FeatureList::IsEnabled(features::kMemoryCoordinator)) { |
@@ -144,14 +145,27 @@ DOMStorageContextWrapper::DOMStorageContextWrapper( |
} |
} |
-DOMStorageContextWrapper::~DOMStorageContextWrapper() {} |
+DOMStorageContextWrapper::~DOMStorageContextWrapper() { |
+ DCHECK(!mojo_state_) << "Shutdown should be called before destruction"; |
+} |
void DOMStorageContextWrapper::GetLocalStorageUsage( |
const GetLocalStorageUsageCallback& callback) { |
DCHECK(context_.get()); |
if (mojo_state_) { |
- mojo_state_->GetStorageUsage(base::BindOnce( |
- &DOMStorageContextWrapper::GotMojoLocalStorageUsage, this, callback)); |
+ // base::Unretained is safe here, because the mojo_state_ won't be deleted |
+ // until a ShutdownAndDelete task has been ran on the mojo_task_runner_, and |
+ // as soon as that task is posted, mojo_state_ is set to null, preventing |
+ // further tasks from being queued. |
+ mojo_task_runner_->PostTask( |
+ FROM_HERE, |
+ base::BindOnce( |
+ &LocalStorageContextMojo::GetStorageUsage, |
+ base::Unretained(mojo_state_), |
+ base::BindOnce( |
+ &DOMStorageContextWrapper::GotMojoLocalStorageUsage, this, |
+ callback, |
+ base::RetainedRef(base::ThreadTaskRunnerHandle::Get())))); |
return; |
} |
context_->task_runner()->PostShutdownBlockingTask( |
@@ -179,8 +193,16 @@ void DOMStorageContextWrapper::DeleteLocalStorageForPhysicalOrigin( |
FROM_HERE, DOMStorageTaskRunner::PRIMARY_SEQUENCE, |
base::Bind(&DOMStorageContextImpl::DeleteLocalStorageForPhysicalOrigin, |
context_, origin)); |
- if (mojo_state_) |
- mojo_state_->DeleteStorageForPhysicalOrigin(url::Origin(origin)); |
+ if (mojo_state_) { |
+ // base::Unretained is safe here, because the mojo_state_ won't be deleted |
+ // until a ShutdownAndDelete task has been ran on the mojo_task_runner_, and |
+ // as soon as that task is posted, mojo_state_ is set to null, preventing |
+ // further tasks from being queued. |
+ mojo_task_runner_->PostTask( |
+ FROM_HERE, |
+ base::BindOnce(&LocalStorageContextMojo::DeleteStorageForPhysicalOrigin, |
+ base::Unretained(mojo_state_), url::Origin(origin))); |
+ } |
} |
void DOMStorageContextWrapper::DeleteLocalStorage(const GURL& origin) { |
@@ -189,8 +211,16 @@ void DOMStorageContextWrapper::DeleteLocalStorage(const GURL& origin) { |
FROM_HERE, |
DOMStorageTaskRunner::PRIMARY_SEQUENCE, |
base::Bind(&DOMStorageContextImpl::DeleteLocalStorage, context_, origin)); |
- if (mojo_state_) |
- mojo_state_->DeleteStorage(url::Origin(origin)); |
+ if (mojo_state_) { |
+ // base::Unretained is safe here, because the mojo_state_ won't be deleted |
+ // until a ShutdownAndDelete task has been ran on the mojo_task_runner_, and |
+ // as soon as that task is posted, mojo_state_ is set to null, preventing |
+ // further tasks from being queued. |
+ mojo_task_runner_->PostTask( |
+ FROM_HERE, |
+ base::BindOnce(&LocalStorageContextMojo::DeleteStorage, |
+ base::Unretained(mojo_state_), url::Origin(origin))); |
+ } |
} |
void DOMStorageContextWrapper::DeleteSessionStorage( |
@@ -230,11 +260,26 @@ void DOMStorageContextWrapper::SetForceKeepSessionState() { |
FROM_HERE, |
DOMStorageTaskRunner::PRIMARY_SEQUENCE, |
base::Bind(&DOMStorageContextImpl::SetForceKeepSessionState, context_)); |
+ if (mojo_state_) { |
+ // base::Unretained is safe here, because the mojo_state_ won't be deleted |
+ // until a ShutdownAndDelete task has been ran on the mojo_task_runner_, and |
+ // as soon as that task is posted, mojo_state_ is set to null, preventing |
+ // further tasks from being queued. |
+ mojo_task_runner_->PostTask( |
+ FROM_HERE, |
+ base::BindOnce(&LocalStorageContextMojo::SetForceKeepSessionState, |
+ base::Unretained(mojo_state_))); |
+ } |
} |
void DOMStorageContextWrapper::Shutdown() { |
DCHECK(context_.get()); |
- mojo_state_.reset(); |
+ if (mojo_state_) { |
+ mojo_task_runner_->PostTask( |
+ FROM_HERE, base::BindOnce(&LocalStorageContextMojo::ShutdownAndDelete, |
+ base::Unretained(mojo_state_))); |
+ mojo_state_ = nullptr; |
+ } |
memory_pressure_listener_.reset(); |
context_->task_runner()->PostShutdownBlockingTask( |
FROM_HERE, |
@@ -248,11 +293,19 @@ void DOMStorageContextWrapper::Shutdown() { |
void DOMStorageContextWrapper::Flush() { |
DCHECK(context_.get()); |
+ |
context_->task_runner()->PostShutdownBlockingTask( |
FROM_HERE, DOMStorageTaskRunner::PRIMARY_SEQUENCE, |
base::Bind(&DOMStorageContextImpl::Flush, context_)); |
- if (mojo_state_) |
- mojo_state_->Flush(); |
+ if (mojo_state_) { |
+ // base::Unretained is safe here, because the mojo_state_ won't be deleted |
+ // until a ShutdownAndDelete task has been ran on the mojo_task_runner_, and |
+ // as soon as that task is posted, mojo_state_ is set to null, preventing |
+ // further tasks from being queued. |
+ mojo_task_runner_->PostTask(FROM_HERE, |
+ base::BindOnce(&LocalStorageContextMojo::Flush, |
+ base::Unretained(mojo_state_))); |
+ } |
} |
void DOMStorageContextWrapper::OpenLocalStorage( |
@@ -260,7 +313,14 @@ void DOMStorageContextWrapper::OpenLocalStorage( |
mojom::LevelDBWrapperRequest request) { |
if (!mojo_state_) |
return; |
- mojo_state_->OpenLocalStorage(origin, std::move(request)); |
+ // base::Unretained is safe here, because the mojo_state_ won't be deleted |
+ // until a ShutdownAndDelete task has been ran on the mojo_task_runner_, and |
+ // as soon as that task is posted, mojo_state_ is set to null, preventing |
+ // further tasks from being queued. |
+ mojo_task_runner_->PostTask( |
+ FROM_HERE, base::BindOnce(&LocalStorageContextMojo::OpenLocalStorage, |
+ base::Unretained(mojo_state_), origin, |
+ std::move(request))); |
} |
void DOMStorageContextWrapper::OnMemoryPressure( |
@@ -283,17 +343,25 @@ void DOMStorageContextWrapper::PurgeMemory(DOMStorageContextImpl::PurgeOption |
context_->task_runner()->PostTask( |
FROM_HERE, |
base::Bind(&DOMStorageContextImpl::PurgeMemory, context_, purge_option)); |
- if (mojo_state_ && purge_option == DOMStorageContextImpl::PURGE_AGGRESSIVE) |
- mojo_state_->PurgeMemory(); |
+ if (mojo_state_ && purge_option == DOMStorageContextImpl::PURGE_AGGRESSIVE) { |
+ // base::Unretained is safe here, because the mojo_state_ won't be deleted |
+ // until a ShutdownAndDelete task has been ran on the mojo_task_runner_, and |
+ // as soon as that task is posted, mojo_state_ is set to null, preventing |
+ // further tasks from being queued. |
+ mojo_task_runner_->PostTask( |
+ FROM_HERE, base::BindOnce(&LocalStorageContextMojo::PurgeMemory, |
+ base::Unretained(mojo_state_))); |
+ } |
} |
void DOMStorageContextWrapper::GotMojoLocalStorageUsage( |
GetLocalStorageUsageCallback callback, |
+ base::SingleThreadTaskRunner* reply_task_runner, |
std::vector<LocalStorageUsageInfo> usage) { |
context_->task_runner()->PostShutdownBlockingTask( |
FROM_HERE, DOMStorageTaskRunner::PRIMARY_SEQUENCE, |
base::Bind(&GetLocalStorageUsageHelper, base::Passed(&usage), |
- base::RetainedRef(base::ThreadTaskRunnerHandle::Get()), |
+ base::RetainedRef(reply_task_runner), |
base::RetainedRef(context_), callback)); |
} |