Taiyo Mizuhashi | 94ce74f | 2025-01-28 04:20:14 | [diff] [blame] | 1 | // 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 | |
kenoss | ccc3589 | 2025-06-09 13:09:47 | [diff] [blame] | 8 | #include "base/functional/callback.h" |
Taiyo Mizuhashi | 94ce74f | 2025-01-28 04:20:14 | [diff] [blame] | 9 | #include "base/memory/weak_ptr.h" |
| 10 | #include "content/browser/preloading/prefetch/prefetch_container.h" |
Taiyo Mizuhashi | 94ce74f | 2025-01-28 04:20:14 | [diff] [blame] | 11 | #include "content/public/browser/prefetch_handle.h" |
Taiyo Mizuhashi | 94ce74f | 2025-01-28 04:20:14 | [diff] [blame] | 12 | |
| 13 | namespace content { |
| 14 | |
Hiroshige Hayashizaki | 583b496 | 2025-08-19 18:58:26 | [diff] [blame] | 15 | class PrefetchService; |
Hiroshige Hayashizaki | 22be5e4c | 2025-03-07 21:39:59 | [diff] [blame] | 16 | enum class PrefetchStatus; |
| 17 | |
kenoss | ccc3589 | 2025-06-09 13:09:47 | [diff] [blame] | 18 | // Currently, it must be visible from `PrefetchResponseReader` for `friend`. |
| 19 | // |
| 20 | // TODO(crbug.com/400761083): Put it into `namespace prefetch_handle`. |
| 21 | class PrefetchContainerObserver final : public PrefetchContainer::Observer { |
| 22 | public: |
kenoss | b4e57f7 | 2025-06-16 08:28:40 | [diff] [blame] | 23 | PrefetchContainerObserver(); |
kenoss | ccc3589 | 2025-06-09 13:09:47 | [diff] [blame] | 24 | ~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 | |
kenoss | b4e57f7 | 2025-06-16 08:28:40 | [diff] [blame] | 34 | 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 | |
kenoss | ccc3589 | 2025-06-09 13:09:47 | [diff] [blame] | 43 | // 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; |
kenoss | b4e57f7 | 2025-06-16 08:28:40 | [diff] [blame] | 48 | void OnPrefetchCompletedOrFailed( |
Hiroshige Hayashizaki | 6a103bad | 2025-07-11 02:15:32 | [diff] [blame] | 49 | PrefetchContainer& prefetch_container, |
kenoss | b4e57f7 | 2025-06-16 08:28:40 | [diff] [blame] | 50 | const network::URLLoaderCompletionStatus& completion_status, |
| 51 | const std::optional<int>& response_code) override; |
kenoss | ccc3589 | 2025-06-09 13:09:47 | [diff] [blame] | 52 | |
| 53 | private: |
| 54 | base::RepeatingCallback<void(const network::mojom::URLResponseHead&)> |
| 55 | on_prefetch_head_received_; |
kenoss | b4e57f7 | 2025-06-16 08:28:40 | [diff] [blame] | 56 | base::RepeatingCallback<void( |
| 57 | const network::URLLoaderCompletionStatus& completion_status, |
| 58 | const std::optional<int>& response_code)> |
| 59 | on_prefetch_completed_or_failed_; |
kenoss | ccc3589 | 2025-06-09 13:09:47 | [diff] [blame] | 60 | }; |
| 61 | |
Taiyo Mizuhashi | 94ce74f | 2025-01-28 04:20:14 | [diff] [blame] | 62 | class PrefetchHandleImpl final : public PrefetchHandle { |
| 63 | public: |
| 64 | PrefetchHandleImpl(base::WeakPtr<PrefetchService> prefetch_service, |
| 65 | base::WeakPtr<PrefetchContainer> prefetch_container); |
| 66 | ~PrefetchHandleImpl() override; |
| 67 | |
kenoss | 451c511 | 2025-03-12 02:17:21 | [diff] [blame] | 68 | // `PrefetchHandle` implementations |
kenoss | b4e57f7 | 2025-06-16 08:28:40 | [diff] [blame] | 69 | void SetOnPrefetchHeadReceivedCallback( |
kenoss | ccc3589 | 2025-06-09 13:09:47 | [diff] [blame] | 70 | base::RepeatingCallback<void(const network::mojom::URLResponseHead&)> |
| 71 | on_prefetch_head_received) override; |
kenoss | b4e57f7 | 2025-06-16 08:28:40 | [diff] [blame] | 72 | 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; |
kenoss | 451c511 | 2025-03-12 02:17:21 | [diff] [blame] | 77 | bool IsAlive() const override; |
| 78 | |
Hiroshige Hayashizaki | 22be5e4c | 2025-03-07 21:39:59 | [diff] [blame] | 79 | // 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 Mizuhashi | 94ce74f | 2025-01-28 04:20:14 | [diff] [blame] | 89 | private: |
| 90 | base::WeakPtr<PrefetchService> prefetch_service_; |
| 91 | base::WeakPtr<PrefetchContainer> prefetch_container_; |
kenoss | b4e57f7 | 2025-06-16 08:28:40 | [diff] [blame] | 92 | PrefetchContainerObserver prefetch_container_observer_; |
Hiroshige Hayashizaki | 22be5e4c | 2025-03-07 21:39:59 | [diff] [blame] | 93 | std::optional<PrefetchStatus> prefetch_status_on_release_started_prefetch_; |
Taiyo Mizuhashi | 94ce74f | 2025-01-28 04:20:14 | [diff] [blame] | 94 | }; |
| 95 | |
| 96 | } // namespace content |
| 97 | |
| 98 | #endif // CONTENT_BROWSER_PRELOADING_PREFETCH_PREFETCH_HANDLE_IMPL_H_ |