| // 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. |
| |
| #include "content/browser/preloading/prerender/prerender_attributes.h" |
| |
| #include <optional> |
| |
| #include "content/browser/renderer_host/render_frame_host_impl.h" |
| #include "content/public/browser/render_frame_host.h" |
| #include "third_party/perfetto/include/perfetto/tracing/traced_value.h" |
| |
| namespace content { |
| |
| void PrerenderAttributes::WriteIntoTrace( |
| perfetto::TracedValue trace_context) const { |
| auto dict = std::move(trace_context).WriteDictionary(); |
| dict.Add("url", prerendering_url); |
| dict.Add("trigger_type", trigger_type); |
| } |
| |
| 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, |
| 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) |
| : prerendering_url(prerendering_url), |
| trigger_type(trigger_type), |
| embedder_histogram_suffix(embedder_histogram_suffix), |
| speculation_rules_params(std::move(speculation_rules_params)), |
| referrer(std::move(referrer)), |
| no_vary_search_hint(std::move(no_vary_search_hint)), |
| initiator_web_contents(std::move(initiator_web_contents)), |
| transition_type(transition_type), |
| should_warm_up_compositor(should_warm_up_compositor), |
| should_prepare_paint_tree(should_prepare_paint_tree), |
| url_match_predicate(std::move(url_match_predicate)), |
| prerender_navigation_handle_callback( |
| std::move(prerender_navigation_handle_callback)), |
| preload_pipeline_info(std::move(preload_pipeline_info)) { |
| if (initiator_render_frame_host) { |
| initiator_origin = initiator_render_frame_host->GetLastCommittedOrigin(); |
| initiator_process_id = |
| initiator_render_frame_host->GetProcess()->GetDeprecatedID(); |
| initiator_frame_token = initiator_render_frame_host->GetFrameToken(); |
| initiator_frame_tree_node_id = |
| initiator_render_frame_host->GetFrameTreeNodeId(); |
| initiator_ukm_id = initiator_render_frame_host->GetPageUkmSourceId(); |
| auto* rfhi = static_cast<RenderFrameHostImpl*>(initiator_render_frame_host); |
| initiator_devtools_navigation_token = rfhi->GetDevToolsNavigationToken(); |
| } |
| |
| CHECK(!IsBrowserInitiated() || |
| !initiator_devtools_navigation_token.has_value()); |
| CHECK(!IsBrowserInitiated() || !this->speculation_rules_params.has_value()); |
| } |
| |
| PrerenderAttributes::~PrerenderAttributes() = default; |
| |
| PrerenderAttributes::PrerenderAttributes(const PrerenderAttributes&) = default; |
| PrerenderAttributes& PrerenderAttributes::operator=( |
| const PrerenderAttributes&) = default; |
| PrerenderAttributes::PrerenderAttributes(PrerenderAttributes&&) noexcept = |
| default; |
| PrerenderAttributes& PrerenderAttributes::operator=( |
| PrerenderAttributes&&) noexcept = default; |
| |
| std::optional<blink::mojom::SpeculationTargetHint> |
| PrerenderAttributes::GetTargetHint() const { |
| return speculation_rules_params.has_value() |
| ? std::make_optional(speculation_rules_params->target_hint) |
| : std::nullopt; |
| } |
| |
| std::optional<blink::mojom::SpeculationEagerness> |
| PrerenderAttributes::GetEagerness() const { |
| return speculation_rules_params.has_value() |
| ? std::make_optional(speculation_rules_params->eagerness) |
| : std::nullopt; |
| } |
| |
| std::optional<SpeculationRulesTags> PrerenderAttributes::GetTags() const { |
| return speculation_rules_params.has_value() |
| ? std::make_optional(speculation_rules_params->tags) |
| : std::nullopt; |
| } |
| |
| } // namespace content |