blob: 3fdc7a3f7593907216c58ec2256803ea076b101a [file] [log] [blame]
Taiyo Mizuhashi94ce74f2025-01-28 04:20:141// Copyright 2025 The Chromium Authors
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef CONTENT_BROWSER_PRELOADING_PREFETCH_PREFETCH_HANDLE_IMPL_H_
6#define CONTENT_BROWSER_PRELOADING_PREFETCH_PREFETCH_HANDLE_IMPL_H_
7
kenossccc35892025-06-09 13:09:478#include "base/functional/callback.h"
Taiyo Mizuhashi94ce74f2025-01-28 04:20:149#include "base/memory/weak_ptr.h"
10#include "content/browser/preloading/prefetch/prefetch_container.h"
Taiyo Mizuhashi94ce74f2025-01-28 04:20:1411#include "content/public/browser/prefetch_handle.h"
Taiyo Mizuhashi94ce74f2025-01-28 04:20:1412
13namespace content {
14
Hiroshige Hayashizaki583b4962025-08-19 18:58:2615class PrefetchService;
Hiroshige Hayashizaki22be5e4c2025-03-07 21:39:5916enum class PrefetchStatus;
17
kenossccc35892025-06-09 13:09:4718// Currently, it must be visible from `PrefetchResponseReader` for `friend`.
19//
20// TODO(crbug.com/400761083): Put it into `namespace prefetch_handle`.
21class PrefetchContainerObserver final : public PrefetchContainer::Observer {
22 public:
kenossb4e57f72025-06-16 08:28:4023 PrefetchContainerObserver();
kenossccc35892025-06-09 13:09:4724 ~PrefetchContainerObserver() override;
25
26 // Not movable nor copyable.
27 PrefetchContainerObserver(PrefetchContainerObserver&& other) = delete;
28 PrefetchContainerObserver& operator=(PrefetchContainerObserver&& other) =
29 delete;
30 PrefetchContainerObserver(const PrefetchContainerObserver&) = delete;
31 PrefetchContainerObserver& operator=(const PrefetchContainerObserver&) =
32 delete;
33
kenossb4e57f72025-06-16 08:28:4034 void SetOnPrefetchHeadReceivedCallback(
35 base::RepeatingCallback<void(const network::mojom::URLResponseHead&)>
36 on_prefetch_head_received);
37 void SetOnPrefetchCompletedOrFailedCallback(
38 base::RepeatingCallback<
39 void(const network::URLLoaderCompletionStatus& completion_status,
40 const std::optional<int>& response_code)>
41 on_prefetch_completed_or_failed);
42
kenossccc35892025-06-09 13:09:4743 // Implements `PrefetchContainer::Observer`.
44 void OnWillBeDestroyed(PrefetchContainer& prefetch_container) override;
45 void OnGotInitialEligibility(PrefetchContainer& prefetch_container,
46 PreloadingEligibility eligibility) override;
47 void OnDeterminedHead(PrefetchContainer& prefetch_container) override;
kenossb4e57f72025-06-16 08:28:4048 void OnPrefetchCompletedOrFailed(
Hiroshige Hayashizaki6a103bad2025-07-11 02:15:3249 PrefetchContainer& prefetch_container,
kenossb4e57f72025-06-16 08:28:4050 const network::URLLoaderCompletionStatus& completion_status,
51 const std::optional<int>& response_code) override;
kenossccc35892025-06-09 13:09:4752
53 private:
54 base::RepeatingCallback<void(const network::mojom::URLResponseHead&)>
55 on_prefetch_head_received_;
kenossb4e57f72025-06-16 08:28:4056 base::RepeatingCallback<void(
57 const network::URLLoaderCompletionStatus& completion_status,
58 const std::optional<int>& response_code)>
59 on_prefetch_completed_or_failed_;
kenossccc35892025-06-09 13:09:4760};
61
Taiyo Mizuhashi94ce74f2025-01-28 04:20:1462class PrefetchHandleImpl final : public PrefetchHandle {
63 public:
64 PrefetchHandleImpl(base::WeakPtr<PrefetchService> prefetch_service,
65 base::WeakPtr<PrefetchContainer> prefetch_container);
66 ~PrefetchHandleImpl() override;
67
kenoss451c5112025-03-12 02:17:2168 // `PrefetchHandle` implementations
kenossb4e57f72025-06-16 08:28:4069 void SetOnPrefetchHeadReceivedCallback(
kenossccc35892025-06-09 13:09:4770 base::RepeatingCallback<void(const network::mojom::URLResponseHead&)>
71 on_prefetch_head_received) override;
kenossb4e57f72025-06-16 08:28:4072 void SetOnPrefetchCompletedOrFailedCallback(
73 base::RepeatingCallback<
74 void(const network::URLLoaderCompletionStatus& completion_status,
75 const std::optional<int>& response_code)>
76 on_prefetch_completed_or_failed) override;
kenoss451c5112025-03-12 02:17:2177 bool IsAlive() const override;
78
Hiroshige Hayashizaki22be5e4c2025-03-07 21:39:5979 // TODO(crbug.com/390329781): The following methods are tentative interface
80 // for incrementally migrating `//content/` internal code to `PrefetchHandle`.
81 // Revisit the semantics when exposing for the public API.
82
83 // Sets the `PrefetchStatus` that will be set to the `PrefetchContainer` when
84 // this handle is destroyed and the `PrefetchContainer`'s `LoadState` is
85 // `kStarted` at that time.
86 void SetPrefetchStatusOnReleaseStartedPrefetch(
87 PrefetchStatus prefetch_status_on_release_started_prefetch);
88
Taiyo Mizuhashi94ce74f2025-01-28 04:20:1489 private:
90 base::WeakPtr<PrefetchService> prefetch_service_;
91 base::WeakPtr<PrefetchContainer> prefetch_container_;
kenossb4e57f72025-06-16 08:28:4092 PrefetchContainerObserver prefetch_container_observer_;
Hiroshige Hayashizaki22be5e4c2025-03-07 21:39:5993 std::optional<PrefetchStatus> prefetch_status_on_release_started_prefetch_;
Taiyo Mizuhashi94ce74f2025-01-28 04:20:1494};
95
96} // namespace content
97
98#endif // CONTENT_BROWSER_PRELOADING_PREFETCH_PREFETCH_HANDLE_IMPL_H_