Files
ladybird/Libraries/LibWeb/HTML/VideoTrackList.h
Zaggy1024 04cc5bced9 LibWeb: Update video elements' natural dimensions during playback
This tightens the implementation of video element sizing to the spec by
implementing two spec concepts:
- The media resource's natural width and height, and
- The video element's natural width and height.
The element's natural dimensions change based on the representation,
which has many inputs, so update checks are triggered from many
locations.

The resize event is fired when the media resource's natural dimensions
change, and the layout is invalidated if the element's natural
dimensions change.

Tests for a few important resize triggers have been added.
2026-04-21 19:11:24 -05:00

66 lines
1.8 KiB
C++

/*
* Copyright (c) 2023, Tim Flynn <trflynn89@serenityos.org>
*
* SPDX-License-Identifier: BSD-2-Clause
*/
#pragma once
#include <AK/Badge.h>
#include <AK/String.h>
#include <LibGC/RootVector.h>
#include <LibWeb/DOM/EventTarget.h>
#include <LibWeb/HTML/VideoTrack.h>
namespace Web::HTML {
class VideoTrackList final : public DOM::EventTarget {
WEB_PLATFORM_OBJECT(VideoTrackList, DOM::EventTarget);
GC_DECLARE_ALLOCATOR(VideoTrackList);
public:
void add_track(GC::Ref<VideoTrack>);
void remove_all_tracks();
Span<GC::Ref<VideoTrack>> video_tracks() { return m_video_tracks; }
// https://html.spec.whatwg.org/multipage/media.html#dom-videotracklist-length
size_t length() const { return m_video_tracks.size(); }
GC::Ptr<VideoTrack> get_track_by_id(StringView id) const;
i32 selected_index() const;
template<typename Callback>
void for_each_track(Callback&& callback)
{
for (auto& video_track : m_video_tracks) {
auto iteration_decision = callback(*video_track);
if (iteration_decision == IterationDecision::Break)
break;
}
}
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 VideoTrackList(JS::Realm&, GC::Ptr<HTMLMediaElement> = nullptr);
virtual void visit_edges(Visitor&) override;
virtual void initialize(JS::Realm&) override;
virtual JS::ThrowCompletionOr<Optional<JS::PropertyDescriptor>> internal_get_own_property(JS::PropertyKey const& property_name) const override;
GC::Ptr<HTMLMediaElement> m_media_element;
Vector<GC::Ref<VideoTrack>> m_video_tracks;
};
}