/* * Copyright (c) 2023, Tim Flynn * * SPDX-License-Identifier: BSD-2-Clause */ #pragma once #include #include #include #include #include namespace Web::HTML { class AudioTrackList final : public DOM::EventTarget { WEB_PLATFORM_OBJECT(AudioTrackList, DOM::EventTarget); JS_DECLARE_ALLOCATOR(AudioTrackList); public: void add_track(Badge, JS::NonnullGCPtr); void remove_all_tracks(Badge); // https://html.spec.whatwg.org/multipage/media.html#dom-audiotracklist-length size_t length() const { return m_audio_tracks.size(); } JS::GCPtr get_track_by_id(StringView id) const; bool has_enabled_track() const; template void for_each_enabled_track(Callback&& callback) { for (auto& audio_track : m_audio_tracks) { if (audio_track->enabled()) callback(*audio_track); } } void set_onchange(WebIDL::CallbackType*); WebIDL::CallbackType* onchange(); void set_onaddtrack(WebIDL::CallbackType*); WebIDL::CallbackType* onaddtrack(); void set_onremovetrack(WebIDL::CallbackType*); WebIDL::CallbackType* onremovetrack(); private: explicit AudioTrackList(JS::Realm&); virtual void visit_edges(Visitor&) override; virtual void initialize(JS::Realm&) override; virtual JS::ThrowCompletionOr> internal_get_own_property(JS::PropertyKey const& property_name) const override; Vector> m_audio_tracks; }; }