#ifndef CONTENT_BROWSER_PRELOADING_PREFETCH_PREFETCH_URL_LOADER_INTERCEPTOR_H_
#define CONTENT_BROWSER_PRELOADING_PREFETCH_PREFETCH_URL_LOADER_INTERCEPTOR_H_
#include <optional>
#include "base/memory/weak_ptr.h"
#include "base/sequence_checker.h"
#include "content/browser/loader/navigation_loader_interceptor.h"
#include "content/browser/preloading/prefetch/prefetch_serving_handle.h"
#include "content/common/content_export.h"
#include "content/public/browser/frame_tree_node_id.h"
#include "third_party/blink/public/common/tokens/tokens.h"
namespace content {
class PrefetchContainer;
class PrefetchServingPageMetricsContainer;
class ServiceWorkerMainResourceHandle;
using PrefetchCompleteCallbackForTesting =
base::RepeatingCallback<void(PrefetchContainer*)>;
class CONTENT_EXPORT PrefetchURLLoaderInterceptor final
: public NavigationLoaderInterceptor {
public:
PrefetchURLLoaderInterceptor(
PrefetchServiceWorkerState expected_service_worker_state,
base::WeakPtr<ServiceWorkerMainResourceHandle>
service_worker_handle_for_navigation,
FrameTreeNodeId frame_tree_node_id,
std::optional<blink::DocumentToken> initiator_document_token,
base::WeakPtr<PrefetchServingPageMetricsContainer>
serving_page_metrics_container);
~PrefetchURLLoaderInterceptor() override;
PrefetchURLLoaderInterceptor(const PrefetchURLLoaderInterceptor&) = delete;
PrefetchURLLoaderInterceptor& operator=(const PrefetchURLLoaderInterceptor&) =
delete;
void MaybeCreateLoader(
const network::ResourceRequest& tentative_resource_request,
BrowserContext* browser_context,
NavigationLoaderInterceptor::LoaderCallback callback,
NavigationLoaderInterceptor::FallbackCallback fallback_callback) override;
static void SetPrefetchCompleteCallbackForTesting(
PrefetchCompleteCallbackForTesting callback);
protected:
FrameTreeNodeId GetFrameTreeNodeId() const { return frame_tree_node_id_; }
private:
void GetPrefetch(const GURL& url,
base::OnceCallback<void(PrefetchServingHandle)>
get_prefetch_callback) const;
void OnGetPrefetchComplete(const GURL& url,
const std::optional<url::Origin>& top_frame_origin,
PrefetchServingHandle serving_handle);
const PrefetchServiceWorkerState expected_service_worker_state_;
const base::WeakPtr<ServiceWorkerMainResourceHandle>
service_worker_handle_for_navigation_;
const FrameTreeNodeId frame_tree_node_id_;
const std::optional<blink::DocumentToken> initiator_document_token_;
base::WeakPtr<PrefetchServingPageMetricsContainer>
serving_page_metrics_container_;
NavigationLoaderInterceptor::LoaderCallback loader_callback_;
PrefetchServingHandle redirect_serving_handle_;
SEQUENCE_CHECKER(sequence_checker_);
base::WeakPtrFactory<PrefetchURLLoaderInterceptor> weak_factory_{this};
};
}
#endif