blob: 1d693e933b40130a5c305e8ff19c5627eeed2d7e [file] [log] [blame]
// 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