Selaa lähdekoodia

LibWeb: Make TextMetrics GC-allocated

Andreas Kling 2 vuotta sitten
vanhempi
commit
6b7a1d13e9

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

@@ -470,7 +470,6 @@ class StorageWrapper;
 class SubtleCryptoWrapper;
 class TextDecoderWrapper;
 class TextEncoderWrapper;
-class TextMetricsWrapper;
 class URLSearchParamsIteratorWrapper;
 class URLSearchParamsWrapper;
 class URLWrapper;

+ 1 - 1
Userland/Libraries/LibWeb/HTML/Canvas/CanvasText.h

@@ -19,7 +19,7 @@ public:
 
     virtual void fill_text(String const&, float x, float y, Optional<double> max_width) = 0;
     virtual void stroke_text(String const&, float x, float y, Optional<double> max_width) = 0;
-    virtual RefPtr<TextMetrics> measure_text(String const& text) = 0;
+    virtual JS::NonnullGCPtr<TextMetrics> measure_text(String const& text) = 0;
 
 protected:
     CanvasText() = default;

+ 2 - 2
Userland/Libraries/LibWeb/HTML/CanvasRenderingContext2D.cpp

@@ -396,7 +396,7 @@ void CanvasRenderingContext2D::reset_to_default_state()
 }
 
 // https://html.spec.whatwg.org/multipage/canvas.html#dom-context-2d-measuretext
-RefPtr<TextMetrics> CanvasRenderingContext2D::measure_text(String const& text)
+JS::NonnullGCPtr<TextMetrics> CanvasRenderingContext2D::measure_text(String const& text)
 {
     // The measureText(text) method steps are to run the text preparation
     // algorithm, passing it text and the object implementing the CanvasText
@@ -404,7 +404,7 @@ RefPtr<TextMetrics> CanvasRenderingContext2D::measure_text(String const& text)
     // TextMetrics object with members behaving as described in the following
     // list:
     auto prepared_text = prepare_text(text);
-    auto metrics = TextMetrics::create();
+    auto metrics = TextMetrics::create(global_object());
     // FIXME: Use the font that was used to create the glyphs in prepared_text.
     auto& font = Gfx::FontDatabase::default_font();
 

+ 1 - 1
Userland/Libraries/LibWeb/HTML/CanvasRenderingContext2D.h

@@ -78,7 +78,7 @@ public:
 
     JS::NonnullGCPtr<HTMLCanvasElement> canvas_for_binding() const;
 
-    virtual RefPtr<TextMetrics> measure_text(String const& text) override;
+    virtual JS::NonnullGCPtr<TextMetrics> measure_text(String const& text) override;
 
     virtual void clip() override;
 

+ 13 - 3
Userland/Libraries/LibWeb/HTML/TextMetrics.cpp

@@ -4,13 +4,23 @@
  * SPDX-License-Identifier: BSD-2-Clause
  */
 
-#include "TextMetrics.h"
+#include <LibWeb/Bindings/TextMetricsPrototype.h>
+#include <LibWeb/HTML/TextMetrics.h>
+#include <LibWeb/HTML/Window.h>
 
 namespace Web::HTML {
 
-RefPtr<TextMetrics> TextMetrics::create()
+JS::NonnullGCPtr<TextMetrics> TextMetrics::create(HTML::Window& window)
 {
-    return adopt_ref(*new TextMetrics());
+    return *window.heap().allocate<TextMetrics>(window.realm(), window);
 }
 
+TextMetrics::TextMetrics(HTML::Window& window)
+    : PlatformObject(window.realm())
+{
+    set_prototype(&window.ensure_web_prototype<Bindings::TextMetricsPrototype>("TextMetrics"));
+}
+
+TextMetrics::~TextMetrics() = default;
+
 }

+ 9 - 8
Userland/Libraries/LibWeb/HTML/TextMetrics.h

@@ -6,18 +6,17 @@
 
 #pragma once
 
-#include <LibJS/Heap/Handle.h>
-#include <LibWeb/Bindings/Wrappable.h>
+#include <LibWeb/Bindings/PlatformObject.h>
 
 namespace Web::HTML {
 
-class TextMetrics
-    : public RefCounted<TextMetrics>
-    , public Bindings::Wrappable {
+class TextMetrics : public Bindings::PlatformObject {
+    WEB_PLATFORM_OBJECT(TextMetrics, Bindings::PlatformObject);
+
 public:
-    using WrapperType = Bindings::TextMetricsWrapper;
+    static JS::NonnullGCPtr<TextMetrics> create(HTML::Window&);
 
-    static RefPtr<TextMetrics> create();
+    virtual ~TextMetrics() override;
 
     double width() const { return m_width; }
     double actual_bounding_box_left() const { return m_actual_bounding_box_left; }
@@ -46,7 +45,7 @@ public:
     void set_ideographic_baseline(double baseline) { m_ideographic_baseline = baseline; }
 
 private:
-    explicit TextMetrics() = default;
+    explicit TextMetrics(HTML::Window&);
 
     double m_width { 0 };
     double m_actual_bounding_box_left { 0 };
@@ -64,3 +63,5 @@ private:
 };
 
 }
+
+WRAPPER_HACK(TextMetrics, Web::HTML)

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

@@ -149,7 +149,7 @@ libweb_js_wrapper(HTML/Path2D NO_INSTANCE)
 libweb_js_wrapper(HTML/PromiseRejectionEvent NO_INSTANCE)
 libweb_js_wrapper(HTML/Storage)
 libweb_js_wrapper(HTML/SubmitEvent NO_INSTANCE)
-libweb_js_wrapper(HTML/TextMetrics)
+libweb_js_wrapper(HTML/TextMetrics NO_INSTANCE)
 libweb_js_wrapper(HTML/Worker NO_INSTANCE)
 libweb_js_wrapper(HTML/WorkerGlobalScope NO_INSTANCE)
 libweb_js_wrapper(HTML/WorkerLocation)