blob: 667db9467f3a9c5b32176805777acf0f971dec32 [file] [log] [blame]
// Copyright 2014 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_SEARCH_ENGINES_TEMPLATE_URL_DATA_H_
#define COMPONENTS_SEARCH_ENGINES_TEMPLATE_URL_DATA_H_
#include <string>
#include <string_view>
#include <vector>
#include "base/containers/span.h"
#include "base/memory/raw_ptr.h"
#include "base/time/time.h"
#include "base/values.h"
#include "components/search_engines/template_url_id.h"
#include "third_party/search_engines_data/resources/definitions/prepopulated_engines.h"
#include "url/gurl.h"
// The data for the TemplateURL. Separating this into its own class allows most
// users to do SSA-style usage of TemplateURL: construct a TemplateURLData with
// whatever fields are desired, then create an immutable TemplateURL from it.
struct TemplateURLData {
enum class PolicyOrigin {
kNoPolicy = 0,
kDefaultSearchProvider = 1,
kSiteSearch = 2,
kSearchAggregator = 3,
};
using RegulatoryExtension = TemplateURLPrepopulateData::RegulatoryExtension;
TemplateURLData();
TemplateURLData(const TemplateURLData& other);
TemplateURLData& operator=(const TemplateURLData& other);
// Creates a TemplateURLData suitable for prepopulated engines.
// Note that unlike in the default constructor, |safe_for_autoreplace| will
// be set to true. date_created and last_modified will be set to null time
// value, instead of current time.
// std::string_view in arguments is used to pass const char* pointer members
// of PrepopulatedEngine structure which can be nullptr.
TemplateURLData(std::u16string_view name,
std::u16string_view keyword,
std::string_view search_url,
std::string_view suggest_url,
std::string_view image_url,
std::string_view image_translate_url,
std::string_view new_tab_url,
std::string_view contextual_search_url,
std::string_view logo_url,
std::string_view doodle_url,
std::string_view search_url_post_params,
std::string_view suggest_url_post_params,
std::string_view image_url_post_params,
std::string_view image_translate_source_language_param_key,
std::string_view image_translate_target_language_param_key,
std::vector<std::string> search_intent_params,
std::string_view favicon_url,
std::string_view encoding,
std::u16string_view image_search_branding_label,
const base::Value::List& alternate_urls_list,
bool preconnect_to_search_url,
bool prefetch_likely_navigations,
int prepopulate_id,
const base::span<const RegulatoryExtension>& extensions);
~TemplateURLData();
// A short description of the template. This is the name we show to the user
// in various places that use TemplateURLs. For example, the location bar
// shows this when the user selects a substituting match.
void SetShortName(std::u16string_view short_name);
const std::u16string& short_name() const { return short_name_; }
// The shortcut for this TemplateURL. |keyword| must be non-empty.
void SetKeyword(std::u16string_view keyword);
const std::u16string& keyword() const { return keyword_; }
// The raw URL for the TemplateURL, which may not be valid as-is (e.g. because
// it requires substitutions first). This must be non-empty.
void SetURL(const std::string& url);
const std::string& url() const { return url_; }
// Generate the deterministic hash of data within this TemplateURL.
std::vector<uint8_t> GenerateHash() const;
// Retrieve builtin image resource ID for this engine.
std::string GetBuiltinImageResourceId() const;
// Recomputes |sync_guid| using the same logic as in the constructor. This
// means a random GUID is generated, except for built-in search engines,
// which generate GUIDs deterministically based on |prepopulate_id| or
// |starter_pack_id|.
void GenerateSyncGUID();
// Estimates dynamic memory usage.
// See base/trace_event/memory_usage_estimator.h for more info.
size_t EstimateMemoryUsage() const;
// Returns whether this search engine was created by an Enterprise policy.
bool CreatedByPolicy() const;
// Returns whether this search engine was created by the Default Search
// Provider Enterprise policy.
bool CreatedByDefaultSearchProviderPolicy() const;
// Returns whether this search engine was created by an Enterprise policy that
// doesn't define the Default Search Provider.
bool CreatedByNonDefaultSearchProviderPolicy() const;
// Returns whether this search engine was created by the
// EnterpriseSearchAggregatorSettings policy.
bool CreatedByEnterpriseSearchAggregatorPolicy() const;
// Returns whether this search engine was created by the SiteSearchSettings
// policy.
bool CreatedBySiteSearchPolicy() const;
// Optional additional raw URLs.
std::string suggestions_url;
std::string image_url;
std::string image_translate_url;
std::string new_tab_url;
std::string contextual_search_url;
// Optional URL for the logo.
GURL logo_url;
// Optional URL for the Doodle.
GURL doodle_url;
// The following post_params are comma-separated lists used to specify the
// post parameters for the corresponding URL.
std::string search_url_post_params;
std::string suggestions_url_post_params;
std::string image_url_post_params;
// The key of the parameter identifying the source language for an image
// translation.
std::string image_translate_source_language_param_key;
// The key of the parameter identifying the target language for an image
// translation.
std::string image_translate_target_language_param_key;
// Brand name used for image search queries. If not set, the short_name
// will be used.
std::u16string image_search_branding_label;
// The parameters making up the engine's canonical search URL in addition to
// the search terms. These params disambiguate the search terms and determine
// the fulfillment.
std::vector<std::string> search_intent_params;
// Favicon for the TemplateURL.
GURL favicon_url;
// URL to the OSD file this came from. May be empty.
GURL originating_url;
// Whether it's safe for auto-modification code (the autogenerator and the
// code that imports data from other browsers) to replace the TemplateURL.
// This should be set to false for any TemplateURL the user edits, or any
// TemplateURL that the user clearly manually edited in the past, like a
// bookmark keyword from another browser.
bool safe_for_autoreplace;
// The list of supported encodings for the search terms. This may be empty,
// which indicates the terms should be encoded with UTF-8.
std::vector<std::string> input_encodings;
// Unique identifier of this TemplateURL. The unique ID is set by the
// TemplateURLService when the TemplateURL is added to it.
TemplateURLID id;
// Date this TemplateURL was created.
//
// NOTE: this may be 0, which indicates the TemplateURL was created before we
// started tracking creation time.
base::Time date_created;
// The last time this TemplateURL was modified by a user, since creation.
//
// NOTE: Like date_created above, this may be 0.
base::Time last_modified;
// Date when this TemplateURL was last visited.
//
// NOTE: This might be 0 if the TemplateURL has never been visited.
base::Time last_visited;
// True if this TemplateURL was automatically created by the administrator via
// group policy.
PolicyOrigin policy_origin;
// True if this TemplateURL is forced to be the default search engine or a
// site search engine via policy. This prevents the user from setting another
// search engine as default (for default search engines) or modifying/deleting
// this engine (for site search engines).
// False if this TemplateURL is recommended (allowing user override) or not
// set via policy. This allows the user to set another search engine as
// default (for default search engines) or to modify/delete the this engine
// (for site search engines).
bool enforced_by_policy;
// The Regulatory program supplying this definition.
// This permits deduplication and election of the best supported TemplateURL
// definition from all known sources (see ReconcilingTemplateURLDataHolder).
//
// TODO(b:322513019): All definition origins could possibly be aggregated
// under a single enum for clarity and simplicity. This would allow for more
// consistent handling and detection (what should be processed, and how).
// The amount of work needed to do this seems very significant. Investigate
// whether this makes sense and is feasible.
RegulatoryExtensionType regulatory_origin;
// True if this TemplateURL should be promoted in the Omnibox along with the
// starter pack.
bool featured_by_policy = false;
// Number of times this TemplateURL has been explicitly used to load a URL.
// We don't increment this for uses as the "default search engine" since
// that's not really "explicit" usage and incrementing would result in pinning
// the user's default search engine(s) to the top of the list of searches on
// the New Tab page, de-emphasizing the omnibox as "where you go to search".
int usage_count;
// If this TemplateURL comes from prepopulated data the prepopulate_id is > 0.
int prepopulate_id;
// The primary unique identifier for Sync. This set on all TemplateURLs
// regardless of whether they have been associated with Sync.
std::string sync_guid;
// A list of URL patterns that can be used, in addition to |url_|, to extract
// search terms from a URL.
std::vector<std::string> alternate_urls;
// A list of regulatory extensions, keyed by extension variant.
base::flat_map<RegulatoryExtensionType,
raw_ptr<const RegulatoryExtension, CtnExperimental>>
regulatory_extensions;
// Whether a connection to |url_| should regularly be established when this is
// set as the "default search engine".
bool preconnect_to_search_url = false;
// Whether the client is allowed to prefetch Search queries that are likely
// (in addition to queries that are recommended via suggestion server). This
// is experimental.
bool prefetch_likely_navigations = false;
enum class ActiveStatus {
kUnspecified = 0, // The default value when a search engine is auto-added.
kTrue, // Search engine is active.
kFalse, // SE has been manually deactivated by a user.
};
// Whether this entry is "active". Active entries can be invoked by keyword
// via the omnibox. Inactive search engines do nothing until they have been
// activated. A search engine is inactive if it's unspecified or false.
ActiveStatus is_active{ActiveStatus::kUnspecified};
// This TemplateURL is part of the built-in "starter pack" if
// starter_pack_id > 0.
int starter_pack_id{0};
friend bool operator==(const TemplateURLData&,
const TemplateURLData&) = default;
private:
// Private so we can enforce using the setters and thus enforce that these
// fields are never empty.
std::u16string short_name_;
std::u16string keyword_;
std::string url_;
};
#endif // COMPONENTS_SEARCH_ENGINES_TEMPLATE_URL_DATA_H_