From ecad28657a0941c99870bdb72f3a6f09b6db6ee3 Mon Sep 17 00:00:00 2001 From: Jamie Mansfield Date: Sun, 9 Jun 2024 11:07:41 +0100 Subject: [PATCH] LibWeb/HTML: Implement TextTrackList IDL interface --- .../BindingsGenerator/IDLGenerators.cpp | 1 + .../Userland/Libraries/LibWeb/HTML/BUILD.gn | 1 + .../Userland/Libraries/LibWeb/idl_files.gni | 1 + .../Text/expected/all-window-properties.txt | 1 + Userland/Libraries/LibWeb/CMakeLists.txt | 1 + Userland/Libraries/LibWeb/Forward.h | 1 + .../Libraries/LibWeb/HTML/TextTrackList.cpp | 111 ++++++++++++++++++ .../Libraries/LibWeb/HTML/TextTrackList.h | 46 ++++++++ .../Libraries/LibWeb/HTML/TextTrackList.idl | 13 ++ Userland/Libraries/LibWeb/idl_files.cmake | 1 + 10 files changed, 177 insertions(+) create mode 100644 Userland/Libraries/LibWeb/HTML/TextTrackList.cpp create mode 100644 Userland/Libraries/LibWeb/HTML/TextTrackList.h create mode 100644 Userland/Libraries/LibWeb/HTML/TextTrackList.idl diff --git a/Meta/Lagom/Tools/CodeGenerators/LibWeb/BindingsGenerator/IDLGenerators.cpp b/Meta/Lagom/Tools/CodeGenerators/LibWeb/BindingsGenerator/IDLGenerators.cpp index 6c58252b9fb..5af3d976bfe 100644 --- a/Meta/Lagom/Tools/CodeGenerators/LibWeb/BindingsGenerator/IDLGenerators.cpp +++ b/Meta/Lagom/Tools/CodeGenerators/LibWeb/BindingsGenerator/IDLGenerators.cpp @@ -85,6 +85,7 @@ static bool is_platform_object(Type const& type) "Table"sv, "Text"sv, "TextMetrics"sv, + "TextTrack"sv, "URLSearchParams"sv, "VideoTrack"sv, "VideoTrackList"sv, diff --git a/Meta/gn/secondary/Userland/Libraries/LibWeb/HTML/BUILD.gn b/Meta/gn/secondary/Userland/Libraries/LibWeb/HTML/BUILD.gn index 97ae5c19333..e5d5ab1248c 100644 --- a/Meta/gn/secondary/Userland/Libraries/LibWeb/HTML/BUILD.gn +++ b/Meta/gn/secondary/Userland/Libraries/LibWeb/HTML/BUILD.gn @@ -164,6 +164,7 @@ source_set("HTML") { "TagNames.cpp", "TextMetrics.cpp", "TextTrack.cpp", + "TextTrackList.cpp", "TimeRanges.cpp", "Timer.cpp", "ToggleEvent.cpp", diff --git a/Meta/gn/secondary/Userland/Libraries/LibWeb/idl_files.gni b/Meta/gn/secondary/Userland/Libraries/LibWeb/idl_files.gni index e20c73f0a0d..e8c3409886e 100644 --- a/Meta/gn/secondary/Userland/Libraries/LibWeb/idl_files.gni +++ b/Meta/gn/secondary/Userland/Libraries/LibWeb/idl_files.gni @@ -225,6 +225,7 @@ standard_idl_files = [ "//Userland/Libraries/LibWeb/HTML/SubmitEvent.idl", "//Userland/Libraries/LibWeb/HTML/TextMetrics.idl", "//Userland/Libraries/LibWeb/HTML/TextTrack.idl", + "//Userland/Libraries/LibWeb/HTML/TextTrackList.idl", "//Userland/Libraries/LibWeb/HTML/TimeRanges.idl", "//Userland/Libraries/LibWeb/HTML/ToggleEvent.idl", "//Userland/Libraries/LibWeb/HTML/TrackEvent.idl", diff --git a/Tests/LibWeb/Text/expected/all-window-properties.txt b/Tests/LibWeb/Text/expected/all-window-properties.txt index ba370e465da..0890ce11ffc 100644 --- a/Tests/LibWeb/Text/expected/all-window-properties.txt +++ b/Tests/LibWeb/Text/expected/all-window-properties.txt @@ -323,6 +323,7 @@ TextDecoder TextEncoder TextMetrics TextTrack +TextTrackList TimeRanges ToggleEvent TrackEvent diff --git a/Userland/Libraries/LibWeb/CMakeLists.txt b/Userland/Libraries/LibWeb/CMakeLists.txt index c2445c66511..44b4cbe81ff 100644 --- a/Userland/Libraries/LibWeb/CMakeLists.txt +++ b/Userland/Libraries/LibWeb/CMakeLists.txt @@ -432,6 +432,7 @@ set(SOURCES HTML/TagNames.cpp HTML/TextMetrics.cpp HTML/TextTrack.cpp + HTML/TextTrackList.cpp HTML/Timer.cpp HTML/TimeRanges.cpp HTML/ToggleEvent.cpp diff --git a/Userland/Libraries/LibWeb/Forward.h b/Userland/Libraries/LibWeb/Forward.h index 8c8c00b24c5..194f9449cec 100644 --- a/Userland/Libraries/LibWeb/Forward.h +++ b/Userland/Libraries/LibWeb/Forward.h @@ -470,6 +470,7 @@ class Storage; class SubmitEvent; class TextMetrics; class TextTrack; +class TextTrackList; class Timer; class TimeRanges; class ToggleEvent; diff --git a/Userland/Libraries/LibWeb/HTML/TextTrackList.cpp b/Userland/Libraries/LibWeb/HTML/TextTrackList.cpp new file mode 100644 index 00000000000..ad0d85f357a --- /dev/null +++ b/Userland/Libraries/LibWeb/HTML/TextTrackList.cpp @@ -0,0 +1,111 @@ +/* + * Copyright (c) 2024, Jamie Mansfield + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#include +#include +#include +#include +#include + +namespace Web::HTML { + +JS_DEFINE_ALLOCATOR(TextTrackList); + +TextTrackList::TextTrackList(JS::Realm& realm) + : DOM::EventTarget(realm, MayInterfereWithIndexedPropertyAccess::Yes) +{ +} + +TextTrackList::~TextTrackList() = default; + +void TextTrackList::initialize(JS::Realm& realm) +{ + Base::initialize(realm); + WEB_SET_PROTOTYPE_FOR_INTERFACE(TextTrackList); +} + +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> 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 +JS::GCPtr 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); +} + +} diff --git a/Userland/Libraries/LibWeb/HTML/TextTrackList.h b/Userland/Libraries/LibWeb/HTML/TextTrackList.h new file mode 100644 index 00000000000..5b63a578d9d --- /dev/null +++ b/Userland/Libraries/LibWeb/HTML/TextTrackList.h @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2024, Jamie Mansfield + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#pragma once + +#include +#include +#include + +namespace Web::HTML { + +class TextTrackList final : public DOM::EventTarget { + WEB_PLATFORM_OBJECT(TextTrackList, DOM::EventTarget); + JS_DECLARE_ALLOCATOR(TextTrackList); + +public: + virtual ~TextTrackList() override; + + size_t length() const; + + JS::GCPtr get_track_by_id(StringView id) const; + + 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: + TextTrackList(JS::Realm&); + + virtual void initialize(JS::Realm&) override; + virtual void visit_edges(Visitor&) override; + + virtual JS::ThrowCompletionOr> internal_get_own_property(JS::PropertyKey const& property_name) const override; + + Vector> m_text_tracks; +}; + +} diff --git a/Userland/Libraries/LibWeb/HTML/TextTrackList.idl b/Userland/Libraries/LibWeb/HTML/TextTrackList.idl new file mode 100644 index 00000000000..3323a8ceb4e --- /dev/null +++ b/Userland/Libraries/LibWeb/HTML/TextTrackList.idl @@ -0,0 +1,13 @@ +#import + +// https://html.spec.whatwg.org/multipage/media.html#texttracklist +[Exposed=Window] +interface TextTrackList : EventTarget { + readonly attribute unsigned long length; + getter TextTrack (unsigned long index); + TextTrack? getTrackById(DOMString id); + + attribute EventHandler onchange; + attribute EventHandler onaddtrack; + attribute EventHandler onremovetrack; +}; diff --git a/Userland/Libraries/LibWeb/idl_files.cmake b/Userland/Libraries/LibWeb/idl_files.cmake index 3827757a1ee..21590d1f944 100644 --- a/Userland/Libraries/LibWeb/idl_files.cmake +++ b/Userland/Libraries/LibWeb/idl_files.cmake @@ -209,6 +209,7 @@ libweb_js_bindings(HTML/Storage) libweb_js_bindings(HTML/SubmitEvent) libweb_js_bindings(HTML/TextMetrics) libweb_js_bindings(HTML/TextTrack) +libweb_js_bindings(HTML/TextTrackList) libweb_js_bindings(HTML/TimeRanges) libweb_js_bindings(HTML/ToggleEvent) libweb_js_bindings(HTML/TrackEvent)