/* * Copyright (c) 2018-2022, Andreas Kling * Copyright (c) 2022, Dex♪ * * SPDX-License-Identifier: BSD-2-Clause */ #pragma once #include #include #include #include #include #include #include #include namespace Web { #if ARCH(X86_64) # define CPU_STRING "x86_64" #elif ARCH(AARCH64) # define CPU_STRING "AArch64" #elif ARCH(I386) # define CPU_STRING "x86" #elif ARCH(RISCV64) # define CPU_STRING "RISC-V 64" #else # error Unknown architecture #endif #if defined(AK_OS_SERENITY) # define OS_STRING "SerenityOS" #elif defined(AK_OS_ANDROID) # define OS_STRING "Android 10" #elif defined(AK_OS_LINUX) # define OS_STRING "Linux" #elif defined(AK_OS_MACOS) # define OS_STRING "macOS" #elif defined(AK_OS_WINDOWS) # define OS_STRING "Windows" #elif defined(AK_OS_FREEBSD) # define OS_STRING "FreeBSD" #elif defined(AK_OS_OPENBSD) # define OS_STRING "OpenBSD" #elif defined(AK_OS_NETBSD) # define OS_STRING "NetBSD" #elif defined(AK_OS_DRAGONFLY) # define OS_STRING "DragonFly" #elif defined(AK_OS_SOLARIS) # define OS_STRING "SunOS" #elif defined(AK_OS_HAIKU) # define OS_STRING "Haiku" #elif defined(AK_OS_GNU_HURD) # define OS_STRING "GNU/Hurd" #else # error Unknown OS #endif #define BROWSER_NAME "Ladybird" #define BROWSER_VERSION "1.0" constexpr auto default_user_agent = "Mozilla/5.0 (" OS_STRING "; " CPU_STRING ") " BROWSER_NAME "/" BROWSER_VERSION ""sv; constexpr auto default_platform = OS_STRING " " CPU_STRING ""sv; class ResourceLoaderConnectorRequest : public RefCounted { public: virtual ~ResourceLoaderConnectorRequest(); struct CertificateAndKey { DeprecatedString certificate; DeprecatedString key; }; virtual void set_should_buffer_all_input(bool) = 0; virtual bool stop() = 0; virtual void stream_into(Stream&) = 0; Function const& response_headers, Optional response_code, ReadonlyBytes payload)> on_buffered_request_finish; Function on_finish; Function total_size, u64 downloaded_size)> on_progress; Function on_certificate_requested; protected: explicit ResourceLoaderConnectorRequest(); }; class ResourceLoaderConnector : public RefCounted { public: virtual ~ResourceLoaderConnector(); virtual void prefetch_dns(AK::URL const&) = 0; virtual void preconnect(AK::URL const&) = 0; virtual RefPtr start_request(DeprecatedString const& method, AK::URL const&, HashMap const& request_headers = {}, ReadonlyBytes request_body = {}, Core::ProxyData const& = {}) = 0; protected: explicit ResourceLoaderConnector(); }; class ResourceLoader : public Core::EventReceiver { C_OBJECT_ABSTRACT(ResourceLoader) public: static void initialize(RefPtr); static ResourceLoader& the(); RefPtr load_resource(Resource::Type, LoadRequest&); using SuccessCallback = Function const& response_headers, Optional status_code)>; using ErrorCallback = Function status_code, ReadonlyBytes payload, HashMap const& response_headers)>; using TimeoutCallback = Function; void load(LoadRequest&, SuccessCallback success_callback, ErrorCallback error_callback = nullptr, Optional timeout = {}, TimeoutCallback timeout_callback = nullptr); ResourceLoaderConnector& connector() { return *m_connector; } void prefetch_dns(AK::URL const&); void preconnect(AK::URL const&); Function on_load_counter_change; int pending_loads() const { return m_pending_loads; } String const& user_agent() const { return m_user_agent; } void set_user_agent(String user_agent) { m_user_agent = move(user_agent); } String const& platform() const { return m_platform; } void set_platform(String platform) { m_platform = move(platform); } void clear_cache(); void evict_from_cache(LoadRequest const&); private: ResourceLoader(NonnullRefPtr); static ErrorOr> try_create(NonnullRefPtr); static bool is_port_blocked(int port); int m_pending_loads { 0 }; HashTable> m_active_requests; NonnullRefPtr m_connector; String m_user_agent; String m_platform; Optional m_page {}; }; }