blob: de6364caf5480daf6a64335e80ac35bed70222c0 [file] [log] [blame]
// Copyright 2022 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_OMNIBOX_BROWSER_AUTOCOMPLETE_GROUPER_SECTIONS_H_
#define COMPONENTS_OMNIBOX_BROWSER_AUTOCOMPLETE_GROUPER_SECTIONS_H_
#include <memory>
#include <vector>
#include "components/omnibox/browser/autocomplete_grouper_groups.h"
#include "components/omnibox/browser/autocomplete_match.h"
#include "components/omnibox/browser/suggestion_group_util.h"
#include "components/omnibox/common/omnibox_feature_configs.h"
class Section;
using Groups = std::vector<Group>;
using PSections = std::vector<std::unique_ptr<Section>>;
// `Section` class and subclasses used to implement the various autocomplete
// grouping algorithms.
// Section containing no `Groups` and, therefore, no matches.
class Section {
public:
explicit Section(size_t limit,
Groups groups,
omnibox::GroupConfigMap& group_configs,
omnibox::GroupConfig_SideType side_type =
omnibox::GroupConfig_SideType_DEFAULT_PRIMARY);
virtual ~Section();
// Returns `matches` ranked and culled according to `sections`. All `matches`
// should have `suggestion_group_id` set and be sorted by relevance.
static ACMatches GroupMatches(PSections sections, ACMatches& matches);
// Used to adjust this `Section`'s and its `Group`s' total limits.
virtual void InitFromMatches(ACMatches& matches) {}
protected:
// Returns the first `Group` in this `Section` `match` can be added to or
// `groups_.end()` if none can be found. Does not take the total limit into
// account.
Groups::iterator FindGroup(const AutocompleteMatch& match);
// Returns whether `match` was added to a `Group` in this `Section`. Does not
// add a match beyond the total limit.
bool Add(const AutocompleteMatch& match);
// Max number of matches this `Section` can contain across `groups_`.
size_t limit_{0};
// The number of matches this `Section` contains across `groups_`.
size_t count_{0};
// The `Group`s this `Section` contains.
Groups groups_{};
// This `Section`s map of group IDs to group information.
omnibox::GroupConfigMap group_configs_;
// This `Section`s side type.
omnibox::GroupConfig_SideType side_type_;
};
// Base section for ZPS limits and grouping. Asserts that matches are sorted by
// their `Group`s position.
class ZpsSection : public Section {
public:
ZpsSection(size_t limit,
Groups groups,
omnibox::GroupConfigMap& group_configs,
omnibox::GroupConfig_SideType side_type =
omnibox::GroupConfig_SideType_DEFAULT_PRIMARY);
// Section:
void InitFromMatches(ACMatches& matches) override;
};
// Base section for ZPS limits and grouping where local history zero-prefix
// suggestions are enabled. Sorts the matches by their `Group`s position to
// ensure zero-prefix suggestions from local history backfill remote
// personalized zero-prefix suggestions.
// TODO(crbug.com/409810808): Find a more general solution for accommodating
// local history backfill and remove this class.
class ZpsSectionWithLocalHistory : public ZpsSection {
protected:
explicit ZpsSectionWithLocalHistory(size_t limit,
Groups groups,
omnibox::GroupConfigMap& group_configs);
// Section:
void InitFromMatches(ACMatches& matches) override;
};
// A ZpsSection that automatically counts all MV Tiles as one suggestion when
// applying the total limit.
class ZpsSectionWithMVTiles : public ZpsSection {
public:
explicit ZpsSectionWithMVTiles(size_t limit,
Groups groups,
omnibox::GroupConfigMap& group_configs);
// Section:
void InitFromMatches(ACMatches& matches) override;
};
// Android prefixed section for Adaptive Suggestions grouping.
class AndroidNonZPSSection : public Section {
public:
// Construct a new instance of the grouping class used in non-zero-prefix
// context.
// When `show_only_search_suggestions` is set to `true`, URLs will not be
// offered at any position other than position 0 (the Default Match).
explicit AndroidNonZPSSection(bool show_only_search_suggestions,
omnibox::GroupConfigMap& group_configs);
// Section:
void InitFromMatches(ACMatches& matches) override;
// Specify number of matches that are at least 50% exposed while the
// software keyboard is visible.
static void set_num_visible_matches(size_t num_visible_matches) {
num_visible_matches_ = num_visible_matches;
}
private:
static size_t num_visible_matches_;
};
// Android prefix section for Hub search (ZPS).
class AndroidHubZPSSection : public Section {
public:
explicit AndroidHubZPSSection(omnibox::GroupConfigMap& group_configs);
};
// Android prefix section for Hub search (non-ZPS).
class AndroidHubNonZPSSection : public Section {
public:
explicit AndroidHubNonZPSSection(omnibox::GroupConfigMap& group_configs);
};
// Section expressing the Android ZPS limits and grouping for the NTP.
// - up to 15 + `max_related_queries` + `max_trending_queries` suggestions
// total.
// - up to 1 clipboard suggestion.
// - up to 15 MIA or personalized suggestions.
// - up to 5 trending search suggestions.
class AndroidNTPZpsSection : public ZpsSectionWithLocalHistory {
public:
AndroidNTPZpsSection(omnibox::GroupConfigMap& group_configs,
bool mia_enabled);
void InitFromMatches(ACMatches& matches) override;
};
// Section expressing the Android ZPS limits and grouping for the SRP.
// - up to 15 suggestions total.
// - up to 1 verbatim suggestion.
// - up to 1 clipboard suggestion.
// - up to 1 most visited carousel.
// - up to 15 previous search related suggestions.
// - up to 15 personalized suggestions.
class AndroidSRPZpsSection : public ZpsSection {
public:
explicit AndroidSRPZpsSection(omnibox::GroupConfigMap& group_configs);
};
// Section expressing the Android ZPS limits and grouping for the Web.
// - up to 15 suggestions total.
// - up to 1 verbatim suggestion.
// - up to 1 clipboard suggestion.
// - up to 1 most visited carousel.
// - up to 8 page related suggestions.
// - up to 15 personalized suggestions.
class AndroidWebZpsSection : public ZpsSectionWithMVTiles {
public:
explicit AndroidWebZpsSection(omnibox::GroupConfigMap& group_configs);
};
// Section expressing the Desktop ZPS limits and grouping for the NTP.
// - up to 8 suggestions total or 7 total if the ZPS IPH is enabled (the 8th
// suggestion being the IPH).
// - up to 8 MIA or personalized suggestions.
// - up to 8 trending search suggestions.
class DesktopNTPZpsSection : public ZpsSectionWithLocalHistory {
public:
DesktopNTPZpsSection(omnibox::GroupConfigMap& group_configs,
size_t limit,
bool mia_enabled);
};
// Section expressing the Desktop ZPS limits and grouping for unscoped
// extensions.
// - Up to 8 unscoped extension suggestions total.
// - Up to 4 from the first extension.
// - Up to 4 from the second extension.
class DesktopZpsUnscopedExtensionSection : public ZpsSection {
public:
explicit DesktopZpsUnscopedExtensionSection(
omnibox::GroupConfigMap& group_configs);
};
// Section expressing the Desktop ZPS limits and grouping for the IPH suggestion
// on the NTP.
// - Up to 1 IPH suggestion total
class DesktopNTPZpsIPHSection : public ZpsSection {
public:
explicit DesktopNTPZpsIPHSection(omnibox::GroupConfigMap& group_configs);
};
// Section expressing the Desktop secondary ZPS limits and grouping for the NTP.
// - up to 4 suggestions total.
// - up to 3 previous search related suggestion chips.
// - up to 4 previous search related text suggestions.
// - up to 4 trending suggestions.
class DesktopSecondaryNTPZpsSection : public ZpsSection {
public:
explicit DesktopSecondaryNTPZpsSection(
omnibox::GroupConfigMap& group_configs);
};
// Section expressing the Desktop ZPS limits and grouping for the SRP.
// - up to `max_suggestions` suggestions total.
// - up to `search_limit` previous search related suggestions.
// - up to `search_limit` personalized suggestions.
// - up to `url_limit` most visited tiles suggestions
class DesktopSRPZpsSection : public ZpsSection {
public:
explicit DesktopSRPZpsSection(omnibox::GroupConfigMap& group_configs,
size_t max_suggestions,
size_t search_limit,
size_t url_limit,
size_t contextual_action_limit);
};
// Section expressing the Desktop URL ZPS limits and grouping for the Web.
// - up to `limit` most visited tiles suggestions.
class DesktopWebURLZpsSection : public ZpsSection {
public:
explicit DesktopWebURLZpsSection(omnibox::GroupConfigMap& group_configs,
size_t limit);
};
// Section expressing the Desktop Search ZPS limits and grouping for the Web.
// - up to `limit` suggestions total.
// - up to `limit` page related or personalized search suggestions.
// - up to `contextual_action_limit` contextual search action suggestions.
// - up to `contextual_search_limit` contextual search suggestions.
class DesktopWebSearchZpsSection : public Section {
public:
explicit DesktopWebSearchZpsSection(omnibox::GroupConfigMap& group_configs,
size_t limit,
size_t contextual_action_limit,
size_t contextual_search_limit);
};
// An experimental alternative for `DesktopWebSearchZpsSection` that excludes
// all but contextual matches. It's intended as a full replacement instead
// of modifying that section, for simplicity and ease of removal after
// experimentation.
// - up to `contextual_action_limit` + `contextual_search_limit` total.
// - up to `contextual_action_limit` contextual search action suggestions.
// - up to `contextual_search_limit` contextual search suggestions.
class DesktopWebSearchZpsContextualOnlySection : public Section {
public:
explicit DesktopWebSearchZpsContextualOnlySection(
omnibox::GroupConfigMap& group_configs,
size_t contextual_action_limit,
size_t contextual_search_limit);
};
// Section expressing the Desktop ZPS limits and grouping for the Lens
// contextual searchbox.
// - up to 8 suggestions total.
// - up to 8 page related suggestions.
class DesktopLensContextualZpsSection : public ZpsSection {
public:
explicit DesktopLensContextualZpsSection(
omnibox::GroupConfigMap& group_configs);
};
// Section expressing the Desktop ZPS limits and grouping for the Lens
// multimodal searchbox.
// - up to 8 suggestions total.
// - up to 8 multimodal suggestions.
class DesktopLensMultimodalZpsSection : public ZpsSection {
public:
explicit DesktopLensMultimodalZpsSection(
omnibox::GroupConfigMap& group_configs);
};
// A ZPS section that includes only the toolbelt match.
class ToolbeltSection : public ZpsSection {
public:
explicit ToolbeltSection(omnibox::GroupConfigMap& group_configs);
};
// Section expressing the Desktop, non-ZPS limits and grouping.
// - up to 10 suggestions total.
// - up to 1 default, 10 starer packs, 10 search, 8 nav, and 1 history cluster
// suggestions.
// - Only allow more than 8 suggestions if the section does not contain navs.
// - Only allow more than 7 navs if there are no non-navs to show.
// - The history cluster suggestion should count against the search limit.
// - The default suggestion should count against either the search or nav limit.
// - Group defaults 1st, then searches and history clusters, then navs.
class DesktopNonZpsSection : public Section {
public:
explicit DesktopNonZpsSection(omnibox::GroupConfigMap& group_configs);
// Section:
void InitFromMatches(ACMatches& matches) override;
};
// Section expressing the iOS ZPS limits and grouping for the NTP.
// - up to `total_count` suggestions total.
// - up to 1 clipboard suggestion.
// - up to `psuggest_count` MIA or personalized suggestions.
// - up to `max_trending_queries` trending suggestions.
class IOSNTPZpsSection : public ZpsSectionWithLocalHistory {
public:
IOSNTPZpsSection(omnibox::GroupConfigMap& group_configs, bool mia_enabled);
void InitFromMatches(ACMatches& matches) override;
};
// Section expressing the iOS ZPS limits and grouping for the SRP.
// - up to 20 suggestions total (where all MV Tiles are counted for 1).
// - up to 1 verbatim suggestion.
// - up to 1 clipboard suggestion.
// - up to 10 most visited in a carousel.
// - up to 8 previous search related suggestions.
// - up to 20 personalized suggestions.
class IOSSRPZpsSection : public ZpsSectionWithMVTiles {
public:
explicit IOSSRPZpsSection(omnibox::GroupConfigMap& group_configs);
};
// Section expressing the iOS ZPS limits and grouping for the Web.
// - up to 20 suggestions total (but all MV Tiles are counted for 1).
// - up to 1 verbatim suggestion.
// - up to 1 clipboard suggestion.
// - up to 10 most visited in a carousel.
// - up to 8 page related suggestions.
// - up to 20 personalized suggestions.
class IOSWebZpsSection : public ZpsSectionWithMVTiles {
public:
explicit IOSWebZpsSection(omnibox::GroupConfigMap& group_configs);
};
// Section expressing the iOS ZPS limits and grouping for the Lens mutimodal
// searchbox.
// - up to 10 suggestions total.
// - up to 10 search suggestions.
class IOSLensMultimodalZpsSection : public ZpsSection {
public:
explicit IOSLensMultimodalZpsSection(omnibox::GroupConfigMap& group_configs);
};
#endif // COMPONENTS_OMNIBOX_BROWSER_AUTOCOMPLETE_GROUPER_SECTIONS_H_