Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(970)

Side by Side Diff: content/browser/service_worker/service_worker_storage.cc

Issue 633873002: Service Worker: Respect the "clear on exit" content setting (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@contentsettings
Patch Set: sync Created 6 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
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
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
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
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
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
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
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698