ladybird/Libraries/LibWeb/HTML/TextTrackList.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

111 lines
3.6 KiB
C++

/*
* Copyright (c) 2024, Jamie Mansfield <jmansfield@cadixdev.org>
*
* SPDX-License-Identifier: BSD-2-Clause
*/
#include <LibJS/Runtime/Realm.h>
#include <LibWeb/Bindings/Intrinsics.h>
#include <LibWeb/Bindings/TextTrackListPrototype.h>
#include <LibWeb/HTML/EventNames.h>
#include <LibWeb/HTML/TextTrackList.h>
namespace Web::HTML {
GC_DEFINE_ALLOCATOR(TextTrackList);
TextTrackList::TextTrackList(JS::Realm& realm)
: DOM::EventTarget(realm, MayInterfereWithIndexedPropertyAccess::Yes)
{
}
TextTrackList::~TextTrackList() = default;
void TextTrackList::initialize(JS::Realm& realm)
{
WEB_SET_PROTOTYPE_FOR_INTERFACE(TextTrackList);
Base::initialize(realm);
}
void TextTrackList::visit_edges(JS::Cell::Visitor& visitor)
{
Base::visit_edges(visitor);
visitor.visit(m_text_tracks);
}
// https://html.spec.whatwg.org/multipage/media.html#dom-texttracklist-item
JS::ThrowCompletionOr<Optional<JS::PropertyDescriptor>> TextTrackList::internal_get_own_property(const JS::PropertyKey& property_name) const
{
// To determine the value of an indexed property of a TextTrackList object for a given index index, the user
// agent must return the indexth text track in the list represented by the TextTrackList object.
if (property_name.is_number()) {
if (auto index = property_name.as_number(); index < m_text_tracks.size()) {
JS::PropertyDescriptor descriptor;
descriptor.value = m_text_tracks.at(index);
return descriptor;
}
}
return Base::internal_get_own_property(property_name);
}
// https://html.spec.whatwg.org/multipage/media.html#dom-texttracklist-length
size_t TextTrackList::length() const
{
return m_text_tracks.size();
}
// https://html.spec.whatwg.org/multipage/media.html#dom-texttracklist-gettrackbyid
GC::Ptr<TextTrack> TextTrackList::get_track_by_id(StringView id) const
{
// The getTrackById(id) method must return the first TextTrack in the TextTrackList object whose id
// IDL attribute would return a value equal to the value of the id argument.
auto it = m_text_tracks.find_if([&](auto const& text_track) {
return text_track->id() == id;
});
// When no tracks match the given argument, the method must return null.
if (it == m_text_tracks.end())
return nullptr;
return *it;
}
// https://html.spec.whatwg.org/multipage/media.html#handler-texttracklist-onchange
void TextTrackList::set_onchange(WebIDL::CallbackType* event_handler)
{
set_event_handler_attribute(HTML::EventNames::change, event_handler);
}
// https://html.spec.whatwg.org/multipage/media.html#handler-texttracklist-onchange
WebIDL::CallbackType* TextTrackList::onchange()
{
return event_handler_attribute(HTML::EventNames::change);
}
// https://html.spec.whatwg.org/multipage/media.html#handler-texttracklist-onaddtrack
void TextTrackList::set_onaddtrack(WebIDL::CallbackType* event_handler)
{
set_event_handler_attribute(HTML::EventNames::addtrack, event_handler);
}
// https://html.spec.whatwg.org/multipage/media.html#handler-texttracklist-onaddtrack
WebIDL::CallbackType* TextTrackList::onaddtrack()
{
return event_handler_attribute(HTML::EventNames::addtrack);
}
// https://html.spec.whatwg.org/multipage/media.html#handler-texttracklist-onremovetrack
void TextTrackList::set_onremovetrack(WebIDL::CallbackType* event_handler)
{
set_event_handler_attribute(HTML::EventNames::removetrack, event_handler);
}
// https://html.spec.whatwg.org/multipage/media.html#handler-texttracklist-onremovetrack
WebIDL::CallbackType* TextTrackList::onremovetrack()
{
return event_handler_attribute(HTML::EventNames::removetrack);
}
}