// Copyright 2017 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
syntax = "proto2";
option optimize_for = LITE_RUNTIME;
option java_package = "org.chromium.components.optimization_guide.proto";
option java_outer_classname = "HintsProto";
package optimization_guide.proto;
import "components/optimization_guide/proto/common_types.proto";
import "components/optimization_guide/proto/loading_predictor_metadata.proto";
// Information about the hint that the client already has for a host.
message MatchedHintInfo {
// Describes the granularity of the key field.
optional KeyRepresentation key_representation = 1;
// The key of the hint currently used for the host.
optional string key = 2;
// The version of the hint for this key already stored on the client.
optional int64 version = 3;
}
message HostInfo {
// Host that the client is requesting information for.
optional string host = 1;
// Information about the hint that the client already has for the host.
optional MatchedHintInfo matched_hint = 2;
}
// Information about a URL to request hints for.
message UrlInfo {
// The URL that the client is requesting information for.
optional string url = 1;
}
// Information about the set of host hashes to retrieve hints for.
message HashedHostInfos {
// The partial host hash will be the first num_hash_bits least significant bit
// of the hashed host.
repeated uint32 partial_host_hashes = 1;
optional uint32 num_hash_bits = 2;
}
// Request to return a set of hints that guide what optimizations to perform
// on those hosts.
message GetHintsRequest {
reserved 6, 10;
// Information about the set of hosts to retrieve hints for.
repeated HostInfo hosts = 1;
// Information about the set of URLs to retrieve hints for.
repeated UrlInfo urls = 4;
// Information about the set of host hashes to retrieve hints for.
optional HashedHostInfos hashed_hosts = 8;
// The set of optimization types that the requesting client can support
// and perform.
//
// It is guaranteed that the response will only contain hints for
// optimizations present in this set.
repeated OptimizationType supported_optimizations = 2;
// The set of key representations that the client can process.
//
// It is guaranteed that the response will only contain hints for key
// representations present in this set. If not specified,
// [HOST_SUFFIX, FULL_URL] will be used.
repeated KeyRepresentation supported_key_representations = 5;
// Context in which this request is made.
optional RequestContext context = 3;
// Metadata related to how the request with this context was made.
optional RequestContextMetadata context_metadata = 11;
// The locale to associate with this request.
//
// It is the IETF language tag, defined in BCP 47. The region subtag is not
// included when it adds no distinguishing information to the language tag
// (e.g. both "en-US" and "fr" are correct here).
optional string locale = 7;
// Information about the request origin.
optional OriginInfo origin_info = 9;
}
message RequestContextMetadata {
// update logic at {@link HintsManager::CanApplyOptimizationOnDemand} for
// getting the context metadata sent and setting the metadata w.r.t the
// context.
oneof metadata {
// Only filled in when RequestContext is CONTEXT_PAGE_INSIGHTS_HUB.
PageInsightsHubRequestContextMetadata page_insights_hub_metadata = 1;
}
}
message PageInsightsHubRequestContextMetadata {
// True if the Page Insights feature was triggered by the user (as opposed to
// auto-peeking).
optional bool is_user_initiated = 1;
// True if the Page Insights feature is showing on top of an initial page. See
// go/pih-cct-conditions.
optional bool is_initial_page = 2;
// True if logging of URL by server, and personalisation of response, is
// forbidden.
optional bool should_not_log_or_personalize = 3;
// Timestamp for the navigation that reached the URL, in milliseconds.
optional int64 navigation_timestamp_ms = 4;
}
// Response to the GetHints request.
message GetHintsResponse {
// An ordered list containing hints for key/optimization combinations.
//
// It is guaranteed that there will only be a single hint per key and key
// representation combination. These hints are intended to apply to a full
// page. It is expected that the client will use the Hint record with the
// most specific key that matches the main frame URL.
repeated Hint hints = 1;
// The maximum duration in which the hints, or lack of hints, provided in
// this response are valid.
optional Duration max_cache_duration = 2;
// A set of hint keys to remove from the client cache.
//
// It is guaranteed that all entries in this list were provided by the client
// in the corresponding request's |hosts.matched_hint| fields.
//
// It is expected for the client to immediately stop using all hints contained
// in this field. Hints that are not present in |hints| or in this field
// should adhere to the client cache's existing expiration policy.
repeated MatchedHintInfo hints_to_remove = 3;
}
// These values must reflect the values defined in the server-side
// OptimizationType enum at http://shortn/_t8G1sv8yAS (Google-internal link).
// Additionally, these values must be synchronized with the OptimizationType
// enum in enums.xml and optimization/histograms.xml for metric recording.
enum OptimizationType {
// Values for obsolete optimizations.
reserved 11, 12, 16, 29, 32, 66;
TYPE_UNSPECIFIED = 0;
// This optimization blocks JavaScript on the page.
NOSCRIPT = 1;
// This optimization applies a set of ResourceLoadingHint(s) to load the
// page.
RESOURCE_LOADING = 2;
// This optimization redirects the navigation through a lite page server.
LITE_PAGE_REDIRECT = 3;
// This optimization does validation of metadata fetch on navigation.
METADATA_FETCH_VALIDATION = 4;
// This optimization defers execution of parser-blocking script until after
// parsing completes.
DEFER_ALL_SCRIPT = 5;
// This optimization is used to provide aggregated performance information
// about the page and pages it links to.
PERFORMANCE_HINTS = 6;
// This optimization allows page loads going through the data reduction
// proxy to be transformed by the proxy.
LITE_PAGE = 7;
// This optimization compresses public images.
COMPRESS_PUBLIC_IMAGES = 8;
// This optimization provides the Loading Predictor with resources predicted
// to be on the page.
LOADING_PREDICTOR = 9;
// This optimization provides information about hosts that historically
// provide a fast and responsive user experience.
FAST_HOST_HINTS = 10;
// This optimization provides information about how to throttle meda requests
// to reduce the bitrate of adaptively streamed media.
LITE_VIDEO = 13;
// This optimization is used to provide aggregated performance information
// about pages linked to from the current page.
LINK_PERFORMANCE = 14;
// Detects if a page is a shopping page or not. A tradeoff has been made here
// where the number of shopping page predictions for non-shopping pages is
// increased to reduce the number of non-shopping page predictions for
// shopping pages.
SHOPPING_PAGE_PREDICTOR = 15;
// Provides key information about the merchant represented by the current
// host.
MERCHANT_TRUST_SIGNALS = 17;
// Provides pricing data so the user can track prices and price updates.
PRICE_TRACKING = 18;
// This optimization does validation of bloom filter.
BLOOM_FILTER_VALIDATION = 19;
// Provides 'About this site' data about the site being visited.
ABOUT_THIS_SITE = 20;
// Provides key information about the merchant represented by the current
// host -- VERSION 2.
MERCHANT_TRUST_SIGNALS_V2 = 21;
// Provides the entities that are present on the page.
PAGE_ENTITIES = 22;
// This optimization provides information for whether a page should be
// included in a history cluster.
HISTORY_CLUSTERS = 23;
// Determines if a page is eligible for 'Thank creator' functionality.
THANK_CREATOR_ELIGIBLE = 24;
// This optimization provides information about hosts that are blocked for
// IBAN autofill.
IBAN_AUTOFILL_BLOCKED = 25;
// This optimization provides information about images for a URL.
SALIENT_IMAGE = 26;
// This optimization provides information about a sampling rate of Autofill
// UKM metrics per origin based on origin popularity.
AUTOFILL_SAMPLING_RATE = 27;
// This optimization provides information about whether a merchant is
// opted-out of Visa virtual cards for a URL.
VCN_MERCHANT_OPT_OUT_VISA = 28;
// Provides price insights data including the typical price range and the
// price history.
PRICE_INSIGHTS = 30;
// Information about which JavaScript functions should be eager compiled.
V8_COMPILE_HINTS = 31;
// This optimization provides information about shoppinge page types of this
// page.
SHOPPING_PAGE_TYPES = 33;
// This optimization provides information about shopping discounts for a URL.
SHOPPING_DISCOUNTS = 34;
// This optimization helps determine if this page is a good candidate for
// compose.
COMPOSE = 35;
// This optimization provides information about whether a merchant can be
// triggered with PIX bottom sheet. This allowlist uses page pattern matching
// to perform regex match against entire URLs.
PIX_PAYMENT_MERCHANT_ALLOWLIST = 36;
// The below optimizations provide information for merchant URLs that are
// eligible for credit card category benefits. These URLs are shared and apply
// to all card issuers that support showing benefits on Chrome.
SHARED_CREDIT_CARD_FLIGHT_BENEFITS = 37;
SHARED_CREDIT_CARD_DINING_BENEFITS = 38;
SHARED_CREDIT_CARD_GROCERY_BENEFITS = 39;
SHARED_CREDIT_CARD_ENTERTAINMENT_BENEFITS = 40;
SHARED_CREDIT_CARD_STREAMING_BENEFITS = 41;
SHARED_CREDIT_CARD_SUBSCRIPTION_BENEFITS = 42;
// The below optimizations provide information about merchant URLs that only
// Capital One supports for credit card category benefits.
CAPITAL_ONE_CREDIT_CARD_DINING_BENEFITS = 43;
CAPITAL_ONE_CREDIT_CARD_GROCERY_BENEFITS = 44;
CAPITAL_ONE_CREDIT_CARD_ENTERTAINMENT_BENEFITS = 45;
CAPITAL_ONE_CREDIT_CARD_STREAMING_BENEFITS = 46;
// The below optimizations provide information about merchant URLs that only
// American Express supports for credit card category benefits.
AMERICAN_EXPRESS_CREDIT_CARD_FLIGHT_BENEFITS = 47;
AMERICAN_EXPRESS_CREDIT_CARD_SUBSCRIPTION_BENEFITS = 48;
// This optimization provides information about URLs that should be blocked
// from displaying Capital One credit card benefits.
CAPITAL_ONE_CREDIT_CARD_BENEFITS_BLOCKED = 55;
// This optimization provides information about whether a merchant is
// opted-out of Discover virtual cards for a URL.
VCN_MERCHANT_OPT_OUT_DISCOVER = 56;
// This optimization provides information about whether a merchant is
// opted-out of Mastercard virtual cards for a URL.
VCN_MERCHANT_OPT_OUT_MASTERCARD = 57;
// This optimization provides information about merchants origins for which
// PIX payments should be triggered. This allowlist contains a list of origins
// and uses a bloom filter for matching.
PIX_MERCHANT_ORIGINS_ALLOWLIST = 58;
// This optimization provides information for whether a page is eligible for
// history embeddings.
HISTORY_EMBEDDINGS = 59;
// The following optimizations provide information about sites on which
// an autofill ablation is supposed to be applied.
AUTOFILL_ABLATION_SITES_LIST1 = 60;
AUTOFILL_ABLATION_SITES_LIST2 = 61;
AUTOFILL_ABLATION_SITES_LIST3 = 62;
AUTOFILL_ABLATION_SITES_LIST4 = 63;
AUTOFILL_ABLATION_SITES_LIST5 = 64;
AUTOFILL_ABLATION_SITES_LIST6 = 65;
// This optimization helps determine if this merchant page is a good candidate
// for enabling price/amount extraction.
AMOUNT_EXTRACTION_ALLOWLIST = 67;
// This optimization provides information about sites for which pages Autofill
// prediction improvements should be triggered on.
AUTOFILL_PREDICTION_IMPROVEMENTS_ALLOWLIST = 68;
// This optimization helps determine if this merchant page is a good candidate
// for buy now pay later provider Affirm to enable amount extraction.
AMOUNT_EXTRACTION_ALLOWLIST_AFFIRM = 69;
// This optimization helps determine if this merchant page is a good candidate
// for buy now pay later provider Zip to enable amount extraction.
AMOUNT_EXTRACTION_ALLOWLIST_ZIP = 70;
}
// Presents semantics for how page load URLs should be matched.
enum KeyRepresentation {
REPRESENTATION_UNSPECIFIED = 0;
// The suffix to match in the hostname of a page load URL.
//
// Example: A host suffix of example.com would match pages with host
// sports.example.com, but not fooexample.com.
HOST_SUFFIX = 1 [deprecated = true];
// The full URL to match.
//
// This will be an exact match of a page load URL, including query params and
// fragments.
FULL_URL = 2;
// The host to match.
//
// This will be an exact match of a page load host.
HOST = 3;
// This will be a partial hash of a page load host.
HASHED_HOST = 4;
}
message Optimization {
reserved 2, 3, 4, 5, 10, 11, 12, 14;
// The type of optimization the hint applies to.
optional OptimizationType optimization_type = 1;
// The version of the tuning group for the optimization type.
//
// This will only be populated if this optimization is being autotuned.
//
// If this is set to UINT64_MAX, this optimization should be considered as
// not allowed and was only included for metrics purposes.
optional uint64 tuning_version = 6;
// The metadata associated with the optimization type.
//
// It is expected that the client and server have agreed upon the appropriate
// metadata type for the optimization type.
//
// New clients should utilize any_metadata rather than adding another field.
oneof metadata {
LoadingPredictorMetadata loading_predictor_metadata = 13;
Any any_metadata = 15;
}
}
message PageHint {
reserved 2;
// The pattern to match against the committed page URL.
//
// The pattern may be a single substring to match against the full URL or it
// may be an ordered set of substrings to match where the substrings are
// separated by the ‘*’ wildcard character (with an implicit ‘*’ at the
// beginning and end).
optional string page_pattern = 1;
// An ordered set of optimizations that should be allowlisted for this page
// pattern.
//
// The client will use the first optimization that it supports.
repeated Optimization allowlisted_optimizations = 3;
}
message Hint {
// Describes the granularity of the key field.
optional KeyRepresentation key_representation = 1;
// The key that applies to this hint. The key_representation field describes
// the form in which this key takes. Guaranteed to be non-empty.
optional string key = 2;
// An unordered set of optimizations that should be allowlisted for this
// hint.
//
// This field is currently only specified for key_representation of HOST.
repeated Optimization allowlisted_optimizations = 3;
// An ordered set of per-page hints. Only the first PageHint record
// that matches a committed page URL should be used for that page load.
repeated PageHint page_hints = 4;
// Version that generated this hint.
//
// It is expected that this version be sent along with subsequent requests
// for hosts that match this hint.
optional string version = 5;
// The maximum duration for which the hint should be used for.
optional Duration max_cache_duration = 6;
}
// Configuration and data for a Bloom filter.
//
// Note that some additional aspects of the BloomFilter are separately
// specified between the client and server including the specific MurmurHash3
// hashing function, how the hashing function is seeded, how bits are
// addressed in the byte vector, and the nature of the strings that the
// Bloom filter holds (whether host, host suffix, URL path, etc.).
message BloomFilter {
// Specifies the number of hash functions to use in the Bloom filter.
// This essentially means how many bits will be set in the bit array
// for a string member of the Bloom filter.
optional uint32 num_hash_functions = 1;
// The number of bits in the Bloom filter's bit array.
optional uint32 num_bits = 2;
// The bit array data of the Bloom filter provided via a byte vector.
// The number of bytes provided must be large enough to hold the
// specified number of bits (num_bits).
optional bytes data = 3;
}
// The format for input to the bloom filter.
enum BloomFilterFormat {
BLOOM_FILTER_FORMAT_UNKNOWN = 0;
BLOOM_FILTER_FORMAT_PLAINTEXT = 1;
BLOOM_FILTER_FORMAT_SHA256 = 2;
}
// A scalable filter for an optimization type.
//
// Next ID: 7
message OptimizationFilter {
// The type of optimization this filter applies to.
optional OptimizationType optimization_type = 1;
// The filter data represented as a Bloom filter.
optional BloomFilter bloom_filter = 2;
// Additional filters represented as regexps matched against the main page
// URL. If matched, the URL will be considered as contained in the filter.
repeated string regexps = 3;
// Additional filters represented as regexps matched against the main page
// URL. If matched, the URL will be considered as not contained in the filter.
//
// This set of regexps should be checked prior to any matching against the
// contained bloom_filter or regexps fields.
repeated string exclusion_regexps = 5;
// Whether additional host suffixes (other than the host) should be checked
// against the filter.
optional bool skip_host_suffix_checking = 4;
// The format to check against the bloom filter. Note this only applies
// to checks in the bloom_filter and not regexps.
optional BloomFilterFormat bloom_filter_format = 6;
}
message Configuration {
// An ordered list containing hints for key/optimization combinations.
//
// It is guaranteed that there will only be a single hint per key and key
// representation combination. These hints are intended to apply to a full
// page.
//
// Note, this list may contain multiple hints that apply to a page. For
// example, if there are hints for (HOST_SUFFIX,example.com) and
// (HOST_SUFFIX,sports.example.com), these may both apply to
// sports.example.com/foo.
//
// The client will use the first Hint record with a key that matches the
// main frame URL. Therefore, the server should provide all the hint
// details for that key that it wants to provide as the client will only
// look at that one record to decide which optimization to apply.
repeated Hint hints = 1;
// A set of per-optimization blocklists.
//
// It is guaranteed that an optimization type will not have filters in both
// |optimization_blocklists| and |optimization_allowlists|.
repeated OptimizationFilter optimization_blocklists = 2;
// A set of per-optimization allowlists.
//
// It is guaranteed that an optimization type will not have filters in both
// |optimization_blocklists| and |optimization_allowlists|.
repeated OptimizationFilter optimization_allowlists = 3;
}
enum HintSource {
HINT_SOURCE_UNKNOWN = 0;
// Served from the Chrome Optimization Hints Component.
HINT_SOURCE_OPTIMIZATION_HINTS_COMPONENT = 1;
// Served from the Chrome Optimization Guide Service.
HINT_SOURCE_OPTIMIZATION_GUIDE_SERVICE = 2;
}
message Version {
reserved 2;
// The time the hint was generated.
optional Timestamp generation_timestamp = 1;
// The source from which the hint was served from.
optional HintSource hint_source = 3;
}
// The theme the user is using.
enum ThemeKey {
THEME_KEY_UNKNOWN = 0;
// User is using light mode.
THEME_KEY_LIGHT = 1;
// User is using dark mode.
THEME_KEY_DARK = 2;
}