From b1c1e33baee05f4285912a85d0fd856feee33364 Mon Sep 17 00:00:00 2001 From: stelar7 Date: Thu, 31 Jul 2025 12:43:03 +0200 Subject: [PATCH] LibWeb/EME: Implement MediaKeySystemAccess --- Libraries/LibWeb/CMakeLists.txt | 1 + .../EncryptedMediaExtensions.h | 32 ++++++++++++--- .../EncryptedMediaExtensions.idl | 6 --- .../MediaKeySystemAccess.cpp | 36 +++++++++++++++++ .../MediaKeySystemAccess.h | 40 +++++++++++++++++++ .../MediaKeySystemAccess.idl | 32 +++++++++++++++ Libraries/LibWeb/Forward.h | 7 +++- .../MediaCapabilities.idl | 2 +- Libraries/LibWeb/idl_files.cmake | 1 + .../BindingsGenerator/IDLGenerators.cpp | 2 + .../Text/expected/all-window-properties.txt | 1 + 11 files changed, 147 insertions(+), 13 deletions(-) delete mode 100644 Libraries/LibWeb/EncryptedMediaExtensions/EncryptedMediaExtensions.idl create mode 100644 Libraries/LibWeb/EncryptedMediaExtensions/MediaKeySystemAccess.cpp create mode 100644 Libraries/LibWeb/EncryptedMediaExtensions/MediaKeySystemAccess.h create mode 100644 Libraries/LibWeb/EncryptedMediaExtensions/MediaKeySystemAccess.idl diff --git a/Libraries/LibWeb/CMakeLists.txt b/Libraries/LibWeb/CMakeLists.txt index 97da4e01559..7430eba9200 100644 --- a/Libraries/LibWeb/CMakeLists.txt +++ b/Libraries/LibWeb/CMakeLists.txt @@ -329,6 +329,7 @@ set(SOURCES Encoding/TextEncoder.cpp Encoding/TextEncoderCommon.cpp Encoding/TextEncoderStream.cpp + EncryptedMediaExtensions/MediaKeySystemAccess.cpp EntriesAPI/FileSystemEntry.cpp EventTiming/PerformanceEventTiming.cpp Fetch/Body.cpp diff --git a/Libraries/LibWeb/EncryptedMediaExtensions/EncryptedMediaExtensions.h b/Libraries/LibWeb/EncryptedMediaExtensions/EncryptedMediaExtensions.h index b3b300f4500..2401f918c04 100644 --- a/Libraries/LibWeb/EncryptedMediaExtensions/EncryptedMediaExtensions.h +++ b/Libraries/LibWeb/EncryptedMediaExtensions/EncryptedMediaExtensions.h @@ -1,5 +1,6 @@ /* * Copyright (c) 2025, Psychpsyo + * Copyright (c) 2025, stelar7 * * SPDX-License-Identifier: BSD-2-Clause */ @@ -7,14 +8,35 @@ #pragma once #include +#include namespace Web::Bindings { -// https://w3c.github.io/encrypted-media/#dom-mediakeysrequirement -enum class MediaKeysRequirement : u8 { - Required, - Optional, - NotAllowed +// https://w3c.github.io/encrypted-media/#dom-mediakeysystemmediacapability +struct MediaKeySystemMediaCapability { + Utf16String content_type; + Optional encryption_scheme; + Utf16String robustness; +}; + +// https://w3c.github.io/encrypted-media/#dom-mediakeysystemconfiguration +struct MediaKeySystemConfiguration { + Utf16String label; + Vector init_data_types; + Vector audio_capabilities; + Vector video_capabilities; + Bindings::MediaKeysRequirement distinctive_identifier { Bindings::MediaKeysRequirement::Optional }; + Bindings::MediaKeysRequirement persistent_state { Bindings::MediaKeysRequirement::Optional }; + Optional> session_types; +}; + +} + +namespace Web::EncryptedMediaExtensions { + +struct MediaKeyRestrictions { + bool distinctive_identifiers { true }; + bool persist_state { true }; }; } diff --git a/Libraries/LibWeb/EncryptedMediaExtensions/EncryptedMediaExtensions.idl b/Libraries/LibWeb/EncryptedMediaExtensions/EncryptedMediaExtensions.idl deleted file mode 100644 index 12ff2ff748a..00000000000 --- a/Libraries/LibWeb/EncryptedMediaExtensions/EncryptedMediaExtensions.idl +++ /dev/null @@ -1,6 +0,0 @@ -// https://w3c.github.io/encrypted-media/#dom-mediakeysrequirement -enum MediaKeysRequirement { - "required", - "optional", - "not-allowed" -}; diff --git a/Libraries/LibWeb/EncryptedMediaExtensions/MediaKeySystemAccess.cpp b/Libraries/LibWeb/EncryptedMediaExtensions/MediaKeySystemAccess.cpp new file mode 100644 index 00000000000..281225917ee --- /dev/null +++ b/Libraries/LibWeb/EncryptedMediaExtensions/MediaKeySystemAccess.cpp @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2025, stelar7 + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#include +#include +#include + +namespace Web::EncryptedMediaExtensions { + +GC_DEFINE_ALLOCATOR(MediaKeySystemAccess); + +MediaKeySystemAccess::~MediaKeySystemAccess() = default; + +MediaKeySystemAccess::MediaKeySystemAccess(JS::Realm& realm, Utf16String const& key_system, Bindings::MediaKeySystemConfiguration configuration, NonnullOwnPtr cdm_implementation) + : PlatformObject(realm) + , m_key_system(key_system) + , m_configuration(move(configuration)) + , m_cdm_implementation(move(cdm_implementation)) +{ +} + +GC::Ref MediaKeySystemAccess::create(JS::Realm& realm, Utf16String const& key_system, Bindings::MediaKeySystemConfiguration configuration, NonnullOwnPtr cdm_implementation) +{ + return realm.create(realm, key_system, configuration, move(cdm_implementation)); +} + +void MediaKeySystemAccess::initialize(JS::Realm& realm) +{ + WEB_SET_PROTOTYPE_FOR_INTERFACE(MediaKeySystemAccess); + Base::initialize(realm); +} + +} diff --git a/Libraries/LibWeb/EncryptedMediaExtensions/MediaKeySystemAccess.h b/Libraries/LibWeb/EncryptedMediaExtensions/MediaKeySystemAccess.h new file mode 100644 index 00000000000..5fb8abd70ca --- /dev/null +++ b/Libraries/LibWeb/EncryptedMediaExtensions/MediaKeySystemAccess.h @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2025, stelar7 + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#pragma once + +#include +#include +#include +#include +#include + +namespace Web::EncryptedMediaExtensions { + +// https://w3c.github.io/encrypted-media/#dom-mediakeysystemaccess +class MediaKeySystemAccess : public Bindings::PlatformObject { + WEB_PLATFORM_OBJECT(MediaKeySystemAccess, Bindings::PlatformObject); + GC_DECLARE_ALLOCATOR(MediaKeySystemAccess); + +public: + virtual ~MediaKeySystemAccess() override; + [[nodiscard]] static GC::Ref create(JS::Realm&, Utf16String const&, Bindings::MediaKeySystemConfiguration, NonnullOwnPtr); + + [[nodiscard]] Utf16String key_system() const { return m_key_system; } + [[nodiscard]] Bindings::MediaKeySystemConfiguration get_configuration() const { return m_configuration; } + +protected: + explicit MediaKeySystemAccess(JS::Realm&, Utf16String const&, Bindings::MediaKeySystemConfiguration, NonnullOwnPtr); + virtual void initialize(JS::Realm&) override; + +private: + Utf16String m_key_system; + + Bindings::MediaKeySystemConfiguration m_configuration; + NonnullOwnPtr m_cdm_implementation; +}; + +} diff --git a/Libraries/LibWeb/EncryptedMediaExtensions/MediaKeySystemAccess.idl b/Libraries/LibWeb/EncryptedMediaExtensions/MediaKeySystemAccess.idl new file mode 100644 index 00000000000..bd13786aca1 --- /dev/null +++ b/Libraries/LibWeb/EncryptedMediaExtensions/MediaKeySystemAccess.idl @@ -0,0 +1,32 @@ +// https://w3c.github.io/encrypted-media/#mediakeysystemaccess-interface +[Exposed=Window, SecureContext] +interface MediaKeySystemAccess { + readonly attribute Utf16DOMString keySystem; + MediaKeySystemConfiguration getConfiguration(); + [FIXME] Promise createMediaKeys(); +}; + +// https://w3c.github.io/encrypted-media/#dom-mediakeysrequirement +enum MediaKeysRequirement { + "required", + "optional", + "not-allowed" +}; + +// https://w3c.github.io/encrypted-media/#dom-mediakeysystemconfiguration +dictionary MediaKeySystemConfiguration { + Utf16DOMString label = ""; + sequence initDataTypes = []; + sequence audioCapabilities = []; + sequence videoCapabilities = []; + MediaKeysRequirement distinctiveIdentifier = "optional"; + MediaKeysRequirement persistentState = "optional"; + sequence sessionTypes; +}; + +// https://w3c.github.io/encrypted-media/#dom-mediakeysystemmediacapability +dictionary MediaKeySystemMediaCapability { + Utf16DOMString contentType = ""; + Utf16DOMString? encryptionScheme = null; + Utf16DOMString robustness = ""; +}; diff --git a/Libraries/LibWeb/Forward.h b/Libraries/LibWeb/Forward.h index 598fccc0715..f8ea94f17b1 100644 --- a/Libraries/LibWeb/Forward.h +++ b/Libraries/LibWeb/Forward.h @@ -87,7 +87,6 @@ enum class HdrMetadataType : u8; enum class ImageSmoothingQuality : u8; enum class MediaDecodingType : u8; enum class MediaEncodingType : u8; -enum class MediaKeysRequirement : u8; enum class OffscreenRenderingContextId : u8; enum class ReadableStreamReaderMode : u8; enum class ReferrerPolicy : u8; @@ -465,6 +464,12 @@ struct TextEncoderEncodeIntoResult; } +namespace Web::EncryptedMediaExtensions { + +class MediaKeySystemAccess; + +} + namespace Web::EntriesAPI { class FileSystemEntry; diff --git a/Libraries/LibWeb/MediaCapabilitiesAPI/MediaCapabilities.idl b/Libraries/LibWeb/MediaCapabilitiesAPI/MediaCapabilities.idl index 6a0957e9e7a..05324c4d080 100644 --- a/Libraries/LibWeb/MediaCapabilitiesAPI/MediaCapabilities.idl +++ b/Libraries/LibWeb/MediaCapabilitiesAPI/MediaCapabilities.idl @@ -1,4 +1,4 @@ -#import +#import // https://w3c.github.io/media-capabilities/#mediaconfiguration dictionary MediaConfiguration { diff --git a/Libraries/LibWeb/idl_files.cmake b/Libraries/LibWeb/idl_files.cmake index bd76b6a5271..a3dad4e1697 100644 --- a/Libraries/LibWeb/idl_files.cmake +++ b/Libraries/LibWeb/idl_files.cmake @@ -105,6 +105,7 @@ libweb_js_bindings(DOMURL/URLSearchParams ITERABLE) libweb_js_bindings(Encoding/TextDecoder) libweb_js_bindings(Encoding/TextEncoder) libweb_js_bindings(Encoding/TextEncoderStream) +libweb_js_bindings(EncryptedMediaExtensions/MediaKeySystemAccess) libweb_js_bindings(EntriesAPI/FileSystemEntry) libweb_js_bindings(EventTiming/PerformanceEventTiming) libweb_js_bindings(Fetch/Headers ITERABLE) diff --git a/Meta/Lagom/Tools/CodeGenerators/LibWeb/BindingsGenerator/IDLGenerators.cpp b/Meta/Lagom/Tools/CodeGenerators/LibWeb/BindingsGenerator/IDLGenerators.cpp index 531dd107a47..65de0e6c428 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) "Instance"sv, "IntersectionObserverEntry"sv, "KeyframeEffect"sv, + "MediaKeySystemAccess"sv, "MediaList"sv, "Memory"sv, "MessagePort"sv, @@ -4889,6 +4890,7 @@ using namespace Web::CSS; using namespace Web::DOM; using namespace Web::DOMURL; using namespace Web::Encoding; +using namespace Web::EncryptedMediaExtensions; using namespace Web::EntriesAPI; using namespace Web::EventTiming; using namespace Web::Fetch; diff --git a/Tests/LibWeb/Text/expected/all-window-properties.txt b/Tests/LibWeb/Text/expected/all-window-properties.txt index 0d99295a25d..3949988a1e6 100644 --- a/Tests/LibWeb/Text/expected/all-window-properties.txt +++ b/Tests/LibWeb/Text/expected/all-window-properties.txt @@ -264,6 +264,7 @@ MathMLElement MediaCapabilities MediaElementAudioSourceNode MediaError +MediaKeySystemAccess MediaList MediaQueryList MediaQueryListEvent