Chromium Code Reviews| 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 "base/bind_helpers.h" | 7 #include "base/bind_helpers.h" |
| 8 #include "base/files/file_util.h" | 8 #include "base/files/file_util.h" |
| 9 #include "base/message_loop/message_loop.h" | 9 #include "base/message_loop/message_loop.h" |
| 10 #include "base/sequenced_task_runner.h" | 10 #include "base/sequenced_task_runner.h" |
| (...skipping 389 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 400 } | 400 } |
| 401 | 401 |
| 402 ServiceWorkerDatabase::RegistrationData data; | 402 ServiceWorkerDatabase::RegistrationData data; |
| 403 data.registration_id = registration->id(); | 403 data.registration_id = registration->id(); |
| 404 data.scope = registration->pattern(); | 404 data.scope = registration->pattern(); |
| 405 data.script = version->script_url(); | 405 data.script = version->script_url(); |
| 406 data.has_fetch_handler = true; | 406 data.has_fetch_handler = true; |
| 407 data.version_id = version->version_id(); | 407 data.version_id = version->version_id(); |
| 408 data.last_update_check = registration->last_update_check(); | 408 data.last_update_check = registration->last_update_check(); |
| 409 data.is_active = (version == registration->active_version()); | 409 data.is_active = (version == registration->active_version()); |
| 410 data.foreign_fetch_scopes = version->foreign_fetch_scopes(); | |
| 410 | 411 |
| 411 ResourceList resources; | 412 ResourceList resources; |
| 412 version->script_cache_map()->GetResources(&resources); | 413 version->script_cache_map()->GetResources(&resources); |
| 413 | 414 |
| 414 if (resources.empty()) { | 415 if (resources.empty()) { |
| 415 RunSoon(FROM_HERE, base::Bind(callback, SERVICE_WORKER_ERROR_FAILED)); | 416 RunSoon(FROM_HERE, base::Bind(callback, SERVICE_WORKER_ERROR_FAILED)); |
| 416 return; | 417 return; |
| 417 } | 418 } |
| 418 | 419 |
| 419 uint64 resources_total_size_bytes = 0; | 420 uint64 resources_total_size_bytes = 0; |
| (...skipping 258 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 678 base::Bind( | 679 base::Bind( |
| 679 &ServiceWorkerStorage::GetUserDataForAllRegistrationsInDB, | 680 &ServiceWorkerStorage::GetUserDataForAllRegistrationsInDB, |
| 680 database_.get(), | 681 database_.get(), |
| 681 base::ThreadTaskRunnerHandle::Get(), | 682 base::ThreadTaskRunnerHandle::Get(), |
| 682 key, | 683 key, |
| 683 base::Bind(&ServiceWorkerStorage::DidGetUserDataForAllRegistrations, | 684 base::Bind(&ServiceWorkerStorage::DidGetUserDataForAllRegistrations, |
| 684 weak_factory_.GetWeakPtr(), | 685 weak_factory_.GetWeakPtr(), |
| 685 callback))); | 686 callback))); |
| 686 } | 687 } |
| 687 | 688 |
| 689 bool ServiceWorkerStorage::OriginHasForeignFetchRegistrations( | |
| 690 const GURL& origin) { | |
|
nhiroki
2015/10/21 05:42:54
This should return false if the storage is disable
Marijn Kruisselbrink
2015/10/21 20:33:46
Done
| |
| 691 return foreign_fetch_origins_.find(origin) != foreign_fetch_origins_.end(); | |
| 692 } | |
| 693 | |
| 688 void ServiceWorkerStorage::DeleteAndStartOver(const StatusCallback& callback) { | 694 void ServiceWorkerStorage::DeleteAndStartOver(const StatusCallback& callback) { |
| 689 Disable(); | 695 Disable(); |
| 690 | 696 |
| 691 // Delete the database on the database thread. | 697 // Delete the database on the database thread. |
| 692 PostTaskAndReplyWithResult( | 698 PostTaskAndReplyWithResult( |
| 693 database_task_manager_->GetTaskRunner(), FROM_HERE, | 699 database_task_manager_->GetTaskRunner(), FROM_HERE, |
| 694 base::Bind(&ServiceWorkerDatabase::DestroyDatabase, | 700 base::Bind(&ServiceWorkerDatabase::DestroyDatabase, |
| 695 base::Unretained(database_.get())), | 701 base::Unretained(database_.get())), |
| 696 base::Bind(&ServiceWorkerStorage::DidDeleteDatabase, | 702 base::Bind(&ServiceWorkerStorage::DidDeleteDatabase, |
| 697 weak_factory_.GetWeakPtr(), callback)); | 703 weak_factory_.GetWeakPtr(), callback)); |
| (...skipping 149 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 847 DCHECK(data); | 853 DCHECK(data); |
| 848 DCHECK_EQ(INITIALIZING, state_); | 854 DCHECK_EQ(INITIALIZING, state_); |
| 849 | 855 |
| 850 if (status == ServiceWorkerDatabase::STATUS_OK) { | 856 if (status == ServiceWorkerDatabase::STATUS_OK) { |
| 851 next_registration_id_ = data->next_registration_id; | 857 next_registration_id_ = data->next_registration_id; |
| 852 next_version_id_ = data->next_version_id; | 858 next_version_id_ = data->next_version_id; |
| 853 next_resource_id_ = data->next_resource_id; | 859 next_resource_id_ = data->next_resource_id; |
| 854 registered_origins_.swap(data->origins); | 860 registered_origins_.swap(data->origins); |
| 855 disk_cache_migration_needed_ = data->disk_cache_migration_needed; | 861 disk_cache_migration_needed_ = data->disk_cache_migration_needed; |
| 856 old_disk_cache_deletion_needed_ = data->old_disk_cache_deletion_needed; | 862 old_disk_cache_deletion_needed_ = data->old_disk_cache_deletion_needed; |
| 863 foreign_fetch_origins_.swap(data->foreign_fetch_origins); | |
| 857 state_ = INITIALIZED; | 864 state_ = INITIALIZED; |
| 858 } else { | 865 } else { |
| 859 DVLOG(2) << "Failed to initialize: " | 866 DVLOG(2) << "Failed to initialize: " |
| 860 << ServiceWorkerDatabase::StatusToString(status); | 867 << ServiceWorkerDatabase::StatusToString(status); |
| 861 ScheduleDeleteAndStartOver(); | 868 ScheduleDeleteAndStartOver(); |
| 862 } | 869 } |
| 863 | 870 |
| 864 for (const auto& task : pending_tasks_) | 871 for (const auto& task : pending_tasks_) |
| 865 RunSoon(FROM_HERE, task); | 872 RunSoon(FROM_HERE, task); |
| 866 pending_tasks_.clear(); | 873 pending_tasks_.clear(); |
| (...skipping 216 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1083 const GURL& origin, | 1090 const GURL& origin, |
| 1084 const ServiceWorkerDatabase::RegistrationData& deleted_version, | 1091 const ServiceWorkerDatabase::RegistrationData& deleted_version, |
| 1085 const std::vector<int64>& newly_purgeable_resources, | 1092 const std::vector<int64>& newly_purgeable_resources, |
| 1086 ServiceWorkerDatabase::Status status) { | 1093 ServiceWorkerDatabase::Status status) { |
| 1087 if (status != ServiceWorkerDatabase::STATUS_OK) { | 1094 if (status != ServiceWorkerDatabase::STATUS_OK) { |
| 1088 ScheduleDeleteAndStartOver(); | 1095 ScheduleDeleteAndStartOver(); |
| 1089 callback.Run(DatabaseStatusToStatusCode(status)); | 1096 callback.Run(DatabaseStatusToStatusCode(status)); |
| 1090 return; | 1097 return; |
| 1091 } | 1098 } |
| 1092 registered_origins_.insert(origin); | 1099 registered_origins_.insert(origin); |
| 1100 if (!new_version.foreign_fetch_scopes.empty()) | |
| 1101 foreign_fetch_origins_.insert(origin); | |
| 1093 | 1102 |
| 1094 scoped_refptr<ServiceWorkerRegistration> registration = | 1103 scoped_refptr<ServiceWorkerRegistration> registration = |
| 1095 context_->GetLiveRegistration(new_version.registration_id); | 1104 context_->GetLiveRegistration(new_version.registration_id); |
| 1096 if (registration) { | 1105 if (registration) { |
| 1097 registration->set_resources_total_size_bytes( | 1106 registration->set_resources_total_size_bytes( |
| 1098 new_version.resources_total_size_bytes); | 1107 new_version.resources_total_size_bytes); |
| 1099 } | 1108 } |
| 1100 if (quota_manager_proxy_) { | 1109 if (quota_manager_proxy_) { |
| 1101 // Can be nullptr in tests. | 1110 // Can be nullptr in tests. |
| 1102 quota_manager_proxy_->NotifyStorageModified( | 1111 quota_manager_proxy_->NotifyStorageModified( |
| (...skipping 15 matching lines...) Expand all Loading... | |
| 1118 ServiceWorkerDatabase::Status status) { | 1127 ServiceWorkerDatabase::Status status) { |
| 1119 if (status != ServiceWorkerDatabase::STATUS_OK && | 1128 if (status != ServiceWorkerDatabase::STATUS_OK && |
| 1120 status != ServiceWorkerDatabase::STATUS_ERROR_NOT_FOUND) { | 1129 status != ServiceWorkerDatabase::STATUS_ERROR_NOT_FOUND) { |
| 1121 ScheduleDeleteAndStartOver(); | 1130 ScheduleDeleteAndStartOver(); |
| 1122 } | 1131 } |
| 1123 callback.Run(DatabaseStatusToStatusCode(status)); | 1132 callback.Run(DatabaseStatusToStatusCode(status)); |
| 1124 } | 1133 } |
| 1125 | 1134 |
| 1126 void ServiceWorkerStorage::DidDeleteRegistration( | 1135 void ServiceWorkerStorage::DidDeleteRegistration( |
| 1127 const DidDeleteRegistrationParams& params, | 1136 const DidDeleteRegistrationParams& params, |
| 1128 bool origin_is_deletable, | 1137 OriginState origin_state, |
| 1129 const ServiceWorkerDatabase::RegistrationData& deleted_version, | 1138 const ServiceWorkerDatabase::RegistrationData& deleted_version, |
| 1130 const std::vector<int64>& newly_purgeable_resources, | 1139 const std::vector<int64>& newly_purgeable_resources, |
| 1131 ServiceWorkerDatabase::Status status) { | 1140 ServiceWorkerDatabase::Status status) { |
| 1132 pending_deletions_.erase(params.registration_id); | 1141 pending_deletions_.erase(params.registration_id); |
| 1133 if (status != ServiceWorkerDatabase::STATUS_OK) { | 1142 if (status != ServiceWorkerDatabase::STATUS_OK) { |
| 1134 ScheduleDeleteAndStartOver(); | 1143 ScheduleDeleteAndStartOver(); |
| 1135 params.callback.Run(DatabaseStatusToStatusCode(status)); | 1144 params.callback.Run(DatabaseStatusToStatusCode(status)); |
| 1136 return; | 1145 return; |
| 1137 } | 1146 } |
| 1138 if (quota_manager_proxy_) { | 1147 if (quota_manager_proxy_) { |
| 1139 // Can be nullptr in tests. | 1148 // Can be nullptr in tests. |
| 1140 quota_manager_proxy_->NotifyStorageModified( | 1149 quota_manager_proxy_->NotifyStorageModified( |
| 1141 storage::QuotaClient::kServiceWorker, | 1150 storage::QuotaClient::kServiceWorker, |
| 1142 params.origin, | 1151 params.origin, |
| 1143 storage::StorageType::kStorageTypeTemporary, | 1152 storage::StorageType::kStorageTypeTemporary, |
| 1144 -deleted_version.resources_total_size_bytes); | 1153 -deleted_version.resources_total_size_bytes); |
| 1145 } | 1154 } |
| 1146 if (origin_is_deletable) | 1155 if (origin_state == OriginState::DELETE_FROM_ALL) |
| 1147 registered_origins_.erase(params.origin); | 1156 registered_origins_.erase(params.origin); |
| 1157 if (origin_state == OriginState::DELETE_FROM_ALL || | |
| 1158 origin_state == OriginState::DELETE_FROM_FOREIGN_FETCH) | |
| 1159 foreign_fetch_origins_.erase(params.origin); | |
| 1148 params.callback.Run(SERVICE_WORKER_OK); | 1160 params.callback.Run(SERVICE_WORKER_OK); |
| 1149 | 1161 |
| 1150 if (!context_->GetLiveVersion(deleted_version.version_id)) | 1162 if (!context_->GetLiveVersion(deleted_version.version_id)) |
| 1151 StartPurgingResources(newly_purgeable_resources); | 1163 StartPurgingResources(newly_purgeable_resources); |
| 1152 } | 1164 } |
| 1153 | 1165 |
| 1154 void ServiceWorkerStorage::DidWriteUncommittedResourceIds( | 1166 void ServiceWorkerStorage::DidWriteUncommittedResourceIds( |
| 1155 ServiceWorkerDatabase::Status status) { | 1167 ServiceWorkerDatabase::Status status) { |
| 1156 if (status != ServiceWorkerDatabase::STATUS_OK) | 1168 if (status != ServiceWorkerDatabase::STATUS_OK) |
| 1157 ScheduleDeleteAndStartOver(); | 1169 ScheduleDeleteAndStartOver(); |
| (...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1226 registration->set_is_deleted(true); | 1238 registration->set_is_deleted(true); |
| 1227 } | 1239 } |
| 1228 scoped_refptr<ServiceWorkerVersion> version = | 1240 scoped_refptr<ServiceWorkerVersion> version = |
| 1229 context_->GetLiveVersion(data.version_id); | 1241 context_->GetLiveVersion(data.version_id); |
| 1230 if (!version) { | 1242 if (!version) { |
| 1231 version = new ServiceWorkerVersion( | 1243 version = new ServiceWorkerVersion( |
| 1232 registration.get(), data.script, data.version_id, context_); | 1244 registration.get(), data.script, data.version_id, context_); |
| 1233 version->SetStatus(data.is_active ? | 1245 version->SetStatus(data.is_active ? |
| 1234 ServiceWorkerVersion::ACTIVATED : ServiceWorkerVersion::INSTALLED); | 1246 ServiceWorkerVersion::ACTIVATED : ServiceWorkerVersion::INSTALLED); |
| 1235 version->script_cache_map()->SetResources(resources); | 1247 version->script_cache_map()->SetResources(resources); |
| 1248 version->set_foreign_fetch_scopes(data.foreign_fetch_scopes); | |
| 1236 } | 1249 } |
| 1237 | 1250 |
| 1238 if (version->status() == ServiceWorkerVersion::ACTIVATED) | 1251 if (version->status() == ServiceWorkerVersion::ACTIVATED) |
| 1239 registration->SetActiveVersion(version); | 1252 registration->SetActiveVersion(version); |
| 1240 else if (version->status() == ServiceWorkerVersion::INSTALLED) | 1253 else if (version->status() == ServiceWorkerVersion::INSTALLED) |
| 1241 registration->SetWaitingVersion(version); | 1254 registration->SetWaitingVersion(version); |
| 1242 else | 1255 else |
| 1243 NOTREACHED(); | 1256 NOTREACHED(); |
| 1244 | 1257 |
| 1245 return registration; | 1258 return registration; |
| (...skipping 323 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1569 | 1582 |
| 1570 status = database->IsOldDiskCacheDeletionNeeded( | 1583 status = database->IsOldDiskCacheDeletionNeeded( |
| 1571 &data->old_disk_cache_deletion_needed); | 1584 &data->old_disk_cache_deletion_needed); |
| 1572 if (status != ServiceWorkerDatabase::STATUS_OK) { | 1585 if (status != ServiceWorkerDatabase::STATUS_OK) { |
| 1573 original_task_runner->PostTask( | 1586 original_task_runner->PostTask( |
| 1574 FROM_HERE, base::Bind(callback, base::Passed(data.Pass()), status)); | 1587 FROM_HERE, base::Bind(callback, base::Passed(data.Pass()), status)); |
| 1575 return; | 1588 return; |
| 1576 } | 1589 } |
| 1577 | 1590 |
| 1578 status = database->GetOriginsWithRegistrations(&data->origins); | 1591 status = database->GetOriginsWithRegistrations(&data->origins); |
| 1592 if (status != ServiceWorkerDatabase::STATUS_OK) { | |
| 1593 original_task_runner->PostTask( | |
| 1594 FROM_HERE, base::Bind(callback, base::Passed(data.Pass()), status)); | |
| 1595 return; | |
| 1596 } | |
| 1597 | |
| 1598 status = database->GetOriginsWithForeignFetchRegistrations( | |
| 1599 &data->foreign_fetch_origins); | |
| 1579 original_task_runner->PostTask( | 1600 original_task_runner->PostTask( |
| 1580 FROM_HERE, base::Bind(callback, base::Passed(data.Pass()), status)); | 1601 FROM_HERE, base::Bind(callback, base::Passed(data.Pass()), status)); |
| 1581 } | 1602 } |
| 1582 | 1603 |
| 1583 void ServiceWorkerStorage::DeleteOldDiskCacheInDB( | 1604 void ServiceWorkerStorage::DeleteOldDiskCacheInDB( |
| 1584 ServiceWorkerDatabase* database, | 1605 ServiceWorkerDatabase* database, |
| 1585 const base::FilePath& disk_cache_path) { | 1606 const base::FilePath& disk_cache_path) { |
| 1586 // Ignore a failure. A retry will happen on the next initialization. | 1607 // Ignore a failure. A retry will happen on the next initialization. |
| 1587 if (!base::DeleteFile(disk_cache_path, true)) | 1608 if (!base::DeleteFile(disk_cache_path, true)) |
| 1588 return; | 1609 return; |
| 1589 database->SetOldDiskCacheDeletionNotNeeded(); | 1610 database->SetOldDiskCacheDeletionNotNeeded(); |
| 1590 } | 1611 } |
| 1591 | 1612 |
| 1592 void ServiceWorkerStorage::DeleteRegistrationFromDB( | 1613 void ServiceWorkerStorage::DeleteRegistrationFromDB( |
| 1593 ServiceWorkerDatabase* database, | 1614 ServiceWorkerDatabase* database, |
| 1594 scoped_refptr<base::SequencedTaskRunner> original_task_runner, | 1615 scoped_refptr<base::SequencedTaskRunner> original_task_runner, |
| 1595 int64 registration_id, | 1616 int64 registration_id, |
| 1596 const GURL& origin, | 1617 const GURL& origin, |
| 1597 const DeleteRegistrationCallback& callback) { | 1618 const DeleteRegistrationCallback& callback) { |
| 1598 DCHECK(database); | 1619 DCHECK(database); |
| 1599 | 1620 |
| 1600 ServiceWorkerDatabase::RegistrationData deleted_version; | 1621 ServiceWorkerDatabase::RegistrationData deleted_version; |
| 1601 std::vector<int64> newly_purgeable_resources; | 1622 std::vector<int64> newly_purgeable_resources; |
| 1602 ServiceWorkerDatabase::Status status = database->DeleteRegistration( | 1623 ServiceWorkerDatabase::Status status = database->DeleteRegistration( |
| 1603 registration_id, origin, &deleted_version, &newly_purgeable_resources); | 1624 registration_id, origin, &deleted_version, &newly_purgeable_resources); |
| 1604 if (status != ServiceWorkerDatabase::STATUS_OK) { | 1625 if (status != ServiceWorkerDatabase::STATUS_OK) { |
| 1605 original_task_runner->PostTask( | 1626 original_task_runner->PostTask( |
| 1606 FROM_HERE, | 1627 FROM_HERE, base::Bind(callback, OriginState::KEEP_ALL, deleted_version, |
| 1607 base::Bind( | 1628 std::vector<int64>(), status)); |
| 1608 callback, false, deleted_version, std::vector<int64>(), status)); | |
| 1609 return; | 1629 return; |
| 1610 } | 1630 } |
| 1611 | 1631 |
| 1612 // TODO(nhiroki): Add convenient method to ServiceWorkerDatabase to check the | 1632 // TODO(nhiroki): Add convenient method to ServiceWorkerDatabase to check the |
| 1613 // unique origin list. | 1633 // unique origin list. |
| 1614 RegistrationList registrations; | 1634 RegistrationList registrations; |
| 1615 status = database->GetRegistrationsForOrigin(origin, ®istrations, nullptr); | 1635 status = database->GetRegistrationsForOrigin(origin, ®istrations, nullptr); |
| 1616 if (status != ServiceWorkerDatabase::STATUS_OK) { | 1636 if (status != ServiceWorkerDatabase::STATUS_OK) { |
| 1617 original_task_runner->PostTask( | 1637 original_task_runner->PostTask( |
| 1618 FROM_HERE, | 1638 FROM_HERE, base::Bind(callback, OriginState::KEEP_ALL, deleted_version, |
| 1619 base::Bind( | 1639 std::vector<int64>(), status)); |
| 1620 callback, false, deleted_version, std::vector<int64>(), status)); | |
| 1621 return; | 1640 return; |
| 1622 } | 1641 } |
| 1623 | 1642 |
| 1624 bool deletable = registrations.empty(); | 1643 OriginState origin_state = registrations.empty() |
| 1625 original_task_runner->PostTask(FROM_HERE, | 1644 ? OriginState::DELETE_FROM_ALL |
| 1626 base::Bind(callback, | 1645 : OriginState::DELETE_FROM_FOREIGN_FETCH; |
| 1627 deletable, | 1646 |
| 1628 deleted_version, | 1647 // TODO(mek): Add convenient method to ServiceWorkerDatabase to check the |
| 1629 newly_purgeable_resources, | 1648 // foreign fetch scope origin list. |
| 1630 status)); | 1649 for (const auto& registration : registrations) { |
| 1650 if (!registration.foreign_fetch_scopes.empty()) { | |
| 1651 origin_state = OriginState::KEEP_ALL; | |
| 1652 break; | |
| 1653 } | |
| 1654 } | |
| 1655 original_task_runner->PostTask( | |
| 1656 FROM_HERE, base::Bind(callback, origin_state, deleted_version, | |
| 1657 newly_purgeable_resources, status)); | |
| 1631 } | 1658 } |
| 1632 | 1659 |
| 1633 void ServiceWorkerStorage::WriteRegistrationInDB( | 1660 void ServiceWorkerStorage::WriteRegistrationInDB( |
| 1634 ServiceWorkerDatabase* database, | 1661 ServiceWorkerDatabase* database, |
| 1635 scoped_refptr<base::SequencedTaskRunner> original_task_runner, | 1662 scoped_refptr<base::SequencedTaskRunner> original_task_runner, |
| 1636 const ServiceWorkerDatabase::RegistrationData& data, | 1663 const ServiceWorkerDatabase::RegistrationData& data, |
| 1637 const ResourceList& resources, | 1664 const ResourceList& resources, |
| 1638 const WriteRegistrationCallback& callback) { | 1665 const WriteRegistrationCallback& callback) { |
| 1639 DCHECK(database); | 1666 DCHECK(database); |
| 1640 ServiceWorkerDatabase::RegistrationData deleted_version; | 1667 ServiceWorkerDatabase::RegistrationData deleted_version; |
| (...skipping 202 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1843 callback.Run(SERVICE_WORKER_ERROR_FAILED); | 1870 callback.Run(SERVICE_WORKER_ERROR_FAILED); |
| 1844 return; | 1871 return; |
| 1845 } | 1872 } |
| 1846 DVLOG(1) << "Deleted ServiceWorkerDiskCache successfully."; | 1873 DVLOG(1) << "Deleted ServiceWorkerDiskCache successfully."; |
| 1847 ServiceWorkerMetrics::RecordDeleteAndStartOverResult( | 1874 ServiceWorkerMetrics::RecordDeleteAndStartOverResult( |
| 1848 ServiceWorkerMetrics::DELETE_OK); | 1875 ServiceWorkerMetrics::DELETE_OK); |
| 1849 callback.Run(SERVICE_WORKER_OK); | 1876 callback.Run(SERVICE_WORKER_OK); |
| 1850 } | 1877 } |
| 1851 | 1878 |
| 1852 } // namespace content | 1879 } // namespace content |
| OLD | NEW |