From 0b2449d8d264f58b39ed2a4a69b0afb8eb762011 Mon Sep 17 00:00:00 2001 From: Jamie Mansfield Date: Thu, 19 Sep 2024 19:41:57 +0100 Subject: [PATCH] LibWeb/HTML: Implement TextTrackCue idl interface --- .../Text/expected/all-window-properties.txt | 1 + Userland/Libraries/LibWeb/CMakeLists.txt | 1 + Userland/Libraries/LibWeb/Forward.h | 1 + Userland/Libraries/LibWeb/HTML/EventNames.h | 2 + .../Libraries/LibWeb/HTML/TextTrackCue.cpp | 89 +++++++++++++++++++ Userland/Libraries/LibWeb/HTML/TextTrackCue.h | 64 +++++++++++++ .../Libraries/LibWeb/HTML/TextTrackCue.idl | 15 ++++ Userland/Libraries/LibWeb/idl_files.cmake | 1 + 8 files changed, 174 insertions(+) create mode 100644 Userland/Libraries/LibWeb/HTML/TextTrackCue.cpp create mode 100644 Userland/Libraries/LibWeb/HTML/TextTrackCue.h create mode 100644 Userland/Libraries/LibWeb/HTML/TextTrackCue.idl diff --git a/Tests/LibWeb/Text/expected/all-window-properties.txt b/Tests/LibWeb/Text/expected/all-window-properties.txt index d48e72a3729..533ecd18bc3 100644 --- a/Tests/LibWeb/Text/expected/all-window-properties.txt +++ b/Tests/LibWeb/Text/expected/all-window-properties.txt @@ -344,6 +344,7 @@ TextDecoder TextEncoder TextMetrics TextTrack +TextTrackCue TextTrackList TimeRanges ToggleEvent diff --git a/Userland/Libraries/LibWeb/CMakeLists.txt b/Userland/Libraries/LibWeb/CMakeLists.txt index 05e8807b47b..55fe2abe624 100644 --- a/Userland/Libraries/LibWeb/CMakeLists.txt +++ b/Userland/Libraries/LibWeb/CMakeLists.txt @@ -462,6 +462,7 @@ set(SOURCES HTML/TagNames.cpp HTML/TextMetrics.cpp HTML/TextTrack.cpp + HTML/TextTrackCue.cpp HTML/TextTrackList.cpp HTML/Timer.cpp HTML/TimeRanges.cpp diff --git a/Userland/Libraries/LibWeb/Forward.h b/Userland/Libraries/LibWeb/Forward.h index 80cbaf04c2a..634ff8fc811 100644 --- a/Userland/Libraries/LibWeb/Forward.h +++ b/Userland/Libraries/LibWeb/Forward.h @@ -496,6 +496,7 @@ class Storage; class SubmitEvent; class TextMetrics; class TextTrack; +class TextTrackCue; class TextTrackList; class Timer; class TimeRanges; diff --git a/Userland/Libraries/LibWeb/HTML/EventNames.h b/Userland/Libraries/LibWeb/HTML/EventNames.h index a061c0f31cb..d048674767a 100644 --- a/Userland/Libraries/LibWeb/HTML/EventNames.h +++ b/Userland/Libraries/LibWeb/HTML/EventNames.h @@ -52,7 +52,9 @@ namespace Web::HTML::EventNames { __ENUMERATE_HTML_EVENT(durationchange) \ __ENUMERATE_HTML_EVENT(emptied) \ __ENUMERATE_HTML_EVENT(ended) \ + __ENUMERATE_HTML_EVENT(enter) \ __ENUMERATE_HTML_EVENT(error) \ + __ENUMERATE_HTML_EVENT(exit) \ __ENUMERATE_HTML_EVENT(finish) \ __ENUMERATE_HTML_EVENT(focus) \ __ENUMERATE_HTML_EVENT(focusin) \ diff --git a/Userland/Libraries/LibWeb/HTML/TextTrackCue.cpp b/Userland/Libraries/LibWeb/HTML/TextTrackCue.cpp new file mode 100644 index 00000000000..5713c5e91f6 --- /dev/null +++ b/Userland/Libraries/LibWeb/HTML/TextTrackCue.cpp @@ -0,0 +1,89 @@ +/* + * Copyright (c) 2024, Jamie Mansfield + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#include +#include +#include +#include +#include +#include + +namespace Web::HTML { + +JS_DEFINE_ALLOCATOR(TextTrackCue); + +TextTrackCue::TextTrackCue(JS::Realm& realm, JS::GCPtr track) + : DOM::EventTarget(realm) + , m_track(track) +{ +} + +TextTrackCue::~TextTrackCue() = default; + +void TextTrackCue::initialize(JS::Realm& realm) +{ + Base::initialize(realm); + WEB_SET_PROTOTYPE_FOR_INTERFACE(TextTrackCue); +} + +void TextTrackCue::visit_edges(JS::Cell::Visitor& visitor) +{ + Base::visit_edges(visitor); + visitor.visit(m_track); +} + +// https://html.spec.whatwg.org/multipage/media.html#dom-texttrackcue-starttime +void TextTrackCue::set_start_time(double start_time) +{ + // On setting, the text track cue start time must be set to the new value, interpreted in seconds; + m_start_time = start_time; + + // FIXME: then, if the TextTrackCue object's text track cue is in a text track's list of cues, and that text track is in a media + // element's list of text tracks, and the media element's show poster flag is not set, then run the time marches on steps + // for that media element. +} + +// https://html.spec.whatwg.org/multipage/media.html#dom-texttrackcue-endtime +WebIDL::ExceptionOr TextTrackCue::set_end_time(double end_time) +{ + // On setting, if the new value is negative Infinity or a Not-a-Number (NaN) value, then throw a TypeError exception. + if (end_time == -AK::Infinity || isnan(end_time)) + return WebIDL::SimpleException { WebIDL::SimpleExceptionType::TypeError, "Value is negative infinity or NaN"_string }; + + // Otherwise, the text track cue end time must be set to the new value. + m_end_time = end_time; + + // FIXME: Then, if the TextTrackCue object's text track cue is in a text track's list of cues, and that text track is in a media + // element's list of text tracks, and the media element's show poster flag is not set, then run the time marches on steps + // for that media element. + return {}; +} + +// https://html.spec.whatwg.org/multipage/media.html#handler-texttrackcue-onenter +WebIDL::CallbackType* TextTrackCue::onenter() +{ + return event_handler_attribute(HTML::EventNames::enter); +} + +// https://html.spec.whatwg.org/multipage/media.html#handler-texttrackcue-onenter +void TextTrackCue::set_onenter(WebIDL::CallbackType* event_handler) +{ + set_event_handler_attribute(HTML::EventNames::enter, event_handler); +} + +// https://html.spec.whatwg.org/multipage/media.html#handler-texttrackcue-onexit +WebIDL::CallbackType* TextTrackCue::onexit() +{ + return event_handler_attribute(HTML::EventNames::exit); +} + +// https://html.spec.whatwg.org/multipage/media.html#handler-texttrackcue-onexit +void TextTrackCue::set_onexit(WebIDL::CallbackType* event_handler) +{ + set_event_handler_attribute(HTML::EventNames::exit, event_handler); +} + +} diff --git a/Userland/Libraries/LibWeb/HTML/TextTrackCue.h b/Userland/Libraries/LibWeb/HTML/TextTrackCue.h new file mode 100644 index 00000000000..946e03f81f2 --- /dev/null +++ b/Userland/Libraries/LibWeb/HTML/TextTrackCue.h @@ -0,0 +1,64 @@ +/* + * Copyright (c) 2024, Jamie Mansfield + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#pragma once + +#include +#include +#include + +namespace Web::HTML { + +// https://html.spec.whatwg.org/multipage/media.html#texttrackcue +class TextTrackCue : public DOM::EventTarget { + WEB_PLATFORM_OBJECT(TextTrackCue, DOM::EventTarget); + JS_DECLARE_ALLOCATOR(TextTrackCue); + +public: + virtual ~TextTrackCue() override; + + JS::GCPtr track() { return m_track; } + + String const& id() const { return m_identifier; } + void set_id(String const& id) { m_identifier = id; } + + double start_time() const { return m_start_time; } + void set_start_time(double start_time); + + double end_time() const { return m_end_time; } + WebIDL::ExceptionOr set_end_time(double end_time); + + bool pause_on_exit() const { return m_pause_on_exit; } + void set_pause_on_exit(bool pause_on_exit) { m_pause_on_exit = pause_on_exit; } + + WebIDL::CallbackType* onenter(); + void set_onenter(WebIDL::CallbackType*); + + WebIDL::CallbackType* onexit(); + void set_onexit(WebIDL::CallbackType*); + +protected: + TextTrackCue(JS::Realm&, JS::GCPtr); + + virtual void initialize(JS::Realm&) override; + virtual void visit_edges(Visitor&) override; + + JS::GCPtr m_track; + + // https://html.spec.whatwg.org/multipage/media.html#text-track-cue-identifier + String m_identifier; + + // https://html.spec.whatwg.org/multipage/media.html#text-track-cue-start-time + double m_start_time; + + // https://html.spec.whatwg.org/multipage/media.html#text-track-cue-end-time + double m_end_time; + + // https://html.spec.whatwg.org/multipage/media.html#text-track-cue-pause-on-exit-flag + bool m_pause_on_exit; +}; + +} diff --git a/Userland/Libraries/LibWeb/HTML/TextTrackCue.idl b/Userland/Libraries/LibWeb/HTML/TextTrackCue.idl new file mode 100644 index 00000000000..e46443705f6 --- /dev/null +++ b/Userland/Libraries/LibWeb/HTML/TextTrackCue.idl @@ -0,0 +1,15 @@ +#import + +// https://html.spec.whatwg.org/multipage/media.html#texttrackcue +[Exposed=Window] +interface TextTrackCue : EventTarget { + readonly attribute TextTrack? track; + + attribute DOMString id; + attribute double startTime; + attribute unrestricted double endTime; + attribute boolean pauseOnExit; + + attribute EventHandler onenter; + attribute EventHandler onexit; +}; diff --git a/Userland/Libraries/LibWeb/idl_files.cmake b/Userland/Libraries/LibWeb/idl_files.cmake index c51992daac4..301e045067e 100644 --- a/Userland/Libraries/LibWeb/idl_files.cmake +++ b/Userland/Libraries/LibWeb/idl_files.cmake @@ -222,6 +222,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/TextTrackCue) libweb_js_bindings(HTML/TextTrackList) libweb_js_bindings(HTML/TimeRanges) libweb_js_bindings(HTML/ToggleEvent)