blob: 3a61f9a36c3758e665d13904fa569b1bfec1f7c8 [file] [log] [blame]
Avi Drissman4e1b7bc32022-09-15 14:03:501// Copyright 2021 The Chromium Authors
Robert Linc37fb582021-11-11 03:18:472// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
Sreeja Kamishettyc227f7a2022-07-08 22:33:155#ifndef CONTENT_BROWSER_PRELOADING_PRERENDER_PRERENDER_HANDLE_IMPL_H_
6#define CONTENT_BROWSER_PRELOADING_PRERENDER_PRERENDER_HANDLE_IMPL_H_
Robert Linc37fb582021-11-11 03:18:477
Lei Zhang5686e522023-03-02 17:33:108#include "base/memory/weak_ptr.h"
Hiroki Nakagawab6b8b2e2024-12-04 01:24:219#include "content/browser/preloading/prerender/prerender_host.h"
Avi Drissmandcc8e682024-09-04 14:14:4810#include "content/public/browser/frame_tree_node_id.h"
Lei Zhang5686e522023-03-02 17:33:1011#include "content/public/browser/preloading.h"
Robert Linc37fb582021-11-11 03:18:4712#include "content/public/browser/prerender_handle.h"
Lingqi Chi60cff3252023-12-05 02:32:5513
14class GURL;
Robert Linc37fb582021-11-11 03:18:4715
16namespace content {
17
Lei Zhang5686e522023-03-02 17:33:1018class PrerenderHostRegistry;
19
Hiroki Nakagawab6b8b2e2024-12-04 01:24:2120class PrerenderHandleImpl final : public PrerenderHandle,
21 public PrerenderHost::Observer {
Robert Linc37fb582021-11-11 03:18:4722 public:
23 PrerenderHandleImpl(
24 base::WeakPtr<PrerenderHostRegistry> prerender_host_registry,
Avi Drissmandcc8e682024-09-04 14:14:4825 FrameTreeNodeId frame_tree_node_id,
Hiroki Nakagawae628b452025-03-29 13:08:0626 const GURL& url,
27 std::optional<net::HttpNoVarySearchData> no_vary_search_hint);
Robert Linc37fb582021-11-11 03:18:4728 ~PrerenderHandleImpl() override;
Lei Zhang5686e522023-03-02 17:33:1029
30 // PrerenderHandle:
Hiroki Nakagawa56dbf1472025-01-29 08:40:3831 int32_t GetHandleId() const override;
Lingqi Chi60cff3252023-12-05 02:32:5532 const GURL& GetInitialPrerenderingUrl() const override;
Hiroki Nakagawae628b452025-03-29 13:08:0633 const std::optional<net::HttpNoVarySearchData>& GetNoVarySearchHint()
34 const override;
Robert Lin6d825ba2022-02-10 03:35:4035 base::WeakPtr<PrerenderHandle> GetWeakPtr() override;
Sreeja Kamishetty26e40d22022-10-17 17:54:3536 void SetPreloadingAttemptFailureReason(
37 PreloadingFailureReason reason) override;
Hiroki Nakagawa3154fcfd2025-01-29 03:14:1338 void AddActivationCallback(base::OnceClosure activation_callback) override;
39 void AddErrorCallback(base::OnceClosure error_callback) override;
40 bool IsValid() const override;
Hiroki Nakagawab6b8b2e2024-12-04 01:24:2141
42 // PrerenderHost::Observer:
43 void OnActivated() override;
Hiroki Nakagawa1075a94f2025-01-16 12:26:5344 void OnFailed(PrerenderFinalStatus status) override;
Jiacheng Guo4391a962025-07-30 02:14:2045 void OnHostReused() override;
Prudhvikumar Bommanae34ac672024-01-10 18:23:4446
Avi Drissmandcc8e682024-09-04 14:14:4847 FrameTreeNodeId frame_tree_node_id_for_testing() const {
48 return frame_tree_node_id_;
49 }
Hiroki Nakagawaa04ae182023-03-23 06:00:4550
Robert Linc37fb582021-11-11 03:18:4751 private:
Hiroki Nakagawab6b8b2e2024-12-04 01:24:2152 PrerenderHost* GetPrerenderHost();
53
Hiroki Nakagawa56dbf1472025-01-29 08:40:3854 const int handle_id_;
55
Robert Linc37fb582021-11-11 03:18:4756 base::WeakPtr<PrerenderHostRegistry> prerender_host_registry_;
57 // `frame_tree_node_id_` is the root FrameTreeNode id of the prerendered
Prudhvikumar Bommanae34ac672024-01-10 18:23:4458 // page.
Jiacheng Guo4391a962025-07-30 02:14:2059 FrameTreeNodeId frame_tree_node_id_;
Robert Lin624a0fe2021-12-08 22:58:3060
61 const GURL prerendering_url_;
Hiroki Nakagawae628b452025-03-29 13:08:0662 const std::optional<net::HttpNoVarySearchData> no_vary_search_hint_;
Robert Lin6d825ba2022-02-10 03:35:4063
Hiroki Nakagawa3154fcfd2025-01-29 03:14:1364 enum class State { kValid, kActivated, kCanceled };
65 State state_ = State::kValid;
66
67 std::vector<base::OnceClosure> activation_callbacks_;
68 std::vector<base::OnceClosure> error_callbacks_;
Hiroki Nakagawab6b8b2e2024-12-04 01:24:2169
Robert Lin6d825ba2022-02-10 03:35:4070 base::WeakPtrFactory<PrerenderHandle> weak_factory_{this};
Robert Linc37fb582021-11-11 03:18:4771};
72
73} // namespace content
74
Sreeja Kamishettyc227f7a2022-07-08 22:33:1575#endif // CONTENT_BROWSER_PRELOADING_PRERENDER_PRERENDER_HANDLE_IMPL_H_