|  | // Copyright 2018 The Chromium Authors | 
|  | // Use of this source code is governed by a BSD-style license that can be | 
|  | // found in the LICENSE file. | 
|  |  | 
|  | #include "content/browser/background_fetch/storage/get_registration_task.h" | 
|  |  | 
|  | #include "base/functional/bind.h" | 
|  | #include "content/browser/background_fetch/storage/database_helpers.h" | 
|  | #include "content/browser/background_fetch/storage/get_metadata_task.h" | 
|  | #include "third_party/blink/public/common/storage_key/storage_key.h" | 
|  |  | 
|  | namespace content { | 
|  | namespace background_fetch { | 
|  |  | 
|  | GetRegistrationTask::GetRegistrationTask(DatabaseTaskHost* host, | 
|  | int64_t service_worker_registration_id, | 
|  | const blink::StorageKey& storage_key, | 
|  | const std::string& developer_id, | 
|  | GetRegistrationCallback callback) | 
|  | : DatabaseTask(host), | 
|  | service_worker_registration_id_(service_worker_registration_id), | 
|  | storage_key_(storage_key), | 
|  | developer_id_(developer_id), | 
|  | callback_(std::move(callback)) {} | 
|  |  | 
|  | GetRegistrationTask::~GetRegistrationTask() = default; | 
|  |  | 
|  | void GetRegistrationTask::Start() { | 
|  | AddSubTask(std::make_unique<GetMetadataTask>( | 
|  | this, service_worker_registration_id_, storage_key_, developer_id_, | 
|  | base::BindOnce(&GetRegistrationTask::DidGetMetadata, | 
|  | weak_factory_.GetWeakPtr()))); | 
|  | } | 
|  |  | 
|  | void GetRegistrationTask::DidGetMetadata( | 
|  | blink::mojom::BackgroundFetchError error, | 
|  | std::unique_ptr<proto::BackgroundFetchMetadata> metadata_proto) { | 
|  | metadata_proto_ = std::move(metadata_proto); | 
|  | if (error == blink::mojom::BackgroundFetchError::STORAGE_ERROR) | 
|  | SetStorageError(BackgroundFetchStorageError::kServiceWorkerStorageError); | 
|  | FinishWithError(error); | 
|  | } | 
|  |  | 
|  | void GetRegistrationTask::FinishWithError( | 
|  | blink::mojom::BackgroundFetchError error) { | 
|  | auto registration_data = blink::mojom::BackgroundFetchRegistrationData::New(); | 
|  | BackgroundFetchRegistrationId registration_id; | 
|  |  | 
|  | if (error == blink::mojom::BackgroundFetchError::NONE) { | 
|  | DCHECK(metadata_proto_); | 
|  |  | 
|  | bool converted = ToBackgroundFetchRegistration(*metadata_proto_, | 
|  | registration_data.get()); | 
|  | if (!converted) { | 
|  | // Database corrupted. | 
|  | SetStorageErrorAndFinish( | 
|  | BackgroundFetchStorageError::kServiceWorkerStorageError); | 
|  | return; | 
|  | } | 
|  |  | 
|  | registration_id = BackgroundFetchRegistrationId( | 
|  | service_worker_registration_id_, storage_key_, developer_id_, | 
|  | metadata_proto_->registration().unique_id()); | 
|  | } | 
|  |  | 
|  | std::move(callback_).Run(error, std::move(registration_id), | 
|  | std::move(registration_data)); | 
|  | Finished();  // Destroys |this|. | 
|  | } | 
|  |  | 
|  | }  // namespace background_fetch | 
|  | }  // namespace content |