Преглед изворни кода

LibWeb: Make MessageChannel GC-allocated

Andreas Kling пре 2 година
родитељ
комит
2ff7e37048

+ 0 - 1
Userland/Libraries/LibWeb/Forward.h

@@ -467,7 +467,6 @@ class IdleDeadlineWrapper;
 class ImageDataWrapper;
 class ImageDataWrapper;
 class IntersectionObserverWrapper;
 class IntersectionObserverWrapper;
 class LocationObject;
 class LocationObject;
-class MessageChannelWrapper;
 class OptionConstructor;
 class OptionConstructor;
 class Path2DWrapper;
 class Path2DWrapper;
 class RangePrototype;
 class RangePrototype;

+ 20 - 3
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
  * SPDX-License-Identifier: BSD-2-Clause
  */
  */
 
 
+#include <LibWeb/Bindings/MessageChannelPrototype.h>
 #include <LibWeb/DOM/Document.h>
 #include <LibWeb/DOM/Document.h>
 #include <LibWeb/HTML/MessageChannel.h>
 #include <LibWeb/HTML/MessageChannel.h>
 #include <LibWeb/HTML/MessagePort.h>
 #include <LibWeb/HTML/MessagePort.h>
+#include <LibWeb/HTML/Window.h>
 
 
 namespace Web::HTML {
 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)
 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.
     // 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.
     // 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.
     // 3. Entangle this's port 1 and this's port 2.
     m_port1->entangle_with(*m_port2);
     m_port1->entangle_with(*m_port2);
@@ -24,6 +34,13 @@ MessageChannel::MessageChannel(HTML::Window& window)
 
 
 MessageChannel::~MessageChannel() = default;
 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()
 MessagePort* MessageChannel::port1()
 {
 {
     return m_port1;
     return m_port1;

+ 12 - 20
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
  * SPDX-License-Identifier: BSD-2-Clause
  */
  */
 
 
 #pragma once
 #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/Forward.h>
-#include <LibWeb/HTML/Window.h>
 
 
 namespace Web::HTML {
 namespace Web::HTML {
 
 
 // https://html.spec.whatwg.org/multipage/web-messaging.html#message-channels
 // 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;
     virtual ~MessageChannel() override;
 
 
     MessagePort* port1();
     MessagePort* port1();
@@ -40,8 +28,12 @@ public:
 private:
 private:
     explicit MessageChannel(HTML::Window&);
     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)

+ 1 - 1
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/HTMLUnknownElement NO_INSTANCE)
 libweb_js_wrapper(HTML/HTMLVideoElement NO_INSTANCE)
 libweb_js_wrapper(HTML/HTMLVideoElement NO_INSTANCE)
 libweb_js_wrapper(HTML/ImageData)
 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/MessageEvent NO_INSTANCE)
 libweb_js_wrapper(HTML/MessagePort NO_INSTANCE)
 libweb_js_wrapper(HTML/MessagePort NO_INSTANCE)
 libweb_js_wrapper(HTML/PageTransitionEvent NO_INSTANCE)
 libweb_js_wrapper(HTML/PageTransitionEvent NO_INSTANCE)