mirror of
https://github.com/LadybirdBrowser/ladybird
synced 2026-04-27 02:05:07 +02:00
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.
50 lines
1.3 KiB
C++
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 };
|
|
};
|
|
|
|
}
|