summaryrefslogtreecommitdiff
path: root/Userland/Libraries/LibWeb/HTML
diff options
context:
space:
mode:
authorAndreas Kling <kling@serenityos.org>2022-09-01 20:59:51 +0200
committerAndreas Kling <kling@serenityos.org>2022-09-06 00:27:09 +0200
commit2ff7e37048e0296ae6dc3653ca69da7bb1fa22dc (patch)
treec3d1628838d506e822244f2c78a26a1ce057125b /Userland/Libraries/LibWeb/HTML
parent2bba97964b1daa30877ba715f6e058de5a5100c5 (diff)
downloadserenity-2ff7e37048e0296ae6dc3653ca69da7bb1fa22dc.zip
LibWeb: Make MessageChannel GC-allocated
Diffstat (limited to 'Userland/Libraries/LibWeb/HTML')
-rw-r--r--Userland/Libraries/LibWeb/HTML/MessageChannel.cpp23
-rw-r--r--Userland/Libraries/LibWeb/HTML/MessageChannel.h32
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)