Browse Source

LibWeb: Make TextDecoder GC-allocated

Andreas Kling 2 years ago
parent
commit
018d236439

+ 22 - 0
Userland/Libraries/LibWeb/Encoding/TextDecoder.cpp

@@ -9,9 +9,31 @@
 #include <LibWeb/Bindings/IDLAbstractOperations.h>
 #include <LibWeb/Bindings/IDLAbstractOperations.h>
 #include <LibWeb/Bindings/Wrapper.h>
 #include <LibWeb/Bindings/Wrapper.h>
 #include <LibWeb/Encoding/TextDecoder.h>
 #include <LibWeb/Encoding/TextDecoder.h>
+#include <LibWeb/HTML/Window.h>
 
 
 namespace Web::Encoding {
 namespace Web::Encoding {
 
 
+DOM::ExceptionOr<JS::NonnullGCPtr<TextDecoder>> TextDecoder::create_with_global_object(HTML::Window& window, FlyString encoding)
+{
+    auto decoder = TextCodec::decoder_for(encoding);
+    if (!decoder)
+        return DOM::SimpleException { DOM::SimpleExceptionType::TypeError, String::formatted("Invalid encoding {}", encoding) };
+
+    return JS::NonnullGCPtr(*window.heap().allocate<TextDecoder>(window.realm(), window, *decoder, move(encoding), false, false));
+}
+
+// https://encoding.spec.whatwg.org/#dom-textdecoder
+TextDecoder::TextDecoder(HTML::Window& window, TextCodec::Decoder& decoder, FlyString encoding, bool fatal, bool ignore_bom)
+    : PlatformObject(window.realm())
+    , m_decoder(decoder)
+    , m_encoding(move(encoding))
+    , m_fatal(fatal)
+    , m_ignore_bom(ignore_bom)
+{
+}
+
+TextDecoder::~TextDecoder() = default;
+
 // https://encoding.spec.whatwg.org/#dom-textdecoder-decode
 // https://encoding.spec.whatwg.org/#dom-textdecoder-decode
 DOM::ExceptionOr<String> TextDecoder::decode(JS::Handle<JS::Object> const& input) const
 DOM::ExceptionOr<String> TextDecoder::decode(JS::Handle<JS::Object> const& input) const
 {
 {

+ 10 - 27
Userland/Libraries/LibWeb/Encoding/TextDecoder.h

@@ -8,35 +8,22 @@
 
 
 #include <AK/Forward.h>
 #include <AK/Forward.h>
 #include <AK/NonnullRefPtr.h>
 #include <AK/NonnullRefPtr.h>
-#include <AK/RefCounted.h>
 #include <LibJS/Forward.h>
 #include <LibJS/Forward.h>
 #include <LibTextCodec/Decoder.h>
 #include <LibTextCodec/Decoder.h>
-#include <LibWeb/Bindings/Wrappable.h>
+#include <LibWeb/Bindings/PlatformObject.h>
 #include <LibWeb/DOM/ExceptionOr.h>
 #include <LibWeb/DOM/ExceptionOr.h>
 #include <LibWeb/Forward.h>
 #include <LibWeb/Forward.h>
 
 
 namespace Web::Encoding {
 namespace Web::Encoding {
 
 
 // https://encoding.spec.whatwg.org/#textdecoder
 // https://encoding.spec.whatwg.org/#textdecoder
-class TextDecoder
-    : public RefCounted<TextDecoder>
-    , public Bindings::Wrappable {
-public:
-    using WrapperType = Bindings::TextDecoderWrapper;
-
-    static DOM::ExceptionOr<NonnullRefPtr<TextDecoder>> create(FlyString encoding)
-    {
-        auto decoder = TextCodec::decoder_for(encoding);
-        if (!decoder)
-            return DOM::SimpleException { DOM::SimpleExceptionType::TypeError, String::formatted("Invalid encoding {}", encoding) };
+class TextDecoder : public Bindings::PlatformObject {
+    WEB_PLATFORM_OBJECT(TextDecoder, Bindings::PlatformObject);
 
 
-        return adopt_ref(*new TextDecoder(*decoder, move(encoding), false, false));
-    }
+public:
+    static DOM::ExceptionOr<JS::NonnullGCPtr<TextDecoder>> create_with_global_object(HTML::Window&, FlyString encoding);
 
 
-    static DOM::ExceptionOr<NonnullRefPtr<TextDecoder>> create_with_global_object(HTML::Window&, FlyString label)
-    {
-        return TextDecoder::create(move(label));
-    }
+    virtual ~TextDecoder() override;
 
 
     DOM::ExceptionOr<String> decode(JS::Handle<JS::Object> const&) const;
     DOM::ExceptionOr<String> decode(JS::Handle<JS::Object> const&) const;
 
 
@@ -44,15 +31,9 @@ public:
     bool fatal() const { return m_fatal; }
     bool fatal() const { return m_fatal; }
     bool ignore_bom() const { return m_ignore_bom; };
     bool ignore_bom() const { return m_ignore_bom; };
 
 
-protected:
+private:
     // https://encoding.spec.whatwg.org/#dom-textdecoder
     // https://encoding.spec.whatwg.org/#dom-textdecoder
-    TextDecoder(TextCodec::Decoder& decoder, FlyString encoding, bool fatal, bool ignore_bom)
-        : m_decoder(decoder)
-        , m_encoding(move(encoding))
-        , m_fatal(fatal)
-        , m_ignore_bom(ignore_bom)
-    {
-    }
+    TextDecoder(HTML::Window&, TextCodec::Decoder&, FlyString encoding, bool fatal, bool ignore_bom);
 
 
     TextCodec::Decoder& m_decoder;
     TextCodec::Decoder& m_decoder;
     FlyString m_encoding;
     FlyString m_encoding;
@@ -61,3 +42,5 @@ protected:
 };
 };
 
 
 }
 }
+
+WRAPPER_HACK(TextDecoder, Web::Encoding)

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

@@ -461,7 +461,6 @@ class OptionConstructor;
 class RangePrototype;
 class RangePrototype;
 class ResizeObserverWrapper;
 class ResizeObserverWrapper;
 class SelectionWrapper;
 class SelectionWrapper;
-class TextDecoderWrapper;
 class URLSearchParamsIteratorWrapper;
 class URLSearchParamsIteratorWrapper;
 class URLSearchParamsWrapper;
 class URLSearchParamsWrapper;
 class URLWrapper;
 class URLWrapper;

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

@@ -51,7 +51,7 @@ libweb_js_wrapper(DOM/StaticRange NO_INSTANCE)
 libweb_js_wrapper(DOM/Text NO_INSTANCE)
 libweb_js_wrapper(DOM/Text NO_INSTANCE)
 libweb_js_wrapper(DOM/TreeWalker NO_INSTANCE)
 libweb_js_wrapper(DOM/TreeWalker NO_INSTANCE)
 libweb_js_wrapper(DOMParsing/XMLSerializer NO_INSTANCE)
 libweb_js_wrapper(DOMParsing/XMLSerializer NO_INSTANCE)
-libweb_js_wrapper(Encoding/TextDecoder)
+libweb_js_wrapper(Encoding/TextDecoder NO_INSTANCE)
 libweb_js_wrapper(Encoding/TextEncoder NO_INSTANCE)
 libweb_js_wrapper(Encoding/TextEncoder NO_INSTANCE)
 libweb_js_wrapper(Fetch/Headers ITERABLE)
 libweb_js_wrapper(Fetch/Headers ITERABLE)
 libweb_js_wrapper(FileAPI/Blob)
 libweb_js_wrapper(FileAPI/Blob)