diff --git a/Meta/Lagom/Tools/CodeGenerators/LibWeb/BindingsGenerator/IDLGenerators.cpp b/Meta/Lagom/Tools/CodeGenerators/LibWeb/BindingsGenerator/IDLGenerators.cpp index ce8a0064462..51f2b26dee7 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 e5b481c327f..b4fab803fea 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 3c61f4d7bd6..b3a5f2b0709 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 00000000000..1029f2f04b0 --- /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 d0045eab078..b31a37f117d 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 679165321ff..565e69e1a36 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 45aedbaa5cd..334529e70d4 100644 --- a/Userland/Libraries/LibWeb/CMakeLists.txt +++ b/Userland/Libraries/LibWeb/CMakeLists.txt @@ -563,6 +563,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 a4ee9880652..2eb6b4422a7 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 00000000000..3a524408072 --- /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); + +WebIDL::ExceptionOr> 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 00000000000..120ba5395dc --- /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 WebIDL::ExceptionOr> 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 00000000000..266164fccc8 --- /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 00000000000..c928b3b6288 --- /dev/null +++ b/Userland/Libraries/LibWeb/MediaSourceExtensions/ManagedMediaSource.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(ManagedMediaSource); + +WebIDL::ExceptionOr> ManagedMediaSource::construct_impl(JS::Realm& realm) +{ + return realm.heap().allocate(realm, realm); +} + +ManagedMediaSource::ManagedMediaSource(JS::Realm& realm) + : MediaSource(realm) +{ +} + +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 00000000000..58dc88b2716 --- /dev/null +++ b/Userland/Libraries/LibWeb/MediaSourceExtensions/ManagedMediaSource.h @@ -0,0 +1,29 @@ +/* + * 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: + [[nodiscard]] static WebIDL::ExceptionOr> construct_impl(JS::Realm&); + +private: + ManagedMediaSource(JS::Realm&); + + 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 00000000000..0e57b3f80e1 --- /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 { + 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 00000000000..f00c7e1a423 --- /dev/null +++ b/Userland/Libraries/LibWeb/MediaSourceExtensions/ManagedSourceBuffer.cpp @@ -0,0 +1,28 @@ +/* + * Copyright (c) 2024, Jelle Raaijmakers + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#include +#include +#include + +namespace Web::MediaSourceExtensions { + +JS_DEFINE_ALLOCATOR(ManagedSourceBuffer); + +ManagedSourceBuffer::ManagedSourceBuffer(JS::Realm& realm) + : SourceBuffer(realm) +{ +} + +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 00000000000..32731813ad4 --- /dev/null +++ b/Userland/Libraries/LibWeb/MediaSourceExtensions/ManagedSourceBuffer.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/#managedsourcebuffer-interface +class ManagedSourceBuffer : public SourceBuffer { + WEB_PLATFORM_OBJECT(ManagedSourceBuffer, SourceBuffer); + JS_DECLARE_ALLOCATOR(ManagedSourceBuffer); + +public: +private: + ManagedSourceBuffer(JS::Realm&); + + 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 00000000000..972d5b83c24 --- /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 00000000000..d91d9e2630b --- /dev/null +++ b/Userland/Libraries/LibWeb/MediaSourceExtensions/MediaSource.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(MediaSource); + +WebIDL::ExceptionOr> MediaSource::construct_impl(JS::Realm& realm) +{ + return realm.heap().allocate(realm, realm); +} + +MediaSource::MediaSource(JS::Realm& realm) + : DOM::EventTarget(realm) +{ +} + +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 00000000000..738d194568e --- /dev/null +++ b/Userland/Libraries/LibWeb/MediaSourceExtensions/MediaSource.h @@ -0,0 +1,34 @@ +/* + * 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: + [[nodiscard]] static WebIDL::ExceptionOr> construct_impl(JS::Realm&); + + // https://w3c.github.io/media-source/#dom-mediasource-canconstructindedicatedworker + static bool can_construct_in_dedicated_worker(JS::VM&) { return true; } + +protected: + MediaSource(JS::Realm&); + + 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 00000000000..1eb5ccedd31 --- /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 00000000000..9275aaab214 --- /dev/null +++ b/Userland/Libraries/LibWeb/MediaSourceExtensions/MediaSourceHandle.cpp @@ -0,0 +1,28 @@ +/* + * Copyright (c) 2024, Jelle Raaijmakers + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#include +#include +#include + +namespace Web::MediaSourceExtensions { + +JS_DEFINE_ALLOCATOR(MediaSourceHandle); + +MediaSourceHandle::MediaSourceHandle(JS::Realm& realm) + : Bindings::PlatformObject(realm) +{ +} + +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 00000000000..f479b85c207 --- /dev/null +++ b/Userland/Libraries/LibWeb/MediaSourceExtensions/MediaSourceHandle.h @@ -0,0 +1,28 @@ +/* + * Copyright (c) 2024, Jelle Raaijmakers + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#pragma once + +#include +#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: + MediaSourceHandle(JS::Realm&); + + 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 00000000000..fbc2a92cc95 --- /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 00000000000..1a295f91147 --- /dev/null +++ b/Userland/Libraries/LibWeb/MediaSourceExtensions/SourceBuffer.cpp @@ -0,0 +1,28 @@ +/* + * Copyright (c) 2024, Jelle Raaijmakers + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#include +#include +#include + +namespace Web::MediaSourceExtensions { + +JS_DEFINE_ALLOCATOR(SourceBuffer); + +SourceBuffer::SourceBuffer(JS::Realm& realm) + : DOM::EventTarget(realm) +{ +} + +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 00000000000..a7d0d066251 --- /dev/null +++ b/Userland/Libraries/LibWeb/MediaSourceExtensions/SourceBuffer.h @@ -0,0 +1,28 @@ +/* + * 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); + +protected: + SourceBuffer(JS::Realm&); + + 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 00000000000..d4fbc99b9f4 --- /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 00000000000..53f6db6b9d6 --- /dev/null +++ b/Userland/Libraries/LibWeb/MediaSourceExtensions/SourceBufferList.cpp @@ -0,0 +1,28 @@ +/* + * Copyright (c) 2024, Jelle Raaijmakers + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#include +#include +#include + +namespace Web::MediaSourceExtensions { + +JS_DEFINE_ALLOCATOR(SourceBufferList); + +SourceBufferList::SourceBufferList(JS::Realm& realm) + : DOM::EventTarget(realm) +{ +} + +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 00000000000..3949f263b10 --- /dev/null +++ b/Userland/Libraries/LibWeb/MediaSourceExtensions/SourceBufferList.h @@ -0,0 +1,26 @@ +/* + * 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); + +private: + SourceBufferList(JS::Realm&); + + 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 00000000000..d6c3150d497 --- /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 5cfb595e3fb..1d0e6201b42 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)