| 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 { |
| (...skipping 233 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 698 const std::vector<int64>& newly_purgeable_resources, | 696 const std::vector<int64>& newly_purgeable_resources, |
| 699 ServiceWorkerDatabase::Status status) { | 697 ServiceWorkerDatabase::Status status) { |
| 700 if (status != ServiceWorkerDatabase::STATUS_OK) { | 698 if (status != ServiceWorkerDatabase::STATUS_OK) { |
| 701 ScheduleDeleteAndStartOver(); | 699 ScheduleDeleteAndStartOver(); |
| 702 callback.Run(DatabaseStatusToStatusCode(status)); | 700 callback.Run(DatabaseStatusToStatusCode(status)); |
| 703 return; | 701 return; |
| 704 } | 702 } |
| 705 registered_origins_.insert(origin); | 703 registered_origins_.insert(origin); |
| 706 callback.Run(SERVICE_WORKER_OK); | 704 callback.Run(SERVICE_WORKER_OK); |
| 707 | 705 |
| 708 SchedulePurgeResources(deleted_version_id, newly_purgeable_resources); | 706 if (!context_ || !context_->GetLiveVersion(deleted_version_id)) |
| 707 StartPurgingResources(newly_purgeable_resources); |
| 709 } | 708 } |
| 710 | 709 |
| 711 void ServiceWorkerStorage::DidUpdateToActiveState( | 710 void ServiceWorkerStorage::DidUpdateToActiveState( |
| 712 const StatusCallback& callback, | 711 const StatusCallback& callback, |
| 713 ServiceWorkerDatabase::Status status) { | 712 ServiceWorkerDatabase::Status status) { |
| 714 if (status != ServiceWorkerDatabase::STATUS_OK && | 713 if (status != ServiceWorkerDatabase::STATUS_OK && |
| 715 status != ServiceWorkerDatabase::STATUS_ERROR_NOT_FOUND) { | 714 status != ServiceWorkerDatabase::STATUS_ERROR_NOT_FOUND) { |
| 716 ScheduleDeleteAndStartOver(); | 715 ScheduleDeleteAndStartOver(); |
| 717 } | 716 } |
| 718 callback.Run(DatabaseStatusToStatusCode(status)); | 717 callback.Run(DatabaseStatusToStatusCode(status)); |
| 719 } | 718 } |
| 720 | 719 |
| 721 void ServiceWorkerStorage::DidDeleteRegistration( | 720 void ServiceWorkerStorage::DidDeleteRegistration( |
| 722 const GURL& origin, | 721 const GURL& origin, |
| 723 const StatusCallback& callback, | 722 const StatusCallback& callback, |
| 724 bool origin_is_deletable, | 723 bool origin_is_deletable, |
| 725 int64 version_id, | 724 int64 version_id, |
| 726 const std::vector<int64>& newly_purgeable_resources, | 725 const std::vector<int64>& newly_purgeable_resources, |
| 727 ServiceWorkerDatabase::Status status) { | 726 ServiceWorkerDatabase::Status status) { |
| 728 if (status != ServiceWorkerDatabase::STATUS_OK) { | 727 if (status != ServiceWorkerDatabase::STATUS_OK) { |
| 729 ScheduleDeleteAndStartOver(); | 728 ScheduleDeleteAndStartOver(); |
| 730 callback.Run(DatabaseStatusToStatusCode(status)); | 729 callback.Run(DatabaseStatusToStatusCode(status)); |
| 731 return; | 730 return; |
| 732 } | 731 } |
| 733 if (origin_is_deletable) | 732 if (origin_is_deletable) |
| 734 registered_origins_.erase(origin); | 733 registered_origins_.erase(origin); |
| 735 callback.Run(SERVICE_WORKER_OK); | 734 callback.Run(SERVICE_WORKER_OK); |
| 736 | 735 |
| 737 SchedulePurgeResources(version_id, newly_purgeable_resources); | 736 if (!context_ || !context_->GetLiveVersion(version_id)) |
| 737 StartPurgingResources(newly_purgeable_resources); |
| 738 } | 738 } |
| 739 | 739 |
| 740 scoped_refptr<ServiceWorkerRegistration> | 740 scoped_refptr<ServiceWorkerRegistration> |
| 741 ServiceWorkerStorage::GetOrCreateRegistration( | 741 ServiceWorkerStorage::GetOrCreateRegistration( |
| 742 const ServiceWorkerDatabase::RegistrationData& data, | 742 const ServiceWorkerDatabase::RegistrationData& data, |
| 743 const ResourceList& resources) { | 743 const ResourceList& resources) { |
| 744 scoped_refptr<ServiceWorkerRegistration> registration = | 744 scoped_refptr<ServiceWorkerRegistration> registration = |
| 745 context_->GetLiveRegistration(data.registration_id); | 745 context_->GetLiveRegistration(data.registration_id); |
| 746 if (registration) | 746 if (registration) |
| 747 return registration; | 747 return registration; |
| (...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 837 | 837 |
| 838 void ServiceWorkerStorage::OnDiskCacheInitialized(int rv) { | 838 void ServiceWorkerStorage::OnDiskCacheInitialized(int rv) { |
| 839 if (rv != net::OK) { | 839 if (rv != net::OK) { |
| 840 LOG(ERROR) << "Failed to open the serviceworker diskcache: " | 840 LOG(ERROR) << "Failed to open the serviceworker diskcache: " |
| 841 << net::ErrorToString(rv); | 841 << net::ErrorToString(rv); |
| 842 ScheduleDeleteAndStartOver(); | 842 ScheduleDeleteAndStartOver(); |
| 843 } | 843 } |
| 844 ServiceWorkerMetrics::CountInitDiskCacheResult(rv == net::OK); | 844 ServiceWorkerMetrics::CountInitDiskCacheResult(rv == net::OK); |
| 845 } | 845 } |
| 846 | 846 |
| 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( | 847 void ServiceWorkerStorage::StartPurgingResources( |
| 874 const std::vector<int64>& ids) { | 848 const std::vector<int64>& ids) { |
| 875 DCHECK(has_checked_for_stale_resources_); | 849 DCHECK(has_checked_for_stale_resources_); |
| 876 for (size_t i = 0; i < ids.size(); ++i) | 850 for (size_t i = 0; i < ids.size(); ++i) |
| 877 purgeable_resource_ids_.push_back(ids[i]); | 851 purgeable_resource_ids_.push_back(ids[i]); |
| 878 ContinuePurgingResources(); | 852 ContinuePurgingResources(); |
| 879 } | 853 } |
| 880 | 854 |
| 855 void ServiceWorkerStorage::PurgeResources(const ResourceList& resources) { |
| 856 StartPurgingResources(resources); |
| 857 } |
| 858 |
| 881 void ServiceWorkerStorage::StartPurgingResources( | 859 void ServiceWorkerStorage::StartPurgingResources( |
| 882 const ResourceList& resources) { | 860 const ResourceList& resources) { |
| 883 DCHECK(has_checked_for_stale_resources_); | 861 DCHECK(has_checked_for_stale_resources_); |
| 884 for (size_t i = 0; i < resources.size(); ++i) | 862 for (size_t i = 0; i < resources.size(); ++i) |
| 885 purgeable_resource_ids_.push_back(resources[i].resource_id); | 863 purgeable_resource_ids_.push_back(resources[i].resource_id); |
| 886 ContinuePurgingResources(); | 864 ContinuePurgingResources(); |
| 887 } | 865 } |
| 888 | 866 |
| 889 void ServiceWorkerStorage::ContinuePurgingResources() { | 867 void ServiceWorkerStorage::ContinuePurgingResources() { |
| 890 if (purgeable_resource_ids_.empty() || is_purge_pending_) | 868 if (purgeable_resource_ids_.empty() || is_purge_pending_) |
| (...skipping 305 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1196 // Give up the corruption recovery until the browser restarts. | 1174 // Give up the corruption recovery until the browser restarts. |
| 1197 LOG(ERROR) << "Failed to delete the diskcache."; | 1175 LOG(ERROR) << "Failed to delete the diskcache."; |
| 1198 callback.Run(SERVICE_WORKER_ERROR_FAILED); | 1176 callback.Run(SERVICE_WORKER_ERROR_FAILED); |
| 1199 return; | 1177 return; |
| 1200 } | 1178 } |
| 1201 DVLOG(1) << "Deleted ServiceWorkerDiskCache successfully."; | 1179 DVLOG(1) << "Deleted ServiceWorkerDiskCache successfully."; |
| 1202 callback.Run(SERVICE_WORKER_OK); | 1180 callback.Run(SERVICE_WORKER_OK); |
| 1203 } | 1181 } |
| 1204 | 1182 |
| 1205 } // namespace content | 1183 } // namespace content |
| OLD | NEW |