#ifndef CONTENT_BROWSER_PRELOADING_PRERENDER_PRERENDER_ATTRIBUTES_H_
#define CONTENT_BROWSER_PRELOADING_PRERENDER_PRERENDER_ATTRIBUTES_H_
#include <optional>
#include <string>
#include "content/browser/preloading/preload_pipeline_info_impl.h"
#include "content/browser/preloading/speculation_rules/speculation_rules_params.h"
#include "content/common/content_export.h"
#include "content/public/browser/frame_tree_node_id.h"
#include "content/public/browser/preload_pipeline_info.h"
#include "content/public/browser/preloading.h"
#include "content/public/browser/preloading_trigger_type.h"
#include "content/public/browser/web_contents.h"
#include "content/public/common/referrer.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/navigation/navigation_params.mojom.h"
#include "third_party/blink/public/mojom/speculation_rules/speculation_rules.mojom.h"
#include "third_party/perfetto/include/perfetto/tracing/traced_value_forward.h"
#include "ui/base/page_transition_types.h"
namespace content {
struct CONTENT_EXPORT PrerenderAttributes {
PrerenderAttributes(
const GURL& prerendering_url,
PreloadingTriggerType trigger_type,
const std::string& embedder_histogram_suffix,
std::optional<SpeculationRulesParams> speculation_rules_params,
Referrer referrer,
std::optional<net::HttpNoVarySearchData> no_vary_search_hint,
RenderFrameHost* initiator_render_frame_host,
base::WeakPtr<WebContents> initiator_web_contents,
ui::PageTransition transition_type,
bool should_warm_up_compositor,
bool should_prepare_paint_tree,
blink::mojom::SpeculationAction prerender_action_type,
base::RepeatingCallback<bool(const GURL&,
const std::optional<UrlMatchType>&)>
url_match_predicate,
base::RepeatingCallback<void(NavigationHandle&)>
prerender_navigation_handle_callback,
scoped_refptr<PreloadPipelineInfoImpl> preload_pipeline_info,
bool allow_reuse,
bool form_submission);
~PrerenderAttributes();
PrerenderAttributes(const PrerenderAttributes&);
PrerenderAttributes& operator=(const PrerenderAttributes&);
PrerenderAttributes(PrerenderAttributes&&) noexcept;
PrerenderAttributes& operator=(PrerenderAttributes&&) noexcept;
bool IsBrowserInitiated() const { return !initiator_origin.has_value(); }
std::optional<blink::mojom::SpeculationTargetHint> GetTargetHint() const;
std::optional<blink::mojom::SpeculationEagerness> GetEagerness() const;
std::optional<SpeculationRulesTags> GetTags() const;
GURL prerendering_url;
PreloadingTriggerType trigger_type;
std::string embedder_histogram_suffix;
std::optional<SpeculationRulesParams> speculation_rules_params;
Referrer referrer;
#if BUILDFLAG(IS_ANDROID)
net::HttpRequestHeaders additional_headers;
#endif
std::optional<net::HttpNoVarySearchData> no_vary_search_hint;
std::optional<url::Origin> initiator_origin;
int initiator_process_id = ChildProcessHost::kInvalidUniqueID;
base::WeakPtr<WebContents> initiator_web_contents;
std::optional<blink::LocalFrameToken> initiator_frame_token;
FrameTreeNodeId initiator_frame_tree_node_id;
ukm::SourceId initiator_ukm_id = ukm::kInvalidSourceId;
ui::PageTransition transition_type;
bool should_warm_up_compositor = false;
bool should_prepare_paint_tree = false;
blink::mojom::SpeculationAction prerender_action_type;
PreloadingHoldbackStatus holdback_status_override =
PreloadingHoldbackStatus::kUnspecified;
base::RepeatingCallback<bool(const GURL&, const std::optional<UrlMatchType>&)>
url_match_predicate;
base::RepeatingCallback<void(NavigationHandle&)>
prerender_navigation_handle_callback;
scoped_refptr<PreloadPipelineInfoImpl> preload_pipeline_info;
bool allow_reuse = false;
bool form_submission = false;
bool enable_cross_origin_prerender_iframes = false;
std::optional<base::UnguessableToken> initiator_devtools_navigation_token;
void WriteIntoTrace(perfetto::TracedValue trace_context) const;
#if BUILDFLAG(ARKWEB_NETWORK_LOAD)
std::string extra_headers;
#endif
};
}
#endif