diff --git a/Meta/gn/secondary/Userland/Libraries/LibWeb/HTML/BUILD.gn b/Meta/gn/secondary/Userland/Libraries/LibWeb/HTML/BUILD.gn index 155e63a434a..0901a1e7f9a 100644 --- a/Meta/gn/secondary/Userland/Libraries/LibWeb/HTML/BUILD.gn +++ b/Meta/gn/secondary/Userland/Libraries/LibWeb/HTML/BUILD.gn @@ -15,6 +15,7 @@ source_set("HTML") { "AttributeNames.cpp", "AudioTrack.cpp", "AudioTrackList.cpp", + "BroadcastChannel.cpp", "BrowsingContext.cpp", "BrowsingContextGroup.cpp", "CORSSettingAttribute.cpp", diff --git a/Meta/gn/secondary/Userland/Libraries/LibWeb/idl_files.gni b/Meta/gn/secondary/Userland/Libraries/LibWeb/idl_files.gni index e8c3409886e..d0ef89d2c16 100644 --- a/Meta/gn/secondary/Userland/Libraries/LibWeb/idl_files.gni +++ b/Meta/gn/secondary/Userland/Libraries/LibWeb/idl_files.gni @@ -110,6 +110,7 @@ standard_idl_files = [ "//Userland/Libraries/LibWeb/HighResolutionTime/Performance.idl", "//Userland/Libraries/LibWeb/HTML/AudioTrack.idl", "//Userland/Libraries/LibWeb/HTML/AudioTrackList.idl", + "//Userland/Libraries/LibWeb/HTML/BroadcastChannel.idl", "//Userland/Libraries/LibWeb/HTML/CanvasGradient.idl", "//Userland/Libraries/LibWeb/HTML/CanvasPattern.idl", "//Userland/Libraries/LibWeb/HTML/CanvasRenderingContext2D.idl", diff --git a/Tests/LibWeb/Text/expected/all-window-properties.txt b/Tests/LibWeb/Text/expected/all-window-properties.txt index c93511af9a1..27301174aed 100644 --- a/Tests/LibWeb/Text/expected/all-window-properties.txt +++ b/Tests/LibWeb/Text/expected/all-window-properties.txt @@ -24,6 +24,7 @@ BigInt64Array BigUint64Array Blob Boolean +BroadcastChannel ByteLengthQueuingStrategy CDATASection CSSAnimation diff --git a/Userland/Libraries/LibWeb/CMakeLists.txt b/Userland/Libraries/LibWeb/CMakeLists.txt index 4082513b62f..0eaf0b5be6e 100644 --- a/Userland/Libraries/LibWeb/CMakeLists.txt +++ b/Userland/Libraries/LibWeb/CMakeLists.txt @@ -249,6 +249,7 @@ set(SOURCES HTML/AttributeNames.cpp HTML/AudioTrack.cpp HTML/AudioTrackList.cpp + HTML/BroadcastChannel.cpp HTML/BrowsingContext.cpp HTML/BrowsingContextGroup.cpp HTML/Canvas/CanvasDrawImage.cpp diff --git a/Userland/Libraries/LibWeb/Forward.h b/Userland/Libraries/LibWeb/Forward.h index 99862008914..e339cb1bfe3 100644 --- a/Userland/Libraries/LibWeb/Forward.h +++ b/Userland/Libraries/LibWeb/Forward.h @@ -342,6 +342,7 @@ class DOMRectReadOnly; namespace Web::HTML { class AudioTrack; class AudioTrackList; +class BroadcastChannel; class BrowsingContext; class BrowsingContextGroup; class CanvasRenderingContext2D; diff --git a/Userland/Libraries/LibWeb/HTML/BroadcastChannel.cpp b/Userland/Libraries/LibWeb/HTML/BroadcastChannel.cpp new file mode 100644 index 00000000000..cb80830c564 --- /dev/null +++ b/Userland/Libraries/LibWeb/HTML/BroadcastChannel.cpp @@ -0,0 +1,72 @@ +/* + * Copyright (c) 2024, Jamie Mansfield + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#include +#include +#include +#include +#include + +namespace Web::HTML { + +JS_DEFINE_ALLOCATOR(BroadcastChannel); + +JS::NonnullGCPtr BroadcastChannel::construct_impl(JS::Realm& realm, FlyString const& name) +{ + return realm.heap().allocate(realm, realm, name); +} + +BroadcastChannel::BroadcastChannel(JS::Realm& realm, FlyString const& name) + : DOM::EventTarget(realm) + , m_channel_name(name) +{ +} + +void BroadcastChannel::initialize(JS::Realm& realm) +{ + Base::initialize(realm); + WEB_SET_PROTOTYPE_FOR_INTERFACE(BroadcastChannel); +} + +// https://html.spec.whatwg.org/multipage/web-messaging.html#dom-broadcastchannel-name +FlyString BroadcastChannel::name() +{ + // The name getter steps are to return this's channel name. + return m_channel_name; +} + +// https://html.spec.whatwg.org/multipage/web-messaging.html#dom-broadcastchannel-close +void BroadcastChannel::close() +{ + // The close() method steps are to set this's closed flag to true. + m_closed_flag = true; +} + +// https://html.spec.whatwg.org/multipage/web-messaging.html#handler-broadcastchannel-onmessage +void BroadcastChannel::set_onmessage(WebIDL::CallbackType* event_handler) +{ + set_event_handler_attribute(HTML::EventNames::message, event_handler); +} + +// https://html.spec.whatwg.org/multipage/web-messaging.html#handler-broadcastchannel-onmessage +WebIDL::CallbackType* BroadcastChannel::onmessage() +{ + return event_handler_attribute(HTML::EventNames::message); +} + +// https://html.spec.whatwg.org/multipage/web-messaging.html#handler-broadcastchannel-onmessageerror +void BroadcastChannel::set_onmessageerror(WebIDL::CallbackType* event_handler) +{ + set_event_handler_attribute(HTML::EventNames::messageerror, event_handler); +} + +// https://html.spec.whatwg.org/multipage/web-messaging.html#handler-broadcastchannel-onmessageerror +WebIDL::CallbackType* BroadcastChannel::onmessageerror() +{ + return event_handler_attribute(HTML::EventNames::messageerror); +} + +} diff --git a/Userland/Libraries/LibWeb/HTML/BroadcastChannel.h b/Userland/Libraries/LibWeb/HTML/BroadcastChannel.h new file mode 100644 index 00000000000..1136b830df9 --- /dev/null +++ b/Userland/Libraries/LibWeb/HTML/BroadcastChannel.h @@ -0,0 +1,38 @@ +/* + * Copyright (c) 2024, Jamie Mansfield + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#pragma once + +#include + +namespace Web::HTML { + +class BroadcastChannel final : public DOM::EventTarget { + WEB_PLATFORM_OBJECT(BroadcastChannel, DOM::EventTarget); + JS_DECLARE_ALLOCATOR(BroadcastChannel); + +public: + [[nodiscard]] static JS::NonnullGCPtr construct_impl(JS::Realm&, FlyString const& name); + + FlyString name(); + + void close(); + + void set_onmessage(WebIDL::CallbackType*); + WebIDL::CallbackType* onmessage(); + void set_onmessageerror(WebIDL::CallbackType*); + WebIDL::CallbackType* onmessageerror(); + +private: + BroadcastChannel(JS::Realm&, FlyString const& name); + + virtual void initialize(JS::Realm&) override; + + FlyString m_channel_name; + bool m_closed_flag { false }; +}; + +} diff --git a/Userland/Libraries/LibWeb/HTML/BroadcastChannel.idl b/Userland/Libraries/LibWeb/HTML/BroadcastChannel.idl new file mode 100644 index 00000000000..6b415bb7d48 --- /dev/null +++ b/Userland/Libraries/LibWeb/HTML/BroadcastChannel.idl @@ -0,0 +1,14 @@ +#import +#import + +// https://html.spec.whatwg.org/multipage/web-messaging.html#broadcastchannel +[Exposed=(Window,Worker)] +interface BroadcastChannel : EventTarget { + constructor(DOMString name); + + readonly attribute DOMString name; + [FIXME] undefined postMessage(any message); + undefined close(); + attribute EventHandler onmessage; + attribute EventHandler onmessageerror; +}; diff --git a/Userland/Libraries/LibWeb/idl_files.cmake b/Userland/Libraries/LibWeb/idl_files.cmake index 1a0c12f9178..671191d2f68 100644 --- a/Userland/Libraries/LibWeb/idl_files.cmake +++ b/Userland/Libraries/LibWeb/idl_files.cmake @@ -94,6 +94,7 @@ libweb_js_bindings(Geometry/DOMRectList) libweb_js_bindings(Geometry/DOMRectReadOnly) libweb_js_bindings(HTML/AudioTrack) libweb_js_bindings(HTML/AudioTrackList) +libweb_js_bindings(HTML/BroadcastChannel) libweb_js_bindings(HTML/CanvasGradient) libweb_js_bindings(HTML/CanvasPattern) libweb_js_bindings(HTML/CanvasRenderingContext2D)