blob: 4f40b94753913be9ef72afb0276eea1c5f915ad5 [file] [log] [blame]
// Copyright 2019 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.
#ifndef CHROME_BROWSER_OPTIMIZATION_GUIDE_PREDICTION_PREDICTION_MODEL_FETCHER_H_
#define CHROME_BROWSER_OPTIMIZATION_GUIDE_PREDICTION_PREDICTION_MODEL_FETCHER_H_
#include <memory>
#include <string>
#include <vector>
#include "base/callback.h"
#include "base/macros.h"
#include "base/memory/scoped_refptr.h"
#include "base/optional.h"
#include "base/sequence_checker.h"
#include "components/optimization_guide/proto/models.pb.h"
#include "url/gurl.h"
namespace network {
class SharedURLLoaderFactory;
class SimpleURLLoader;
} // namespace network
namespace optimization_guide {
// Callback to inform the caller that the remote hints have been fetched and
// to pass back the fetched hints response from the remote Optimization Guide
// Service.
using ModelsFetchedCallback = base::OnceCallback<void(
base::Optional<
std::unique_ptr<optimization_guide::proto::GetModelsResponse>>)>;
// A class to handle requests for prediction models (and prediction data) from
// a remote Optimization Guide Service.
//
// This class fetches new models from the remote Optimization Guide Service.
class PredictionModelFetcher {
public:
PredictionModelFetcher(
scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory,
GURL optimization_guide_service_get_models_url);
virtual ~PredictionModelFetcher();
// Requests PredictionModels and HostModelFeatures from the Optimization Guide
// Service if a request for them is not already in progress. Returns whether a
// new request was issued. |models_fetched_callback| is called when the
// request is complete providing the GetModelsResponse object if successful or
// nullopt if the fetch failed or no fetch is needed. Virtualized for testing.
virtual bool FetchOptimizationGuideServiceModels(
const std::vector<optimization_guide::proto::ModelInfo>&
models_request_info,
const std::vector<std::string>& hosts,
optimization_guide::proto::RequestContext request_context,
ModelsFetchedCallback models_fetched_callback);
private:
// URL loader completion callback.
void OnURLLoadComplete(std::unique_ptr<std::string> response_body);
// Handles the response from the remote Optimization Guide Service.
// |response| is the response body, |status| is the
// |net::Error| of the response, and response_code is the HTTP
// response code (if available).
void HandleResponse(const std::string& response,
int status,
int response_code);
// Used to hold the callback while the SimpleURLLoader performs the request
// asynchronously.
ModelsFetchedCallback models_fetched_callback_;
// The URL for the remote Optimization Guide Service that serves models and
// host features.
const GURL optimization_guide_service_get_models_url_;
// Used to hold the GetModelsRequest being constructed and sent as a remote
// request.
std::unique_ptr<optimization_guide::proto::GetModelsRequest>
pending_models_request_;
// Holds the URLLoader for an active hints request.
std::unique_ptr<network::SimpleURLLoader> url_loader_;
// Used for creating a |url_loader_| when needed for request hints.
scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory_;
SEQUENCE_CHECKER(sequence_checker_);
DISALLOW_COPY_AND_ASSIGN(PredictionModelFetcher);
};
} // namespace optimization_guide
#endif // CHROME_BROWSER_OPTIMIZATION_GUIDE_PREDICTION_PREDICTION_MODEL_FETCHER_H_