diff --git a/Userland/Libraries/LibWeb/Forward.h b/Userland/Libraries/LibWeb/Forward.h index dd28924a24..7b7e4f930a 100644 --- a/Userland/Libraries/LibWeb/Forward.h +++ b/Userland/Libraries/LibWeb/Forward.h @@ -467,7 +467,6 @@ class IdleDeadlineWrapper; class ImageDataWrapper; class IntersectionObserverWrapper; class LocationObject; -class MessageChannelWrapper; class OptionConstructor; class Path2DWrapper; class RangePrototype; 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 + * Copyright (c) 2021-2022, Andreas Kling * * SPDX-License-Identifier: BSD-2-Clause */ +#include #include #include #include +#include namespace Web::HTML { -MessageChannel::MessageChannel(HTML::Window& window) +JS::NonnullGCPtr MessageChannel::create_with_global_object(HTML::Window& window) { + return *window.heap().allocate(window.realm(), window); +} + +MessageChannel::MessageChannel(HTML::Window& window) + : PlatformObject(window.realm()) +{ + set_prototype(&window.ensure_web_prototype("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 + * Copyright (c) 2021-2022, Andreas Kling * * SPDX-License-Identifier: BSD-2-Clause */ #pragma once -#include -#include -#include +#include #include -#include namespace Web::HTML { // https://html.spec.whatwg.org/multipage/web-messaging.html#message-channels -class MessageChannel final - : public RefCounted - , public Bindings::Wrappable { +class MessageChannel final : public Bindings::PlatformObject { + WEB_PLATFORM_OBJECT(MessageChannel, Bindings::PlatformObject); + public: - using WrapperType = Bindings::MessageChannelWrapper; - - using RefCounted::ref; - using RefCounted::unref; - - static NonnullRefPtr create_with_global_object(HTML::Window& window) - { - return adopt_ref(*new MessageChannel(window)); - } - + static JS::NonnullGCPtr create_with_global_object(HTML::Window&); virtual ~MessageChannel() override; MessagePort* port1(); @@ -40,8 +28,12 @@ public: private: explicit MessageChannel(HTML::Window&); - JS::Handle m_port1; - JS::Handle m_port2; + virtual void visit_edges(Cell::Visitor&) override; + + JS::GCPtr m_port1; + JS::GCPtr m_port2; }; } + +WRAPPER_HACK(MessageChannel, Web::HTML) diff --git a/Userland/Libraries/LibWeb/idl_files.cmake b/Userland/Libraries/LibWeb/idl_files.cmake index ff76850e89..8112c87d18 100644 --- a/Userland/Libraries/LibWeb/idl_files.cmake +++ b/Userland/Libraries/LibWeb/idl_files.cmake @@ -141,7 +141,7 @@ libweb_js_wrapper(HTML/HTMLUListElement NO_INSTANCE) libweb_js_wrapper(HTML/HTMLUnknownElement NO_INSTANCE) libweb_js_wrapper(HTML/HTMLVideoElement NO_INSTANCE) libweb_js_wrapper(HTML/ImageData) -libweb_js_wrapper(HTML/MessageChannel) +libweb_js_wrapper(HTML/MessageChannel NO_INSTANCE) libweb_js_wrapper(HTML/MessageEvent NO_INSTANCE) libweb_js_wrapper(HTML/MessagePort NO_INSTANCE) libweb_js_wrapper(HTML/PageTransitionEvent NO_INSTANCE)