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 |