blob: 231de3c26e2f5e579a981b70ab70d7eaaec64042 [file] [log] [blame]
// Copyright 2020 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 "chrome/browser/optimization_guide/prediction/prediction_model_download_client.h"
#include "base/bind.h"
#include "base/metrics/histogram_macros_local.h"
#include "base/threading/sequenced_task_runner_handle.h"
#include "chrome/browser/optimization_guide/optimization_guide_keyed_service.h"
#include "chrome/browser/optimization_guide/optimization_guide_keyed_service_factory.h"
#include "chrome/browser/optimization_guide/prediction/prediction_manager.h"
#include "chrome/browser/optimization_guide/prediction/prediction_model_download_manager.h"
#include "components/download/public/background_service/download_metadata.h"
#include "services/network/public/cpp/resource_request_body.h"
namespace optimization_guide {
PredictionModelDownloadClient::PredictionModelDownloadClient(Profile* profile)
: profile_(profile) {}
PredictionModelDownloadClient::~PredictionModelDownloadClient() = default;
PredictionModelDownloadManager*
PredictionModelDownloadClient::GetPredictionModelDownloadManager() {
OptimizationGuideKeyedService* optimization_guide_keyed_service =
OptimizationGuideKeyedServiceFactory::GetForProfile(profile_);
if (!optimization_guide_keyed_service)
return nullptr;
PredictionManager* prediction_manager =
optimization_guide_keyed_service->GetPredictionManager();
if (!prediction_manager)
return nullptr;
return prediction_manager->prediction_model_download_manager();
}
void PredictionModelDownloadClient::OnServiceInitialized(
bool state_lost,
const std::vector<download::DownloadMetaData>& downloads) {
PredictionModelDownloadManager* download_manager =
GetPredictionModelDownloadManager();
if (!download_manager)
return;
std::set<std::string> outstanding_download_guids;
std::map<std::string, base::FilePath> successful_downloads;
for (const auto& download : downloads) {
if (!download.completion_info) {
outstanding_download_guids.emplace(download.guid);
continue;
}
successful_downloads.emplace(download.guid, download.completion_info->path);
}
download_manager->OnDownloadServiceReady(outstanding_download_guids,
successful_downloads);
}
void PredictionModelDownloadClient::OnServiceUnavailable() {
PredictionModelDownloadManager* download_manager =
GetPredictionModelDownloadManager();
if (download_manager)
download_manager->OnDownloadServiceUnavailable();
}
void PredictionModelDownloadClient::OnDownloadStarted(
const std::string& guid,
const std::vector<GURL>& url_chain,
const scoped_refptr<const net::HttpResponseHeaders>& headers) {
// Do not remove. This is a hook used by integration tests that test
// client-server interaction.
LOCAL_HISTOGRAM_BOOLEAN(
"OptimizationGuide.PredictionModelDownloadClient.DownloadStarted", true);
}
void PredictionModelDownloadClient::OnDownloadFailed(
const std::string& guid,
const download::CompletionInfo& completion_info,
download::Client::FailureReason reason) {
PredictionModelDownloadManager* download_manager =
GetPredictionModelDownloadManager();
if (download_manager)
download_manager->OnDownloadFailed(guid);
}
void PredictionModelDownloadClient::OnDownloadSucceeded(
const std::string& guid,
const download::CompletionInfo& completion_info) {
PredictionModelDownloadManager* download_manager =
GetPredictionModelDownloadManager();
if (download_manager)
download_manager->OnDownloadSucceeded(guid, completion_info.path);
}
bool PredictionModelDownloadClient::CanServiceRemoveDownloadedFile(
const std::string& guid,
bool force_delete) {
// Always return true. We immediately postprocess successful downloads and the
// file downloaded by the Download Service should already be deleted and this
// hypothetically should never be called with anything that matters.
return true;
}
void PredictionModelDownloadClient::GetUploadData(
const std::string& guid,
download::GetUploadDataCallback callback) {
base::SequencedTaskRunnerHandle::Get()->PostTask(
FROM_HERE, base::BindOnce(std::move(callback), nullptr));
}
} // namespace optimization_guide