Skip to content

Commit ae11d70

Browse files
committed
LibWeb: Make DOMStringMap GC-allocated
1 parent 72bacba commit ae11d70

File tree

8 files changed

+35
-25
lines changed

8 files changed

+35
-25
lines changed

Userland/Libraries/LibWeb/Forward.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -471,7 +471,6 @@ class DOMPointReadOnlyWrapper;
471471
class DOMRectListWrapper;
472472
class DOMRectReadOnlyWrapper;
473473
class DOMRectWrapper;
474-
class DOMStringMapWrapper;
475474
class DOMTokenListWrapper;
476475
class ElementWrapper;
477476
class ErrorEventWrapper;

Userland/Libraries/LibWeb/HTML/DOMStringMap.cpp

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,23 @@
55
*/
66

77
#include <AK/CharacterTypes.h>
8+
#include <LibWeb/Bindings/DOMStringMapPrototype.h>
9+
#include <LibWeb/Bindings/WindowObject.h>
10+
#include <LibWeb/DOM/Document.h>
811
#include <LibWeb/DOM/Element.h>
912
#include <LibWeb/HTML/DOMStringMap.h>
1013

1114
namespace Web::HTML {
1215

13-
DOMStringMap::DOMStringMap(DOM::Element& associated_element)
14-
: m_associated_element(associated_element)
16+
DOMStringMap* DOMStringMap::create(DOM::Element& element)
17+
{
18+
auto& realm = element.document().preferred_window_object().realm();
19+
return realm.heap().allocate<DOMStringMap>(realm, element);
20+
}
21+
22+
DOMStringMap::DOMStringMap(DOM::Element& element)
23+
: PlatformObject(element.document().preferred_window_object().ensure_web_prototype<Bindings::DOMStringMapPrototype>("DOMStringMap"))
24+
, m_associated_element(element)
1525
{
1626
}
1727

Lines changed: 14 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,29 @@
11
/*
22
* Copyright (c) 2021, Luke Wilde <lukew@serenityos.org>
3+
* Copyright (c) 2022, Andreas Kling <kling@serenityos.org>
34
*
45
* SPDX-License-Identifier: BSD-2-Clause
56
*/
67

78
#pragma once
89

9-
#include <AK/RefCounted.h>
10-
#include <AK/Weakable.h>
11-
#include <LibWeb/Bindings/Wrappable.h>
10+
#include <LibWeb/Bindings/PlatformObject.h>
1211
#include <LibWeb/Forward.h>
1312

1413
namespace Web::HTML {
1514

1615
// https://html.spec.whatwg.org/multipage/dom.html#domstringmap
17-
class DOMStringMap final
18-
: public RefCounted<DOMStringMap>
19-
, public Weakable<DOMStringMap>
20-
, public Bindings::Wrappable {
21-
public:
22-
using WrapperType = Bindings::DOMStringMapWrapper;
16+
class DOMStringMap final : public Bindings::PlatformObject {
17+
JS_OBJECT(DOMStringMap, Bindings::PlatformObject);
2318

24-
static NonnullRefPtr<DOMStringMap> create(DOM::Element& associated_element)
25-
{
26-
return adopt_ref(*new DOMStringMap(associated_element));
27-
}
19+
public:
20+
static DOMStringMap* create(DOM::Element&);
21+
explicit DOMStringMap(DOM::Element&);
2822

2923
virtual ~DOMStringMap() override;
3024

25+
DOMStringMap& impl() { return *this; }
26+
3127
Vector<String> supported_property_names() const;
3228

3329
String determine_value_of_named_property(String const&) const;
@@ -38,8 +34,6 @@ class DOMStringMap final
3834
bool delete_existing_named_property(String const&);
3935

4036
private:
41-
DOMStringMap(DOM::Element&);
42-
4337
struct NameValuePair {
4438
String name;
4539
String value;
@@ -52,3 +46,8 @@ class DOMStringMap final
5246
};
5347

5448
}
49+
50+
namespace Web::Bindings {
51+
inline JS::Object* wrap(JS::Realm&, Web::HTML::DOMStringMap& object) { return &object; }
52+
using DOMStringMapWrapper = Web::HTML::DOMStringMap;
53+
}

Userland/Libraries/LibWeb/HTML/HTMLElement.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ namespace Web::HTML {
3030

3131
HTMLElement::HTMLElement(DOM::Document& document, DOM::QualifiedName qualified_name)
3232
: Element(document, move(qualified_name))
33-
, m_dataset(DOMStringMap::create(*this))
33+
, m_dataset(JS::make_handle(DOMStringMap::create(*this)))
3434
{
3535
}
3636

Userland/Libraries/LibWeb/HTML/HTMLElement.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,8 @@ class HTMLElement
3838

3939
bool cannot_navigate() const;
4040

41-
NonnullRefPtr<DOMStringMap> dataset() const { return m_dataset; }
41+
DOMStringMap* dataset() { return m_dataset.cell(); }
42+
DOMStringMap const* dataset() const { return m_dataset.cell(); }
4243

4344
void focus();
4445

@@ -65,7 +66,7 @@ class HTMLElement
6566
};
6667
ContentEditableState content_editable_state() const;
6768

68-
NonnullRefPtr<DOMStringMap> m_dataset;
69+
JS::Handle<DOMStringMap> m_dataset;
6970

7071
// https://html.spec.whatwg.org/multipage/interaction.html#locked-for-focus
7172
bool m_locked_for_focus { false };

Userland/Libraries/LibWeb/SVG/SVGElement.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ namespace Web::SVG {
1010

1111
SVGElement::SVGElement(DOM::Document& document, DOM::QualifiedName qualified_name)
1212
: Element(document, move(qualified_name))
13-
, m_dataset(HTML::DOMStringMap::create(*this))
13+
, m_dataset(JS::make_handle(HTML::DOMStringMap::create(*this)))
1414
{
1515
}
1616

Userland/Libraries/LibWeb/SVG/SVGElement.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,13 @@ class SVGElement : public DOM::Element {
1717

1818
virtual bool requires_svg_container() const override { return true; }
1919

20-
NonnullRefPtr<HTML::DOMStringMap> dataset() const { return m_dataset; }
20+
HTML::DOMStringMap* dataset() { return m_dataset.cell(); }
21+
HTML::DOMStringMap const* dataset() const { return m_dataset.cell(); }
2122

2223
protected:
2324
SVGElement(DOM::Document&, DOM::QualifiedName);
2425

25-
NonnullRefPtr<HTML::DOMStringMap> m_dataset;
26+
JS::Handle<HTML::DOMStringMap> m_dataset;
2627
};
2728

2829
}

Userland/Libraries/LibWeb/idl_files.cmake

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ libweb_js_wrapper(HTML/CanvasGradient)
6565
libweb_js_wrapper(HTML/CanvasRenderingContext2D)
6666
libweb_js_wrapper(HTML/CloseEvent)
6767
libweb_js_wrapper(HTML/DOMParser)
68-
libweb_js_wrapper(HTML/DOMStringMap)
68+
libweb_js_wrapper(HTML/DOMStringMap NO_INSTANCE)
6969
libweb_js_wrapper(HTML/ErrorEvent)
7070
libweb_js_wrapper(HTML/History)
7171
libweb_js_wrapper(HTML/HTMLAnchorElement)

0 commit comments

Comments
 (0)