Files
ladybird/Libraries/LibWeb/HTML/BroadcastChannel.h
Aliaksandr Kalenik b5bb0ef5d4 LibWeb: Use GC::Weak in BroadcastChannelRepository
Previously `BroadcastChannelRepository` held strong references to
`BroadcastChannel` instances, which is removed only after `close()` on
corresponding `BroadcastChannel` was called, which might never happen.

This would have to be revisited once we will implement broadcast
channels messaging across different WebContent processes, but for now
using weak references in the repository saves us from leaking all
unclosed `BroadcastChannel`s.
2025-12-26 06:17:01 +01:00

50 lines
1.3 KiB
C++

/*
* Copyright (c) 2024, Jamie Mansfield <jmansfield@cadixdev.org>
* Copyright (c) 2024, Shannon Booth <shannon@serenityos.org>
*
* SPDX-License-Identifier: BSD-2-Clause
*/
#pragma once
#include <LibWeb/DOM/EventTarget.h>
namespace Web::HTML {
class BroadcastChannel final : public DOM::EventTarget {
WEB_PLATFORM_OBJECT(BroadcastChannel, DOM::EventTarget);
GC_DECLARE_ALLOCATOR(BroadcastChannel);
public:
[[nodiscard]] static GC::Ref<BroadcastChannel> construct_impl(JS::Realm&, FlyString const& name);
// https://html.spec.whatwg.org/multipage/web-messaging.html#dom-broadcastchannel-name
FlyString const& name() const
{
// The name getter steps are to return this's channel name.
return m_channel_name;
}
WebIDL::ExceptionOr<void> post_message(JS::Value message);
void close();
void set_onmessage(GC::Ptr<WebIDL::CallbackType>);
GC::Ptr<WebIDL::CallbackType> onmessage();
void set_onmessageerror(GC::Ptr<WebIDL::CallbackType>);
GC::Ptr<WebIDL::CallbackType> onmessageerror();
private:
BroadcastChannel(JS::Realm&, FlyString const& name);
virtual void initialize(JS::Realm&) override;
virtual void finalize() override;
bool is_eligible_for_messaging() const;
FlyString m_channel_name;
bool m_closed_flag { false };
};
}