Files
ladybird/Libraries/LibWeb/HTML/EventSource.h
Shannon Booth 5adfd1c43a LibWeb/Bindings: Generate struct definitions from IDL dictionaries
Previously we were inconsistent by generating code for enum definitions
but not generating code for dictionaries. With future changes to the
IDL generator to expose helpers to convert to and from IDL values
this produced circular depdendencies. To solve this problem, also
generate the dictionary definitions in bindings headers.
2026-05-09 10:49:49 +02:00

101 lines
3.0 KiB
C++

/*
* Copyright (c) 2024, Tim Flynn <trflynn89@serenityos.org>
*
* SPDX-License-Identifier: BSD-2-Clause
*/
#pragma once
#include <AK/String.h>
#include <AK/StringBuilder.h>
#include <AK/StringView.h>
#include <AK/Time.h>
#include <LibGC/Ptr.h>
#include <LibJS/Forward.h>
#include <LibURL/URL.h>
#include <LibWeb/Bindings/EventSource.h>
#include <LibWeb/DOM/EventTarget.h>
#include <LibWeb/Forward.h>
#include <LibWeb/WebIDL/ExceptionOr.h>
#include <LibWeb/WebIDL/Types.h>
namespace Web::HTML {
class EventSource : public DOM::EventTarget {
WEB_PLATFORM_OBJECT(EventSource, DOM::EventTarget);
GC_DECLARE_ALLOCATOR(EventSource);
public:
static constexpr bool OVERRIDES_FINALIZE = true;
virtual ~EventSource() override;
static WebIDL::ExceptionOr<GC::Ref<EventSource>> construct_impl(JS::Realm&, StringView url, Bindings::EventSourceInit const& event_source_init_dict = {});
// https://html.spec.whatwg.org/multipage/server-sent-events.html#dom-eventsource-url
String url() const { return m_url.serialize(); }
// https://html.spec.whatwg.org/multipage/server-sent-events.html#dom-eventsource-withcredentials
bool with_credentials() const { return m_with_credentials; }
enum class ReadyState : WebIDL::UnsignedShort {
Connecting = 0,
Open = 1,
Closed = 2,
};
// https://html.spec.whatwg.org/multipage/server-sent-events.html#dom-eventsource-readystate
ReadyState ready_state() const { return m_ready_state; }
void set_onopen(WebIDL::CallbackType*);
WebIDL::CallbackType* onopen();
void set_onmessage(WebIDL::CallbackType*);
WebIDL::CallbackType* onmessage();
void set_onerror(WebIDL::CallbackType*);
WebIDL::CallbackType* onerror();
void close();
void forcibly_close();
private:
explicit EventSource(JS::Realm&);
virtual void initialize(JS::Realm&) override;
virtual void finalize() override;
virtual void visit_edges(Cell::Visitor&) override;
void announce_the_connection();
void reestablish_the_connection();
void fail_the_connection();
void interpret_response(StringView);
void process_field(StringView field, StringView value);
void dispatch_the_event();
// https://html.spec.whatwg.org/multipage/server-sent-events.html#concept-eventsource-url
URL::URL m_url;
// https://html.spec.whatwg.org/multipage/server-sent-events.html#concept-event-stream-request
GC::Ptr<Fetch::Infrastructure::Request> m_request;
// https://html.spec.whatwg.org/multipage/server-sent-events.html#concept-event-stream-reconnection-time
AK::Duration m_reconnection_time { AK::Duration::from_seconds(3) };
// https://html.spec.whatwg.org/multipage/server-sent-events.html#concept-event-stream-last-event-id
String m_last_event_id;
String m_event_type;
StringBuilder m_data;
bool m_with_credentials { false };
ReadyState m_ready_state { ReadyState::Connecting };
GC::Ptr<Fetch::Infrastructure::FetchAlgorithms> m_fetch_algorithms;
GC::Ptr<Fetch::Infrastructure::FetchController> m_fetch_controller;
};
}