diff options
author | Andreas Kling <kling@serenityos.org> | 2022-09-01 20:59:51 +0200 |
---|---|---|
committer | Andreas Kling <kling@serenityos.org> | 2022-09-06 00:27:09 +0200 |
commit | 2ff7e37048e0296ae6dc3653ca69da7bb1fa22dc (patch) | |
tree | c3d1628838d506e822244f2c78a26a1ce057125b /Userland/Libraries/LibWeb/HTML | |
parent | 2bba97964b1daa30877ba715f6e058de5a5100c5 (diff) | |
download | serenity-2ff7e37048e0296ae6dc3653ca69da7bb1fa22dc.zip |
LibWeb: Make MessageChannel GC-allocated
Diffstat (limited to 'Userland/Libraries/LibWeb/HTML')
-rw-r--r-- | Userland/Libraries/LibWeb/HTML/MessageChannel.cpp | 23 | ||||
-rw-r--r-- | Userland/Libraries/LibWeb/HTML/MessageChannel.h | 32 |
2 files changed, 32 insertions, 23 deletions
diff --git a/Userland/Libraries/LibWeb/HTML/MessageChannel.cpp b/Userland/Libraries/LibWeb/HTML/MessageChannel.cpp index 8c74020b78..378256f46a 100644 --- a/Userland/Libraries/LibWeb/HTML/MessageChannel.cpp +++ b/Userland/Libraries/LibWeb/HTML/MessageChannel.cpp @@ -1,22 +1,32 @@ /* - * Copyright (c) 2021, Andreas Kling <kling@serenityos.org> + * Copyright (c) 2021-2022, Andreas Kling <kling@serenityos.org> * * SPDX-License-Identifier: BSD-2-Clause */ +#include <LibWeb/Bindings/MessageChannelPrototype.h> #include <LibWeb/DOM/Document.h> #include <LibWeb/HTML/MessageChannel.h> #include <LibWeb/HTML/MessagePort.h> +#include <LibWeb/HTML/Window.h> namespace Web::HTML { +JS::NonnullGCPtr<MessageChannel> MessageChannel::create_with_global_object(HTML::Window& window) +{ + return *window.heap().allocate<MessageChannel>(window.realm(), window); +} + MessageChannel::MessageChannel(HTML::Window& window) + : PlatformObject(window.realm()) { + set_prototype(&window.ensure_web_prototype<Bindings::MessageChannelPrototype>("MessageChannel")); + // 1. Set this's port 1 to a new MessagePort in this's relevant Realm. - m_port1 = JS::make_handle(*MessagePort::create(window)); + m_port1 = MessagePort::create(window); // 2. Set this's port 2 to a new MessagePort in this's relevant Realm. - m_port2 = JS::make_handle(*MessagePort::create(window)); + m_port2 = MessagePort::create(window); // 3. Entangle this's port 1 and this's port 2. m_port1->entangle_with(*m_port2); @@ -24,6 +34,13 @@ MessageChannel::MessageChannel(HTML::Window& window) MessageChannel::~MessageChannel() = default; +void MessageChannel::visit_edges(Cell::Visitor& visitor) +{ + Base::visit_edges(visitor); + visitor.visit(m_port1.ptr()); + visitor.visit(m_port2.ptr()); +} + MessagePort* MessageChannel::port1() { return m_port1; diff --git a/Userland/Libraries/LibWeb/HTML/MessageChannel.h b/Userland/Libraries/LibWeb/HTML/MessageChannel.h index 7ac38e3912..7c7d65210e 100644 --- a/Userland/Libraries/LibWeb/HTML/MessageChannel.h +++ b/Userland/Libraries/LibWeb/HTML/MessageChannel.h @@ -1,34 +1,22 @@ /* - * Copyright (c) 2021, Andreas Kling <kling@serenityos.org> + * Copyright (c) 2021-2022, Andreas Kling <kling@serenityos.org> * * SPDX-License-Identifier: BSD-2-Clause */ #pragma once -#include <AK/RefCounted.h> -#include <LibWeb/Bindings/Wrappable.h> -#include <LibWeb/DOM/EventTarget.h> +#include <LibWeb/Bindings/PlatformObject.h> #include <LibWeb/Forward.h> -#include <LibWeb/HTML/Window.h> namespace Web::HTML { // https://html.spec.whatwg.org/multipage/web-messaging.html#message-channels -class MessageChannel final - : public RefCounted<MessageChannel> - , public Bindings::Wrappable { -public: - using WrapperType = Bindings::MessageChannelWrapper; - - using RefCounted::ref; - using RefCounted::unref; - - static NonnullRefPtr<MessageChannel> create_with_global_object(HTML::Window& window) - { - return adopt_ref(*new MessageChannel(window)); - } +class MessageChannel final : public Bindings::PlatformObject { + WEB_PLATFORM_OBJECT(MessageChannel, Bindings::PlatformObject); +public: + static JS::NonnullGCPtr<MessageChannel> create_with_global_object(HTML::Window&); virtual ~MessageChannel() override; MessagePort* port1(); @@ -40,8 +28,12 @@ public: private: explicit MessageChannel(HTML::Window&); - JS::Handle<MessagePort> m_port1; - JS::Handle<MessagePort> m_port2; + virtual void visit_edges(Cell::Visitor&) override; + + JS::GCPtr<MessagePort> m_port1; + JS::GCPtr<MessagePort> m_port2; }; } + +WRAPPER_HACK(MessageChannel, Web::HTML) |