#ifndef CONTENT_BROWSER_PRELOADING_PRERENDERER_IMPL_H_
#define CONTENT_BROWSER_PRELOADING_PRERENDERER_IMPL_H_
#include <array>
#include <tuple>
#include "base/scoped_observation.h"
#include "content/browser/preloading/preloading_confidence.h"
#include "content/browser/preloading/prerender/prerender_host_registry.h"
#include "content/browser/preloading/prerenderer.h"
#include "content/public/browser/web_contents_observer.h"
namespace content {
class PrerenderHostRegistry;
class Page;
class CONTENT_EXPORT PrerendererImpl : public Prerenderer,
WebContentsObserver,
PrerenderHostRegistry::Observer {
public:
explicit PrerendererImpl(RenderFrameHost& render_frame_host);
~PrerendererImpl() override;
void PrimaryPageChanged(Page& page) override;
void ProcessCandidatesForPrerender(
const std::vector<blink::mojom::SpeculationCandidatePtr>& candidates,
bool enable_cross_origin_prerender_iframes = false) override;
bool MaybePrerender(const blink::mojom::SpeculationCandidatePtr& candidate,
const PreloadingPredictor& enacting_predictor,
PreloadingConfidence confidence) override;
void OnLCPPredicted() override;
bool ShouldWaitForPrerenderResult(const GURL& url) override;
void SetPrerenderCancellationCallback(
PrerenderCancellationCallback callback) override;
void OnCancel(FrameTreeNodeId host_frame_tree_node_id,
const PrerenderCancellationReason& reason) override;
void OnRegistryDestroyed() override;
void CancelStartedPrerendersForTesting();
private:
struct PrerenderInfo;
void CancelStartedPrerenders();
void RecordReceivedPrerendersCountToMetrics();
void ResetReceivedPrerendersCountForMetrics();
void IncrementReceivedPrerendersCountForMetrics(
PreloadingTriggerType trigger_type,
blink::mojom::SpeculationEagerness eagerness);
std::vector<PrerenderInfo> started_prerenders_;
base::flat_map<PreloadingTriggerType,
std::array<int,
static_cast<size_t>(
blink::mojom::SpeculationEagerness::kMaxValue) +
1>>
received_prerenders_by_eagerness_;
PrerenderCancellationCallback prerender_cancellation_callback_ =
base::DoNothing();
base::ScopedObservation<PrerenderHostRegistry,
PrerenderHostRegistry::Observer>
observation_{this};
base::WeakPtr<PrerenderHostRegistry> registry_;
const raw_ref<RenderFrameHost> render_frame_host_;
bool blocked_ = false;
using BlockedCandidateInfo =
std::tuple<blink::mojom::SpeculationCandidatePtr ,
PreloadingPredictor ,
PreloadingConfidence >;
std::vector<BlockedCandidateInfo> blocked_candidates_;
bool enable_cross_origin_prerender_iframes_ = false;
};
}
#endif