diff --git a/Userland/Libraries/LibWeb/HTML/CloseEvent.h b/Userland/Libraries/LibWeb/HTML/CloseEvent.h index 9c0e71064b..3b7c56f2f7 100644 --- a/Userland/Libraries/LibWeb/HTML/CloseEvent.h +++ b/Userland/Libraries/LibWeb/HTML/CloseEvent.h @@ -10,27 +10,37 @@ namespace Web::HTML { +struct CloseEventInit : public DOM::EventInit { + bool was_clean { false }; + u16 code { 0 }; + String reason { "" }; +}; + class CloseEvent : public DOM::Event { public: using WrapperType = Bindings::CloseEventWrapper; - static NonnullRefPtr create(const FlyString& event_name, bool was_clean, u16 code, const String& reason) + static NonnullRefPtr create(FlyString const& event_name, CloseEventInit const& event_init = {}) { - return adopt_ref(*new CloseEvent(event_name, was_clean, code, reason)); + return adopt_ref(*new CloseEvent(event_name, event_init)); + } + static NonnullRefPtr create_with_global_object(Bindings::WindowObject&, FlyString const& event_name, CloseEventInit const& event_init) + { + return CloseEvent::create(event_name, event_init); } virtual ~CloseEvent() override = default; - bool was_clean() { return m_was_clean; } + bool was_clean() const { return m_was_clean; } u16 code() const { return m_code; } String reason() const { return m_reason; } protected: - CloseEvent(const FlyString& event_name, bool was_clean, u16 code, const String& reason) - : Event(event_name) - , m_was_clean(was_clean) - , m_code(code) - , m_reason(reason) + CloseEvent(FlyString const& event_name, CloseEventInit const& event_init) + : Event(event_name, event_init) + , m_was_clean(event_init.was_clean) + , m_code(event_init.code) + , m_reason(event_init.reason) { } diff --git a/Userland/Libraries/LibWeb/HTML/CloseEvent.idl b/Userland/Libraries/LibWeb/HTML/CloseEvent.idl index bc2df5c1f8..7abf0cb6a4 100644 --- a/Userland/Libraries/LibWeb/HTML/CloseEvent.idl +++ b/Userland/Libraries/LibWeb/HTML/CloseEvent.idl @@ -1,7 +1,15 @@ +#import + interface CloseEvent : Event { + constructor(DOMString type, optional CloseEventInit eventInitDict = {}); readonly attribute boolean wasClean; readonly attribute unsigned short code; readonly attribute USVString reason; - +}; + +dictionary CloseEventInit : EventInit { + boolean wasClean = false; + unsigned short code = 0; + USVString reason = ""; }; diff --git a/Userland/Libraries/LibWeb/HTML/WebSocket.cpp b/Userland/Libraries/LibWeb/HTML/WebSocket.cpp index bd50c022ef..c5dfca9088 100644 --- a/Userland/Libraries/LibWeb/HTML/WebSocket.cpp +++ b/Userland/Libraries/LibWeb/HTML/WebSocket.cpp @@ -189,7 +189,11 @@ void WebSocket::on_close(u16 code, String reason, bool was_clean) { // 1. Change the readyState attribute's value to CLOSED. This is handled by the Protocol's WebSocket // 2. If [needed], fire an event named error at the WebSocket object. This is handled by the Protocol's WebSocket - dispatch_event(CloseEvent::create(EventNames::close, was_clean, code, reason)); + CloseEventInit event_init {}; + event_init.was_clean = was_clean; + event_init.code = code; + event_init.reason = move(reason); + dispatch_event(CloseEvent::create(EventNames::close, event_init)); } // https://html.spec.whatwg.org/multipage/web-sockets.html#feedback-from-the-protocol