1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-25 15:47:44 +00:00

LibWeb: Implement TrackEvent for media events

This commit is contained in:
Timothy Flynn 2023-04-04 09:28:59 -04:00 committed by Linus Groh
parent 3f1badf9b2
commit 460e1bd072
6 changed files with 92 additions and 0 deletions

View file

@ -343,6 +343,7 @@ set(SOURCES
HTML/TagNames.cpp
HTML/TextMetrics.cpp
HTML/Timer.cpp
HTML/TrackEvent.cpp
HTML/VideoTrack.cpp
HTML/VideoTrackList.cpp
HTML/Window.cpp

View file

@ -355,6 +355,7 @@ class Storage;
class SubmitEvent;
class TextMetrics;
class Timer;
class TrackEvent;
class VideoTrack;
class VideoTrackList;
class Window;

View file

@ -0,0 +1,37 @@
/*
* Copyright (c) 2023, Tim Flynn <trflynn89@serenityos.org>
*
* SPDX-License-Identifier: BSD-2-Clause
*/
#include <LibWeb/Bindings/Intrinsics.h>
#include <LibWeb/Bindings/TrackEventPrototype.h>
#include <LibWeb/HTML/TrackEvent.h>
namespace Web::HTML {
WebIDL::ExceptionOr<JS::NonnullGCPtr<TrackEvent>> TrackEvent::create(JS::Realm& realm, FlyString const& event_name, TrackEventInit const& event_init)
{
return MUST_OR_THROW_OOM(realm.heap().allocate<TrackEvent>(realm, realm, event_name, event_init));
}
WebIDL::ExceptionOr<JS::NonnullGCPtr<TrackEvent>> TrackEvent::construct_impl(JS::Realm& realm, FlyString const& event_name, TrackEventInit const& event_init)
{
return create(realm, event_name, event_init);
}
TrackEvent::TrackEvent(JS::Realm& realm, FlyString const& event_name, TrackEventInit const& event_init)
: DOM::Event(realm, event_name.to_deprecated_fly_string(), event_init)
, m_track(event_init.track)
{
}
JS::ThrowCompletionOr<void> TrackEvent::initialize(JS::Realm& realm)
{
MUST_OR_THROW_OOM(Base::initialize(realm));
set_prototype(&Bindings::ensure_web_prototype<Bindings::TrackEventPrototype>(realm, "TrackEvent"));
return {};
}
}

View file

@ -0,0 +1,36 @@
/*
* Copyright (c) 2023, Tim Flynn <trflynn89@serenityos.org>
*
* SPDX-License-Identifier: BSD-2-Clause
*/
#pragma once
#include <AK/FlyString.h>
#include <LibWeb/DOM/Event.h>
namespace Web::HTML {
struct TrackEventInit : public DOM::EventInit {
JS::GCPtr<VideoTrack> track;
};
class TrackEvent : public DOM::Event {
WEB_PLATFORM_OBJECT(TrackEvent, DOM::Event);
public:
static WebIDL::ExceptionOr<JS::NonnullGCPtr<TrackEvent>> create(JS::Realm&, FlyString const& event_name, TrackEventInit const& event_init = {});
static WebIDL::ExceptionOr<JS::NonnullGCPtr<TrackEvent>> construct_impl(JS::Realm&, FlyString const& event_name, TrackEventInit const& event_init);
// https://html.spec.whatwg.org/multipage/media.html#dom-trackevent-track
JS::GCPtr<VideoTrack> track() const { return m_track; }
private:
TrackEvent(JS::Realm&, FlyString const& event_name, TrackEventInit const& event_init);
virtual JS::ThrowCompletionOr<void> initialize(JS::Realm&) override;
JS::GCPtr<VideoTrack> m_track;
};
}

View file

@ -0,0 +1,16 @@
#import <DOM/Event.idl>
#import <HTML/VideoTrack.idl>
// https://html.spec.whatwg.org/multipage/media.html#trackevent
[Exposed=Window, UseNewAKString]
interface TrackEvent : Event {
constructor(DOMString type, optional TrackEventInit eventInitDict = {});
// FIXME: Should be: (VideoTrack or AudioTrack or TextTrack)?
readonly attribute VideoTrack? track;
};
dictionary TrackEventInit : EventInit {
// FIXME: Should be: (VideoTrack or AudioTrack or TextTrack)?
VideoTrack? track = null;
};

View file

@ -165,6 +165,7 @@ libweb_js_bindings(HTML/PromiseRejectionEvent)
libweb_js_bindings(HTML/Storage)
libweb_js_bindings(HTML/SubmitEvent)
libweb_js_bindings(HTML/TextMetrics)
libweb_js_bindings(HTML/TrackEvent)
libweb_js_bindings(HTML/VideoTrack)
libweb_js_bindings(HTML/VideoTrackList)
libweb_js_bindings(HTML/Window GLOBAL)