Serenity Operating System
at master 130 lines 4.7 kB view raw
1/* 2 * Copyright (c) 2018-2022, Andreas Kling <kling@serenityos.org> 3 * Copyright (c) 2022, Dex♪ <dexes.ttp@gmail.com> 4 * 5 * SPDX-License-Identifier: BSD-2-Clause 6 */ 7 8#pragma once 9 10#include <AK/DeprecatedString.h> 11#include <AK/Function.h> 12#include <AK/HashMap.h> 13#include <AK/URL.h> 14#include <LibCore/Object.h> 15#include <LibCore/Proxy.h> 16#include <LibWeb/Loader/Resource.h> 17#include <LibWeb/Page/Page.h> 18 19namespace Web { 20 21#if ARCH(X86_64) 22# define CPU_STRING "x86_64" 23#elif ARCH(AARCH64) 24# define CPU_STRING "AArch64" 25#endif 26 27#if defined(AK_OS_SERENITY) 28# define OS_STRING "SerenityOS" 29#elif defined(AK_OS_LINUX) 30# define OS_STRING "Linux" 31#elif defined(AK_OS_MACOS) 32# define OS_STRING "macOS" 33#elif defined(AK_OS_WINDOWS) 34# define OS_STRING "Windows" 35#elif defined(AK_OS_FREEBSD) 36# define OS_STRING "FreeBSD" 37#elif defined(AK_OS_OPENBSD) 38# define OS_STRING "OpenBSD" 39#elif defined(AK_OS_NETBSD) 40# define OS_STRING "NetBSD" 41#elif defined(AK_OS_DRAGONFLY) 42# define OS_STRING "DragonFly" 43#elif defined(AK_OS_SOLARIS) 44# define OS_STRING "SunOS" 45#else 46# error Unknown OS 47#endif 48 49#define BROWSER_NAME "Ladybird" 50#define BROWSER_VERSION "1.0" 51 52constexpr auto default_user_agent = "Mozilla/5.0 (" OS_STRING "; " CPU_STRING ") LibWeb+LibJS/1.0 " BROWSER_NAME "/" BROWSER_VERSION ""sv; 53 54class ResourceLoaderConnectorRequest : public RefCounted<ResourceLoaderConnectorRequest> { 55public: 56 virtual ~ResourceLoaderConnectorRequest(); 57 58 struct CertificateAndKey { 59 DeprecatedString certificate; 60 DeprecatedString key; 61 }; 62 63 virtual void set_should_buffer_all_input(bool) = 0; 64 virtual bool stop() = 0; 65 66 virtual void stream_into(Stream&) = 0; 67 68 Function<void(bool success, u32 total_size, HashMap<DeprecatedString, DeprecatedString, CaseInsensitiveStringTraits> const& response_headers, Optional<u32> response_code, ReadonlyBytes payload)> on_buffered_request_finish; 69 Function<void(bool success, u32 total_size)> on_finish; 70 Function<void(Optional<u32> total_size, u32 downloaded_size)> on_progress; 71 Function<CertificateAndKey()> on_certificate_requested; 72 73protected: 74 explicit ResourceLoaderConnectorRequest(); 75}; 76 77class ResourceLoaderConnector : public RefCounted<ResourceLoaderConnector> { 78public: 79 virtual ~ResourceLoaderConnector(); 80 81 virtual void prefetch_dns(AK::URL const&) = 0; 82 virtual void preconnect(AK::URL const&) = 0; 83 84 virtual RefPtr<ResourceLoaderConnectorRequest> start_request(DeprecatedString const& method, AK::URL const&, HashMap<DeprecatedString, DeprecatedString> const& request_headers = {}, ReadonlyBytes request_body = {}, Core::ProxyData const& = {}) = 0; 85 86protected: 87 explicit ResourceLoaderConnector(); 88}; 89 90class ResourceLoader : public Core::Object { 91 C_OBJECT_ABSTRACT(ResourceLoader) 92public: 93 static void initialize(RefPtr<ResourceLoaderConnector>); 94 static ResourceLoader& the(); 95 96 RefPtr<Resource> load_resource(Resource::Type, LoadRequest&); 97 98 void load(LoadRequest&, Function<void(ReadonlyBytes, HashMap<DeprecatedString, DeprecatedString, CaseInsensitiveStringTraits> const& response_headers, Optional<u32> status_code)> success_callback, Function<void(DeprecatedString const&, Optional<u32> status_code)> error_callback = nullptr, Optional<u32> timeout = {}, Function<void()> timeout_callback = nullptr); 99 void load(const AK::URL&, Function<void(ReadonlyBytes, HashMap<DeprecatedString, DeprecatedString, CaseInsensitiveStringTraits> const& response_headers, Optional<u32> status_code)> success_callback, Function<void(DeprecatedString const&, Optional<u32> status_code)> error_callback = nullptr, Optional<u32> timeout = {}, Function<void()> timeout_callback = nullptr); 100 101 ResourceLoaderConnector& connector() { return *m_connector; } 102 103 void prefetch_dns(AK::URL const&); 104 void preconnect(AK::URL const&); 105 106 Function<void()> on_load_counter_change; 107 108 int pending_loads() const { return m_pending_loads; } 109 110 DeprecatedString const& user_agent() const { return m_user_agent; } 111 void set_user_agent(DeprecatedString const& user_agent) { m_user_agent = user_agent; } 112 113 void clear_cache(); 114 void evict_from_cache(LoadRequest const&); 115 116private: 117 ResourceLoader(NonnullRefPtr<ResourceLoaderConnector>); 118 static ErrorOr<NonnullRefPtr<ResourceLoader>> try_create(NonnullRefPtr<ResourceLoaderConnector>); 119 120 static bool is_port_blocked(int port); 121 122 int m_pending_loads { 0 }; 123 124 HashTable<NonnullRefPtr<ResourceLoaderConnectorRequest>> m_active_requests; 125 NonnullRefPtr<ResourceLoaderConnector> m_connector; 126 DeprecatedString m_user_agent; 127 Optional<Page&> m_page {}; 128}; 129 130}