LibWeb: Only set prototype once for object with IDL interface

Before this change, we were going through the chain of base classes for
each IDL interface object and having them set the prototype to their
prototype.

Instead of doing that, reorder things so that we set the right prototype
immediately in Foo::initialize(), and then don't bother in all the base
class overrides.

This knocks off a ~1% profile item on Speedometer 3.
This commit is contained in:
Andreas Kling 2025-04-20 16:22:57 +02:00 committed by Andreas Kling
commit a6dfc74e93
Notes: github-actions[bot] 2025-04-20 16:44:17 +00:00
417 changed files with 423 additions and 423 deletions

View file

@ -23,8 +23,8 @@ SVGAElement::~SVGAElement() = default;
void SVGAElement::initialize(JS::Realm& realm)
{
Base::initialize(realm);
WEB_SET_PROTOTYPE_FOR_INTERFACE(SVGAElement);
Base::initialize(realm);
}
void SVGAElement::visit_edges(Cell::Visitor& visitor)

View file

@ -49,8 +49,8 @@ WebIDL::ExceptionOr<void> SVGAnimatedEnumeration::set_base_val(u16 base_val)
void SVGAnimatedEnumeration::initialize(JS::Realm& realm)
{
Base::initialize(realm);
WEB_SET_PROTOTYPE_FOR_INTERFACE(SVGAnimatedEnumeration);
Base::initialize(realm);
}
// https://svgwg.org/svg2-draft/types.html#__svg__SVGAnimatedEnumeration__baseVal

View file

@ -30,8 +30,8 @@ SVGAnimatedLength::~SVGAnimatedLength() = default;
void SVGAnimatedLength::initialize(JS::Realm& realm)
{
Base::initialize(realm);
WEB_SET_PROTOTYPE_FOR_INTERFACE(SVGAnimatedLength);
Base::initialize(realm);
}
void SVGAnimatedLength::visit_edges(Cell::Visitor& visitor)

View file

@ -28,8 +28,8 @@ SVGAnimatedNumber::~SVGAnimatedNumber() = default;
void SVGAnimatedNumber::initialize(JS::Realm& realm)
{
Base::initialize(realm);
WEB_SET_PROTOTYPE_FOR_INTERFACE(SVGAnimatedNumber);
Base::initialize(realm);
}
}

View file

@ -22,8 +22,8 @@ SVGAnimatedRect::~SVGAnimatedRect() = default;
void SVGAnimatedRect::initialize(JS::Realm& realm)
{
Base::initialize(realm);
WEB_SET_PROTOTYPE_FOR_INTERFACE(SVGAnimatedRect);
Base::initialize(realm);
m_base_val = Geometry::DOMRect::create(realm, { 0, 0, 0, 0 });
m_anim_val = Geometry::DOMRect::create(realm, { 0, 0, 0, 0 });
}

View file

@ -33,8 +33,8 @@ SVGAnimatedString::~SVGAnimatedString() = default;
void SVGAnimatedString::initialize(JS::Realm& realm)
{
Base::initialize(realm);
WEB_SET_PROTOTYPE_FOR_INTERFACE(SVGAnimatedString);
Base::initialize(realm);
}
void SVGAnimatedString::visit_edges(Cell::Visitor& visitor)

View file

@ -28,8 +28,8 @@ SVGAnimatedTransformList::~SVGAnimatedTransformList() = default;
void SVGAnimatedTransformList::initialize(JS::Realm& realm)
{
Base::initialize(realm);
WEB_SET_PROTOTYPE_FOR_INTERFACE(SVGAnimatedTransformList);
Base::initialize(realm);
}
void SVGAnimatedTransformList::visit_edges(Cell::Visitor& visitor)

View file

@ -25,8 +25,8 @@ SVGCircleElement::SVGCircleElement(DOM::Document& document, DOM::QualifiedName q
void SVGCircleElement::initialize(JS::Realm& realm)
{
Base::initialize(realm);
WEB_SET_PROTOTYPE_FOR_INTERFACE(SVGCircleElement);
Base::initialize(realm);
}
bool SVGCircleElement::is_presentational_hint(FlyString const& name) const

View file

@ -24,8 +24,8 @@ SVGClipPathElement::~SVGClipPathElement()
void SVGClipPathElement::initialize(JS::Realm& realm)
{
Base::initialize(realm);
WEB_SET_PROTOTYPE_FOR_INTERFACE(SVGClipPathElement);
Base::initialize(realm);
}
void SVGClipPathElement::attribute_changed(FlyString const& name, Optional<String> const& old_value, Optional<String> const& value, Optional<FlyString> const& namespace_)

View file

@ -24,8 +24,8 @@ SVGDefsElement::~SVGDefsElement()
void SVGDefsElement::initialize(JS::Realm& realm)
{
Base::initialize(realm);
WEB_SET_PROTOTYPE_FOR_INTERFACE(SVGDefsElement);
Base::initialize(realm);
}
}

View file

@ -21,8 +21,8 @@ SVGDescElement::SVGDescElement(DOM::Document& document, DOM::QualifiedName quali
void SVGDescElement::initialize(JS::Realm& realm)
{
Base::initialize(realm);
WEB_SET_PROTOTYPE_FOR_INTERFACE(SVGDescElement);
Base::initialize(realm);
}
GC::Ptr<Layout::Node> SVGDescElement::create_layout_node(GC::Ref<CSS::ComputedProperties>)

View file

@ -26,8 +26,8 @@ SVGElement::SVGElement(DOM::Document& document, DOM::QualifiedName qualified_nam
void SVGElement::initialize(JS::Realm& realm)
{
Base::initialize(realm);
WEB_SET_PROTOTYPE_FOR_INTERFACE(SVGElement);
Base::initialize(realm);
}
bool SVGElement::should_include_in_accessibility_tree() const

View file

@ -22,8 +22,8 @@ SVGEllipseElement::SVGEllipseElement(DOM::Document& document, DOM::QualifiedName
void SVGEllipseElement::initialize(JS::Realm& realm)
{
Base::initialize(realm);
WEB_SET_PROTOTYPE_FOR_INTERFACE(SVGEllipseElement);
Base::initialize(realm);
}
void SVGEllipseElement::attribute_changed(FlyString const& name, Optional<String> const& old_value, Optional<String> const& value, Optional<FlyString> const& namespace_)

View file

@ -19,8 +19,8 @@ SVGFilterElement::SVGFilterElement(DOM::Document& document, DOM::QualifiedName q
void SVGFilterElement::initialize(JS::Realm& realm)
{
Base::initialize(realm);
WEB_SET_PROTOTYPE_FOR_INTERFACE(SVGFilterElement);
Base::initialize(realm);
}
void SVGFilterElement::apply_presentational_hints(GC::Ref<CSS::CascadedProperties> cascaded_properties) const

View file

@ -28,8 +28,8 @@ SVGForeignObjectElement::~SVGForeignObjectElement() = default;
void SVGForeignObjectElement::initialize(JS::Realm& realm)
{
Base::initialize(realm);
WEB_SET_PROTOTYPE_FOR_INTERFACE(SVGForeignObjectElement);
Base::initialize(realm);
// FIXME: These never actually get updated!
m_x = SVGAnimatedLength::create(realm, SVGLength::create(realm, 0, 0), SVGLength::create(realm, 0, 0));

View file

@ -22,8 +22,8 @@ SVGGElement::SVGGElement(DOM::Document& document, DOM::QualifiedName qualified_n
void SVGGElement::initialize(JS::Realm& realm)
{
Base::initialize(realm);
WEB_SET_PROTOTYPE_FOR_INTERFACE(SVGGElement);
Base::initialize(realm);
}
GC::Ptr<Layout::Node> SVGGElement::create_layout_node(GC::Ref<CSS::ComputedProperties> style)

View file

@ -18,8 +18,8 @@ SVGGeometryElement::SVGGeometryElement(DOM::Document& document, DOM::QualifiedNa
void SVGGeometryElement::initialize(JS::Realm& realm)
{
Base::initialize(realm);
WEB_SET_PROTOTYPE_FOR_INTERFACE(SVGGeometryElement);
Base::initialize(realm);
}
GC::Ptr<Layout::Node> SVGGeometryElement::create_layout_node(GC::Ref<CSS::ComputedProperties> style)

View file

@ -150,8 +150,8 @@ GC::Ptr<SVGGradientElement const> SVGGradientElement::linked_gradient(HashTable<
void SVGGradientElement::initialize(JS::Realm& realm)
{
Base::initialize(realm);
WEB_SET_PROTOTYPE_FOR_INTERFACE(SVGGradientElement);
Base::initialize(realm);
}
void SVGGradientElement::visit_edges(Cell::Visitor& visitor)

View file

@ -33,8 +33,8 @@ SVGGraphicsElement::SVGGraphicsElement(DOM::Document& document, DOM::QualifiedNa
void SVGGraphicsElement::initialize(JS::Realm& realm)
{
Base::initialize(realm);
WEB_SET_PROTOTYPE_FOR_INTERFACE(SVGGraphicsElement);
Base::initialize(realm);
}
void SVGGraphicsElement::attribute_changed(FlyString const& name, Optional<String> const& old_value, Optional<String> const& value, Optional<FlyString> const& namespace_)

View file

@ -28,8 +28,8 @@ SVGImageElement::SVGImageElement(DOM::Document& document, DOM::QualifiedName qua
void SVGImageElement::initialize(JS::Realm& realm)
{
Base::initialize(realm);
WEB_SET_PROTOTYPE_FOR_INTERFACE(SVGImageElement);
Base::initialize(realm);
}
void SVGImageElement::visit_edges(Cell::Visitor& visitor)

View file

@ -61,8 +61,8 @@ SVGLength::SVGLength(JS::Realm& realm, u8 unit_type, float value)
void SVGLength::initialize(JS::Realm& realm)
{
Base::initialize(realm);
WEB_SET_PROTOTYPE_FOR_INTERFACE(SVGLength);
Base::initialize(realm);
}
SVGLength::~SVGLength() = default;

View file

@ -22,8 +22,8 @@ SVGLineElement::SVGLineElement(DOM::Document& document, DOM::QualifiedName quali
void SVGLineElement::initialize(JS::Realm& realm)
{
Base::initialize(realm);
WEB_SET_PROTOTYPE_FOR_INTERFACE(SVGLineElement);
Base::initialize(realm);
}
void SVGLineElement::attribute_changed(FlyString const& name, Optional<String> const& old_value, Optional<String> const& value, Optional<FlyString> const& namespace_)

View file

@ -24,8 +24,8 @@ SVGLinearGradientElement::SVGLinearGradientElement(DOM::Document& document, DOM:
void SVGLinearGradientElement::initialize(JS::Realm& realm)
{
Base::initialize(realm);
WEB_SET_PROTOTYPE_FOR_INTERFACE(SVGLinearGradientElement);
Base::initialize(realm);
}
void SVGLinearGradientElement::attribute_changed(FlyString const& name, Optional<String> const& old_value, Optional<String> const& value, Optional<FlyString> const& namespace_)

View file

@ -23,8 +23,8 @@ SVGMaskElement::~SVGMaskElement() = default;
void SVGMaskElement::initialize(JS::Realm& realm)
{
Base::initialize(realm);
WEB_SET_PROTOTYPE_FOR_INTERFACE(SVGMaskElement);
Base::initialize(realm);
}
GC::Ptr<Layout::Node> SVGMaskElement::create_layout_node(GC::Ref<CSS::ComputedProperties>)

View file

@ -21,8 +21,8 @@ SVGMetadataElement::SVGMetadataElement(DOM::Document& document, DOM::QualifiedNa
void SVGMetadataElement::initialize(JS::Realm& realm)
{
Base::initialize(realm);
WEB_SET_PROTOTYPE_FOR_INTERFACE(SVGMetadataElement);
Base::initialize(realm);
}
GC::Ptr<Layout::Node> SVGMetadataElement::create_layout_node(GC::Ref<CSS::ComputedProperties>)

View file

@ -92,8 +92,8 @@ SVGPathElement::SVGPathElement(DOM::Document& document, DOM::QualifiedName quali
void SVGPathElement::initialize(JS::Realm& realm)
{
Base::initialize(realm);
WEB_SET_PROTOTYPE_FOR_INTERFACE(SVGPathElement);
Base::initialize(realm);
}
void SVGPathElement::attribute_changed(FlyString const& name, Optional<String> const& old_value, Optional<String> const& value, Optional<FlyString> const& namespace_)

View file

@ -22,8 +22,8 @@ SVGPolygonElement::SVGPolygonElement(DOM::Document& document, DOM::QualifiedName
void SVGPolygonElement::initialize(JS::Realm& realm)
{
Base::initialize(realm);
WEB_SET_PROTOTYPE_FOR_INTERFACE(SVGPolygonElement);
Base::initialize(realm);
}
void SVGPolygonElement::attribute_changed(FlyString const& name, Optional<String> const& old_value, Optional<String> const& value, Optional<FlyString> const& namespace_)

View file

@ -22,8 +22,8 @@ SVGPolylineElement::SVGPolylineElement(DOM::Document& document, DOM::QualifiedNa
void SVGPolylineElement::initialize(JS::Realm& realm)
{
Base::initialize(realm);
WEB_SET_PROTOTYPE_FOR_INTERFACE(SVGPolylineElement);
Base::initialize(realm);
}
void SVGPolylineElement::attribute_changed(FlyString const& name, Optional<String> const& old_value, Optional<String> const& value, Optional<FlyString> const& namespace_)

View file

@ -21,8 +21,8 @@ SVGRadialGradientElement::SVGRadialGradientElement(DOM::Document& document, DOM:
void SVGRadialGradientElement::initialize(JS::Realm& realm)
{
Base::initialize(realm);
WEB_SET_PROTOTYPE_FOR_INTERFACE(SVGRadialGradientElement);
Base::initialize(realm);
}
void SVGRadialGradientElement::attribute_changed(FlyString const& name, Optional<String> const& old_value, Optional<String> const& value, Optional<FlyString> const& namespace_)

View file

@ -24,8 +24,8 @@ SVGRectElement::SVGRectElement(DOM::Document& document, DOM::QualifiedName quali
void SVGRectElement::initialize(JS::Realm& realm)
{
Base::initialize(realm);
WEB_SET_PROTOTYPE_FOR_INTERFACE(SVGRectElement);
Base::initialize(realm);
}
void SVGRectElement::attribute_changed(FlyString const& name, Optional<String> const& old_value, Optional<String> const& value, Optional<FlyString> const& namespace_)

View file

@ -31,8 +31,8 @@ SVGSVGElement::SVGSVGElement(DOM::Document& document, DOM::QualifiedName qualifi
void SVGSVGElement::initialize(JS::Realm& realm)
{
Base::initialize(realm);
WEB_SET_PROTOTYPE_FOR_INTERFACE(SVGSVGElement);
Base::initialize(realm);
m_view_box_for_bindings = realm.create<SVGAnimatedRect>(realm);
}

View file

@ -24,8 +24,8 @@ SVGScriptElement::SVGScriptElement(DOM::Document& document, DOM::QualifiedName q
void SVGScriptElement::initialize(JS::Realm& realm)
{
Base::initialize(realm);
WEB_SET_PROTOTYPE_FOR_INTERFACE(SVGScriptElement);
Base::initialize(realm);
}
void SVGScriptElement::visit_edges(Cell::Visitor& visitor)

View file

@ -79,8 +79,8 @@ GC::Ref<SVGAnimatedNumber> SVGStopElement::offset() const
void SVGStopElement::initialize(JS::Realm& realm)
{
Base::initialize(realm);
WEB_SET_PROTOTYPE_FOR_INTERFACE(SVGStopElement);
Base::initialize(realm);
}
}

View file

@ -20,8 +20,8 @@ SVGStyleElement::~SVGStyleElement() = default;
void SVGStyleElement::initialize(JS::Realm& realm)
{
Base::initialize(realm);
WEB_SET_PROTOTYPE_FOR_INTERFACE(SVGStyleElement);
Base::initialize(realm);
}
void SVGStyleElement::visit_edges(Cell::Visitor& visitor)

View file

@ -28,8 +28,8 @@ SVGSymbolElement::SVGSymbolElement(DOM::Document& document, DOM::QualifiedName q
void SVGSymbolElement::initialize(JS::Realm& realm)
{
Base::initialize(realm);
WEB_SET_PROTOTYPE_FOR_INTERFACE(SVGSymbolElement);
Base::initialize(realm);
m_view_box_for_bindings = realm.create<SVGAnimatedRect>(realm);
}

View file

@ -20,8 +20,8 @@ SVGTSpanElement::SVGTSpanElement(DOM::Document& document, DOM::QualifiedName qua
void SVGTSpanElement::initialize(JS::Realm& realm)
{
Base::initialize(realm);
WEB_SET_PROTOTYPE_FOR_INTERFACE(SVGTSpanElement);
Base::initialize(realm);
}
GC::Ptr<Layout::Node> SVGTSpanElement::create_layout_node(GC::Ref<CSS::ComputedProperties> style)

View file

@ -26,8 +26,8 @@ SVGTextContentElement::SVGTextContentElement(DOM::Document& document, DOM::Quali
void SVGTextContentElement::initialize(JS::Realm& realm)
{
Base::initialize(realm);
WEB_SET_PROTOTYPE_FOR_INTERFACE(SVGTextContentElement);
Base::initialize(realm);
}
Optional<TextAnchor> SVGTextContentElement::text_anchor() const

View file

@ -19,8 +19,8 @@ SVGTextElement::SVGTextElement(DOM::Document& document, DOM::QualifiedName quali
void SVGTextElement::initialize(JS::Realm& realm)
{
Base::initialize(realm);
WEB_SET_PROTOTYPE_FOR_INTERFACE(SVGTextElement);
Base::initialize(realm);
}
GC::Ptr<Layout::Node> SVGTextElement::create_layout_node(GC::Ref<CSS::ComputedProperties> style)

View file

@ -32,8 +32,8 @@ GC::Ptr<SVGGeometryElement const> SVGTextPathElement::path_or_shape() const
void SVGTextPathElement::initialize(JS::Realm& realm)
{
Base::initialize(realm);
WEB_SET_PROTOTYPE_FOR_INTERFACE(SVGTextPathElement);
Base::initialize(realm);
}
void SVGTextPathElement::visit_edges(Cell::Visitor& visitor)

View file

@ -25,8 +25,8 @@ SVGTextPositioningElement::SVGTextPositioningElement(DOM::Document& document, DO
void SVGTextPositioningElement::initialize(JS::Realm& realm)
{
Base::initialize(realm);
WEB_SET_PROTOTYPE_FOR_INTERFACE(SVGTextPositioningElement);
Base::initialize(realm);
}
void SVGTextPositioningElement::attribute_changed(FlyString const& name, Optional<String> const& old_value, Optional<String> const& value, Optional<FlyString> const& namespace_)

View file

@ -21,8 +21,8 @@ SVGTitleElement::SVGTitleElement(DOM::Document& document, DOM::QualifiedName qua
void SVGTitleElement::initialize(JS::Realm& realm)
{
Base::initialize(realm);
WEB_SET_PROTOTYPE_FOR_INTERFACE(SVGTitleElement);
Base::initialize(realm);
}
GC::Ptr<Layout::Node> SVGTitleElement::create_layout_node(GC::Ref<CSS::ComputedProperties>)

View file

@ -27,8 +27,8 @@ SVGTransform::~SVGTransform() = default;
void SVGTransform::initialize(JS::Realm& realm)
{
Base::initialize(realm);
WEB_SET_PROTOTYPE_FOR_INTERFACE(SVGTransform);
Base::initialize(realm);
}
// https://svgwg.org/svg2-draft/single-page.html#coords-__svg__SVGTransform__type

View file

@ -59,8 +59,8 @@ GC::Ref<SVGTransform> SVGTransformList::append_item(GC::Ref<SVGTransform> new_it
void SVGTransformList::initialize(JS::Realm& realm)
{
Base::initialize(realm);
WEB_SET_PROTOTYPE_FOR_INTERFACE(SVGTransformList);
Base::initialize(realm);
}
void SVGTransformList::visit_edges(Cell::Visitor& visitor)

View file

@ -33,8 +33,8 @@ SVGUseElement::SVGUseElement(DOM::Document& document, DOM::QualifiedName qualifi
void SVGUseElement::initialize(JS::Realm& realm)
{
Base::initialize(realm);
WEB_SET_PROTOTYPE_FOR_INTERFACE(SVGUseElement);
Base::initialize(realm);
// The shadow tree is open (inspectable by script), but read-only.
auto shadow_root = realm.create<DOM::ShadowRoot>(document(), *this, Bindings::ShadowRootMode::Open);