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/service_worker/service_worker_storage.h" | 5 #include "content/browser/service_worker/service_worker_storage.h" |
6 | 6 |
7 #include <string> | 7 #include <string> |
8 | 8 |
9 #include "base/bind_helpers.h" | 9 #include "base/bind_helpers.h" |
10 #include "base/debug/trace_event.h" | 10 #include "base/debug/trace_event.h" |
11 #include "base/files/file_util.h" | 11 #include "base/files/file_util.h" |
12 #include "base/hash.h" | 12 #include "base/hash.h" |
13 #include "base/message_loop/message_loop.h" | 13 #include "base/message_loop/message_loop.h" |
14 #include "base/sequenced_task_runner.h" | 14 #include "base/sequenced_task_runner.h" |
15 #include "base/single_thread_task_runner.h" | 15 #include "base/single_thread_task_runner.h" |
16 #include "base/task_runner_util.h" | 16 #include "base/task_runner_util.h" |
17 #include "content/browser/service_worker/service_worker_context_core.h" | 17 #include "content/browser/service_worker/service_worker_context_core.h" |
18 #include "content/browser/service_worker/service_worker_disk_cache.h" | 18 #include "content/browser/service_worker/service_worker_disk_cache.h" |
19 #include "content/browser/service_worker/service_worker_info.h" | 19 #include "content/browser/service_worker/service_worker_info.h" |
20 #include "content/browser/service_worker/service_worker_metrics.h" | 20 #include "content/browser/service_worker/service_worker_metrics.h" |
21 #include "content/browser/service_worker/service_worker_registration.h" | 21 #include "content/browser/service_worker/service_worker_registration.h" |
22 #include "content/browser/service_worker/service_worker_utils.h" | 22 #include "content/browser/service_worker/service_worker_utils.h" |
23 #include "content/browser/service_worker/service_worker_version.h" | 23 #include "content/browser/service_worker/service_worker_version.h" |
24 #include "content/common/service_worker/service_worker_types.h" | 24 #include "content/common/service_worker/service_worker_types.h" |
25 #include "content/public/browser/browser_thread.h" | 25 #include "content/public/browser/browser_thread.h" |
26 #include "net/base/completion_callback.h" | 26 #include "net/base/completion_callback.h" |
27 #include "net/base/io_buffer.h" | 27 #include "net/base/io_buffer.h" |
28 #include "net/base/net_errors.h" | 28 #include "net/base/net_errors.h" |
29 #include "storage/browser/quota/quota_manager_proxy.h" | 29 #include "storage/browser/quota/quota_manager_proxy.h" |
| 30 #include "storage/browser/quota/special_storage_policy.h" |
30 | 31 |
31 namespace content { | 32 namespace content { |
32 | 33 |
33 namespace { | 34 namespace { |
34 | 35 |
35 void RunSoon(const tracked_objects::Location& from_here, | 36 void RunSoon(const tracked_objects::Location& from_here, |
36 const base::Closure& closure) { | 37 const base::Closure& closure) { |
37 base::MessageLoop::current()->PostTask(from_here, closure); | 38 base::MessageLoop::current()->PostTask(from_here, closure); |
38 } | 39 } |
39 | 40 |
(...skipping 171 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
211 ServiceWorkerStorage:: | 212 ServiceWorkerStorage:: |
212 DidDeleteRegistrationParams::DidDeleteRegistrationParams() | 213 DidDeleteRegistrationParams::DidDeleteRegistrationParams() |
213 : registration_id(kInvalidServiceWorkerRegistrationId) { | 214 : registration_id(kInvalidServiceWorkerRegistrationId) { |
214 } | 215 } |
215 | 216 |
216 ServiceWorkerStorage:: | 217 ServiceWorkerStorage:: |
217 DidDeleteRegistrationParams::~DidDeleteRegistrationParams() { | 218 DidDeleteRegistrationParams::~DidDeleteRegistrationParams() { |
218 } | 219 } |
219 | 220 |
220 ServiceWorkerStorage::~ServiceWorkerStorage() { | 221 ServiceWorkerStorage::~ServiceWorkerStorage() { |
| 222 ClearSessionOnlyOrigins(); |
221 weak_factory_.InvalidateWeakPtrs(); | 223 weak_factory_.InvalidateWeakPtrs(); |
222 database_task_runner_->DeleteSoon(FROM_HERE, database_.release()); | 224 database_task_manager_->GetTaskRunner()->DeleteSoon(FROM_HERE, |
| 225 database_.release()); |
223 } | 226 } |
224 | 227 |
225 // static | 228 // static |
226 scoped_ptr<ServiceWorkerStorage> ServiceWorkerStorage::Create( | 229 scoped_ptr<ServiceWorkerStorage> ServiceWorkerStorage::Create( |
227 const base::FilePath& path, | 230 const base::FilePath& path, |
228 base::WeakPtr<ServiceWorkerContextCore> context, | 231 base::WeakPtr<ServiceWorkerContextCore> context, |
229 const scoped_refptr<base::SequencedTaskRunner>& database_task_runner, | 232 scoped_ptr<ServiceWorkerDatabaseTaskManager> database_task_manager, |
230 const scoped_refptr<base::SingleThreadTaskRunner>& disk_cache_thread, | 233 const scoped_refptr<base::SingleThreadTaskRunner>& disk_cache_thread, |
231 storage::QuotaManagerProxy* quota_manager_proxy) { | 234 storage::QuotaManagerProxy* quota_manager_proxy, |
| 235 storage::SpecialStoragePolicy* special_storage_policy) { |
232 return make_scoped_ptr(new ServiceWorkerStorage(path, | 236 return make_scoped_ptr(new ServiceWorkerStorage(path, |
233 context, | 237 context, |
234 database_task_runner, | 238 database_task_manager.Pass(), |
235 disk_cache_thread, | 239 disk_cache_thread, |
236 quota_manager_proxy)); | 240 quota_manager_proxy, |
| 241 special_storage_policy)); |
237 } | 242 } |
238 | 243 |
239 // static | 244 // static |
240 scoped_ptr<ServiceWorkerStorage> ServiceWorkerStorage::Create( | 245 scoped_ptr<ServiceWorkerStorage> ServiceWorkerStorage::Create( |
241 base::WeakPtr<ServiceWorkerContextCore> context, | 246 base::WeakPtr<ServiceWorkerContextCore> context, |
242 ServiceWorkerStorage* old_storage) { | 247 ServiceWorkerStorage* old_storage) { |
243 return make_scoped_ptr( | 248 return make_scoped_ptr( |
244 new ServiceWorkerStorage(old_storage->path_, | 249 new ServiceWorkerStorage(old_storage->path_, |
245 context, | 250 context, |
246 old_storage->database_task_runner_, | 251 old_storage->database_task_manager_->Clone(), |
247 old_storage->disk_cache_thread_, | 252 old_storage->disk_cache_thread_, |
248 old_storage->quota_manager_proxy_.get())); | 253 old_storage->quota_manager_proxy_.get(), |
| 254 old_storage->special_storage_policy_.get())); |
249 } | 255 } |
250 | 256 |
251 void ServiceWorkerStorage::FindRegistrationForDocument( | 257 void ServiceWorkerStorage::FindRegistrationForDocument( |
252 const GURL& document_url, | 258 const GURL& document_url, |
253 const FindRegistrationCallback& callback) { | 259 const FindRegistrationCallback& callback) { |
254 DCHECK(!document_url.has_ref()); | 260 DCHECK(!document_url.has_ref()); |
255 if (!LazyInitialize(base::Bind( | 261 if (!LazyInitialize(base::Bind( |
256 &ServiceWorkerStorage::FindRegistrationForDocument, | 262 &ServiceWorkerStorage::FindRegistrationForDocument, |
257 weak_factory_.GetWeakPtr(), document_url, callback))) { | 263 weak_factory_.GetWeakPtr(), document_url, callback))) { |
258 if (state_ != INITIALIZING || !context_) { | 264 if (state_ != INITIALIZING || !context_) { |
(...skipping 29 matching lines...) Expand all Loading... |
288 } | 294 } |
289 | 295 |
290 // To connect this TRACE_EVENT with the callback, TimeTicks is used for | 296 // To connect this TRACE_EVENT with the callback, TimeTicks is used for |
291 // callback id. | 297 // callback id. |
292 int64 callback_id = base::TimeTicks::Now().ToInternalValue(); | 298 int64 callback_id = base::TimeTicks::Now().ToInternalValue(); |
293 TRACE_EVENT_ASYNC_BEGIN1( | 299 TRACE_EVENT_ASYNC_BEGIN1( |
294 "ServiceWorker", | 300 "ServiceWorker", |
295 "ServiceWorkerStorage::FindRegistrationForDocument", | 301 "ServiceWorkerStorage::FindRegistrationForDocument", |
296 callback_id, | 302 callback_id, |
297 "URL", document_url.spec()); | 303 "URL", document_url.spec()); |
298 database_task_runner_->PostTask( | 304 database_task_manager_->GetTaskRunner()->PostTask( |
299 FROM_HERE, | 305 FROM_HERE, |
300 base::Bind( | 306 base::Bind( |
301 &FindForDocumentInDB, | 307 &FindForDocumentInDB, |
302 database_.get(), | 308 database_.get(), |
303 base::MessageLoopProxy::current(), | 309 base::MessageLoopProxy::current(), |
304 document_url, | 310 document_url, |
305 base::Bind(&ServiceWorkerStorage::DidFindRegistrationForDocument, | 311 base::Bind(&ServiceWorkerStorage::DidFindRegistrationForDocument, |
306 weak_factory_.GetWeakPtr(), | 312 weak_factory_.GetWeakPtr(), |
307 document_url, | 313 document_url, |
308 callback, | 314 callback, |
(...skipping 21 matching lines...) Expand all Loading... |
330 FindInstallingRegistrationForPattern(scope); | 336 FindInstallingRegistrationForPattern(scope); |
331 CompleteFindSoon(FROM_HERE, | 337 CompleteFindSoon(FROM_HERE, |
332 installing_registration, | 338 installing_registration, |
333 installing_registration.get() | 339 installing_registration.get() |
334 ? SERVICE_WORKER_OK | 340 ? SERVICE_WORKER_OK |
335 : SERVICE_WORKER_ERROR_NOT_FOUND, | 341 : SERVICE_WORKER_ERROR_NOT_FOUND, |
336 callback); | 342 callback); |
337 return; | 343 return; |
338 } | 344 } |
339 | 345 |
340 database_task_runner_->PostTask( | 346 database_task_manager_->GetTaskRunner()->PostTask( |
341 FROM_HERE, | 347 FROM_HERE, |
342 base::Bind( | 348 base::Bind( |
343 &FindForPatternInDB, | 349 &FindForPatternInDB, |
344 database_.get(), | 350 database_.get(), |
345 base::MessageLoopProxy::current(), | 351 base::MessageLoopProxy::current(), |
346 scope, | 352 scope, |
347 base::Bind(&ServiceWorkerStorage::DidFindRegistrationForPattern, | 353 base::Bind(&ServiceWorkerStorage::DidFindRegistrationForPattern, |
348 weak_factory_.GetWeakPtr(), scope, callback))); | 354 weak_factory_.GetWeakPtr(), scope, callback))); |
349 } | 355 } |
350 | 356 |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
392 return; | 398 return; |
393 } | 399 } |
394 | 400 |
395 scoped_refptr<ServiceWorkerRegistration> registration = | 401 scoped_refptr<ServiceWorkerRegistration> registration = |
396 context_->GetLiveRegistration(registration_id); | 402 context_->GetLiveRegistration(registration_id); |
397 if (registration.get()) { | 403 if (registration.get()) { |
398 CompleteFindNow(registration, SERVICE_WORKER_OK, callback); | 404 CompleteFindNow(registration, SERVICE_WORKER_OK, callback); |
399 return; | 405 return; |
400 } | 406 } |
401 | 407 |
402 database_task_runner_->PostTask( | 408 database_task_manager_->GetTaskRunner()->PostTask( |
403 FROM_HERE, | 409 FROM_HERE, |
404 base::Bind(&FindForIdInDB, | 410 base::Bind(&FindForIdInDB, |
405 database_.get(), | 411 database_.get(), |
406 base::MessageLoopProxy::current(), | 412 base::MessageLoopProxy::current(), |
407 registration_id, origin, | 413 registration_id, origin, |
408 base::Bind(&ServiceWorkerStorage::DidFindRegistrationForId, | 414 base::Bind(&ServiceWorkerStorage::DidFindRegistrationForId, |
409 weak_factory_.GetWeakPtr(), callback))); | 415 weak_factory_.GetWeakPtr(), callback))); |
410 } | 416 } |
411 | 417 |
412 void ServiceWorkerStorage::GetAllRegistrations( | 418 void ServiceWorkerStorage::GetAllRegistrations( |
413 const GetAllRegistrationInfosCallback& callback) { | 419 const GetAllRegistrationInfosCallback& callback) { |
414 if (!LazyInitialize(base::Bind( | 420 if (!LazyInitialize(base::Bind( |
415 &ServiceWorkerStorage::GetAllRegistrations, | 421 &ServiceWorkerStorage::GetAllRegistrations, |
416 weak_factory_.GetWeakPtr(), callback))) { | 422 weak_factory_.GetWeakPtr(), callback))) { |
417 if (state_ != INITIALIZING || !context_) { | 423 if (state_ != INITIALIZING || !context_) { |
418 RunSoon(FROM_HERE, base::Bind( | 424 RunSoon(FROM_HERE, base::Bind( |
419 callback, std::vector<ServiceWorkerRegistrationInfo>())); | 425 callback, std::vector<ServiceWorkerRegistrationInfo>())); |
420 } | 426 } |
421 return; | 427 return; |
422 } | 428 } |
423 DCHECK_EQ(INITIALIZED, state_); | 429 DCHECK_EQ(INITIALIZED, state_); |
424 | 430 |
425 RegistrationList* registrations = new RegistrationList; | 431 RegistrationList* registrations = new RegistrationList; |
426 PostTaskAndReplyWithResult( | 432 PostTaskAndReplyWithResult( |
427 database_task_runner_.get(), | 433 database_task_manager_->GetTaskRunner(), |
428 FROM_HERE, | 434 FROM_HERE, |
429 base::Bind(&ServiceWorkerDatabase::GetAllRegistrations, | 435 base::Bind(&ServiceWorkerDatabase::GetAllRegistrations, |
430 base::Unretained(database_.get()), | 436 base::Unretained(database_.get()), |
431 base::Unretained(registrations)), | 437 base::Unretained(registrations)), |
432 base::Bind(&ServiceWorkerStorage::DidGetAllRegistrations, | 438 base::Bind(&ServiceWorkerStorage::DidGetAllRegistrations, |
433 weak_factory_.GetWeakPtr(), | 439 weak_factory_.GetWeakPtr(), |
434 callback, | 440 callback, |
435 base::Owned(registrations))); | 441 base::Owned(registrations))); |
436 } | 442 } |
437 | 443 |
(...skipping 18 matching lines...) Expand all Loading... |
456 data.version_id = version->version_id(); | 462 data.version_id = version->version_id(); |
457 data.last_update_check = registration->last_update_check(); | 463 data.last_update_check = registration->last_update_check(); |
458 data.is_active = (version == registration->active_version()); | 464 data.is_active = (version == registration->active_version()); |
459 | 465 |
460 ResourceList resources; | 466 ResourceList resources; |
461 version->script_cache_map()->GetResources(&resources); | 467 version->script_cache_map()->GetResources(&resources); |
462 | 468 |
463 if (!has_checked_for_stale_resources_) | 469 if (!has_checked_for_stale_resources_) |
464 DeleteStaleResources(); | 470 DeleteStaleResources(); |
465 | 471 |
466 database_task_runner_->PostTask( | 472 database_task_manager_->GetTaskRunner()->PostTask( |
467 FROM_HERE, | 473 FROM_HERE, |
468 base::Bind(&WriteRegistrationInDB, | 474 base::Bind(&WriteRegistrationInDB, |
469 database_.get(), | 475 database_.get(), |
470 base::MessageLoopProxy::current(), | 476 base::MessageLoopProxy::current(), |
471 data, resources, | 477 data, resources, |
472 base::Bind(&ServiceWorkerStorage::DidStoreRegistration, | 478 base::Bind(&ServiceWorkerStorage::DidStoreRegistration, |
473 weak_factory_.GetWeakPtr(), | 479 weak_factory_.GetWeakPtr(), |
474 callback))); | 480 callback))); |
475 | 481 |
476 registration->set_is_deleted(false); | 482 registration->set_is_deleted(false); |
477 } | 483 } |
478 | 484 |
479 void ServiceWorkerStorage::UpdateToActiveState( | 485 void ServiceWorkerStorage::UpdateToActiveState( |
480 ServiceWorkerRegistration* registration, | 486 ServiceWorkerRegistration* registration, |
481 const StatusCallback& callback) { | 487 const StatusCallback& callback) { |
482 DCHECK(registration); | 488 DCHECK(registration); |
483 | 489 |
484 DCHECK(state_ == INITIALIZED || state_ == DISABLED) << state_; | 490 DCHECK(state_ == INITIALIZED || state_ == DISABLED) << state_; |
485 if (IsDisabled() || !context_) { | 491 if (IsDisabled() || !context_) { |
486 RunSoon(FROM_HERE, base::Bind(callback, SERVICE_WORKER_ERROR_FAILED)); | 492 RunSoon(FROM_HERE, base::Bind(callback, SERVICE_WORKER_ERROR_FAILED)); |
487 return; | 493 return; |
488 } | 494 } |
489 | 495 |
490 PostTaskAndReplyWithResult( | 496 PostTaskAndReplyWithResult( |
491 database_task_runner_.get(), | 497 database_task_manager_->GetTaskRunner(), |
492 FROM_HERE, | 498 FROM_HERE, |
493 base::Bind(&ServiceWorkerDatabase::UpdateVersionToActive, | 499 base::Bind(&ServiceWorkerDatabase::UpdateVersionToActive, |
494 base::Unretained(database_.get()), | 500 base::Unretained(database_.get()), |
495 registration->id(), | 501 registration->id(), |
496 registration->pattern().GetOrigin()), | 502 registration->pattern().GetOrigin()), |
497 base::Bind(&ServiceWorkerStorage::DidUpdateToActiveState, | 503 base::Bind(&ServiceWorkerStorage::DidUpdateToActiveState, |
498 weak_factory_.GetWeakPtr(), | 504 weak_factory_.GetWeakPtr(), |
499 callback)); | 505 callback)); |
500 } | 506 } |
501 | 507 |
502 void ServiceWorkerStorage::UpdateLastUpdateCheckTime( | 508 void ServiceWorkerStorage::UpdateLastUpdateCheckTime( |
503 ServiceWorkerRegistration* registration) { | 509 ServiceWorkerRegistration* registration) { |
504 DCHECK(registration); | 510 DCHECK(registration); |
505 | 511 |
506 DCHECK(state_ == INITIALIZED || state_ == DISABLED) << state_; | 512 DCHECK(state_ == INITIALIZED || state_ == DISABLED) << state_; |
507 if (IsDisabled() || !context_) | 513 if (IsDisabled() || !context_) |
508 return; | 514 return; |
509 | 515 |
510 database_task_runner_->PostTask( | 516 database_task_manager_->GetTaskRunner()->PostTask( |
511 FROM_HERE, | 517 FROM_HERE, |
512 base::Bind( | 518 base::Bind( |
513 base::IgnoreResult(&ServiceWorkerDatabase::UpdateLastCheckTime), | 519 base::IgnoreResult(&ServiceWorkerDatabase::UpdateLastCheckTime), |
514 base::Unretained(database_.get()), | 520 base::Unretained(database_.get()), |
515 registration->id(), | 521 registration->id(), |
516 registration->pattern().GetOrigin(), | 522 registration->pattern().GetOrigin(), |
517 registration->last_update_check())); | 523 registration->last_update_check())); |
518 } | 524 } |
519 | 525 |
520 void ServiceWorkerStorage::DeleteRegistration( | 526 void ServiceWorkerStorage::DeleteRegistration( |
521 int64 registration_id, | 527 int64 registration_id, |
522 const GURL& origin, | 528 const GURL& origin, |
523 const StatusCallback& callback) { | 529 const StatusCallback& callback) { |
524 DCHECK(state_ == INITIALIZED || state_ == DISABLED) << state_; | 530 DCHECK(state_ == INITIALIZED || state_ == DISABLED) << state_; |
525 if (IsDisabled() || !context_) { | 531 if (IsDisabled() || !context_) { |
526 RunSoon(FROM_HERE, base::Bind(callback, SERVICE_WORKER_ERROR_FAILED)); | 532 RunSoon(FROM_HERE, base::Bind(callback, SERVICE_WORKER_ERROR_FAILED)); |
527 return; | 533 return; |
528 } | 534 } |
529 | 535 |
530 if (!has_checked_for_stale_resources_) | 536 if (!has_checked_for_stale_resources_) |
531 DeleteStaleResources(); | 537 DeleteStaleResources(); |
532 | 538 |
533 DidDeleteRegistrationParams params; | 539 DidDeleteRegistrationParams params; |
534 params.registration_id = registration_id; | 540 params.registration_id = registration_id; |
535 params.origin = origin; | 541 params.origin = origin; |
536 params.callback = callback; | 542 params.callback = callback; |
537 | 543 |
538 database_task_runner_->PostTask( | 544 database_task_manager_->GetTaskRunner()->PostTask( |
539 FROM_HERE, | 545 FROM_HERE, |
540 base::Bind(&DeleteRegistrationFromDB, | 546 base::Bind(&DeleteRegistrationFromDB, |
541 database_.get(), | 547 database_.get(), |
542 base::MessageLoopProxy::current(), | 548 base::MessageLoopProxy::current(), |
543 registration_id, origin, | 549 registration_id, origin, |
544 base::Bind(&ServiceWorkerStorage::DidDeleteRegistration, | 550 base::Bind(&ServiceWorkerStorage::DidDeleteRegistration, |
545 weak_factory_.GetWeakPtr(), params))); | 551 weak_factory_.GetWeakPtr(), params))); |
546 | 552 |
547 // The registration should no longer be findable. | 553 // The registration should no longer be findable. |
548 pending_deletions_.insert(registration_id); | 554 pending_deletions_.insert(registration_id); |
(...skipping 15 matching lines...) Expand all Loading... |
564 new ServiceWorkerResponseWriter(response_id, disk_cache())); | 570 new ServiceWorkerResponseWriter(response_id, disk_cache())); |
565 } | 571 } |
566 | 572 |
567 void ServiceWorkerStorage::StoreUncommittedResponseId(int64 id) { | 573 void ServiceWorkerStorage::StoreUncommittedResponseId(int64 id) { |
568 DCHECK_NE(kInvalidServiceWorkerResponseId, id); | 574 DCHECK_NE(kInvalidServiceWorkerResponseId, id); |
569 DCHECK_EQ(INITIALIZED, state_); | 575 DCHECK_EQ(INITIALIZED, state_); |
570 | 576 |
571 if (!has_checked_for_stale_resources_) | 577 if (!has_checked_for_stale_resources_) |
572 DeleteStaleResources(); | 578 DeleteStaleResources(); |
573 | 579 |
574 database_task_runner_->PostTask( | 580 database_task_manager_->GetTaskRunner()->PostTask( |
575 FROM_HERE, | 581 FROM_HERE, |
576 base::Bind(base::IgnoreResult( | 582 base::Bind(base::IgnoreResult( |
577 &ServiceWorkerDatabase::WriteUncommittedResourceIds), | 583 &ServiceWorkerDatabase::WriteUncommittedResourceIds), |
578 base::Unretained(database_.get()), | 584 base::Unretained(database_.get()), |
579 std::set<int64>(&id, &id + 1))); | 585 std::set<int64>(&id, &id + 1))); |
580 } | 586 } |
581 | 587 |
582 void ServiceWorkerStorage::DoomUncommittedResponse(int64 id) { | 588 void ServiceWorkerStorage::DoomUncommittedResponse(int64 id) { |
583 DCHECK_NE(kInvalidServiceWorkerResponseId, id); | 589 DCHECK_NE(kInvalidServiceWorkerResponseId, id); |
584 database_task_runner_->PostTask( | 590 database_task_manager_->GetTaskRunner()->PostTask( |
585 FROM_HERE, | 591 FROM_HERE, |
586 base::Bind(base::IgnoreResult( | 592 base::Bind(base::IgnoreResult( |
587 &ServiceWorkerDatabase::PurgeUncommittedResourceIds), | 593 &ServiceWorkerDatabase::PurgeUncommittedResourceIds), |
588 base::Unretained(database_.get()), | 594 base::Unretained(database_.get()), |
589 std::set<int64>(&id, &id + 1))); | 595 std::set<int64>(&id, &id + 1))); |
590 StartPurgingResources(std::vector<int64>(1, id)); | 596 StartPurgingResources(std::vector<int64>(1, id)); |
591 } | 597 } |
592 | 598 |
593 void ServiceWorkerStorage::CompareScriptResources( | 599 void ServiceWorkerStorage::CompareScriptResources( |
594 int64 lhs_id, int64 rhs_id, | 600 int64 lhs_id, int64 rhs_id, |
595 const CompareCallback& callback) { | 601 const CompareCallback& callback) { |
596 DCHECK(!callback.is_null()); | 602 DCHECK(!callback.is_null()); |
597 scoped_refptr<ResponseComparer> comparer = | 603 scoped_refptr<ResponseComparer> comparer = |
598 new ResponseComparer(weak_factory_.GetWeakPtr(), | 604 new ResponseComparer(weak_factory_.GetWeakPtr(), |
599 CreateResponseReader(lhs_id), | 605 CreateResponseReader(lhs_id), |
600 CreateResponseReader(rhs_id), | 606 CreateResponseReader(rhs_id), |
601 callback); | 607 callback); |
602 comparer->Start(); // It deletes itself when done. | 608 comparer->Start(); // It deletes itself when done. |
603 } | 609 } |
604 | 610 |
605 void ServiceWorkerStorage::DeleteAndStartOver(const StatusCallback& callback) { | 611 void ServiceWorkerStorage::DeleteAndStartOver(const StatusCallback& callback) { |
606 Disable(); | 612 Disable(); |
607 | 613 |
608 // Delete the database on the database thread. | 614 // Delete the database on the database thread. |
609 PostTaskAndReplyWithResult( | 615 PostTaskAndReplyWithResult( |
610 database_task_runner_.get(), | 616 database_task_manager_->GetTaskRunner(), |
611 FROM_HERE, | 617 FROM_HERE, |
612 base::Bind(&ServiceWorkerDatabase::DestroyDatabase, | 618 base::Bind(&ServiceWorkerDatabase::DestroyDatabase, |
613 base::Unretained(database_.get())), | 619 base::Unretained(database_.get())), |
614 base::Bind(&ServiceWorkerStorage::DidDeleteDatabase, | 620 base::Bind(&ServiceWorkerStorage::DidDeleteDatabase, |
615 weak_factory_.GetWeakPtr(), | 621 weak_factory_.GetWeakPtr(), |
616 callback)); | 622 callback)); |
617 } | 623 } |
618 | 624 |
619 int64 ServiceWorkerStorage::NewRegistrationId() { | 625 int64 ServiceWorkerStorage::NewRegistrationId() { |
620 if (state_ == DISABLED) | 626 if (state_ == DISABLED) |
(...skipping 29 matching lines...) Expand all Loading... |
650 ServiceWorkerStatusCode status) { | 656 ServiceWorkerStatusCode status) { |
651 installing_registrations_.erase(registration->id()); | 657 installing_registrations_.erase(registration->id()); |
652 if (status != SERVICE_WORKER_OK && version) { | 658 if (status != SERVICE_WORKER_OK && version) { |
653 ResourceList resources; | 659 ResourceList resources; |
654 version->script_cache_map()->GetResources(&resources); | 660 version->script_cache_map()->GetResources(&resources); |
655 | 661 |
656 std::set<int64> ids; | 662 std::set<int64> ids; |
657 for (size_t i = 0; i < resources.size(); ++i) | 663 for (size_t i = 0; i < resources.size(); ++i) |
658 ids.insert(resources[i].resource_id); | 664 ids.insert(resources[i].resource_id); |
659 | 665 |
660 database_task_runner_->PostTask( | 666 database_task_manager_->GetTaskRunner()->PostTask( |
661 FROM_HERE, | 667 FROM_HERE, |
662 base::Bind(base::IgnoreResult( | 668 base::Bind(base::IgnoreResult( |
663 &ServiceWorkerDatabase::PurgeUncommittedResourceIds), | 669 &ServiceWorkerDatabase::PurgeUncommittedResourceIds), |
664 base::Unretained(database_.get()), | 670 base::Unretained(database_.get()), |
665 ids)); | 671 ids)); |
666 } | 672 } |
667 } | 673 } |
668 | 674 |
669 void ServiceWorkerStorage::NotifyUninstallingRegistration( | 675 void ServiceWorkerStorage::NotifyUninstallingRegistration( |
670 ServiceWorkerRegistration* registration) { | 676 ServiceWorkerRegistration* registration) { |
(...skipping 19 matching lines...) Expand all Loading... |
690 | 696 |
691 void ServiceWorkerStorage::PurgeResources(const ResourceList& resources) { | 697 void ServiceWorkerStorage::PurgeResources(const ResourceList& resources) { |
692 if (!has_checked_for_stale_resources_) | 698 if (!has_checked_for_stale_resources_) |
693 DeleteStaleResources(); | 699 DeleteStaleResources(); |
694 StartPurgingResources(resources); | 700 StartPurgingResources(resources); |
695 } | 701 } |
696 | 702 |
697 ServiceWorkerStorage::ServiceWorkerStorage( | 703 ServiceWorkerStorage::ServiceWorkerStorage( |
698 const base::FilePath& path, | 704 const base::FilePath& path, |
699 base::WeakPtr<ServiceWorkerContextCore> context, | 705 base::WeakPtr<ServiceWorkerContextCore> context, |
700 const scoped_refptr<base::SequencedTaskRunner>& database_task_runner, | 706 scoped_ptr<ServiceWorkerDatabaseTaskManager> database_task_manager, |
701 const scoped_refptr<base::SingleThreadTaskRunner>& disk_cache_thread, | 707 const scoped_refptr<base::SingleThreadTaskRunner>& disk_cache_thread, |
702 storage::QuotaManagerProxy* quota_manager_proxy) | 708 storage::QuotaManagerProxy* quota_manager_proxy, |
| 709 storage::SpecialStoragePolicy* special_storage_policy) |
703 : next_registration_id_(kInvalidServiceWorkerRegistrationId), | 710 : next_registration_id_(kInvalidServiceWorkerRegistrationId), |
704 next_version_id_(kInvalidServiceWorkerVersionId), | 711 next_version_id_(kInvalidServiceWorkerVersionId), |
705 next_resource_id_(kInvalidServiceWorkerResourceId), | 712 next_resource_id_(kInvalidServiceWorkerResourceId), |
706 state_(UNINITIALIZED), | 713 state_(UNINITIALIZED), |
707 path_(path), | 714 path_(path), |
708 context_(context), | 715 context_(context), |
709 database_task_runner_(database_task_runner), | 716 database_task_manager_(database_task_manager.Pass()), |
710 disk_cache_thread_(disk_cache_thread), | 717 disk_cache_thread_(disk_cache_thread), |
711 quota_manager_proxy_(quota_manager_proxy), | 718 quota_manager_proxy_(quota_manager_proxy), |
| 719 special_storage_policy_(special_storage_policy), |
712 is_purge_pending_(false), | 720 is_purge_pending_(false), |
713 has_checked_for_stale_resources_(false), | 721 has_checked_for_stale_resources_(false), |
714 weak_factory_(this) { | 722 weak_factory_(this) { |
715 database_.reset(new ServiceWorkerDatabase(GetDatabasePath())); | 723 database_.reset(new ServiceWorkerDatabase(GetDatabasePath())); |
716 } | 724 } |
717 | 725 |
718 base::FilePath ServiceWorkerStorage::GetDatabasePath() { | 726 base::FilePath ServiceWorkerStorage::GetDatabasePath() { |
719 if (path_.empty()) | 727 if (path_.empty()) |
720 return base::FilePath(); | 728 return base::FilePath(); |
721 return path_.Append(ServiceWorkerContextCore::kServiceWorkerDirectory) | 729 return path_.Append(ServiceWorkerContextCore::kServiceWorkerDirectory) |
(...skipping 18 matching lines...) Expand all Loading... |
740 return false; | 748 return false; |
741 case INITIALIZING: | 749 case INITIALIZING: |
742 pending_tasks_.push_back(callback); | 750 pending_tasks_.push_back(callback); |
743 return false; | 751 return false; |
744 case UNINITIALIZED: | 752 case UNINITIALIZED: |
745 pending_tasks_.push_back(callback); | 753 pending_tasks_.push_back(callback); |
746 // Fall-through. | 754 // Fall-through. |
747 } | 755 } |
748 | 756 |
749 state_ = INITIALIZING; | 757 state_ = INITIALIZING; |
750 database_task_runner_->PostTask( | 758 database_task_manager_->GetTaskRunner()->PostTask( |
751 FROM_HERE, | 759 FROM_HERE, |
752 base::Bind(&ReadInitialDataFromDB, | 760 base::Bind(&ReadInitialDataFromDB, |
753 database_.get(), | 761 database_.get(), |
754 base::MessageLoopProxy::current(), | 762 base::MessageLoopProxy::current(), |
755 base::Bind(&ServiceWorkerStorage::DidReadInitialData, | 763 base::Bind(&ServiceWorkerStorage::DidReadInitialData, |
756 weak_factory_.GetWeakPtr()))); | 764 weak_factory_.GetWeakPtr()))); |
757 return false; | 765 return false; |
758 } | 766 } |
759 | 767 |
760 void ServiceWorkerStorage::DidReadInitialData( | 768 void ServiceWorkerStorage::DidReadInitialData( |
(...skipping 386 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1147 id, base::Bind(&ServiceWorkerStorage::OnResourcePurged, | 1155 id, base::Bind(&ServiceWorkerStorage::OnResourcePurged, |
1148 weak_factory_.GetWeakPtr(), id)); | 1156 weak_factory_.GetWeakPtr(), id)); |
1149 if (rv != net::ERR_IO_PENDING) | 1157 if (rv != net::ERR_IO_PENDING) |
1150 OnResourcePurged(id, rv); | 1158 OnResourcePurged(id, rv); |
1151 } | 1159 } |
1152 | 1160 |
1153 void ServiceWorkerStorage::OnResourcePurged(int64 id, int rv) { | 1161 void ServiceWorkerStorage::OnResourcePurged(int64 id, int rv) { |
1154 DCHECK(is_purge_pending_); | 1162 DCHECK(is_purge_pending_); |
1155 is_purge_pending_ = false; | 1163 is_purge_pending_ = false; |
1156 | 1164 |
1157 database_task_runner_->PostTask( | 1165 database_task_manager_->GetTaskRunner()->PostTask( |
1158 FROM_HERE, | 1166 FROM_HERE, |
1159 base::Bind(base::IgnoreResult( | 1167 base::Bind(base::IgnoreResult( |
1160 &ServiceWorkerDatabase::ClearPurgeableResourceIds), | 1168 &ServiceWorkerDatabase::ClearPurgeableResourceIds), |
1161 base::Unretained(database_.get()), | 1169 base::Unretained(database_.get()), |
1162 std::set<int64>(&id, &id + 1))); | 1170 std::set<int64>(&id, &id + 1))); |
1163 | 1171 |
1164 ContinuePurgingResources(); | 1172 ContinuePurgingResources(); |
1165 } | 1173 } |
1166 | 1174 |
1167 void ServiceWorkerStorage::DeleteStaleResources() { | 1175 void ServiceWorkerStorage::DeleteStaleResources() { |
1168 DCHECK(!has_checked_for_stale_resources_); | 1176 DCHECK(!has_checked_for_stale_resources_); |
1169 has_checked_for_stale_resources_ = true; | 1177 has_checked_for_stale_resources_ = true; |
1170 database_task_runner_->PostTask( | 1178 database_task_manager_->GetTaskRunner()->PostTask( |
1171 FROM_HERE, | 1179 FROM_HERE, |
1172 base::Bind(&ServiceWorkerStorage::CollectStaleResourcesFromDB, | 1180 base::Bind(&ServiceWorkerStorage::CollectStaleResourcesFromDB, |
1173 database_.get(), | 1181 database_.get(), |
1174 base::MessageLoopProxy::current(), | 1182 base::MessageLoopProxy::current(), |
1175 base::Bind(&ServiceWorkerStorage::DidCollectStaleResources, | 1183 base::Bind(&ServiceWorkerStorage::DidCollectStaleResources, |
1176 weak_factory_.GetWeakPtr()))); | 1184 weak_factory_.GetWeakPtr()))); |
1177 } | 1185 } |
1178 | 1186 |
1179 void ServiceWorkerStorage::DidCollectStaleResources( | 1187 void ServiceWorkerStorage::DidCollectStaleResources( |
1180 const std::vector<int64>& stale_resource_ids, | 1188 const std::vector<int64>& stale_resource_ids, |
1181 ServiceWorkerDatabase::Status status) { | 1189 ServiceWorkerDatabase::Status status) { |
1182 DCHECK_EQ(ServiceWorkerDatabase::STATUS_OK, status); | 1190 DCHECK_EQ(ServiceWorkerDatabase::STATUS_OK, status); |
1183 if (status != ServiceWorkerDatabase::STATUS_OK) | 1191 if (status != ServiceWorkerDatabase::STATUS_OK) |
1184 return; | 1192 return; |
1185 StartPurgingResources(stale_resource_ids); | 1193 StartPurgingResources(stale_resource_ids); |
1186 } | 1194 } |
1187 | 1195 |
| 1196 void ServiceWorkerStorage::ClearSessionOnlyOrigins() { |
| 1197 // Can be null in tests. |
| 1198 if (!special_storage_policy_.get()) |
| 1199 return; |
| 1200 |
| 1201 if (!special_storage_policy_->HasSessionOnlyOrigins()) |
| 1202 return; |
| 1203 |
| 1204 std::set<GURL> session_only_origins; |
| 1205 for (const GURL& origin : registered_origins_) { |
| 1206 if (special_storage_policy_->IsStorageSessionOnly(origin)) |
| 1207 session_only_origins.insert(origin); |
| 1208 } |
| 1209 |
| 1210 database_task_manager_->GetShutdownBlockingTaskRunner()->PostTask( |
| 1211 FROM_HERE, |
| 1212 base::Bind(&DeleteAllDataForOriginsFromDB, |
| 1213 database_.get(), |
| 1214 session_only_origins)); |
| 1215 } |
| 1216 |
1188 void ServiceWorkerStorage::CollectStaleResourcesFromDB( | 1217 void ServiceWorkerStorage::CollectStaleResourcesFromDB( |
1189 ServiceWorkerDatabase* database, | 1218 ServiceWorkerDatabase* database, |
1190 scoped_refptr<base::SequencedTaskRunner> original_task_runner, | 1219 scoped_refptr<base::SequencedTaskRunner> original_task_runner, |
1191 const GetResourcesCallback& callback) { | 1220 const GetResourcesCallback& callback) { |
1192 std::set<int64> ids; | 1221 std::set<int64> ids; |
1193 ServiceWorkerDatabase::Status status = | 1222 ServiceWorkerDatabase::Status status = |
1194 database->GetUncommittedResourceIds(&ids); | 1223 database->GetUncommittedResourceIds(&ids); |
1195 if (status != ServiceWorkerDatabase::STATUS_OK) { | 1224 if (status != ServiceWorkerDatabase::STATUS_OK) { |
1196 original_task_runner->PostTask( | 1225 original_task_runner->PostTask( |
1197 FROM_HERE, | 1226 FROM_HERE, |
(...skipping 186 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1384 const GURL& origin, | 1413 const GURL& origin, |
1385 const FindInDBCallback& callback) { | 1414 const FindInDBCallback& callback) { |
1386 ServiceWorkerDatabase::RegistrationData data; | 1415 ServiceWorkerDatabase::RegistrationData data; |
1387 ResourceList resources; | 1416 ResourceList resources; |
1388 ServiceWorkerDatabase::Status status = | 1417 ServiceWorkerDatabase::Status status = |
1389 database->ReadRegistration(registration_id, origin, &data, &resources); | 1418 database->ReadRegistration(registration_id, origin, &data, &resources); |
1390 original_task_runner->PostTask( | 1419 original_task_runner->PostTask( |
1391 FROM_HERE, base::Bind(callback, data, resources, status)); | 1420 FROM_HERE, base::Bind(callback, data, resources, status)); |
1392 } | 1421 } |
1393 | 1422 |
| 1423 void ServiceWorkerStorage::DeleteAllDataForOriginsFromDB( |
| 1424 ServiceWorkerDatabase* database, |
| 1425 const std::set<GURL>& origins) { |
| 1426 DCHECK(database); |
| 1427 |
| 1428 std::vector<int64> newly_purgeable_resources; |
| 1429 database->DeleteAllDataForOrigins(origins, &newly_purgeable_resources); |
| 1430 } |
| 1431 |
1394 // TODO(nhiroki): The corruption recovery should not be scheduled if the error | 1432 // TODO(nhiroki): The corruption recovery should not be scheduled if the error |
1395 // is transient and it can get healed soon (e.g. IO error). To do that, the | 1433 // is transient and it can get healed soon (e.g. IO error). To do that, the |
1396 // database should not disable itself when an error occurs and the storage | 1434 // database should not disable itself when an error occurs and the storage |
1397 // controls it instead. | 1435 // controls it instead. |
1398 void ServiceWorkerStorage::ScheduleDeleteAndStartOver() { | 1436 void ServiceWorkerStorage::ScheduleDeleteAndStartOver() { |
1399 if (state_ == DISABLED) { | 1437 if (state_ == DISABLED) { |
1400 // Recovery process has already been scheduled. | 1438 // Recovery process has already been scheduled. |
1401 return; | 1439 return; |
1402 } | 1440 } |
1403 Disable(); | 1441 Disable(); |
(...skipping 12 matching lines...) Expand all Loading... |
1416 callback.Run(DatabaseStatusToStatusCode(status)); | 1454 callback.Run(DatabaseStatusToStatusCode(status)); |
1417 return; | 1455 return; |
1418 } | 1456 } |
1419 DVLOG(1) << "Deleted ServiceWorkerDatabase successfully."; | 1457 DVLOG(1) << "Deleted ServiceWorkerDatabase successfully."; |
1420 | 1458 |
1421 // Delete the disk cache on the cache thread. | 1459 // Delete the disk cache on the cache thread. |
1422 // TODO(nhiroki): What if there is a bunch of files in the cache directory? | 1460 // TODO(nhiroki): What if there is a bunch of files in the cache directory? |
1423 // Deleting the directory could take a long time and restart could be delayed. | 1461 // Deleting the directory could take a long time and restart could be delayed. |
1424 // We should probably rename the directory and delete it later. | 1462 // We should probably rename the directory and delete it later. |
1425 PostTaskAndReplyWithResult( | 1463 PostTaskAndReplyWithResult( |
1426 database_task_runner_.get(), | 1464 database_task_manager_->GetTaskRunner(), |
1427 FROM_HERE, | 1465 FROM_HERE, |
1428 base::Bind(&base::DeleteFile, GetDiskCachePath(), true), | 1466 base::Bind(&base::DeleteFile, GetDiskCachePath(), true), |
1429 base::Bind(&ServiceWorkerStorage::DidDeleteDiskCache, | 1467 base::Bind(&ServiceWorkerStorage::DidDeleteDiskCache, |
1430 weak_factory_.GetWeakPtr(), | 1468 weak_factory_.GetWeakPtr(), |
1431 callback)); | 1469 callback)); |
1432 } | 1470 } |
1433 | 1471 |
1434 void ServiceWorkerStorage::DidDeleteDiskCache( | 1472 void ServiceWorkerStorage::DidDeleteDiskCache( |
1435 const StatusCallback& callback, bool result) { | 1473 const StatusCallback& callback, bool result) { |
1436 DCHECK_EQ(DISABLED, state_); | 1474 DCHECK_EQ(DISABLED, state_); |
1437 if (!result) { | 1475 if (!result) { |
1438 // Give up the corruption recovery until the browser restarts. | 1476 // Give up the corruption recovery until the browser restarts. |
1439 LOG(ERROR) << "Failed to delete the diskcache."; | 1477 LOG(ERROR) << "Failed to delete the diskcache."; |
1440 callback.Run(SERVICE_WORKER_ERROR_FAILED); | 1478 callback.Run(SERVICE_WORKER_ERROR_FAILED); |
1441 return; | 1479 return; |
1442 } | 1480 } |
1443 DVLOG(1) << "Deleted ServiceWorkerDiskCache successfully."; | 1481 DVLOG(1) << "Deleted ServiceWorkerDiskCache successfully."; |
1444 callback.Run(SERVICE_WORKER_OK); | 1482 callback.Run(SERVICE_WORKER_OK); |
1445 } | 1483 } |
1446 | 1484 |
1447 } // namespace content | 1485 } // namespace content |
OLD | NEW |