blob: 3b7345bc026cf0b728d3dcb2b37854371b5090b9 [file] [log] [blame]
// Copyright 2025 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CONTENT_BROWSER_PRELOADING_PREFETCH_PREFETCH_HANDLE_IMPL_H_
#define CONTENT_BROWSER_PRELOADING_PREFETCH_PREFETCH_HANDLE_IMPL_H_
#include "base/functional/callback.h"
#include "base/memory/weak_ptr.h"
#include "content/browser/preloading/prefetch/prefetch_container.h"
#include "content/browser/preloading/prefetch/prefetch_service.h"
#include "content/public/browser/prefetch_handle.h"
#include "content/public/browser/preloading.h"
namespace content {
enum class PrefetchStatus;
// Currently, it must be visible from `PrefetchResponseReader` for `friend`.
//
// TODO(crbug.com/400761083): Put it into `namespace prefetch_handle`.
class PrefetchContainerObserver final : public PrefetchContainer::Observer {
public:
PrefetchContainerObserver();
~PrefetchContainerObserver() override;
// Not movable nor copyable.
PrefetchContainerObserver(PrefetchContainerObserver&& other) = delete;
PrefetchContainerObserver& operator=(PrefetchContainerObserver&& other) =
delete;
PrefetchContainerObserver(const PrefetchContainerObserver&) = delete;
PrefetchContainerObserver& operator=(const PrefetchContainerObserver&) =
delete;
void SetOnPrefetchHeadReceivedCallback(
base::RepeatingCallback<void(const network::mojom::URLResponseHead&)>
on_prefetch_head_received);
void SetOnPrefetchCompletedOrFailedCallback(
base::RepeatingCallback<
void(const network::URLLoaderCompletionStatus& completion_status,
const std::optional<int>& response_code)>
on_prefetch_completed_or_failed);
// Implements `PrefetchContainer::Observer`.
void OnWillBeDestroyed(PrefetchContainer& prefetch_container) override;
void OnGotInitialEligibility(PrefetchContainer& prefetch_container,
PreloadingEligibility eligibility) override;
void OnDeterminedHead(PrefetchContainer& prefetch_container) override;
void OnPrefetchCompletedOrFailed(
PrefetchContainer& prefetch_container,
const network::URLLoaderCompletionStatus& completion_status,
const std::optional<int>& response_code) override;
private:
base::RepeatingCallback<void(const network::mojom::URLResponseHead&)>
on_prefetch_head_received_;
base::RepeatingCallback<void(
const network::URLLoaderCompletionStatus& completion_status,
const std::optional<int>& response_code)>
on_prefetch_completed_or_failed_;
};
class PrefetchHandleImpl final : public PrefetchHandle {
public:
PrefetchHandleImpl(base::WeakPtr<PrefetchService> prefetch_service,
base::WeakPtr<PrefetchContainer> prefetch_container);
~PrefetchHandleImpl() override;
// `PrefetchHandle` implementations
void SetOnPrefetchHeadReceivedCallback(
base::RepeatingCallback<void(const network::mojom::URLResponseHead&)>
on_prefetch_head_received) override;
void SetOnPrefetchCompletedOrFailedCallback(
base::RepeatingCallback<
void(const network::URLLoaderCompletionStatus& completion_status,
const std::optional<int>& response_code)>
on_prefetch_completed_or_failed) override;
bool IsAlive() const override;
// TODO(crbug.com/390329781): The following methods are tentative interface
// for incrementally migrating `//content/` internal code to `PrefetchHandle`.
// Revisit the semantics when exposing for the public API.
// Sets the `PrefetchStatus` that will be set to the `PrefetchContainer` when
// this handle is destroyed and the `PrefetchContainer`'s `LoadState` is
// `kStarted` at that time.
void SetPrefetchStatusOnReleaseStartedPrefetch(
PrefetchStatus prefetch_status_on_release_started_prefetch);
private:
base::WeakPtr<PrefetchService> prefetch_service_;
base::WeakPtr<PrefetchContainer> prefetch_container_;
PrefetchContainerObserver prefetch_container_observer_;
std::optional<PrefetchStatus> prefetch_status_on_release_started_prefetch_;
};
} // namespace content
#endif // CONTENT_BROWSER_PRELOADING_PREFETCH_PREFETCH_HANDLE_IMPL_H_