Avi Drissman | 4e1b7bc3 | 2022-09-15 14:03:50 | [diff] [blame] | 1 | // Copyright 2021 The Chromium Authors |
Robert Lin | c37fb58 | 2021-11-11 03:18:47 | [diff] [blame] | 2 | // Use of this source code is governed by a BSD-style license that can be |
| 3 | // found in the LICENSE file. |
| 4 | |
Sreeja Kamishetty | c227f7a | 2022-07-08 22:33:15 | [diff] [blame] | 5 | #ifndef CONTENT_BROWSER_PRELOADING_PRERENDER_PRERENDER_HANDLE_IMPL_H_ |
| 6 | #define CONTENT_BROWSER_PRELOADING_PRERENDER_PRERENDER_HANDLE_IMPL_H_ |
Robert Lin | c37fb58 | 2021-11-11 03:18:47 | [diff] [blame] | 7 | |
Lei Zhang | 5686e52 | 2023-03-02 17:33:10 | [diff] [blame] | 8 | #include "base/memory/weak_ptr.h" |
Hiroki Nakagawa | b6b8b2e | 2024-12-04 01:24:21 | [diff] [blame] | 9 | #include "content/browser/preloading/prerender/prerender_host.h" |
Avi Drissman | dcc8e68 | 2024-09-04 14:14:48 | [diff] [blame] | 10 | #include "content/public/browser/frame_tree_node_id.h" |
Lei Zhang | 5686e52 | 2023-03-02 17:33:10 | [diff] [blame] | 11 | #include "content/public/browser/preloading.h" |
Robert Lin | c37fb58 | 2021-11-11 03:18:47 | [diff] [blame] | 12 | #include "content/public/browser/prerender_handle.h" |
Lingqi Chi | 60cff325 | 2023-12-05 02:32:55 | [diff] [blame] | 13 | |
| 14 | class GURL; |
Robert Lin | c37fb58 | 2021-11-11 03:18:47 | [diff] [blame] | 15 | |
| 16 | namespace content { |
| 17 | |
Lei Zhang | 5686e52 | 2023-03-02 17:33:10 | [diff] [blame] | 18 | class PrerenderHostRegistry; |
| 19 | |
Hiroki Nakagawa | b6b8b2e | 2024-12-04 01:24:21 | [diff] [blame] | 20 | class PrerenderHandleImpl final : public PrerenderHandle, |
| 21 | public PrerenderHost::Observer { |
Robert Lin | c37fb58 | 2021-11-11 03:18:47 | [diff] [blame] | 22 | public: |
| 23 | PrerenderHandleImpl( |
| 24 | base::WeakPtr<PrerenderHostRegistry> prerender_host_registry, |
Avi Drissman | dcc8e68 | 2024-09-04 14:14:48 | [diff] [blame] | 25 | FrameTreeNodeId frame_tree_node_id, |
Hiroki Nakagawa | e628b45 | 2025-03-29 13:08:06 | [diff] [blame] | 26 | const GURL& url, |
| 27 | std::optional<net::HttpNoVarySearchData> no_vary_search_hint); |
Robert Lin | c37fb58 | 2021-11-11 03:18:47 | [diff] [blame] | 28 | ~PrerenderHandleImpl() override; |
Lei Zhang | 5686e52 | 2023-03-02 17:33:10 | [diff] [blame] | 29 | |
| 30 | // PrerenderHandle: |
Hiroki Nakagawa | 56dbf147 | 2025-01-29 08:40:38 | [diff] [blame] | 31 | int32_t GetHandleId() const override; |
Lingqi Chi | 60cff325 | 2023-12-05 02:32:55 | [diff] [blame] | 32 | const GURL& GetInitialPrerenderingUrl() const override; |
Hiroki Nakagawa | e628b45 | 2025-03-29 13:08:06 | [diff] [blame] | 33 | const std::optional<net::HttpNoVarySearchData>& GetNoVarySearchHint() |
| 34 | const override; |
Robert Lin | 6d825ba | 2022-02-10 03:35:40 | [diff] [blame] | 35 | base::WeakPtr<PrerenderHandle> GetWeakPtr() override; |
Sreeja Kamishetty | 26e40d2 | 2022-10-17 17:54:35 | [diff] [blame] | 36 | void SetPreloadingAttemptFailureReason( |
| 37 | PreloadingFailureReason reason) override; |
Hiroki Nakagawa | 3154fcfd | 2025-01-29 03:14:13 | [diff] [blame] | 38 | void AddActivationCallback(base::OnceClosure activation_callback) override; |
| 39 | void AddErrorCallback(base::OnceClosure error_callback) override; |
| 40 | bool IsValid() const override; |
Hiroki Nakagawa | b6b8b2e | 2024-12-04 01:24:21 | [diff] [blame] | 41 | |
| 42 | // PrerenderHost::Observer: |
| 43 | void OnActivated() override; |
Hiroki Nakagawa | 1075a94f | 2025-01-16 12:26:53 | [diff] [blame] | 44 | void OnFailed(PrerenderFinalStatus status) override; |
Jiacheng Guo | 4391a96 | 2025-07-30 02:14:20 | [diff] [blame] | 45 | void OnHostReused() override; |
Prudhvikumar Bommana | e34ac67 | 2024-01-10 18:23:44 | [diff] [blame] | 46 | |
Avi Drissman | dcc8e68 | 2024-09-04 14:14:48 | [diff] [blame] | 47 | FrameTreeNodeId frame_tree_node_id_for_testing() const { |
| 48 | return frame_tree_node_id_; |
| 49 | } |
Hiroki Nakagawa | a04ae18 | 2023-03-23 06:00:45 | [diff] [blame] | 50 | |
Robert Lin | c37fb58 | 2021-11-11 03:18:47 | [diff] [blame] | 51 | private: |
Hiroki Nakagawa | b6b8b2e | 2024-12-04 01:24:21 | [diff] [blame] | 52 | PrerenderHost* GetPrerenderHost(); |
| 53 | |
Hiroki Nakagawa | 56dbf147 | 2025-01-29 08:40:38 | [diff] [blame] | 54 | const int handle_id_; |
| 55 | |
Robert Lin | c37fb58 | 2021-11-11 03:18:47 | [diff] [blame] | 56 | base::WeakPtr<PrerenderHostRegistry> prerender_host_registry_; |
| 57 | // `frame_tree_node_id_` is the root FrameTreeNode id of the prerendered |
Prudhvikumar Bommana | e34ac67 | 2024-01-10 18:23:44 | [diff] [blame] | 58 | // page. |
Jiacheng Guo | 4391a96 | 2025-07-30 02:14:20 | [diff] [blame] | 59 | FrameTreeNodeId frame_tree_node_id_; |
Robert Lin | 624a0fe | 2021-12-08 22:58:30 | [diff] [blame] | 60 | |
| 61 | const GURL prerendering_url_; |
Hiroki Nakagawa | e628b45 | 2025-03-29 13:08:06 | [diff] [blame] | 62 | const std::optional<net::HttpNoVarySearchData> no_vary_search_hint_; |
Robert Lin | 6d825ba | 2022-02-10 03:35:40 | [diff] [blame] | 63 | |
Hiroki Nakagawa | 3154fcfd | 2025-01-29 03:14:13 | [diff] [blame] | 64 | 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 Nakagawa | b6b8b2e | 2024-12-04 01:24:21 | [diff] [blame] | 69 | |
Robert Lin | 6d825ba | 2022-02-10 03:35:40 | [diff] [blame] | 70 | base::WeakPtrFactory<PrerenderHandle> weak_factory_{this}; |
Robert Lin | c37fb58 | 2021-11-11 03:18:47 | [diff] [blame] | 71 | }; |
| 72 | |
| 73 | } // namespace content |
| 74 | |
Sreeja Kamishetty | c227f7a | 2022-07-08 22:33:15 | [diff] [blame] | 75 | #endif // CONTENT_BROWSER_PRELOADING_PRERENDER_PRERENDER_HANDLE_IMPL_H_ |