1
0
Fork 0
mirror of https://github.com/LadybirdBrowser/ladybird.git synced 2025-06-08 05:27:14 +09:00
ladybird/Libraries/LibWeb/SVG/SVGAnimatedEnumeration.cpp
Andreas Kling a6dfc74e93 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.
2025-04-20 18:43:11 +02:00

67 lines
2.2 KiB
C++

/*
* Copyright (c) 2025, Jelle Raaijmakers <jelle@ladybird.org>
*
* SPDX-License-Identifier: BSD-2-Clause
*/
#include <LibWeb/Bindings/Intrinsics.h>
#include <LibWeb/Bindings/SVGAnimatedEnumerationPrototype.h>
#include <LibWeb/SVG/SVGAnimatedEnumeration.h>
#include <LibWeb/WebIDL/ExceptionOr.h>
namespace Web::SVG {
GC_DEFINE_ALLOCATOR(SVGAnimatedEnumeration);
GC::Ref<SVGAnimatedEnumeration> SVGAnimatedEnumeration::create(JS::Realm& realm, u16 value)
{
return realm.create<SVGAnimatedEnumeration>(realm, value);
}
SVGAnimatedEnumeration::SVGAnimatedEnumeration(JS::Realm& realm, u16 value)
: PlatformObject(realm)
, m_value(value)
{
}
SVGAnimatedEnumeration::~SVGAnimatedEnumeration() = default;
// https://svgwg.org/svg2-draft/types.html#__svg__SVGAnimatedEnumeration__baseVal
WebIDL::ExceptionOr<void> SVGAnimatedEnumeration::set_base_val(u16 base_val)
{
// 1. Let value be the value being assigned to baseVal.
auto value = base_val;
// FIXME: 2. If value is 0 or is not the numeric type value for any value of the reflected attribute, then throw a
// TypeError.
if (value == 0)
return WebIDL::SimpleException { WebIDL::SimpleExceptionType::TypeError, "invalid value for baseVal"sv };
// FIXME: 3. Otherwise, if the reflecting IDL attribute is orientType and value is SVG_MARKER_ORIENT_ANGLE, then set the
// reflected attribute to the string "0".
// FIXME: 4. Otherwise, value is the numeric type value for a specific, single keyword value for the reflected attribute.
// Set the reflected attribute to that value.
m_value = value;
return {};
}
void SVGAnimatedEnumeration::initialize(JS::Realm& realm)
{
WEB_SET_PROTOTYPE_FOR_INTERFACE(SVGAnimatedEnumeration);
Base::initialize(realm);
}
// https://svgwg.org/svg2-draft/types.html#__svg__SVGAnimatedEnumeration__baseVal
u16 SVGAnimatedEnumeration::base_or_anim_value() const
{
// FIXME: 1. Let value be the value of the reflected attribute (using the attribute's initial value if it is not present or
// invalid).
// FIXME: 2. Return the numeric type value for value, according to the reflecting IDL attribute's definition.
return m_value;
}
}