#ifndef CONTENT_BROWSER_PRELOADING_PREFETCH_PREFETCH_REQUEST_H_
#define CONTENT_BROWSER_PRELOADING_PREFETCH_PREFETCH_REQUEST_H_
#include <optional>
#include <variant>
#include "base/memory/weak_ptr.h"
#include "base/time/time.h"
#include "content/browser/preloading/prefetch/prefetch_key.h"
#include "content/browser/preloading/prefetch/prefetch_params.h"
#include "content/browser/preloading/prefetch/prefetch_type.h"
#include "content/browser/preloading/speculation_rules/speculation_rules_tags.h"
#include "content/common/content_export.h"
#include "content/public/browser/global_routing_id.h"
#include "content/public/browser/prefetch_request_status_listener.h"
#include "content/public/browser/preloading.h"
#include "net/http/http_no_vary_search_data.h"
#include "net/http/http_request_headers.h"
#include "services/metrics/public/cpp/ukm_source_id.h"
#include "third_party/blink/public/mojom/loader/referrer.mojom.h"
#include "url/origin.h"
namespace content {
class BrowserContext;
class PrefetchDocumentManager;
class PreloadPipelineInfo;
class PreloadPipelineInfoImpl;
class PreloadingAttempt;
class RenderFrameHostImpl;
class WebContents;
enum class PrefetchPriority;
class CONTENT_EXPORT PrefetchRendererInitiatorInfo final {
public:
PrefetchRendererInitiatorInfo(
RenderFrameHostImpl& render_frame_host,
base::WeakPtr<PrefetchDocumentManager> prefetch_document_manager);
~PrefetchRendererInitiatorInfo();
PrefetchRendererInitiatorInfo(const PrefetchRendererInitiatorInfo&) = delete;
PrefetchRendererInitiatorInfo& operator=(
const PrefetchRendererInitiatorInfo&) = delete;
PrefetchRendererInitiatorInfo(PrefetchRendererInitiatorInfo&&);
GlobalRenderFrameHostId GetRenderFrameHostId() const {
return render_frame_host_id_;
}
RenderFrameHostImpl* GetRenderFrameHost() const;
PrefetchDocumentManager* prefetch_document_manager() const {
return prefetch_document_manager_.get();
}
const std::optional<base::UnguessableToken>& devtools_navigation_token()
const {
return devtools_navigation_token_;
}
ukm::SourceId ukm_source_id() const { return ukm_source_id_; }
private:
GlobalRenderFrameHostId render_frame_host_id_;
base::WeakPtr<PrefetchDocumentManager> prefetch_document_manager_;
std::optional<base::UnguessableToken> devtools_navigation_token_;
ukm::SourceId ukm_source_id_;
};
class CONTENT_EXPORT PrefetchBrowserInitiatorInfo final {
public:
PrefetchBrowserInitiatorInfo(
const std::string& embedder_histogram_suffix,
std::unique_ptr<PrefetchRequestStatusListener> request_status_listener);
~PrefetchBrowserInitiatorInfo();
PrefetchBrowserInitiatorInfo(const PrefetchBrowserInitiatorInfo&) = delete;
PrefetchBrowserInitiatorInfo& operator=(const PrefetchBrowserInitiatorInfo&) =
delete;
PrefetchBrowserInitiatorInfo(PrefetchBrowserInitiatorInfo&&);
const std::string& embedder_histogram_suffix() const {
return embedder_histogram_suffix_;
}
PrefetchRequestStatusListener* request_status_listener() const {
return request_status_listener_.get();
}
private:
std::string embedder_histogram_suffix_;
std::unique_ptr<PrefetchRequestStatusListener> request_status_listener_;
};
class CONTENT_EXPORT PrefetchRequest final {
public:
static std::unique_ptr<const PrefetchRequest> CreateRendererInitiated(
RenderFrameHostImpl& referring_render_frame_host,
const blink::DocumentToken& referring_document_token,
const GURL& url,
const PrefetchType& prefetch_type,
const blink::mojom::Referrer& referrer,
std::optional<SpeculationRulesTags> speculation_rules_tags,
std::optional<net::HttpNoVarySearchData> no_vary_search_hint,
std::optional<PrefetchPriority> priority,
base::WeakPtr<PrefetchDocumentManager> prefetch_document_manager,
scoped_refptr<PreloadPipelineInfo> preload_pipeline_info,
base::WeakPtr<PreloadingAttempt> attempt = nullptr);
static std::unique_ptr<const PrefetchRequest> CreateBrowserInitiated(
WebContents& referring_web_contents,
const GURL& url,
const PrefetchType& prefetch_type,
const std::string& embedder_histogram_suffix,
const blink::mojom::Referrer& referrer,
const std::optional<url::Origin>& referring_origin,
std::optional<net::HttpNoVarySearchData> no_vary_search_hint,
std::optional<PrefetchPriority> priority,
scoped_refptr<PreloadPipelineInfo> preload_pipeline_info,
base::WeakPtr<PreloadingAttempt> attempt = nullptr,
PreloadingHoldbackStatus holdback_status_override =
PreloadingHoldbackStatus::kUnspecified,
std::optional<base::TimeDelta> ttl = std::nullopt);
static std::unique_ptr<const PrefetchRequest>
CreateBrowserInitiatedWithoutWebContents(
BrowserContext* browser_context,
const GURL& url,
const PrefetchType& prefetch_type,
const std::string& embedder_histogram_suffix,
const blink::mojom::Referrer& referrer,
bool javascript_enabled,
const std::optional<url::Origin>& referring_origin,
std::optional<net::HttpNoVarySearchData> no_vary_search_hint,
std::optional<PrefetchPriority> priority,
base::WeakPtr<PreloadingAttempt> attempt = nullptr,
const net::HttpRequestHeaders& additional_headers = {},
std::unique_ptr<PrefetchRequestStatusListener> request_status_listener =
nullptr,
base::TimeDelta ttl = PrefetchContainerDefaultTtlInPrefetchService(),
bool should_append_variations_header = true,
bool should_disable_block_until_head_timeout = false,
bool should_bypass_http_cache = false);
PrefetchRequest(
base::PassKey<PrefetchRequest>,
const PrefetchType& prefetch_type,
const PrefetchKey& key,
const std::optional<net::HttpNoVarySearchData> no_vary_search_hint,
std::optional<PrefetchPriority> priority,
scoped_refptr<PreloadPipelineInfo> preload_pipeline_info,
base::WeakPtr<PreloadingAttempt> attempt,
base::WeakPtr<WebContents> referring_web_contents,
bool is_javascript_enabled,
const blink::mojom::Referrer& initial_referrer,
const std::optional<url::Origin>& referring_origin,
base::WeakPtr<BrowserContext> browser_context,
std::optional<SpeculationRulesTags> speculation_rules_tags,
const net::HttpRequestHeaders& additional_headers,
base::TimeDelta ttl,
PreloadingHoldbackStatus holdback_status_override,
bool should_append_variations_header,
bool should_disable_block_until_head_timeout,
bool should_bypass_http_cache,
std::variant<PrefetchRendererInitiatorInfo, PrefetchBrowserInitiatorInfo>
info);
~PrefetchRequest();
const PrefetchType& prefetch_type() const { return prefetch_type_; }
const PrefetchKey& key() const { return key_; }
const std::optional<net::HttpNoVarySearchData>& no_vary_search_hint() const {
return no_vary_search_hint_;
}
const std::optional<PrefetchPriority>& priority() const { return priority_; }
PreloadPipelineInfoImpl& preload_pipeline_info() const {
return *preload_pipeline_info_;
}
PreloadingAttempt* attempt() const { return attempt_.get(); }
bool is_javascript_enabled() const { return is_javascript_enabled_; }
const blink::mojom::Referrer& initial_referrer() const {
return initial_referrer_;
}
const std::optional<url::Origin>& referring_origin() const {
return referring_origin_;
}
const base::WeakPtr<WebContents>& referring_web_contents() const {
return referring_web_contents_;
}
BrowserContext* browser_context() const { return browser_context_.get(); }
const std::optional<SpeculationRulesTags>& speculation_rules_tags() const {
return speculation_rules_tags_;
}
const net::HttpRequestHeaders& additional_headers() const {
return additional_headers_;
}
const base::TimeDelta& ttl() const { return ttl_; }
PreloadingHoldbackStatus holdback_status_override() const {
return holdback_status_override_;
}
bool should_append_variations_header() const {
return should_append_variations_header_;
}
bool should_disable_block_until_head_timeout() const {
return should_disable_block_until_head_timeout_;
}
bool should_bypass_http_cache() const { return should_bypass_http_cache_; }
const PrefetchRendererInitiatorInfo* GetRendererInitiatorInfo() const;
const PrefetchBrowserInitiatorInfo* GetBrowserInitiatorInfo() const;
private:
const PrefetchType prefetch_type_;
const PrefetchKey key_;
const std::optional<net::HttpNoVarySearchData> no_vary_search_hint_;
const std::optional<PrefetchPriority> priority_;
const scoped_refptr<PreloadPipelineInfoImpl> preload_pipeline_info_;
const base::WeakPtr<PreloadingAttempt> attempt_;
const bool is_javascript_enabled_;
const blink::mojom::Referrer initial_referrer_;
const std::optional<url::Origin> referring_origin_;
base::WeakPtr<WebContents> referring_web_contents_;
const base::WeakPtr<BrowserContext> browser_context_;
const std::optional<SpeculationRulesTags> speculation_rules_tags_;
const net::HttpRequestHeaders additional_headers_;
const base::TimeDelta ttl_;
const PreloadingHoldbackStatus holdback_status_override_;
const bool should_append_variations_header_;
const bool should_disable_block_until_head_timeout_;
const bool should_bypass_http_cache_;
const std::variant<PrefetchRendererInitiatorInfo,
PrefetchBrowserInitiatorInfo>
initiator_info_;
};
}
#endif