blob: f92331232e849c7b98ddaeb65c15df6a40414c13 [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.
#ifndef COMPONENTS_PREVIEWS_CONTENT_HINT_CACHE_H_
#define COMPONENTS_PREVIEWS_CONTENT_HINT_CACHE_H_
#include <map>
#include <string>
#include <unordered_set>
#include <vector>
#include "base/callback.h"
#include "base/macros.h"
#include "base/sequence_checker.h"
#include "components/optimization_guide/proto/hints.pb.h"
namespace previews {
using HintLoadedCallback =
base::OnceCallback<void(const optimization_guide::proto::Hint&)>;
// Holds a set of optimization hints received from the Cacao service.
// This may include hints received from the ComponentUpdater and hints
// fetched from a Cacao Optimization Guide Service API. It will hold
// the host suffix keys of all cached hints (aka, activation list). It
// will manage a set of the associated hints details in memory and all
// of the hints in a persisted backing store.
class HintCache {
public:
HintCache();
~HintCache();
// Returns whether the cache has a hint data for |host| locally (whether
// in memory or persisted on disk).
bool HasHint(const std::string& host) const;
// Requests that hint data for |host| be loaded asynchronously and passed to
// |callback| if/when loaded. |callback| will not be called if no hint data
// is found for |host|.
void LoadHint(const std::string& host, HintLoadedCallback callback);
// Returns whether there is hint data available for |host| in memory.
bool IsHintLoaded(const std::string& host);
// Returns the hint data for |host| found in memory, otherwise nullptr.
const optimization_guide::proto::Hint* GetHint(const std::string& host) const;
// Adds |hint| to the cache.
void AddHint(const optimization_guide::proto::Hint& hint);
// Adds |hints| to the cache.
void AddHints(const std::vector<optimization_guide::proto::Hint>& hints);
private:
// Returns the most specific host suffix of the host name that is present
// in the activation list.
std::string DetermineHostSuffix(const std::string& host) const;
// The set of host suffixes that have Hint data.
std::unordered_set<std::string> activation_list_;
// The in-memory cache of hints. Maps host suffix to Hint proto.
// TODO(dougarnett): Add MRU subset support (mru_cache) with backing store.
std::map<std::string, optimization_guide::proto::Hint> memory_cache_;
// TODO(dougarnett): Add a backing store with all hints.
SEQUENCE_CHECKER(sequence_checker_);
DISALLOW_COPY_AND_ASSIGN(HintCache);
};
} // namespace previews
#endif // COMPONENTS_PREVIEWS_CONTENT_HINT_CACHE_H_