blob: 86e7cb70618694af8fda579503f1f89cd8785cee [file] [log] [blame]
// Copyright 2021 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CONTENT_BROWSER_PRELOADING_PRERENDER_PRERENDER_ATTRIBUTES_H_
#define CONTENT_BROWSER_PRELOADING_PRERENDER_PRERENDER_ATTRIBUTES_H_
#include <string>
#include "content/common/content_export.h"
#include "content/public/browser/preloading.h"
#include "content/public/browser/prerender_trigger_type.h"
#include "content/public/browser/web_contents.h"
#include "content/public/common/referrer.h"
#include "services/metrics/public/cpp/ukm_source_id.h"
#include "third_party/blink/public/mojom/navigation/navigation_params.mojom.h"
#include "third_party/perfetto/include/perfetto/tracing/traced_value_forward.h"
#include "ui/base/page_transition_types.h"
namespace content {
// Records the basic attributes of a prerender request.
struct CONTENT_EXPORT PrerenderAttributes {
PrerenderAttributes(
const GURL& prerendering_url,
PrerenderTriggerType trigger_type,
const std::string& embedder_histogram_suffix,
Referrer referrer,
absl::optional<url::Origin> initiator_origin,
int initiator_process_id,
base::WeakPtr<WebContents> initiator_web_contents,
absl::optional<blink::LocalFrameToken> initiator_frame_token,
int initiator_frame_tree_node_id,
ukm::SourceId initiator_ukm_id,
ui::PageTransition transition_type,
absl::optional<base::RepeatingCallback<bool(const GURL&)>>
url_match_predicate,
// TODO(crbug/1384419): use pattern other than default parameter.
const absl::optional<base::UnguessableToken>&
initiator_devtools_navigation_token = absl::nullopt);
~PrerenderAttributes();
PrerenderAttributes(const PrerenderAttributes&);
PrerenderAttributes& operator=(const PrerenderAttributes&) = delete;
PrerenderAttributes(PrerenderAttributes&&);
PrerenderAttributes& operator=(PrerenderAttributes&&) = delete;
bool IsBrowserInitiated() const { return !initiator_origin.has_value(); }
GURL prerendering_url;
PrerenderTriggerType trigger_type;
// Used for kEmbedder trigger type to avoid exposing information of embedders
// to content/. Only used for metrics.
std::string embedder_histogram_suffix;
Referrer referrer;
// This is absl::nullopt when prerendering is initiated by the browser
// (not by a renderer using Speculation Rules API).
absl::optional<url::Origin> initiator_origin;
// This is ChildProcessHost::kInvalidUniqueID when prerendering is initiated
// by the browser.
int initiator_process_id;
// This hosts a primary page that is initiating this prerender attempt.
base::WeakPtr<WebContents> initiator_web_contents;
// This is absl::nullopt when prerendering is initiated by the browser.
absl::optional<blink::LocalFrameToken> initiator_frame_token;
// This is RenderFrameHost::kNoFrameTreeNodeId when prerendering is initiated
// by the browser.
int initiator_frame_tree_node_id;
// This is ukm::kInvalidSourceId when prerendering is initiated by the
// browser.
ukm::SourceId initiator_ukm_id;
ui::PageTransition transition_type;
// If the caller wants to override the default holdback processing, they can
// set this. Otherwise, it will be computed as part of
// PrerenderHostRegistry::CreateAndStartHost.
PreloadingHoldbackStatus holdback_status_override =
PreloadingHoldbackStatus::kUnspecified;
// Triggers can specify their own predicate judging whether two URLs are
// considered as pointing to the same destination. The URLs must be in
// same-origin.
absl::optional<base::RepeatingCallback<bool(const GURL&)>>
url_match_predicate;
// This is absl::nullopt when prerendering is initiated by the browser.
absl::optional<base::UnguessableToken> initiator_devtools_navigation_token;
// Serialises this struct into a trace.
void WriteIntoTrace(perfetto::TracedValue trace_context) const;
};
} // namespace content
#endif // CONTENT_BROWSER_PRELOADING_PRERENDER_PRERENDER_ATTRIBUTES_H_