#ifndef CONTENT_BROWSER_PRELOADING_PREFETCH_PREFETCH_SERVING_HANDLE_H_
#define CONTENT_BROWSER_PRELOADING_PREFETCH_PREFETCH_SERVING_HANDLE_H_
#include "base/memory/weak_ptr.h"
#include "content/browser/preloading/prefetch/prefetch_streaming_url_loader_common_types.h"
#include "content/common/content_export.h"
class GURL;
namespace content {
class PrefetchContainer;
class PrefetchNetworkContext;
class PrefetchResponseReader;
class PrefetchSingleRedirectHop;
class ServiceWorkerClient;
enum class PrefetchProbeResult;
enum class PrefetchServableState;
enum class PrefetchStatus;
class CONTENT_EXPORT PrefetchServingHandle final {
public:
PrefetchServingHandle();
PrefetchServingHandle(base::WeakPtr<PrefetchContainer> prefetch_container,
size_t index_redirect_chain_to_serve);
PrefetchServingHandle(const PrefetchServingHandle&) = delete;
PrefetchServingHandle& operator=(const PrefetchServingHandle&) = delete;
PrefetchServingHandle(PrefetchServingHandle&&);
PrefetchServingHandle& operator=(PrefetchServingHandle&&);
~PrefetchServingHandle();
PrefetchContainer* GetPrefetchContainer() const {
return prefetch_container_.get();
}
PrefetchServingHandle Clone() const;
explicit operator bool() const { return GetPrefetchContainer(); }
PrefetchServableState GetServableState(
base::TimeDelta cacheable_duration) const;
bool HasPrefetchStatus() const;
PrefetchStatus GetPrefetchStatus() const;
bool IsEnd() const;
bool IsIsolatedNetworkContextRequiredToServe() const;
PrefetchNetworkContext* GetCurrentNetworkContextToServe() const;
bool HaveDefaultContextCookiesChanged() const;
bool HasIsolatedCookieCopyStarted() const;
bool IsIsolatedCookieCopyInProgress() const;
void OnIsolatedCookieCopyStart() const;
void OnIsolatedCookiesReadCompleteAndWriteStart() const;
void OnIsolatedCookieCopyComplete() const;
void OnInterceptorCheckCookieCopy() const;
void SetOnCookieCopyCompleteCallback(base::OnceClosure callback) const;
void OnPrefetchProbeResult(PrefetchProbeResult probe_result) const;
bool DoesCurrentURLToServeMatch(const GURL& url) const;
const GURL& GetCurrentURLToServe() const;
base::WeakPtr<PrefetchResponseReader>
GetCurrentResponseReaderToServeForTesting();
void AdvanceCurrentURLToServe() { index_redirect_chain_to_serve_++; }
std::pair<PrefetchRequestHandler, base::WeakPtr<ServiceWorkerClient>>
CreateRequestHandler();
bool VariesOnCookieIndices() const;
bool MatchesCookieIndices(
base::span<const std::pair<std::string, std::string>> cookies) const;
private:
const std::vector<std::unique_ptr<PrefetchSingleRedirectHop>>&
redirect_chain() const;
const PrefetchSingleRedirectHop& GetCurrentSingleRedirectHopToServe() const;
base::WeakPtr<PrefetchContainer> prefetch_container_;
size_t index_redirect_chain_to_serve_ = 0;
};
}
#endif