From 3af28f33dc7e0288d82c06fd12082ed04ce3e672 Mon Sep 17 00:00:00 2001 From: Jelle Raaijmakers Date: Fri, 1 Nov 2024 14:03:15 +0100 Subject: [PATCH] LibWeb: Add stubbed Media Source Extensions API Just the boilerplate :^) --- .../BindingsGenerator/IDLGenerators.cpp | 3 ++ .../LibWeb/BindingsGenerator/Namespaces.h | 1 + .../Userland/Libraries/LibWeb/BUILD.gn | 1 + .../LibWeb/MediaSourceExtensions/BUILD.gn | 13 ++++++ .../Userland/Libraries/LibWeb/idl_files.gni | 7 ++++ .../Text/expected/all-window-properties.txt | 7 ++++ Userland/Libraries/LibWeb/CMakeLists.txt | 7 ++++ Userland/Libraries/LibWeb/Forward.h | 10 +++++ .../BufferedChangeEvent.cpp | 33 +++++++++++++++ .../BufferedChangeEvent.h | 35 ++++++++++++++++ .../BufferedChangeEvent.idl | 17 ++++++++ .../ManagedMediaSource.cpp | 23 ++++++++++ .../ManagedMediaSource.h | 25 +++++++++++ .../ManagedMediaSource.idl | 11 +++++ .../ManagedSourceBuffer.cpp | 23 ++++++++++ .../ManagedSourceBuffer.h | 25 +++++++++++ .../ManagedSourceBuffer.idl | 8 ++++ .../MediaSourceExtensions/MediaSource.cpp | 23 ++++++++++ .../MediaSourceExtensions/MediaSource.h | 30 +++++++++++++ .../MediaSourceExtensions/MediaSource.idl | 42 +++++++++++++++++++ .../MediaSourceHandle.cpp | 23 ++++++++++ .../MediaSourceExtensions/MediaSourceHandle.h | 25 +++++++++++ .../MediaSourceHandle.idl | 3 ++ .../MediaSourceExtensions/SourceBuffer.cpp | 23 ++++++++++ .../MediaSourceExtensions/SourceBuffer.h | 27 ++++++++++++ .../MediaSourceExtensions/SourceBuffer.idl | 36 ++++++++++++++++ .../SourceBufferList.cpp | 23 ++++++++++ .../MediaSourceExtensions/SourceBufferList.h | 25 +++++++++++ .../SourceBufferList.idl | 13 ++++++ Userland/Libraries/LibWeb/idl_files.cmake | 7 ++++ 30 files changed, 549 insertions(+) create mode 100644 Meta/gn/secondary/Userland/Libraries/LibWeb/MediaSourceExtensions/BUILD.gn create mode 100644 Userland/Libraries/LibWeb/MediaSourceExtensions/BufferedChangeEvent.cpp create mode 100644 Userland/Libraries/LibWeb/MediaSourceExtensions/BufferedChangeEvent.h create mode 100644 Userland/Libraries/LibWeb/MediaSourceExtensions/BufferedChangeEvent.idl create mode 100644 Userland/Libraries/LibWeb/MediaSourceExtensions/ManagedMediaSource.cpp create mode 100644 Userland/Libraries/LibWeb/MediaSourceExtensions/ManagedMediaSource.h create mode 100644 Userland/Libraries/LibWeb/MediaSourceExtensions/ManagedMediaSource.idl create mode 100644 Userland/Libraries/LibWeb/MediaSourceExtensions/ManagedSourceBuffer.cpp create mode 100644 Userland/Libraries/LibWeb/MediaSourceExtensions/ManagedSourceBuffer.h create mode 100644 Userland/Libraries/LibWeb/MediaSourceExtensions/ManagedSourceBuffer.idl create mode 100644 Userland/Libraries/LibWeb/MediaSourceExtensions/MediaSource.cpp create mode 100644 Userland/Libraries/LibWeb/MediaSourceExtensions/MediaSource.h create mode 100644 Userland/Libraries/LibWeb/MediaSourceExtensions/MediaSource.idl create mode 100644 Userland/Libraries/LibWeb/MediaSourceExtensions/MediaSourceHandle.cpp create mode 100644 Userland/Libraries/LibWeb/MediaSourceExtensions/MediaSourceHandle.h create mode 100644 Userland/Libraries/LibWeb/MediaSourceExtensions/MediaSourceHandle.idl create mode 100644 Userland/Libraries/LibWeb/MediaSourceExtensions/SourceBuffer.cpp create mode 100644 Userland/Libraries/LibWeb/MediaSourceExtensions/SourceBuffer.h create mode 100644 Userland/Libraries/LibWeb/MediaSourceExtensions/SourceBuffer.idl create mode 100644 Userland/Libraries/LibWeb/MediaSourceExtensions/SourceBufferList.cpp create mode 100644 Userland/Libraries/LibWeb/MediaSourceExtensions/SourceBufferList.h create mode 100644 Userland/Libraries/LibWeb/MediaSourceExtensions/SourceBufferList.idl diff --git a/Meta/Lagom/Tools/CodeGenerators/LibWeb/BindingsGenerator/IDLGenerators.cpp b/Meta/Lagom/Tools/CodeGenerators/LibWeb/BindingsGenerator/IDLGenerators.cpp index ce8a006446223..51f2b26dee737 100644 --- a/Meta/Lagom/Tools/CodeGenerators/LibWeb/BindingsGenerator/IDLGenerators.cpp +++ b/Meta/Lagom/Tools/CodeGenerators/LibWeb/BindingsGenerator/IDLGenerators.cpp @@ -90,10 +90,12 @@ static bool is_platform_object(Type const& type) "ServiceWorkerRegistration"sv, "SVGTransform"sv, "ShadowRoot"sv, + "SourceBuffer"sv, "Table"sv, "Text"sv, "TextMetrics"sv, "TextTrack"sv, + "TimeRanges"sv, "URLSearchParams"sv, "VTTRegion"sv, "VideoTrack"sv, @@ -4240,6 +4242,7 @@ static void generate_using_namespace_definitions(SourceGenerator& generator) using namespace Web::Internals; using namespace Web::IntersectionObserver; using namespace Web::MediaCapabilitiesAPI; + using namespace Web::MediaSourceExtensions; using namespace Web::NavigationTiming; using namespace Web::PerformanceTimeline; using namespace Web::RequestIdleCallback; diff --git a/Meta/Lagom/Tools/CodeGenerators/LibWeb/BindingsGenerator/Namespaces.h b/Meta/Lagom/Tools/CodeGenerators/LibWeb/BindingsGenerator/Namespaces.h index e5b481c327fc9..b4fab803feae4 100644 --- a/Meta/Lagom/Tools/CodeGenerators/LibWeb/BindingsGenerator/Namespaces.h +++ b/Meta/Lagom/Tools/CodeGenerators/LibWeb/BindingsGenerator/Namespaces.h @@ -28,6 +28,7 @@ static constexpr Array libweb_interface_namespaces = { "Internals"sv, "IntersectionObserver"sv, "MathML"sv, + "MediaSourceExtensions"sv, "NavigationTiming"sv, "RequestIdleCallback"sv, "ResizeObserver"sv, diff --git a/Meta/gn/secondary/Userland/Libraries/LibWeb/BUILD.gn b/Meta/gn/secondary/Userland/Libraries/LibWeb/BUILD.gn index 3c61f4d7bd65e..b3a5f2b07098f 100644 --- a/Meta/gn/secondary/Userland/Libraries/LibWeb/BUILD.gn +++ b/Meta/gn/secondary/Userland/Libraries/LibWeb/BUILD.gn @@ -319,6 +319,7 @@ shared_library("LibWeb") { "Loader", "MathML", "MediaCapabilitiesAPI", + "MediaSourceExtensions", "MimeSniff", "MixedContent", "NavigationTiming", diff --git a/Meta/gn/secondary/Userland/Libraries/LibWeb/MediaSourceExtensions/BUILD.gn b/Meta/gn/secondary/Userland/Libraries/LibWeb/MediaSourceExtensions/BUILD.gn new file mode 100644 index 0000000000000..1029f2f04b061 --- /dev/null +++ b/Meta/gn/secondary/Userland/Libraries/LibWeb/MediaSourceExtensions/BUILD.gn @@ -0,0 +1,13 @@ +source_set("MediaSourceExtensions") { + configs += [ "//Userland/Libraries/LibWeb:configs" ] + deps = [ "//Userland/Libraries/LibWeb:all_generated" ] + sources = [ + "BufferedChangeEvent.cpp", + "ManagedMediaSource.cpp", + "ManagedSourceBuffer.cpp", + "MediaSource.cpp", + "MediaSourceHandle.cpp", + "SourceBuffer.cpp", + "SourceBufferList.cpp", + ] +} diff --git a/Meta/gn/secondary/Userland/Libraries/LibWeb/idl_files.gni b/Meta/gn/secondary/Userland/Libraries/LibWeb/idl_files.gni index d0045eab07856..b31a37f117d3f 100644 --- a/Meta/gn/secondary/Userland/Libraries/LibWeb/idl_files.gni +++ b/Meta/gn/secondary/Userland/Libraries/LibWeb/idl_files.gni @@ -268,6 +268,13 @@ standard_idl_files = [ "//Userland/Libraries/LibWeb/IntersectionObserver/IntersectionObserverEntry.idl", "//Userland/Libraries/LibWeb/MathML/MathMLElement.idl", "//Userland/Libraries/LibWeb/MediaCapabilitiesAPI/MediaCapabilities.idl", + "//Userland/Libraries/LibWeb/MediaSourceExtensions/BufferedChangeEvent.idl", + "//Userland/Libraries/LibWeb/MediaSourceExtensions/ManagedMediaSource.idl", + "//Userland/Libraries/LibWeb/MediaSourceExtensions/ManagedSourceBuffer.idl", + "//Userland/Libraries/LibWeb/MediaSourceExtensions/MediaSource.idl", + "//Userland/Libraries/LibWeb/MediaSourceExtensions/MediaSourceHandle.idl", + "//Userland/Libraries/LibWeb/MediaSourceExtensions/SourceBuffer.idl", + "//Userland/Libraries/LibWeb/MediaSourceExtensions/SourceBufferList.idl", "//Userland/Libraries/LibWeb/NavigationTiming/PerformanceTiming.idl", "//Userland/Libraries/LibWeb/NavigationTiming/PerformanceNavigation.idl", "//Userland/Libraries/LibWeb/PerformanceTimeline/PerformanceEntry.idl", diff --git a/Tests/LibWeb/Text/expected/all-window-properties.txt b/Tests/LibWeb/Text/expected/all-window-properties.txt index 679165321ffab..565e69e1a36d7 100644 --- a/Tests/LibWeb/Text/expected/all-window-properties.txt +++ b/Tests/LibWeb/Text/expected/all-window-properties.txt @@ -30,6 +30,7 @@ BiquadFilterNode Blob Boolean BroadcastChannel +BufferedChangeEvent ByteLengthQueuingStrategy CDATASection CSSAnimation @@ -212,6 +213,8 @@ Iterator KeyboardEvent KeyframeEffect Location +ManagedMediaSource +ManagedSourceBuffer Map MathMLElement MediaCapabilities @@ -219,6 +222,8 @@ MediaError MediaList MediaQueryList MediaQueryListEvent +MediaSource +MediaSourceHandle MessageChannel MessageEvent MessagePort @@ -335,6 +340,8 @@ Set ShadowRealm ShadowRoot SharedArrayBuffer +SourceBuffer +SourceBufferList StaticRange Storage StorageManager diff --git a/Userland/Libraries/LibWeb/CMakeLists.txt b/Userland/Libraries/LibWeb/CMakeLists.txt index b8e9bdcc044c4..de6b098880add 100644 --- a/Userland/Libraries/LibWeb/CMakeLists.txt +++ b/Userland/Libraries/LibWeb/CMakeLists.txt @@ -562,6 +562,13 @@ set(SOURCES MathML/MathMLElement.cpp MathML/TagNames.cpp MediaCapabilitiesAPI/MediaCapabilities.cpp + MediaSourceExtensions/BufferedChangeEvent.cpp + MediaSourceExtensions/ManagedMediaSource.cpp + MediaSourceExtensions/ManagedSourceBuffer.cpp + MediaSourceExtensions/MediaSource.cpp + MediaSourceExtensions/MediaSourceHandle.cpp + MediaSourceExtensions/SourceBuffer.cpp + MediaSourceExtensions/SourceBufferList.cpp MimeSniff/MimeType.cpp MimeSniff/Resource.cpp MixedContent/AbstractOperations.cpp diff --git a/Userland/Libraries/LibWeb/Forward.h b/Userland/Libraries/LibWeb/Forward.h index a4ee9880652e6..2eb6b4422a737 100644 --- a/Userland/Libraries/LibWeb/Forward.h +++ b/Userland/Libraries/LibWeb/Forward.h @@ -623,6 +623,16 @@ namespace Web::MediaCapabilitiesAPI { class MediaCapabilities; } +namespace Web::MediaSourceExtensions { +class BufferedChangeEvent; +class ManagedMediaSource; +class ManagedSourceBuffer; +class MediaSource; +class MediaSourceHandle; +class SourceBuffer; +class SourceBufferList; +} + namespace Web::MimeSniff { class MimeType; } diff --git a/Userland/Libraries/LibWeb/MediaSourceExtensions/BufferedChangeEvent.cpp b/Userland/Libraries/LibWeb/MediaSourceExtensions/BufferedChangeEvent.cpp new file mode 100644 index 0000000000000..a78ad3e8dbdfe --- /dev/null +++ b/Userland/Libraries/LibWeb/MediaSourceExtensions/BufferedChangeEvent.cpp @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2024, Jelle Raaijmakers + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#include +#include +#include + +namespace Web::MediaSourceExtensions { + +JS_DEFINE_ALLOCATOR(BufferedChangeEvent); + +JS::NonnullGCPtr BufferedChangeEvent::construct_impl(JS::Realm& realm, AK::FlyString const& type, BufferedChangeEventInit const& event_init) +{ + return realm.heap().allocate(realm, realm, type, event_init); +} + +BufferedChangeEvent::BufferedChangeEvent(JS::Realm& realm, AK::FlyString const& type, BufferedChangeEventInit const&) + : DOM::Event(realm, type) +{ +} + +BufferedChangeEvent::~BufferedChangeEvent() = default; + +void BufferedChangeEvent::initialize(JS::Realm& realm) +{ + Base::initialize(realm); + WEB_SET_PROTOTYPE_FOR_INTERFACE(BufferedChangeEvent); +} + +} diff --git a/Userland/Libraries/LibWeb/MediaSourceExtensions/BufferedChangeEvent.h b/Userland/Libraries/LibWeb/MediaSourceExtensions/BufferedChangeEvent.h new file mode 100644 index 0000000000000..af1fe4eb6f4cf --- /dev/null +++ b/Userland/Libraries/LibWeb/MediaSourceExtensions/BufferedChangeEvent.h @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2024, Jelle Raaijmakers + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#pragma once + +#include +#include + +namespace Web::MediaSourceExtensions { + +struct BufferedChangeEventInit : public DOM::EventInit { + JS::GCPtr added_ranges; + JS::GCPtr removed_ranges; +}; + +// https://w3c.github.io/media-source/#bufferedchangeevent-interface +class BufferedChangeEvent : public DOM::Event { + WEB_PLATFORM_OBJECT(BufferedChangeEvent, DOM::Event); + JS_DECLARE_ALLOCATOR(BufferedChangeEvent); + +public: + [[nodiscard]] static JS::NonnullGCPtr construct_impl(JS::Realm&, FlyString const& type, BufferedChangeEventInit const& = {}); + +private: + BufferedChangeEvent(JS::Realm&, FlyString const& type, BufferedChangeEventInit const& event_init); + + virtual ~BufferedChangeEvent() override; + + virtual void initialize(JS::Realm&) override; +}; + +} diff --git a/Userland/Libraries/LibWeb/MediaSourceExtensions/BufferedChangeEvent.idl b/Userland/Libraries/LibWeb/MediaSourceExtensions/BufferedChangeEvent.idl new file mode 100644 index 0000000000000..266164fccc83b --- /dev/null +++ b/Userland/Libraries/LibWeb/MediaSourceExtensions/BufferedChangeEvent.idl @@ -0,0 +1,17 @@ +#import +#import + +// https://w3c.github.io/media-source/#dom-bufferedchangeevent +[Exposed=(Window,DedicatedWorker)] +interface BufferedChangeEvent : Event { + constructor(DOMString type, optional BufferedChangeEventInit eventInitDict = {}); + + [FIXME,SameObject] readonly attribute TimeRanges addedRanges; + [FIXME,SameObject] readonly attribute TimeRanges removedRanges; +}; + +// https://w3c.github.io/media-source/#dom-bufferedchangeeventinit +dictionary BufferedChangeEventInit : EventInit { + TimeRanges addedRanges; + TimeRanges removedRanges; +}; diff --git a/Userland/Libraries/LibWeb/MediaSourceExtensions/ManagedMediaSource.cpp b/Userland/Libraries/LibWeb/MediaSourceExtensions/ManagedMediaSource.cpp new file mode 100644 index 0000000000000..91f11f3687bec --- /dev/null +++ b/Userland/Libraries/LibWeb/MediaSourceExtensions/ManagedMediaSource.cpp @@ -0,0 +1,23 @@ +/* + * Copyright (c) 2024, Jelle Raaijmakers + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#include +#include +#include + +namespace Web::MediaSourceExtensions { + +JS_DEFINE_ALLOCATOR(ManagedMediaSource); + +ManagedMediaSource::~ManagedMediaSource() = default; + +void ManagedMediaSource::initialize(JS::Realm& realm) +{ + Base::initialize(realm); + WEB_SET_PROTOTYPE_FOR_INTERFACE(ManagedMediaSource); +} + +} diff --git a/Userland/Libraries/LibWeb/MediaSourceExtensions/ManagedMediaSource.h b/Userland/Libraries/LibWeb/MediaSourceExtensions/ManagedMediaSource.h new file mode 100644 index 0000000000000..5fe9f1df4bc25 --- /dev/null +++ b/Userland/Libraries/LibWeb/MediaSourceExtensions/ManagedMediaSource.h @@ -0,0 +1,25 @@ +/* + * Copyright (c) 2024, Jelle Raaijmakers + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#pragma once + +#include + +namespace Web::MediaSourceExtensions { + +// https://w3c.github.io/media-source/#managedmediasource-interface +class ManagedMediaSource : public MediaSource { + WEB_PLATFORM_OBJECT(ManagedMediaSource, MediaSource); + JS_DECLARE_ALLOCATOR(ManagedMediaSource); + +public: +private: + virtual ~ManagedMediaSource() override; + + virtual void initialize(JS::Realm&) override; +}; + +} diff --git a/Userland/Libraries/LibWeb/MediaSourceExtensions/ManagedMediaSource.idl b/Userland/Libraries/LibWeb/MediaSourceExtensions/ManagedMediaSource.idl new file mode 100644 index 0000000000000..219cd006112cc --- /dev/null +++ b/Userland/Libraries/LibWeb/MediaSourceExtensions/ManagedMediaSource.idl @@ -0,0 +1,11 @@ +#import +#import + +// https://w3c.github.io/media-source/#managedmediasource-interface +[Exposed=(Window,DedicatedWorker)] +interface ManagedMediaSource : MediaSource { + [FIXME] constructor(); + [FIXME] readonly attribute boolean streaming; + [FIXME] attribute EventHandler onstartstreaming; + [FIXME] attribute EventHandler onendstreaming; +}; diff --git a/Userland/Libraries/LibWeb/MediaSourceExtensions/ManagedSourceBuffer.cpp b/Userland/Libraries/LibWeb/MediaSourceExtensions/ManagedSourceBuffer.cpp new file mode 100644 index 0000000000000..e15af937a828c --- /dev/null +++ b/Userland/Libraries/LibWeb/MediaSourceExtensions/ManagedSourceBuffer.cpp @@ -0,0 +1,23 @@ +/* + * Copyright (c) 2024, Jelle Raaijmakers + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#include +#include +#include + +namespace Web::MediaSourceExtensions { + +JS_DEFINE_ALLOCATOR(ManagedSourceBuffer); + +ManagedSourceBuffer::~ManagedSourceBuffer() = default; + +void ManagedSourceBuffer::initialize(JS::Realm& realm) +{ + Base::initialize(realm); + WEB_SET_PROTOTYPE_FOR_INTERFACE(ManagedSourceBuffer); +} + +} diff --git a/Userland/Libraries/LibWeb/MediaSourceExtensions/ManagedSourceBuffer.h b/Userland/Libraries/LibWeb/MediaSourceExtensions/ManagedSourceBuffer.h new file mode 100644 index 0000000000000..7b466a611cd35 --- /dev/null +++ b/Userland/Libraries/LibWeb/MediaSourceExtensions/ManagedSourceBuffer.h @@ -0,0 +1,25 @@ +/* + * Copyright (c) 2024, Jelle Raaijmakers + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#pragma once + +#include + +namespace Web::MediaSourceExtensions { + +// https://w3c.github.io/media-source/#managedsourcebuffer-interface +class ManagedSourceBuffer : public SourceBuffer { + WEB_PLATFORM_OBJECT(ManagedSourceBuffer, SourceBuffer); + JS_DECLARE_ALLOCATOR(ManagedSourceBuffer); + +public: +private: + virtual ~ManagedSourceBuffer() override; + + virtual void initialize(JS::Realm&) override; +}; + +} diff --git a/Userland/Libraries/LibWeb/MediaSourceExtensions/ManagedSourceBuffer.idl b/Userland/Libraries/LibWeb/MediaSourceExtensions/ManagedSourceBuffer.idl new file mode 100644 index 0000000000000..972d5b83c2451 --- /dev/null +++ b/Userland/Libraries/LibWeb/MediaSourceExtensions/ManagedSourceBuffer.idl @@ -0,0 +1,8 @@ +#import +#import + +// https://w3c.github.io/media-source/#managedsourcebuffer-interface +[Exposed=(Window,DedicatedWorker)] +interface ManagedSourceBuffer : SourceBuffer { + [FIXME] attribute EventHandler onbufferedchange; +}; diff --git a/Userland/Libraries/LibWeb/MediaSourceExtensions/MediaSource.cpp b/Userland/Libraries/LibWeb/MediaSourceExtensions/MediaSource.cpp new file mode 100644 index 0000000000000..c292d159915b1 --- /dev/null +++ b/Userland/Libraries/LibWeb/MediaSourceExtensions/MediaSource.cpp @@ -0,0 +1,23 @@ +/* + * Copyright (c) 2024, Jelle Raaijmakers + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#include +#include +#include + +namespace Web::MediaSourceExtensions { + +JS_DEFINE_ALLOCATOR(MediaSource); + +MediaSource::~MediaSource() = default; + +void MediaSource::initialize(JS::Realm& realm) +{ + Base::initialize(realm); + WEB_SET_PROTOTYPE_FOR_INTERFACE(MediaSource); +} + +} diff --git a/Userland/Libraries/LibWeb/MediaSourceExtensions/MediaSource.h b/Userland/Libraries/LibWeb/MediaSourceExtensions/MediaSource.h new file mode 100644 index 0000000000000..f07b2ca5fc8c4 --- /dev/null +++ b/Userland/Libraries/LibWeb/MediaSourceExtensions/MediaSource.h @@ -0,0 +1,30 @@ +/* + * Copyright (c) 2024, Jelle Raaijmakers + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#pragma once + +#include + +namespace Web::MediaSourceExtensions { + +// https://w3c.github.io/media-source/#dom-mediasource +class MediaSource : public DOM::EventTarget { + WEB_PLATFORM_OBJECT(MediaSource, DOM::EventTarget); + JS_DECLARE_ALLOCATOR(MediaSource); + +public: + // https://w3c.github.io/media-source/#dom-mediasource-canconstructindedicatedworker + static bool can_construct_in_dedicated_worker(JS::VM&) { return true; } + +protected: + virtual ~MediaSource() override; + + virtual void initialize(JS::Realm&) override; + +private: +}; + +} diff --git a/Userland/Libraries/LibWeb/MediaSourceExtensions/MediaSource.idl b/Userland/Libraries/LibWeb/MediaSourceExtensions/MediaSource.idl new file mode 100644 index 0000000000000..1eb5ccedd3110 --- /dev/null +++ b/Userland/Libraries/LibWeb/MediaSourceExtensions/MediaSource.idl @@ -0,0 +1,42 @@ +#import +#import +#import + +// https://w3c.github.io/media-source/#dom-mediasource +enum ReadyState { + "closed", + "open", + "ended", +}; + +// https://w3c.github.io/media-source/#dom-mediasource +enum EndOfStreamError { + "network", + "decode", +}; + +// https://w3c.github.io/media-source/#dom-mediasource +[Exposed=(Window,DedicatedWorker)] +interface MediaSource : EventTarget { + constructor(); + + [FIXME, SameObject, Exposed=DedicatedWorker] + readonly attribute MediaSourceHandle handle; + [FIXME] readonly attribute SourceBufferList sourceBuffers; + [FIXME] readonly attribute SourceBufferList activeSourceBuffers; + [FIXME] readonly attribute ReadyState readyState; + + [FIXME] attribute unrestricted double duration; + [FIXME] attribute EventHandler onsourceopen; + [FIXME] attribute EventHandler onsourceended; + [FIXME] attribute EventHandler onsourceclose; + + static readonly attribute boolean canConstructInDedicatedWorker; + + [FIXME] SourceBuffer addSourceBuffer(DOMString type); + [FIXME] undefined removeSourceBuffer(SourceBuffer sourceBuffer); + [FIXME] undefined endOfStream(optional EndOfStreamError error); + [FIXME] undefined setLiveSeekableRange(double start, double end); + [FIXME] undefined clearLiveSeekableRange(); + [FIXME] static boolean isTypeSupported(DOMString type); +}; diff --git a/Userland/Libraries/LibWeb/MediaSourceExtensions/MediaSourceHandle.cpp b/Userland/Libraries/LibWeb/MediaSourceExtensions/MediaSourceHandle.cpp new file mode 100644 index 0000000000000..b715f98d395a1 --- /dev/null +++ b/Userland/Libraries/LibWeb/MediaSourceExtensions/MediaSourceHandle.cpp @@ -0,0 +1,23 @@ +/* + * Copyright (c) 2024, Jelle Raaijmakers + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#include +#include +#include + +namespace Web::MediaSourceExtensions { + +JS_DEFINE_ALLOCATOR(MediaSourceHandle); + +MediaSourceHandle::~MediaSourceHandle() = default; + +void MediaSourceHandle::initialize(JS::Realm& realm) +{ + Base::initialize(realm); + WEB_SET_PROTOTYPE_FOR_INTERFACE(MediaSourceHandle); +} + +} diff --git a/Userland/Libraries/LibWeb/MediaSourceExtensions/MediaSourceHandle.h b/Userland/Libraries/LibWeb/MediaSourceExtensions/MediaSourceHandle.h new file mode 100644 index 0000000000000..b767c025279dd --- /dev/null +++ b/Userland/Libraries/LibWeb/MediaSourceExtensions/MediaSourceHandle.h @@ -0,0 +1,25 @@ +/* + * Copyright (c) 2024, Jelle Raaijmakers + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#pragma once + +#include + +namespace Web::MediaSourceExtensions { + +// https://w3c.github.io/media-source/#dom-mediasourcehandle +class MediaSourceHandle : public Bindings::PlatformObject { + WEB_PLATFORM_OBJECT(MediaSourceHandle, Bindings::PlatformObject); + JS_DECLARE_ALLOCATOR(MediaSourceHandle); + +public: +private: + virtual ~MediaSourceHandle() override; + + virtual void initialize(JS::Realm&) override; +}; + +} diff --git a/Userland/Libraries/LibWeb/MediaSourceExtensions/MediaSourceHandle.idl b/Userland/Libraries/LibWeb/MediaSourceExtensions/MediaSourceHandle.idl new file mode 100644 index 0000000000000..fbc2a92cc9509 --- /dev/null +++ b/Userland/Libraries/LibWeb/MediaSourceExtensions/MediaSourceHandle.idl @@ -0,0 +1,3 @@ +// https://w3c.github.io/media-source/#dom-mediasourcehandle +[Transferable, Exposed=(Window,DedicatedWorker)] +interface MediaSourceHandle {}; diff --git a/Userland/Libraries/LibWeb/MediaSourceExtensions/SourceBuffer.cpp b/Userland/Libraries/LibWeb/MediaSourceExtensions/SourceBuffer.cpp new file mode 100644 index 0000000000000..5197fbcbfba02 --- /dev/null +++ b/Userland/Libraries/LibWeb/MediaSourceExtensions/SourceBuffer.cpp @@ -0,0 +1,23 @@ +/* + * Copyright (c) 2024, Jelle Raaijmakers + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#include +#include +#include + +namespace Web::MediaSourceExtensions { + +JS_DEFINE_ALLOCATOR(SourceBuffer); + +SourceBuffer::~SourceBuffer() = default; + +void SourceBuffer::initialize(JS::Realm& realm) +{ + Base::initialize(realm); + WEB_SET_PROTOTYPE_FOR_INTERFACE(SourceBuffer); +} + +} diff --git a/Userland/Libraries/LibWeb/MediaSourceExtensions/SourceBuffer.h b/Userland/Libraries/LibWeb/MediaSourceExtensions/SourceBuffer.h new file mode 100644 index 0000000000000..afa8e0faf76e6 --- /dev/null +++ b/Userland/Libraries/LibWeb/MediaSourceExtensions/SourceBuffer.h @@ -0,0 +1,27 @@ +/* + * Copyright (c) 2024, Jelle Raaijmakers + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#pragma once + +#include + +namespace Web::MediaSourceExtensions { + +// https://w3c.github.io/media-source/#dom-sourcebuffer +class SourceBuffer : public DOM::EventTarget { + WEB_PLATFORM_OBJECT(SourceBuffer, DOM::EventTarget); + JS_DECLARE_ALLOCATOR(SourceBuffer); + +public: +protected: + virtual ~SourceBuffer() override; + + virtual void initialize(JS::Realm&) override; + +private: +}; + +} diff --git a/Userland/Libraries/LibWeb/MediaSourceExtensions/SourceBuffer.idl b/Userland/Libraries/LibWeb/MediaSourceExtensions/SourceBuffer.idl new file mode 100644 index 0000000000000..d4fbc99b9f49f --- /dev/null +++ b/Userland/Libraries/LibWeb/MediaSourceExtensions/SourceBuffer.idl @@ -0,0 +1,36 @@ +#import +#import +#import +#import +#import + +// https://w3c.github.io/media-source/#dom-sourcebuffer +enum AppendMode { + "segments", + "sequence", +}; + +// https://w3c.github.io/media-source/#dom-sourcebuffer +[Exposed=(Window,DedicatedWorker)] +interface SourceBuffer : EventTarget { + [FIXME] attribute AppendMode mode; + [FIXME] readonly attribute boolean updating; + [FIXME] readonly attribute TimeRanges buffered; + [FIXME] attribute double timestampOffset; + [FIXME] readonly attribute AudioTrackList audioTracks; + [FIXME] readonly attribute VideoTrackList videoTracks; + [FIXME] readonly attribute TextTrackList textTracks; + [FIXME] attribute double appendWindowStart; + [FIXME] attribute unrestricted double appendWindowEnd; + + [FIXME] attribute EventHandler onupdatestart; + [FIXME] attribute EventHandler onupdate; + [FIXME] attribute EventHandler onupdateend; + [FIXME] attribute EventHandler onerror; + [FIXME] attribute EventHandler onabort; + + [FIXME] undefined appendBuffer(BufferSource data); + [FIXME] undefined abort(); + [FIXME] undefined changeType(DOMString type); + [FIXME] undefined remove(double start, unrestricted double end); +}; diff --git a/Userland/Libraries/LibWeb/MediaSourceExtensions/SourceBufferList.cpp b/Userland/Libraries/LibWeb/MediaSourceExtensions/SourceBufferList.cpp new file mode 100644 index 0000000000000..7b9e642a0f80f --- /dev/null +++ b/Userland/Libraries/LibWeb/MediaSourceExtensions/SourceBufferList.cpp @@ -0,0 +1,23 @@ +/* + * Copyright (c) 2024, Jelle Raaijmakers + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#include +#include +#include + +namespace Web::MediaSourceExtensions { + +JS_DEFINE_ALLOCATOR(SourceBufferList); + +SourceBufferList::~SourceBufferList() = default; + +void SourceBufferList::initialize(JS::Realm& realm) +{ + Base::initialize(realm); + WEB_SET_PROTOTYPE_FOR_INTERFACE(SourceBufferList); +} + +} diff --git a/Userland/Libraries/LibWeb/MediaSourceExtensions/SourceBufferList.h b/Userland/Libraries/LibWeb/MediaSourceExtensions/SourceBufferList.h new file mode 100644 index 0000000000000..65a4d75a7ea0b --- /dev/null +++ b/Userland/Libraries/LibWeb/MediaSourceExtensions/SourceBufferList.h @@ -0,0 +1,25 @@ +/* + * Copyright (c) 2024, Jelle Raaijmakers + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#pragma once + +#include + +namespace Web::MediaSourceExtensions { + +// https://w3c.github.io/media-source/#dom-sourcebufferlist +class SourceBufferList : public DOM::EventTarget { + WEB_PLATFORM_OBJECT(SourceBufferList, DOM::EventTarget); + JS_DECLARE_ALLOCATOR(SourceBufferList); + +public: +private: + virtual ~SourceBufferList() override; + + virtual void initialize(JS::Realm&) override; +}; + +} diff --git a/Userland/Libraries/LibWeb/MediaSourceExtensions/SourceBufferList.idl b/Userland/Libraries/LibWeb/MediaSourceExtensions/SourceBufferList.idl new file mode 100644 index 0000000000000..d6c3150d4971c --- /dev/null +++ b/Userland/Libraries/LibWeb/MediaSourceExtensions/SourceBufferList.idl @@ -0,0 +1,13 @@ +#import +#import + +// https://w3c.github.io/media-source/#dom-sourcebufferlist +[Exposed=(Window,DedicatedWorker)] +interface SourceBufferList : EventTarget { + [FIXME] readonly attribute unsigned long length; + + [FIXME] attribute EventHandler onaddsourcebuffer; + [FIXME] attribute EventHandler onremovesourcebuffer; + + [FIXME] getter SourceBuffer (unsigned long index); +}; diff --git a/Userland/Libraries/LibWeb/idl_files.cmake b/Userland/Libraries/LibWeb/idl_files.cmake index 5cfb595e3fb2d..1d0e6201b422c 100644 --- a/Userland/Libraries/LibWeb/idl_files.cmake +++ b/Userland/Libraries/LibWeb/idl_files.cmake @@ -252,6 +252,13 @@ libweb_js_bindings(IntersectionObserver/IntersectionObserver) libweb_js_bindings(IntersectionObserver/IntersectionObserverEntry) libweb_js_bindings(MathML/MathMLElement) libweb_js_bindings(MediaCapabilitiesAPI/MediaCapabilities) +libweb_js_bindings(MediaSourceExtensions/BufferedChangeEvent) +libweb_js_bindings(MediaSourceExtensions/ManagedMediaSource) +libweb_js_bindings(MediaSourceExtensions/ManagedSourceBuffer) +libweb_js_bindings(MediaSourceExtensions/MediaSource) +libweb_js_bindings(MediaSourceExtensions/MediaSourceHandle) +libweb_js_bindings(MediaSourceExtensions/SourceBuffer) +libweb_js_bindings(MediaSourceExtensions/SourceBufferList) libweb_js_bindings(NavigationTiming/PerformanceNavigation) libweb_js_bindings(NavigationTiming/PerformanceTiming) libweb_js_bindings(PerformanceTimeline/PerformanceEntry)