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:
parent
1560d6ad62
commit
4c921e17b7
Notes:
sideshowbarker
2024-07-17 06:51:10 +09:00
Author: https://github.com/awesomekling Commit: https://github.com/SerenityOS/serenity/commit/4c921e17b7 Pull-request: https://github.com/SerenityOS/serenity/pull/24100
6 changed files with 23 additions and 11 deletions
|
@ -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
|
||||||
{
|
{
|
||||||
|
|
|
@ -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();
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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();
|
||||||
|
|
Loading…
Add table
Reference in a new issue