blob: 4dfa3f784ea0eee5211c7f083b1679a97623bc8f [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 CHROME_BROWSER_PRELOADING_CHROME_PRELOADING_H_
#define CHROME_BROWSER_PRELOADING_CHROME_PRELOADING_H_
#include <string>
#include "content/public/browser/browser_context.h"
#include "content/public/browser/preloading.h"
#include "url/gurl.h"
class TemplateURLService;
// If you change any of the following enums or static variables, please follow
// the process in go/preloading-dashboard-updates to update the mapping
// reflected in dashboard, or if you are not a Googler, please file an FYI bug
// on https://crbug.new with component Internals>Preload.
// Defines various embedder triggering mechanisms which triggers different
// preloading operations mentioned in //content/public/browser/preloading.h.
// These values are persisted to logs. Entries should not be renumbered and
// numeric values should never be reused.
//
// Advance numbering by +1 when adding a new element.
//
// Please make sure Chrome `PreloadingPredictor` are defined after 100
// (inclusive) as 99 and below are reserved for content-public and
// content-internal definitions. Both the value and the name should be unique
// across all the namespaces.
//
// LINT.IfChange
namespace chrome_preloading_predictor {
// When the preloading URL is predicted from the Omnibox Direct URL Input
// (DUI). This is used to perform various preloading operations like prefetch
// and prerender to load Omnibox predicted URLs faster.
inline constexpr content::PreloadingPredictor kOmniboxDirectURLInput(
100,
"OmniboxDirectURLInput");
// When a pointerdown (e.g. mousedown or touchstart) event happens on an
// anchor element with an href value pointing to an HTTP(S) origin, we may
// attempt to preload the link.
inline constexpr content::PreloadingPredictor kPointerDownOnAnchor(
101,
"PointerDownOnAnchor");
// When the preloading URL is predicted from the default search suggest
// service for faster search page loads.
inline constexpr content::PreloadingPredictor kDefaultSearchEngine(
102,
"DefaultSearchEngine");
// When the preloading URL is predicted from the default search suggest due to
// change in Omnibox selection.
inline constexpr content::PreloadingPredictor kOmniboxSearchPredictor(
103,
"OmniboxSearchPredictor");
// When the preloading URL is predicted from the default search suggest due to
// mouse being pressed down on a Omnibox Search suggestion.
inline constexpr content::PreloadingPredictor kOmniboxMousePredictor(
104,
"OmniboxMousePredictor");
// When the default match in omnibox has the search prefetch or prerender
// hint.
inline constexpr content::PreloadingPredictor kOmniboxSearchSuggestDefaultMatch(
105,
"OmniboxSearchSuggestDefaultMatch");
// When the user hovers their mouse over the back button.
inline constexpr content::PreloadingPredictor kBackButtonHover(
106,
"BackButtonHover");
// When a pointerdown (e.g. mousedown or touchstart) event happens on an
// bookmark bar link to an HTTPS origin, we may attempt to preload the link.
inline constexpr content::PreloadingPredictor kPointerDownOnBookmarkBar(
107,
"PointerDownOnBookmarkBar");
// When a mousehover event happens on a bookmark bar link to an HTTPS origin,
// we may attempt to preload the link.
inline constexpr content::PreloadingPredictor kMouseHoverOnBookmarkBar(
108,
"MouseHoverOnBookmarkBar");
// When a pointerdown (e.g. mousedown or touchstart) event happens on a
// new tab page link to an HTTPS origin, we may attempt to preload the link.
// TODO(crbug.com/376421273): This predictor would be replaced by
// kMouseHoverOrMouseDownOnNewTabPage.
inline constexpr content::PreloadingPredictor kPointerDownOnNewTabPage(
109,
"PointerDownOnNewTabPage");
// When a mousehover event happens on a new tab page link to an HTTPS origin,
// we may attempt to preload the link.
// TODO(crbug.com/376421273): This predictor would be replaced by
// kMouseHoverOrMouseDownOnNewTabPage.
inline constexpr content::PreloadingPredictor kMouseHoverOnNewTabPage(
110,
"MouseHoverOnNewTabPage");
// When the preloading URL is predicted from the default search suggest due to
// the user touching down on a Omnibox Search suggestion.
inline constexpr content::PreloadingPredictor kOmniboxTouchDownPredictor(
111,
"OmniboxTouchDownPredirector");
// When the Link-Preview loads a page with prerendering infrastractures.
// TODO(b:291867362): This is not used by the current implementation, but might
// be reused in the future.
inline constexpr content::PreloadingPredictor kLinkPreview(112, "LinkPreview");
// When a mousehover or mousedown event happens on a bookmark bar linking to an
// HTTPS origin, we may attempt to preload the link. This predictor, instead of
// using kPointerDownOnBookmarkBar or kMouseHoverOnBookmarkBar, is for solving
// the problem in https://crbug.com/1516514.
inline constexpr content::PreloadingPredictor
kMouseHoverOrMouseDownOnBookmarkBar(113,
"MouseHoverOrMouseDownOnBookmarkBar");
// When a touch event happens on a new tab page link to an HTTPS origin,
// we may attempt to preload the link.
inline constexpr content::PreloadingPredictor kTouchOnNewTabPage(
114,
"TouchOnNewTabPage");
// When a certain CCT prefetch API is triggered.
inline constexpr content::PreloadingPredictor kChromeCustomTabs(
115,
"ChromeCustomTabs");
// When a mousehover or mousedown event happens on a new tab page linking to an
// HTTPS origin, we may attempt to preload the link. This predictor, instead of
// using kPointerDownOnNewTabPage or MouseHoverOnNewTabPage, is for solving
// the problem in https://crbug.com/376421273.
inline constexpr content::PreloadingPredictor
kMouseHoverOrMouseDownOnNewTabPage(116,
"MouseHoverOrMouseDownOnNewTabPage");
// When the default search engine needs to prerender a prewarm page.
inline constexpr content::PreloadingPredictor kPrewarmDefaultSearchEngine(
117,
"PrewarmDefaultSearchEngine");
} // namespace chrome_preloading_predictor
// LINT.ThenChange()
// These values are persisted to logs. Entries should not be renumbered and
// numeric values should never be reused.
//
// LINT.IfChange
enum class ChromePreloadingEligibility {
// Numbering starts from `kPreloadingEligibilityContentEnd` defined in
// //content/public/preloading.h . Advance numbering by +1 when adding a new
// element.
// Chrome was unable to get a LoadingPredictor object for the user profile.
kUnableToGetLoadingPredictor = static_cast<int>(
content::PreloadingEligibility::kPreloadingEligibilityContentEnd),
// Preloading was ineligible because Prefetch was not started and Prerender
// can't be triggered.
kPrefetchNotStarted =
static_cast<int>(
content::PreloadingEligibility::kPreloadingEligibilityContentEnd) +
1,
// Preloading was ineligible because Prefetch failed and Prerender can't be
// triggered.
kPrefetchFailed =
static_cast<int>(
content::PreloadingEligibility::kPreloadingEligibilityContentEnd) +
2,
// Preloading was ineligible because Prerender was already consumed and can't
// be triggered again.
kPrerenderConsumed =
static_cast<int>(
content::PreloadingEligibility::kPreloadingEligibilityContentEnd) +
3,
// Preloading was ineligible because the default search engine was not set.
kSearchEngineNotValid =
static_cast<int>(
content::PreloadingEligibility::kPreloadingEligibilityContentEnd) +
4,
// Preloading can't be started because there are no search terms present.
kNoSearchTerms =
static_cast<int>(
content::PreloadingEligibility::kPreloadingEligibilityContentEnd) +
5,
// Preloading was ineligible due to error in the network request.
kPreloadingErrorBackOff =
static_cast<int>(
content::PreloadingEligibility::kPreloadingEligibilityContentEnd) +
6,
// Search urls are not eligible for certain types of preloading triggers.
KDisallowSearchUrl =
static_cast<int>(
content::PreloadingEligibility::kPreloadingEligibilityContentEnd) +
7,
kMaxValue = KDisallowSearchUrl,
};
// LINT.ThenChange()
// Helper method to convert ChromePreloadingEligibility to
// content::PreloadingEligibility to avoid casting.
content::PreloadingEligibility ToPreloadingEligibility(
ChromePreloadingEligibility eligibility);
// Helpers methods to extract search terms from a given URL.
TemplateURLService* GetTemplateURLServiceFromBrowserContext(
content::BrowserContext* browser_context);
std::u16string ExtractSearchTermsFromURL(
const TemplateURLService* const template_url_service,
const GURL& url);
std::u16string ExtractSearchTermsFromURL(
content::BrowserContext* browser_context,
const GURL& url);
// Returns true if a canonical URL representation of a `preloading_url` can be
// generated. `canonical_url` is set to the canonical URL representation when
// this method returns `true`. The search query is returned in `search_terms` if
// the passing `search_terms` is not nullptr.
bool HasCanonicalPreloadingOmniboxSearchURL(
const GURL& preloading_url,
content::BrowserContext* browser_context,
GURL* canonical_url,
std::u16string* search_terms = nullptr);
// Returns true when |navigation_url| is considered as navigating to the same
// omnibox search results page as |canonical_preloading_search_url|.
bool IsSearchDestinationMatch(const GURL& canonical_preloading_search_url,
content::BrowserContext* browser_context,
const GURL& navigation_url);
// Returns true when |navigation_url| is considered as navigating to the same
// omnibox search results page as |canonical_preloading_search_url|. Includes
// the result from the default web url match operation.
bool IsSearchDestinationMatchWithWebUrlMatchResult(
const GURL& canonical_preloading_search_url,
content::BrowserContext* browser_context,
const GURL& navigation_url,
const std::optional<content::UrlMatchType>& default_web_url_match =
std::nullopt);
#endif // CHROME_BROWSER_PRELOADING_CHROME_PRELOADING_H_