| Index: content/browser/service_worker/service_worker_storage.cc
|
| diff --git a/content/browser/service_worker/service_worker_storage.cc b/content/browser/service_worker/service_worker_storage.cc
|
| index a6be564c2e464e2bb18c78b6182edeea996012c4..0a06823ca41868e0d885aa235cdc1ce7a1e614fe 100644
|
| --- a/content/browser/service_worker/service_worker_storage.cc
|
| +++ b/content/browser/service_worker/service_worker_storage.cc
|
| @@ -479,22 +479,14 @@ void ServiceWorkerStorage::StoreRegistration(
|
| base::Bind(&WriteRegistrationInDB,
|
| database_.get(),
|
| base::MessageLoopProxy::current(),
|
| - data, resources,
|
| + data,
|
| + resources,
|
| base::Bind(&ServiceWorkerStorage::DidStoreRegistration,
|
| weak_factory_.GetWeakPtr(),
|
| - callback)));
|
| + callback,
|
| + data)));
|
|
|
| registration->set_is_deleted(false);
|
| -
|
| - // TODO(dmurph): Add correct byte delta.
|
| - if (quota_manager_proxy_.get()) {
|
| - // Can be nullptr in tests.
|
| - quota_manager_proxy_->NotifyStorageModified(
|
| - storage::QuotaClient::kServiceWorker,
|
| - registration->pattern().GetOrigin(),
|
| - storage::StorageType::kStorageTypeTemporary,
|
| - 0);
|
| - }
|
| }
|
|
|
| void ServiceWorkerStorage::UpdateToActiveState(
|
| @@ -927,25 +919,26 @@ void ServiceWorkerStorage::DidGetAllRegistrations(
|
| // Add all stored registrations.
|
| std::set<int64> pushed_registrations;
|
| std::vector<ServiceWorkerRegistrationInfo> infos;
|
| - for (RegistrationList::const_iterator it = registrations->begin();
|
| - it != registrations->end(); ++it) {
|
| + for (const auto& registration_data : *registrations) {
|
| const bool inserted =
|
| - pushed_registrations.insert(it->registration_id).second;
|
| + pushed_registrations.insert(registration_data.registration_id).second;
|
| DCHECK(inserted);
|
|
|
| ServiceWorkerRegistration* registration =
|
| - context_->GetLiveRegistration(it->registration_id);
|
| + context_->GetLiveRegistration(registration_data.registration_id);
|
| if (registration) {
|
| infos.push_back(registration->GetInfo());
|
| continue;
|
| }
|
|
|
| ServiceWorkerRegistrationInfo info;
|
| - info.pattern = it->scope;
|
| - info.registration_id = it->registration_id;
|
| + info.pattern = registration_data.scope;
|
| + info.registration_id = registration_data.registration_id;
|
| + info.stored_version_size_bytes =
|
| + registration_data.resources_total_size_bytes;
|
| if (ServiceWorkerVersion* version =
|
| - context_->GetLiveVersion(it->version_id)) {
|
| - if (it->is_active)
|
| + context_->GetLiveVersion(registration_data.version_id)) {
|
| + if (registration_data.is_active)
|
| info.active_version = version->GetInfo();
|
| else
|
| info.waiting_version = version->GetInfo();
|
| @@ -953,12 +946,12 @@ void ServiceWorkerStorage::DidGetAllRegistrations(
|
| continue;
|
| }
|
|
|
| - if (it->is_active) {
|
| + if (registration_data.is_active) {
|
| info.active_version.status = ServiceWorkerVersion::ACTIVATED;
|
| - info.active_version.version_id = it->version_id;
|
| + info.active_version.version_id = registration_data.version_id;
|
| } else {
|
| info.waiting_version.status = ServiceWorkerVersion::INSTALLED;
|
| - info.waiting_version.version_id = it->version_id;
|
| + info.waiting_version.version_id = registration_data.version_id;
|
| }
|
| infos.push_back(info);
|
| }
|
| @@ -976,8 +969,9 @@ void ServiceWorkerStorage::DidGetAllRegistrations(
|
|
|
| void ServiceWorkerStorage::DidStoreRegistration(
|
| const StatusCallback& callback,
|
| + const ServiceWorkerDatabase::RegistrationData& new_version,
|
| const GURL& origin,
|
| - int64 deleted_version_id,
|
| + const ServiceWorkerDatabase::RegistrationData& deleted_version,
|
| const std::vector<int64>& newly_purgeable_resources,
|
| ServiceWorkerDatabase::Status status) {
|
| if (status != ServiceWorkerDatabase::STATUS_OK) {
|
| @@ -986,9 +980,24 @@ void ServiceWorkerStorage::DidStoreRegistration(
|
| return;
|
| }
|
| registered_origins_.insert(origin);
|
| +
|
| + scoped_refptr<ServiceWorkerRegistration> registration =
|
| + context_->GetLiveRegistration(new_version.registration_id);
|
| + registration->set_resources_total_size_bytes(
|
| + new_version.resources_total_size_bytes);
|
| + if (quota_manager_proxy_.get()) {
|
| + // Can be nullptr in tests.
|
| + quota_manager_proxy_->NotifyStorageModified(
|
| + storage::QuotaClient::kServiceWorker,
|
| + origin,
|
| + storage::StorageType::kStorageTypeTemporary,
|
| + new_version.resources_total_size_bytes -
|
| + deleted_version.resources_total_size_bytes);
|
| + }
|
| +
|
| callback.Run(SERVICE_WORKER_OK);
|
|
|
| - if (!context_ || !context_->GetLiveVersion(deleted_version_id))
|
| + if (!context_ || !context_->GetLiveVersion(deleted_version.version_id))
|
| StartPurgingResources(newly_purgeable_resources);
|
| }
|
|
|
| @@ -1005,7 +1014,7 @@ void ServiceWorkerStorage::DidUpdateToActiveState(
|
| void ServiceWorkerStorage::DidDeleteRegistration(
|
| const DidDeleteRegistrationParams& params,
|
| bool origin_is_deletable,
|
| - int64 version_id,
|
| + const ServiceWorkerDatabase::RegistrationData& deleted_version,
|
| const std::vector<int64>& newly_purgeable_resources,
|
| ServiceWorkerDatabase::Status status) {
|
| pending_deletions_.erase(params.registration_id);
|
| @@ -1014,11 +1023,19 @@ void ServiceWorkerStorage::DidDeleteRegistration(
|
| params.callback.Run(DatabaseStatusToStatusCode(status));
|
| return;
|
| }
|
| + if (quota_manager_proxy_.get()) {
|
| + // Can be nullptr in tests.
|
| + quota_manager_proxy_->NotifyStorageModified(
|
| + storage::QuotaClient::kServiceWorker,
|
| + params.origin,
|
| + storage::StorageType::kStorageTypeTemporary,
|
| + -deleted_version.resources_total_size_bytes);
|
| + }
|
| if (origin_is_deletable)
|
| registered_origins_.erase(params.origin);
|
| params.callback.Run(SERVICE_WORKER_OK);
|
|
|
| - if (!context_ || !context_->GetLiveVersion(version_id))
|
| + if (!context_ || !context_->GetLiveVersion(deleted_version.version_id))
|
| StartPurgingResources(newly_purgeable_resources);
|
| }
|
|
|
| @@ -1033,6 +1050,7 @@ ServiceWorkerStorage::GetOrCreateRegistration(
|
|
|
| registration = new ServiceWorkerRegistration(
|
| data.scope, data.registration_id, context_);
|
| + registration->set_resources_total_size_bytes(data.resources_total_size_bytes);
|
| registration->set_last_update_check(data.last_update_check);
|
| if (pending_deletions_.find(data.registration_id) !=
|
| pending_deletions_.end()) {
|
| @@ -1292,17 +1310,15 @@ void ServiceWorkerStorage::DeleteRegistrationFromDB(
|
| const DeleteRegistrationCallback& callback) {
|
| DCHECK(database);
|
|
|
| - int64 version_id = kInvalidServiceWorkerVersionId;
|
| + ServiceWorkerDatabase::RegistrationData deleted_version;
|
| std::vector<int64> newly_purgeable_resources;
|
| ServiceWorkerDatabase::Status status = database->DeleteRegistration(
|
| - registration_id, origin, &version_id, &newly_purgeable_resources);
|
| + registration_id, origin, &deleted_version, &newly_purgeable_resources);
|
| if (status != ServiceWorkerDatabase::STATUS_OK) {
|
| - original_task_runner->PostTask(FROM_HERE,
|
| - base::Bind(callback,
|
| - false,
|
| - kInvalidServiceWorkerVersionId,
|
| - std::vector<int64>(),
|
| - status));
|
| + original_task_runner->PostTask(
|
| + FROM_HERE,
|
| + base::Bind(
|
| + callback, false, deleted_version, std::vector<int64>(), status));
|
| return;
|
| }
|
|
|
| @@ -1311,20 +1327,20 @@ void ServiceWorkerStorage::DeleteRegistrationFromDB(
|
| std::vector<ServiceWorkerDatabase::RegistrationData> registrations;
|
| status = database->GetRegistrationsForOrigin(origin, ®istrations);
|
| if (status != ServiceWorkerDatabase::STATUS_OK) {
|
| - original_task_runner->PostTask(FROM_HERE,
|
| - base::Bind(callback,
|
| - false,
|
| - kInvalidServiceWorkerVersionId,
|
| - std::vector<int64>(),
|
| - status));
|
| + original_task_runner->PostTask(
|
| + FROM_HERE,
|
| + base::Bind(
|
| + callback, false, deleted_version, std::vector<int64>(), status));
|
| return;
|
| }
|
|
|
| bool deletable = registrations.empty();
|
| - original_task_runner->PostTask(
|
| - FROM_HERE,
|
| - base::Bind(
|
| - callback, deletable, version_id, newly_purgeable_resources, status));
|
| + original_task_runner->PostTask(FROM_HERE,
|
| + base::Bind(callback,
|
| + deletable,
|
| + deleted_version,
|
| + newly_purgeable_resources,
|
| + status));
|
| }
|
|
|
| void ServiceWorkerStorage::WriteRegistrationInDB(
|
| @@ -1334,14 +1350,14 @@ void ServiceWorkerStorage::WriteRegistrationInDB(
|
| const ResourceList& resources,
|
| const WriteRegistrationCallback& callback) {
|
| DCHECK(database);
|
| - int64 deleted_version_id = kInvalidServiceWorkerVersionId;
|
| + ServiceWorkerDatabase::RegistrationData deleted_version;
|
| std::vector<int64> newly_purgeable_resources;
|
| ServiceWorkerDatabase::Status status = database->WriteRegistration(
|
| - data, resources, &deleted_version_id, &newly_purgeable_resources);
|
| + data, resources, &deleted_version, &newly_purgeable_resources);
|
| original_task_runner->PostTask(FROM_HERE,
|
| base::Bind(callback,
|
| data.script.GetOrigin(),
|
| - deleted_version_id,
|
| + deleted_version,
|
| newly_purgeable_resources,
|
| status));
|
| }
|
| @@ -1450,6 +1466,8 @@ void ServiceWorkerStorage::DeleteAllDataForOriginsFromDB(
|
| // database should not disable itself when an error occurs and the storage
|
| // controls it instead.
|
| void ServiceWorkerStorage::ScheduleDeleteAndStartOver() {
|
| + // TODO(dmurph): Notify the quota manager somehow that all of our data is now
|
| + // removed.
|
| if (state_ == DISABLED) {
|
| // Recovery process has already been scheduled.
|
| return;
|
|
|