/* * Copyright (c) 2020-2021, Andreas Kling * * SPDX-License-Identifier: BSD-2-Clause */ #pragma once #include #include #include #include #include #include #include #include #include #include namespace Web::XHR { class XMLHttpRequest final : public RefCounted , public Weakable , public XMLHttpRequestEventTarget { public: enum class ReadyState : u16 { Unsent = 0, Opened = 1, HeadersReceived = 2, Loading = 3, Done = 4, }; using WrapperType = Bindings::XMLHttpRequestWrapper; static NonnullRefPtr create(HTML::Window& window) { return adopt_ref(*new XMLHttpRequest(window)); } static NonnullRefPtr create_with_global_object(Bindings::WindowObject& window) { return XMLHttpRequest::create(window.impl()); } virtual ~XMLHttpRequest() override; using RefCounted::ref; using RefCounted::unref; ReadyState ready_state() const { return m_ready_state; }; unsigned status() const { return m_status; }; DOM::ExceptionOr response_text() const; DOM::ExceptionOr response(); Bindings::XMLHttpRequestResponseType response_type() const { return m_response_type; } DOM::ExceptionOr open(String const& method, String const& url); DOM::ExceptionOr open(String const& method, String const& url, bool async, String const& username = {}, String const& password = {}); DOM::ExceptionOr send(String body); DOM::ExceptionOr set_request_header(String const& header, String const& value); void set_response_type(Bindings::XMLHttpRequestResponseType type) { m_response_type = type; } String get_response_header(String const& name) { return m_response_headers.get(name).value_or({}); } String get_all_response_headers() const; Bindings::CallbackType* onreadystatechange(); void set_onreadystatechange(Optional); DOM::ExceptionOr override_mime_type(String const& mime); private: virtual void ref_event_target() override { ref(); } virtual void unref_event_target() override { unref(); } virtual JS::Object* create_wrapper(JS::GlobalObject&) override; void set_ready_state(ReadyState); void set_status(unsigned status) { m_status = status; } void fire_progress_event(String const&, u64, u64); MimeSniff::MimeType get_response_mime_type() const; Optional get_final_encoding() const; MimeSniff::MimeType get_final_mime_type() const; String get_text_response() const; Optional> get_decode_and_split(String const& header_name, HashMap const& header_list) const; Optional extract_mime_type(HashMap const& header_list) const; explicit XMLHttpRequest(HTML::Window&); NonnullRefPtr m_window; ReadyState m_ready_state { ReadyState::Unsent }; unsigned m_status { 0 }; bool m_send { false }; String m_method; AK::URL m_url; Bindings::XMLHttpRequestResponseType m_response_type; HashMap m_request_headers; HashMap m_response_headers; bool m_synchronous { false }; bool m_upload_complete { false }; bool m_upload_listener { false }; bool m_timed_out { false }; ByteBuffer m_received_bytes; enum class Failure { /// ???? }; Variant, Failure, Empty> m_response_object; // https://xhr.spec.whatwg.org/#override-mime-type Optional m_override_mime_type; }; }