| // Copyright 2018 The Chromium Authors. All rights reserved. |
| // 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_num_requests_task.h" |
| |
| #include "content/browser/background_fetch/background_fetch.pb.h" |
| #include "content/browser/background_fetch/storage/database_helpers.h" |
| #include "content/browser/background_fetch/storage/get_metadata_task.h" |
| #include "content/browser/service_worker/service_worker_context_wrapper.h" |
| |
| namespace content { |
| |
| namespace background_fetch { |
| |
| namespace { |
| |
| void HandleGetMetadataCallback( |
| GetNumRequestsTask::NumRequestsCallback callback, |
| blink::mojom::BackgroundFetchError error, |
| std::unique_ptr<proto::BackgroundFetchMetadata> metadata) { |
| if (error != blink::mojom::BackgroundFetchError::NONE) { |
| std::move(callback).Run(0u); |
| return; |
| } |
| |
| DCHECK(metadata); |
| std::move(callback).Run(metadata->num_fetches()); |
| } |
| |
| } // namespace |
| |
| GetNumRequestsTask::GetNumRequestsTask( |
| BackgroundFetchDataManager* data_manager, |
| const BackgroundFetchRegistrationId& registration_id, |
| RequestType type, |
| NumRequestsCallback callback) |
| : DatabaseTask(data_manager), |
| registration_id_(registration_id), |
| type_(type), |
| callback_(std::move(callback)), |
| weak_factory_(this) {} |
| |
| GetNumRequestsTask::~GetNumRequestsTask() = default; |
| |
| void GetNumRequestsTask::Start() { |
| switch (type_) { |
| case RequestType::kAny: |
| GetMetadata(); |
| return; |
| case RequestType::kPending: |
| GetRequests(PendingRequestKeyPrefix(registration_id_.unique_id())); |
| return; |
| case RequestType::kActive: |
| GetRequests(ActiveRequestKeyPrefix(registration_id_.unique_id())); |
| return; |
| case RequestType::kCompleted: |
| GetRequests(CompletedRequestKeyPrefix(registration_id_.unique_id())); |
| return; |
| } |
| NOTREACHED(); |
| } |
| |
| void GetNumRequestsTask::GetMetadata() { |
| AddDatabaseTask(std::make_unique<GetMetadataTask>( |
| data_manager(), registration_id_.service_worker_registration_id(), |
| registration_id_.origin(), registration_id_.developer_id(), |
| base::BindOnce(&HandleGetMetadataCallback, std::move(callback_)))); |
| Finished(); // Destroys |this|. |
| } |
| |
| void GetNumRequestsTask::GetRequests(const std::string& key_prefix) { |
| service_worker_context()->GetRegistrationUserDataByKeyPrefix( |
| registration_id_.service_worker_registration_id(), key_prefix, |
| base::BindOnce(&GetNumRequestsTask::DidGetRequests, |
| weak_factory_.GetWeakPtr())); |
| } |
| |
| void GetNumRequestsTask::DidGetRequests(const std::vector<std::string>& data, |
| blink::ServiceWorkerStatusCode status) { |
| DCHECK_EQ(ToDatabaseStatus(status), DatabaseStatus::kOk); |
| std::move(callback_).Run(data.size()); |
| Finished(); // Destroys |this|. |
| } |
| |
| } // namespace background_fetch |
| |
| } // namespace content |