Files
ladybird/Libraries/LibWeb/HTML/MessageEvent.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

69 lines
2.9 KiB
C++

/*
* Copyright (c) 2021, Dex♪ <dexes.ttp@gmail.com>
* Copyright (c) 2022, Andreas Kling <andreas@ladybird.org>
* Copyright (c) 2026, Sam Atkins <sam@ladybird.org>
*
* SPDX-License-Identifier: BSD-2-Clause
*/
#pragma once
#include <AK/FlyString.h>
#include <LibWeb/Bindings/MessageEvent.h>
#include <LibWeb/DOM/Event.h>
#include <LibWeb/Export.h>
namespace Web::HTML {
// FIXME: Include ServiceWorker
// https://html.spec.whatwg.org/multipage/comms.html#messageeventsource
using MessageEventSource = Variant<GC::Root<WindowProxy>, GC::Root<MessagePort>>;
using NullableMessageEventSource = Variant<GC::Root<WindowProxy>, GC::Root<MessagePort>, Empty>;
// https://html.spec.whatwg.org/multipage/comms.html#messageevent
class WEB_API MessageEvent : public DOM::Event {
WEB_PLATFORM_OBJECT(MessageEvent, DOM::Event);
GC_DECLARE_ALLOCATOR(MessageEvent);
public:
[[nodiscard]] static GC::Ref<MessageEvent> create(JS::Realm&, FlyString const& event_name, Bindings::MessageEventInit const& = {});
[[nodiscard]] static GC::Ref<MessageEvent> create(JS::Realm&, FlyString const& event_name, Bindings::MessageEventInit const&, URL::Origin const&);
static WebIDL::ExceptionOr<GC::Ref<MessageEvent>> construct_impl(JS::Realm&, FlyString const& event_name, Bindings::MessageEventInit const&);
MessageEvent(JS::Realm&, FlyString const& event_name, Bindings::MessageEventInit const& event_init);
MessageEvent(JS::Realm&, FlyString const& event_name, Bindings::MessageEventInit const& event_init, URL::Origin const&);
virtual ~MessageEvent() override;
JS::Value data() const { return m_data; }
String origin() const;
String const& last_event_id() const { return m_last_event_id; }
GC::Ref<JS::Object> ports() const;
NullableMessageEventSource source() const;
virtual Optional<URL::Origin> extract_an_origin() const override;
void init_message_event(String const& type, bool bubbles, bool cancelable, JS::Value data, String const& origin, String const& last_event_id, NullableMessageEventSource source, Vector<GC::Root<MessagePort>> const& ports);
private:
virtual void initialize(JS::Realm&) override;
virtual void visit_edges(Cell::Visitor&) override;
using MessageEventSourceInternal = Variant<Empty, GC::Ref<WindowProxy>, GC::Ref<MessagePort>>;
static MessageEventSourceInternal to_message_event_source_internal(NullableMessageEventSource const&);
MessageEvent(JS::Realm&, FlyString const& event_name, Bindings::MessageEventInit const& event_init, Variant<URL::Origin, String, Empty>);
JS::Value m_data;
// https://html.spec.whatwg.org/multipage/comms.html#concept-messageevent-origin
// Each MessageEvent has an origin (an origin, a string, or null), initially null.
Variant<URL::Origin, String, Empty> m_origin;
String m_last_event_id;
MessageEventSourceInternal m_source;
Vector<GC::Ref<JS::Object>> m_ports;
mutable GC::Ptr<JS::Array> m_ports_array;
};
}