1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99
|
// Copyright 2025 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef COMPONENTS_VISITED_URL_RANKING_INTERNAL_URL_GROUPING_GROUP_SUGGESTIONS_TRACKER_H_
#define COMPONENTS_VISITED_URL_RANKING_INTERNAL_URL_GROUPING_GROUP_SUGGESTIONS_TRACKER_H_
#include <vector>
#include "base/containers/flat_set.h"
#include "components/segmentation_platform/public/input_context.h"
#include "components/visited_url_ranking/public/url_grouping/group_suggestions.h"
#include "components/visited_url_ranking/public/url_grouping/group_suggestions_delegate.h"
class PrefService;
class PrefRegistrySimple;
namespace visited_url_ranking {
using CachedSuggestionsAndInputs =
std::pair<GroupSuggestions,
std::vector<scoped_refptr<segmentation_platform::InputContext>>>;
class GroupSuggestionsTracker {
public:
static const char kGroupSuggestionsTrackerStatePref[];
static const char kGroupSuggestionsTrackerTimeKey[];
static const char kGroupSuggestionsTrackerUserResponseKey[];
static const char kGroupSuggestionsTrackerUserTabIdsKey[];
static const char kGroupSuggestionsTrackerHostHashesKey[];
explicit GroupSuggestionsTracker(PrefService* pref_service);
~GroupSuggestionsTracker();
GroupSuggestionsTracker(const GroupSuggestionsTracker&) = delete;
GroupSuggestionsTracker& operator=(const GroupSuggestionsTracker&) = delete;
static void RegisterProfilePrefs(PrefRegistrySimple* registry);
void AddShownSuggestion(
const GroupSuggestion& suggestion,
const std::vector<scoped_refptr<segmentation_platform::InputContext>>&
inputs,
UserResponse user_response);
bool ShouldShowSuggestion(
const GroupSuggestion& suggestion,
const std::vector<scoped_refptr<segmentation_platform::InputContext>>&
inputs);
// Caches the provided suggestions. Overwrites any previously cached data.
void CacheSuggestions(
GroupSuggestions suggestions,
std::vector<scoped_refptr<segmentation_platform::InputContext>> inputs);
// Retrieves a copy of the last cached suggestions. Does not clear the cache.
std::optional<CachedSuggestionsAndInputs> GetCachedSuggestions() const;
// Invalidates the cached suggestions.
void InvalidateCache();
private:
struct ShownSuggestion {
ShownSuggestion();
~ShownSuggestion();
ShownSuggestion(ShownSuggestion&& suggestion);
ShownSuggestion& operator=(ShownSuggestion&& suggestion);
// Returns the dictionary representation of the `ShownSuggestion` to be
// saved into pref.
base::Value::Dict ToDict() const;
// Returns ShownSuggestion extracted from a dictionary representation.
static std::optional<ShownSuggestion> FromDict(
const base::Value::Dict& dict);
base::Time time_shown;
std::vector<int> tab_ids;
std::set<int> host_hashes;
UserResponse user_response = UserResponse::kUnknown;
};
bool HasOverlappingTabs(const GroupSuggestion& suggestion) const;
bool HasOverlappingHosts(
const GroupSuggestion& suggestion,
const std::vector<scoped_refptr<segmentation_platform::InputContext>>&
inputs) const;
raw_ptr<PrefService> pref_service_;
std::vector<ShownSuggestion> suggestions_;
// Holds the last set of computed suggestions and their input contexts for the
// GetCachedSuggestions API.
std::optional<CachedSuggestionsAndInputs> last_cached_suggestions_and_inputs_;
};
} // namespace visited_url_ranking
#endif // COMPONENTS_VISITED_URL_RANKING_INTERNAL_URL_GROUPING_GROUP_SUGGESTIONS_TRACKER_H_
|