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.
This commit is contained in:
Andreas Kling 2024-04-24 14:56:26 +02:00
parent 1560d6ad62
commit 4c921e17b7
Notes: sideshowbarker 2024-07-17 06:51:10 +09:00
6 changed files with 23 additions and 11 deletions

View file

@ -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
{ {

View file

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

View file

@ -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

View file

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

View file

@ -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);

View file

@ -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(); } [[nodiscard]] JS::NonnullGCPtr<HTML::DOMStringMap> dataset();
HTML::DOMStringMap const* dataset() const { return m_dataset.ptr(); }
void focus(); void focus();
void blur(); void blur();