Jelajahi Sumber

LibWeb: Allocate dataset lazily for HTML/SVG/MathML elements

Most elements never need a dataset object, so we can avoid creating lots
of objects by making them lazy.
Andreas Kling 1 tahun lalu
induk
melakukan
4c921e17b7

+ 7 - 2
Userland/Libraries/LibWeb/HTML/HTMLElement.cpp

@@ -50,8 +50,6 @@ void HTMLElement::initialize(JS::Realm& realm)
 {
 {
     Base::initialize(realm);
     Base::initialize(realm);
     WEB_SET_PROTOTYPE_FOR_INTERFACE(HTMLElement);
     WEB_SET_PROTOTYPE_FOR_INTERFACE(HTMLElement);
-
-    m_dataset = DOMStringMap::create(*this);
 }
 }
 
 
 void HTMLElement::visit_edges(Cell::Visitor& visitor)
 void HTMLElement::visit_edges(Cell::Visitor& visitor)
@@ -60,6 +58,13 @@ void HTMLElement::visit_edges(Cell::Visitor& visitor)
     visitor.visit(m_dataset);
     visitor.visit(m_dataset);
 }
 }
 
 
+JS::NonnullGCPtr<DOMStringMap> HTMLElement::dataset()
+{
+    if (!m_dataset)
+        m_dataset = DOMStringMap::create(*this);
+    return *m_dataset;
+}
+
 // https://html.spec.whatwg.org/multipage/dom.html#dom-dir
 // https://html.spec.whatwg.org/multipage/dom.html#dom-dir
 StringView HTMLElement::dir() const
 StringView HTMLElement::dir() const
 {
 {

+ 1 - 2
Userland/Libraries/LibWeb/HTML/HTMLElement.h

@@ -53,8 +53,7 @@ public:
 
 
     bool cannot_navigate() const;
     bool cannot_navigate() const;
 
 
-    DOMStringMap* dataset() { return m_dataset.ptr(); }
-    DOMStringMap const* dataset() const { return m_dataset.ptr(); }
+    [[nodiscard]] JS::NonnullGCPtr<DOMStringMap> dataset();
 
 
     void focus();
     void focus();
 
 

+ 6 - 1
Userland/Libraries/LibWeb/MathML/MathMLElement.cpp

@@ -23,8 +23,13 @@ void MathMLElement::initialize(JS::Realm& realm)
 {
 {
     Base::initialize(realm);
     Base::initialize(realm);
     WEB_SET_PROTOTYPE_FOR_INTERFACE(MathMLElement);
     WEB_SET_PROTOTYPE_FOR_INTERFACE(MathMLElement);
+}
 
 
-    m_dataset = HTML::DOMStringMap::create(*this);
+JS::NonnullGCPtr<HTML::DOMStringMap> MathMLElement::dataset()
+{
+    if (!m_dataset)
+        m_dataset = HTML::DOMStringMap::create(*this);
+    return *m_dataset;
 }
 }
 
 
 Optional<ARIA::Role> MathMLElement::default_role() const
 Optional<ARIA::Role> MathMLElement::default_role() const

+ 1 - 2
Userland/Libraries/LibWeb/MathML/MathMLElement.h

@@ -20,8 +20,7 @@ class MathMLElement : public DOM::Element
 public:
 public:
     virtual ~MathMLElement() override;
     virtual ~MathMLElement() override;
 
 
-    HTML::DOMStringMap* dataset() { return m_dataset.ptr(); }
-    HTML::DOMStringMap const* dataset() const { return m_dataset.ptr(); }
+    [[nodiscard]] JS::NonnullGCPtr<HTML::DOMStringMap> dataset();
 
 
     virtual Optional<ARIA::Role> default_role() const override;
     virtual Optional<ARIA::Role> default_role() const override;
 
 

+ 7 - 2
Userland/Libraries/LibWeb/SVG/SVGElement.cpp

@@ -25,8 +25,6 @@ void SVGElement::initialize(JS::Realm& realm)
 {
 {
     Base::initialize(realm);
     Base::initialize(realm);
     WEB_SET_PROTOTYPE_FOR_INTERFACE(SVGElement);
     WEB_SET_PROTOTYPE_FOR_INTERFACE(SVGElement);
-
-    m_dataset = HTML::DOMStringMap::create(*this);
 }
 }
 
 
 void SVGElement::visit_edges(Cell::Visitor& visitor)
 void SVGElement::visit_edges(Cell::Visitor& visitor)
@@ -35,6 +33,13 @@ void SVGElement::visit_edges(Cell::Visitor& visitor)
     visitor.visit(m_dataset);
     visitor.visit(m_dataset);
 }
 }
 
 
+JS::NonnullGCPtr<HTML::DOMStringMap> SVGElement::dataset()
+{
+    if (!m_dataset)
+        m_dataset = HTML::DOMStringMap::create(*this);
+    return *m_dataset;
+}
+
 void SVGElement::attribute_changed(FlyString const& name, Optional<String> const& value)
 void SVGElement::attribute_changed(FlyString const& name, Optional<String> const& value)
 {
 {
     Base::attribute_changed(name, value);
     Base::attribute_changed(name, value);

+ 1 - 2
Userland/Libraries/LibWeb/SVG/SVGElement.h

@@ -23,8 +23,7 @@ public:
     virtual void inserted() override;
     virtual void inserted() override;
     virtual void removed_from(Node*) override;
     virtual void removed_from(Node*) override;
 
 
-    HTML::DOMStringMap* dataset() { return m_dataset.ptr(); }
-    HTML::DOMStringMap const* dataset() const { return m_dataset.ptr(); }
+    [[nodiscard]] JS::NonnullGCPtr<HTML::DOMStringMap> dataset();
 
 
     void focus();
     void focus();
     void blur();
     void blur();