#ifndef CONTENT_BROWSER_LOADER_URL_LOADER_FACTORY_UTILS_H_
#define CONTENT_BROWSER_LOADER_URL_LOADER_FACTORY_UTILS_H_
#include <variant>
#include "base/memory/stack_allocated.h"
#include "content/browser/devtools/devtools_instrumentation.h"
#include "content/common/content_export.h"
#include "content/public/browser/content_browser_client.h"
#include "services/network/public/cpp/url_loader_factory_builder.h"
namespace net {
class IsolationInfo;
}
namespace content {
class StoragePartitionImpl;
namespace url_loader_factory {
using Interceptor = base::RepeatingCallback<
void(int process_id, network::URLLoaderFactoryBuilder& factory_builder)>;
CONTENT_EXPORT const Interceptor& GetTestingInterceptor();
CONTENT_EXPORT void SetInterceptorForTesting(const Interceptor& interceptor);
CONTENT_EXPORT bool HasInterceptorOnIOThreadForTesting();
CONTENT_EXPORT void SetHasInterceptorOnIOThreadForTesting(bool has_interceptor);
class CONTENT_EXPORT ContentClientParams final {
STACK_ALLOCATED();
public:
ContentClientParams(BrowserContext* browser_context,
RenderFrameHost* frame,
int render_process_id,
const url::Origin& request_initiator,
const net::IsolationInfo& isolation_info,
ukm::SourceIdObj ukm_source_id,
bool* bypass_redirect_checks = nullptr,
std::optional<int64_t> navigation_id = std::nullopt,
scoped_refptr<base::SequencedTaskRunner>
navigation_response_task_runner = nullptr);
ContentClientParams(const ContentClientParams&) = delete;
ContentClientParams& operator=(const ContentClientParams&) = delete;
ContentClientParams(ContentClientParams&&);
ContentClientParams& operator=(ContentClientParams&&);
~ContentClientParams();
void Run(network::URLLoaderFactoryBuilder& factory_builder,
ContentBrowserClient::URLLoaderFactoryType type,
mojo::PendingRemote<network::mojom::TrustedURLLoaderHeaderClient>*
header_client,
bool* disable_secure_dns,
network::mojom::URLLoaderFactoryOverridePtr* factory_override);
private:
raw_ptr<BrowserContext> browser_context_;
raw_ptr<RenderFrameHost> frame_;
int render_process_id_;
raw_ref<const url::Origin> request_initiator_;
raw_ref<const net::IsolationInfo> isolation_info_;
ukm::SourceIdObj ukm_source_id_;
raw_ptr<bool> bypass_redirect_checks_;
std::optional<int64_t> navigation_id_;
scoped_refptr<base::SequencedTaskRunner> navigation_response_task_runner_;
};
enum class HeaderClientOption { kAllow, kDisallow };
enum class DisableSecureDnsOption { kAllow, kDisallow };
enum class FactoryOverrideOption { kAllow, kDisallow };
class CONTENT_EXPORT TerminalParams final {
STACK_ALLOCATED();
public:
static TerminalParams ForNetworkContext(
network::mojom::NetworkContext* network_context,
network::mojom::URLLoaderFactoryParamsPtr factory_params,
HeaderClientOption header_client_option = HeaderClientOption::kDisallow,
FactoryOverrideOption factory_override_option =
FactoryOverrideOption::kDisallow,
DisableSecureDnsOption disable_secure_dns_option =
DisableSecureDnsOption::kDisallow);
static TerminalParams ForBrowserProcess(
StoragePartitionImpl* storage_partition,
HeaderClientOption header_client_option = HeaderClientOption::kDisallow);
using URLLoaderFactoryTypes =
std::variant<mojo::PendingRemote<network::mojom::URLLoaderFactory>,
scoped_refptr<network::SharedURLLoaderFactory>>;
static TerminalParams ForNonNetwork(URLLoaderFactoryTypes url_loader_factory,
int process_id);
TerminalParams(TerminalParams&&);
TerminalParams& operator=(TerminalParams&&);
~TerminalParams();
network::mojom::NetworkContext* network_context() const;
HeaderClientOption header_client_option() const;
FactoryOverrideOption factory_override_option() const;
DisableSecureDnsOption disable_secure_dns_option() const;
StoragePartitionImpl* storage_partition() const;
int process_id() const;
network::mojom::URLLoaderFactoryParamsPtr TakeFactoryParams();
std::optional<URLLoaderFactoryTypes> TakeURLLoaderFactory();
private:
TerminalParams(network::mojom::NetworkContext* network_context,
network::mojom::URLLoaderFactoryParamsPtr factory_params,
HeaderClientOption header_client_option,
FactoryOverrideOption factory_override_option,
DisableSecureDnsOption disable_secure_dns_option,
StoragePartitionImpl* storage_partition,
std::optional<URLLoaderFactoryTypes> url_loader_factory,
int process_id);
raw_ptr<network::mojom::NetworkContext> network_context_;
network::mojom::URLLoaderFactoryParamsPtr factory_params_;
HeaderClientOption header_client_option_;
FactoryOverrideOption factory_override_option_;
DisableSecureDnsOption disable_secure_dns_option_;
raw_ptr<StoragePartitionImpl> storage_partition_;
std::optional<URLLoaderFactoryTypes> url_loader_factory_;
int process_id_;
};
[[nodiscard]] CONTENT_EXPORT scoped_refptr<network::SharedURLLoaderFactory>
Create(ContentBrowserClient::URLLoaderFactoryType type,
TerminalParams terminal_params,
std::optional<ContentClientParams> content_client_params = std::nullopt,
std::optional<devtools_instrumentation::WillCreateURLLoaderFactoryParams>
devtools_params = std::nullopt);
[[nodiscard]] CONTENT_EXPORT mojo::PendingRemote<
network::mojom::URLLoaderFactory>
CreatePendingRemote(
ContentBrowserClient::URLLoaderFactoryType type,
TerminalParams terminal_params,
std::optional<ContentClientParams> content_client_params = std::nullopt,
std::optional<devtools_instrumentation::WillCreateURLLoaderFactoryParams>
devtools_params = std::nullopt);
CONTENT_EXPORT void CreateAndConnectToPendingReceiver(
mojo::PendingReceiver<network::mojom::URLLoaderFactory> receiver_to_connect,
ContentBrowserClient::URLLoaderFactoryType type,
TerminalParams terminal_params,
std::optional<ContentClientParams> content_client_params = std::nullopt,
std::optional<devtools_instrumentation::WillCreateURLLoaderFactoryParams>
devtools_params = std::nullopt);
}
}
#endif