1
0
Fork 0
mirror of https://github.com/LadybirdBrowser/ladybird.git synced 2025-06-10 18:10:56 +09:00

LibWeb: Add the missing MessageEvent IDL constructor

This commit is contained in:
Idan Horowitz 2021-10-01 18:39:03 +03:00 committed by Andreas Kling
parent 9863de4609
commit d44857d34d
Notes: sideshowbarker 2024-07-18 03:14:18 +09:00
4 changed files with 36 additions and 8 deletions

View file

@ -10,13 +10,23 @@
namespace Web::HTML {
struct MessageEventInit : public DOM::EventInit {
JS::Value data { JS::js_null() };
String origin { "" };
String last_event_id { "" };
};
class MessageEvent : public DOM::Event {
public:
using WrapperType = Bindings::MessageEventWrapper;
static NonnullRefPtr<MessageEvent> create(const FlyString& event_name, JS::Value data, String const& origin)
static NonnullRefPtr<MessageEvent> create(FlyString const& event_name, MessageEventInit const& event_init = {})
{
return adopt_ref(*new MessageEvent(event_name, data, origin));
return adopt_ref(*new MessageEvent(event_name, event_init));
}
static NonnullRefPtr<MessageEvent> create_with_global_object(Bindings::WindowObject&, FlyString const& event_name, MessageEventInit const& event_init)
{
return MessageEvent::create(event_name, event_init);
}
virtual ~MessageEvent() override = default;
@ -26,10 +36,11 @@ public:
String const& last_event_id() const { return m_last_event_id; }
protected:
MessageEvent(const FlyString& event_name, JS::Value data, String origin)
: DOM::Event(event_name)
, m_data(data)
, m_origin(move(origin))
MessageEvent(FlyString const& event_name, MessageEventInit const& event_init)
: DOM::Event(event_name, event_init)
, m_data(event_init.data)
, m_origin(event_init.origin)
, m_last_event_id(event_init.last_event_id)
{
}

View file

@ -1,4 +1,7 @@
#import <DOM/Event.idl>
interface MessageEvent : Event {
constructor(DOMString type, optional MessageEventInit eventInitDict = {});
readonly attribute any data;
readonly attribute USVString origin;
@ -6,3 +9,11 @@ interface MessageEvent : Event {
// FIXME: readonly attribute MessageEventSource? source;
// FIXME: readonly attribute FrozenArray<MessagePort> ports;
};
dictionary MessageEventInit : EventInit {
any data = null;
USVString origin = "";
DOMString lastEventId = "";
// FIXME: MessageEventSource? source = null;
// FIXME: sequence<MessagePort> ports = [];
};

View file

@ -80,7 +80,10 @@ void MessagePort::post_message(JS::Value message)
// FIXME: This is an ad-hoc hack implementation instead, since we don't currently
// have serialization and deserialization of messages.
main_thread_event_loop().task_queue().add(HTML::Task::create(HTML::Task::Source::PostedMessage, nullptr, [strong_port = NonnullRefPtr { *target_port }, message]() mutable {
strong_port->dispatch_event(MessageEvent::create(HTML::EventNames::message, message, "<origin>"));
MessageEventInit event_init {};
event_init.data = message;
event_init.origin = "<origin>";
strong_port->dispatch_event(MessageEvent::create(HTML::EventNames::message, event_init));
}));
}

View file

@ -203,7 +203,10 @@ void WebSocket::on_message(ByteBuffer message, bool is_text)
return;
if (is_text) {
auto text_message = String(ReadonlyBytes(message));
dispatch_event(MessageEvent::create(EventNames::message, JS::js_string(wrapper()->vm(), text_message), url()));
MessageEventInit event_init {};
event_init.data = JS::js_string(wrapper()->vm(), text_message);
event_init.origin = url();
dispatch_event(MessageEvent::create(EventNames::message, event_init));
return;
}
// type indicates that the data is Binary and binaryType is "blob"