Parcourir la source

LibWeb: Make DOMParser GC-allocated

Andreas Kling il y a 2 ans
Parent
commit
d5e831988e

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

@@ -453,7 +453,6 @@ class CanvasGradientWrapper;
 class CanvasRenderingContext2DWrapper;
 class CryptoWrapper;
 class DOMExceptionWrapper;
-class DOMParserWrapper;
 class DOMPointWrapper;
 class DOMPointReadOnlyWrapper;
 class DOMRectListWrapper;

+ 9 - 2
Userland/Libraries/LibWeb/HTML/DOMParser.cpp

@@ -8,13 +8,20 @@
 #include <LibWeb/Bindings/MainThreadVM.h>
 #include <LibWeb/HTML/DOMParser.h>
 #include <LibWeb/HTML/Parser/HTMLParser.h>
+#include <LibWeb/HTML/Scripting/Environments.h>
 #include <LibWeb/XML/XMLDocumentBuilder.h>
 
 namespace Web::HTML {
 
+DOM::ExceptionOr<JS::NonnullGCPtr<DOMParser>> DOMParser::create_with_global_object(HTML::Window& window)
+{
+    return JS::NonnullGCPtr(*window.heap().allocate<DOMParser>(window.realm(), window));
+}
+
 DOMParser::DOMParser(HTML::Window& window)
-    : m_window(JS::make_handle(window))
+    : PlatformObject(window.realm())
 {
+    set_prototype(&window.ensure_web_prototype<Bindings::DOMParserPrototype>("DOMParser"));
 }
 
 DOMParser::~DOMParser() = default;
@@ -23,7 +30,7 @@ DOMParser::~DOMParser() = default;
 JS::NonnullGCPtr<DOM::Document> DOMParser::parse_from_string(String const& string, Bindings::DOMParserSupportedType type)
 {
     // 1. Let document be a new Document, whose content type is type and url is this's relevant global object's associated Document's URL.
-    auto document = DOM::Document::create(Bindings::main_thread_internal_window_object(), m_window->associated_document().url());
+    auto document = DOM::Document::create(Bindings::main_thread_internal_window_object(), verify_cast<HTML::Window>(relevant_global_object(*this)).associated_document().url());
     document->set_content_type(Bindings::idl_enum_to_string(type));
 
     // 2. Switch on type:

+ 7 - 15
Userland/Libraries/LibWeb/HTML/DOMParser.h

@@ -6,9 +6,7 @@
 
 #pragma once
 
-#include <AK/RefCounted.h>
-#include <AK/Weakable.h>
-#include <LibWeb/Bindings/Wrappable.h>
+#include <LibWeb/Bindings/PlatformObject.h>
 #include <LibWeb/DOM/Document.h>
 #include <LibWeb/DOM/ExceptionOr.h>
 #include <LibWeb/Forward.h>
@@ -16,17 +14,11 @@
 namespace Web::HTML {
 
 // https://html.spec.whatwg.org/multipage/dynamic-markup-insertion.html#domparser
-class DOMParser final
-    : public RefCounted<DOMParser>
-    , public Weakable<DOMParser>
-    , public Bindings::Wrappable {
-public:
-    using WrapperType = Bindings::DOMParserWrapper;
+class DOMParser final : public Bindings::PlatformObject {
+    WEB_PLATFORM_OBJECT(DOMParser, Bindings::PlatformObject);
 
-    static DOM::ExceptionOr<NonnullRefPtr<DOMParser>> create_with_global_object(HTML::Window& window)
-    {
-        return adopt_ref(*new DOMParser(window));
-    }
+public:
+    static DOM::ExceptionOr<JS::NonnullGCPtr<DOMParser>> create_with_global_object(HTML::Window&);
 
     virtual ~DOMParser() override;
 
@@ -34,8 +26,8 @@ public:
 
 private:
     explicit DOMParser(HTML::Window&);
-
-    JS::Handle<HTML::Window> m_window;
 };
 
 }
+
+WRAPPER_HACK(DOMParser, Web::HTML)

+ 1 - 1
Userland/Libraries/LibWeb/idl_files.cmake

@@ -64,7 +64,7 @@ libweb_js_wrapper(Geometry/DOMRectReadOnly)
 libweb_js_wrapper(HTML/CanvasGradient)
 libweb_js_wrapper(HTML/CanvasRenderingContext2D)
 libweb_js_wrapper(HTML/CloseEvent NO_INSTANCE)
-libweb_js_wrapper(HTML/DOMParser)
+libweb_js_wrapper(HTML/DOMParser NO_INSTANCE)
 libweb_js_wrapper(HTML/DOMStringMap NO_INSTANCE)
 libweb_js_wrapper(HTML/ErrorEvent NO_INSTANCE)
 libweb_js_wrapper(HTML/History)