| 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/file_util.h" | 10 #include "base/file_util.h" |
| (...skipping 432 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 443 std::set<int64> ids; | 443 std::set<int64> ids; |
| 444 for (size_t i = 0; i < resources.size(); ++i) | 444 for (size_t i = 0; i < resources.size(); ++i) |
| 445 ids.insert(resources[i].resource_id); | 445 ids.insert(resources[i].resource_id); |
| 446 | 446 |
| 447 database_task_runner_->PostTask( | 447 database_task_runner_->PostTask( |
| 448 FROM_HERE, | 448 FROM_HERE, |
| 449 base::Bind(base::IgnoreResult( | 449 base::Bind(base::IgnoreResult( |
| 450 &ServiceWorkerDatabase::PurgeUncommittedResourceIds), | 450 &ServiceWorkerDatabase::PurgeUncommittedResourceIds), |
| 451 base::Unretained(database_.get()), | 451 base::Unretained(database_.get()), |
| 452 ids)); | 452 ids)); |
| 453 | |
| 454 StartPurgingResources(resources); | |
| 455 } | 453 } |
| 456 } | 454 } |
| 457 | 455 |
| 458 void ServiceWorkerStorage::Disable() { | 456 void ServiceWorkerStorage::Disable() { |
| 459 state_ = DISABLED; | 457 state_ = DISABLED; |
| 460 if (disk_cache_) | 458 if (disk_cache_) |
| 461 disk_cache_->Disable(); | 459 disk_cache_->Disable(); |
| 462 } | 460 } |
| 463 | 461 |
| 464 bool ServiceWorkerStorage::IsDisabled() const { | 462 bool ServiceWorkerStorage::IsDisabled() const { |
| 465 return state_ == DISABLED; | 463 return state_ == DISABLED; |
| 466 } | 464 } |
| 467 | 465 |
| 466 void ServiceWorkerStorage::PurgeResources(const ResourceList& resources) { |
| 467 if (!has_checked_for_stale_resources_) |
| 468 DeleteStaleResources(); |
| 469 StartPurgingResources(resources); |
| 470 } |
| 471 |
| 468 ServiceWorkerStorage::ServiceWorkerStorage( | 472 ServiceWorkerStorage::ServiceWorkerStorage( |
| 469 const base::FilePath& path, | 473 const base::FilePath& path, |
| 470 base::WeakPtr<ServiceWorkerContextCore> context, | 474 base::WeakPtr<ServiceWorkerContextCore> context, |
| 471 base::SequencedTaskRunner* database_task_runner, | 475 base::SequencedTaskRunner* database_task_runner, |
| 472 base::MessageLoopProxy* disk_cache_thread, | 476 base::MessageLoopProxy* disk_cache_thread, |
| 473 quota::QuotaManagerProxy* quota_manager_proxy) | 477 quota::QuotaManagerProxy* quota_manager_proxy) |
| 474 : next_registration_id_(kInvalidServiceWorkerRegistrationId), | 478 : next_registration_id_(kInvalidServiceWorkerRegistrationId), |
| 475 next_version_id_(kInvalidServiceWorkerVersionId), | 479 next_version_id_(kInvalidServiceWorkerVersionId), |
| 476 next_resource_id_(kInvalidServiceWorkerResourceId), | 480 next_resource_id_(kInvalidServiceWorkerResourceId), |
| 477 state_(UNINITIALIZED), | 481 state_(UNINITIALIZED), |
| (...skipping 220 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 698 const std::vector<int64>& newly_purgeable_resources, | 702 const std::vector<int64>& newly_purgeable_resources, |
| 699 ServiceWorkerDatabase::Status status) { | 703 ServiceWorkerDatabase::Status status) { |
| 700 if (status != ServiceWorkerDatabase::STATUS_OK) { | 704 if (status != ServiceWorkerDatabase::STATUS_OK) { |
| 701 ScheduleDeleteAndStartOver(); | 705 ScheduleDeleteAndStartOver(); |
| 702 callback.Run(DatabaseStatusToStatusCode(status)); | 706 callback.Run(DatabaseStatusToStatusCode(status)); |
| 703 return; | 707 return; |
| 704 } | 708 } |
| 705 registered_origins_.insert(origin); | 709 registered_origins_.insert(origin); |
| 706 callback.Run(SERVICE_WORKER_OK); | 710 callback.Run(SERVICE_WORKER_OK); |
| 707 | 711 |
| 708 SchedulePurgeResources(deleted_version_id, newly_purgeable_resources); | 712 if (!context_ || !context_->GetLiveVersion(deleted_version_id)) |
| 713 StartPurgingResources(newly_purgeable_resources); |
| 709 } | 714 } |
| 710 | 715 |
| 711 void ServiceWorkerStorage::DidUpdateToActiveState( | 716 void ServiceWorkerStorage::DidUpdateToActiveState( |
| 712 const StatusCallback& callback, | 717 const StatusCallback& callback, |
| 713 ServiceWorkerDatabase::Status status) { | 718 ServiceWorkerDatabase::Status status) { |
| 714 if (status != ServiceWorkerDatabase::STATUS_OK && | 719 if (status != ServiceWorkerDatabase::STATUS_OK && |
| 715 status != ServiceWorkerDatabase::STATUS_ERROR_NOT_FOUND) { | 720 status != ServiceWorkerDatabase::STATUS_ERROR_NOT_FOUND) { |
| 716 ScheduleDeleteAndStartOver(); | 721 ScheduleDeleteAndStartOver(); |
| 717 } | 722 } |
| 718 callback.Run(DatabaseStatusToStatusCode(status)); | 723 callback.Run(DatabaseStatusToStatusCode(status)); |
| 719 } | 724 } |
| 720 | 725 |
| 721 void ServiceWorkerStorage::DidDeleteRegistration( | 726 void ServiceWorkerStorage::DidDeleteRegistration( |
| 722 const GURL& origin, | 727 const GURL& origin, |
| 723 const StatusCallback& callback, | 728 const StatusCallback& callback, |
| 724 bool origin_is_deletable, | 729 bool origin_is_deletable, |
| 725 int64 version_id, | 730 int64 version_id, |
| 726 const std::vector<int64>& newly_purgeable_resources, | 731 const std::vector<int64>& newly_purgeable_resources, |
| 727 ServiceWorkerDatabase::Status status) { | 732 ServiceWorkerDatabase::Status status) { |
| 728 if (status != ServiceWorkerDatabase::STATUS_OK) { | 733 if (status != ServiceWorkerDatabase::STATUS_OK) { |
| 729 ScheduleDeleteAndStartOver(); | 734 ScheduleDeleteAndStartOver(); |
| 730 callback.Run(DatabaseStatusToStatusCode(status)); | 735 callback.Run(DatabaseStatusToStatusCode(status)); |
| 731 return; | 736 return; |
| 732 } | 737 } |
| 733 if (origin_is_deletable) | 738 if (origin_is_deletable) |
| 734 registered_origins_.erase(origin); | 739 registered_origins_.erase(origin); |
| 735 callback.Run(SERVICE_WORKER_OK); | 740 callback.Run(SERVICE_WORKER_OK); |
| 736 | 741 |
| 737 SchedulePurgeResources(version_id, newly_purgeable_resources); | 742 if (!context_ || !context_->GetLiveVersion(version_id)) |
| 743 StartPurgingResources(newly_purgeable_resources); |
| 738 } | 744 } |
| 739 | 745 |
| 740 scoped_refptr<ServiceWorkerRegistration> | 746 scoped_refptr<ServiceWorkerRegistration> |
| 741 ServiceWorkerStorage::GetOrCreateRegistration( | 747 ServiceWorkerStorage::GetOrCreateRegistration( |
| 742 const ServiceWorkerDatabase::RegistrationData& data, | 748 const ServiceWorkerDatabase::RegistrationData& data, |
| 743 const ResourceList& resources) { | 749 const ResourceList& resources) { |
| 744 scoped_refptr<ServiceWorkerRegistration> registration = | 750 scoped_refptr<ServiceWorkerRegistration> registration = |
| 745 context_->GetLiveRegistration(data.registration_id); | 751 context_->GetLiveRegistration(data.registration_id); |
| 746 if (registration) | 752 if (registration) |
| 747 return registration; | 753 return registration; |
| (...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 837 | 843 |
| 838 void ServiceWorkerStorage::OnDiskCacheInitialized(int rv) { | 844 void ServiceWorkerStorage::OnDiskCacheInitialized(int rv) { |
| 839 if (rv != net::OK) { | 845 if (rv != net::OK) { |
| 840 LOG(ERROR) << "Failed to open the serviceworker diskcache: " | 846 LOG(ERROR) << "Failed to open the serviceworker diskcache: " |
| 841 << net::ErrorToString(rv); | 847 << net::ErrorToString(rv); |
| 842 ScheduleDeleteAndStartOver(); | 848 ScheduleDeleteAndStartOver(); |
| 843 } | 849 } |
| 844 ServiceWorkerMetrics::CountInitDiskCacheResult(rv == net::OK); | 850 ServiceWorkerMetrics::CountInitDiskCacheResult(rv == net::OK); |
| 845 } | 851 } |
| 846 | 852 |
| 847 void ServiceWorkerStorage::OnNoControllees(ServiceWorkerVersion* version) { | |
| 848 std::map<int64, std::vector<int64> >::iterator it = | |
| 849 deleted_version_resource_ids_.find(version->version_id()); | |
| 850 DCHECK(it != deleted_version_resource_ids_.end()); | |
| 851 StartPurgingResources(it->second); | |
| 852 deleted_version_resource_ids_.erase(it); | |
| 853 version->RemoveListener(this); | |
| 854 } | |
| 855 | |
| 856 void ServiceWorkerStorage::SchedulePurgeResources( | |
| 857 int64 version_id, | |
| 858 const std::vector<int64>& resources) { | |
| 859 DCHECK(deleted_version_resource_ids_.find(version_id) == | |
| 860 deleted_version_resource_ids_.end()); | |
| 861 if (resources.empty()) | |
| 862 return; | |
| 863 scoped_refptr<ServiceWorkerVersion> version = | |
| 864 context_ ? context_->GetLiveVersion(version_id) : NULL; | |
| 865 if (version && version->HasControllee()) { | |
| 866 deleted_version_resource_ids_[version_id] = resources; | |
| 867 version->AddListener(this); | |
| 868 } else { | |
| 869 StartPurgingResources(resources); | |
| 870 } | |
| 871 } | |
| 872 | |
| 873 void ServiceWorkerStorage::StartPurgingResources( | 853 void ServiceWorkerStorage::StartPurgingResources( |
| 874 const std::vector<int64>& ids) { | 854 const std::vector<int64>& ids) { |
| 875 DCHECK(has_checked_for_stale_resources_); | 855 DCHECK(has_checked_for_stale_resources_); |
| 876 for (size_t i = 0; i < ids.size(); ++i) | 856 for (size_t i = 0; i < ids.size(); ++i) |
| 877 purgeable_resource_ids_.push_back(ids[i]); | 857 purgeable_resource_ids_.push_back(ids[i]); |
| 878 ContinuePurgingResources(); | 858 ContinuePurgingResources(); |
| 879 } | 859 } |
| 880 | 860 |
| 881 void ServiceWorkerStorage::StartPurgingResources( | 861 void ServiceWorkerStorage::StartPurgingResources( |
| 882 const ResourceList& resources) { | 862 const ResourceList& resources) { |
| (...skipping 313 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1196 // Give up the corruption recovery until the browser restarts. | 1176 // Give up the corruption recovery until the browser restarts. |
| 1197 LOG(ERROR) << "Failed to delete the diskcache."; | 1177 LOG(ERROR) << "Failed to delete the diskcache."; |
| 1198 callback.Run(SERVICE_WORKER_ERROR_FAILED); | 1178 callback.Run(SERVICE_WORKER_ERROR_FAILED); |
| 1199 return; | 1179 return; |
| 1200 } | 1180 } |
| 1201 DVLOG(1) << "Deleted ServiceWorkerDiskCache successfully."; | 1181 DVLOG(1) << "Deleted ServiceWorkerDiskCache successfully."; |
| 1202 callback.Run(SERVICE_WORKER_OK); | 1182 callback.Run(SERVICE_WORKER_OK); |
| 1203 } | 1183 } |
| 1204 | 1184 |
| 1205 } // namespace content | 1185 } // namespace content |
| OLD | NEW |