#ifndef CONTENT_BROWSER_LOADER_OBJECT_NAVIGATION_FALLBACK_BODY_LOADER_H_
#define CONTENT_BROWSER_LOADER_OBJECT_NAVIGATION_FALLBACK_BODY_LOADER_H_
#include <memory>
#include <optional>
#include <string>
#include "base/functional/callback.h"
#include "base/memory/raw_ref.h"
#include "content/public/browser/navigation_handle_user_data.h"
#include "mojo/public/cpp/bindings/receiver.h"
#include "mojo/public/cpp/bindings/remote.h"
#include "mojo/public/cpp/system/data_pipe.h"
#include "mojo/public/cpp/system/data_pipe_drainer.h"
#include "services/network/public/cpp/url_loader_completion_status.h"
#include "services/network/public/mojom/url_loader.mojom.h"
#include "third_party/blink/public/mojom/navigation/navigation_params.mojom-forward.h"
#include "third_party/blink/public/mojom/timing/resource_timing.mojom.h"
namespace content {
class NavigationRequest;
class ObjectNavigationFallbackBodyLoader
: public NavigationHandleUserData<ObjectNavigationFallbackBodyLoader>,
public network::mojom::URLLoaderClient,
public mojo::DataPipeDrainer::Client {
public:
static void CreateAndStart(
NavigationRequest& navigation_request,
mojo::ScopedDataPipeConsumerHandle response_body,
network::mojom::URLLoaderClientEndpointsPtr url_loader_client_endpoints,
base::OnceClosure completion_closure);
~ObjectNavigationFallbackBodyLoader() override;
private:
friend NavigationHandleUserData<ObjectNavigationFallbackBodyLoader>;
NAVIGATION_HANDLE_USER_DATA_KEY_DECL();
ObjectNavigationFallbackBodyLoader(
NavigationHandle& navigation_handle,
mojo::ScopedDataPipeConsumerHandle response_body,
network::mojom::URLLoaderClientEndpointsPtr url_loader_client_endpoints,
base::OnceClosure completion_closure);
void BodyLoadFailed();
void OnReceiveEarlyHints(network::mojom::EarlyHintsPtr) override;
void OnReceiveResponse(
network::mojom::URLResponseHeadPtr,
mojo::ScopedDataPipeConsumerHandle body,
std::optional<mojo_base::BigBuffer> cached_metadata) override;
#if BUILDFLAG(ARKWEB_RESOURCE_INTERCEPTION)
void OnTransferDataWithSharedMemory(base::ReadOnlySharedMemoryRegion region, uint64_t buffer_size) override {}
#endif
void OnReceiveRedirect(const net::RedirectInfo&,
network::mojom::URLResponseHeadPtr) override;
void OnUploadProgress(int64_t current_position,
int64_t total_size,
OnUploadProgressCallback) override;
void OnTransferSizeUpdated(int32_t transfer_size_diff) override;
void OnComplete(const network::URLLoaderCompletionStatus& status) override;
void OnDataAvailable(base::span<const uint8_t> data) override;
void OnDataComplete() override;
const raw_ref<NavigationRequest> navigation_request_;
mojo::Remote<network::mojom::URLLoader> url_loader_;
mojo::Receiver<network::mojom::URLLoaderClient> url_loader_client_receiver_;
std::unique_ptr<mojo::DataPipeDrainer> response_body_drainer_;
base::OnceClosure completion_closure_;
};
}
#endif