From 2af98a5353d5663217ef95908a4b5ea4c9db9531 Mon Sep 17 00:00:00 2001 From: Jelle Raaijmakers Date: Tue, 26 Nov 2024 13:46:29 +0100 Subject: [PATCH] LibWeb: Partially implement `MediaSource.isTypeSupported()` --- .../MediaSourceExtensions/MediaSource.cpp | 25 +++++ .../MediaSourceExtensions/MediaSource.h | 2 + .../MediaSourceExtensions/MediaSource.idl | 2 +- .../mediasource-is-type-supported.txt | 66 +++++++++++ .../mediasource-is-type-supported.html | 106 ++++++++++++++++++ 5 files changed, 200 insertions(+), 1 deletion(-) create mode 100644 Tests/LibWeb/Text/expected/wpt-import/media-source/mediasource-is-type-supported.txt create mode 100644 Tests/LibWeb/Text/input/wpt-import/media-source/mediasource-is-type-supported.html diff --git a/Libraries/LibWeb/MediaSourceExtensions/MediaSource.cpp b/Libraries/LibWeb/MediaSourceExtensions/MediaSource.cpp index f809a30b542cc..bd3db4274d3ed 100644 --- a/Libraries/LibWeb/MediaSourceExtensions/MediaSource.cpp +++ b/Libraries/LibWeb/MediaSourceExtensions/MediaSource.cpp @@ -8,6 +8,7 @@ #include #include #include +#include namespace Web::MediaSourceExtensions { @@ -67,4 +68,28 @@ GC::Ptr MediaSource::onsourceclose() return event_handler_attribute(EventNames::sourceclose); } +// https://w3c.github.io/media-source/#dom-mediasource-istypesupported +WebIDL::ExceptionOr MediaSource::is_type_supported(JS::VM&, String const& type) +{ + // 1. If type is an empty string, then return false. + if (type == ""sv) + return false; + + // 2. If type does not contain a valid MIME type string, then return false. + auto mime_type = MimeSniff::MimeType::parse(type); + if (!mime_type.has_value()) + return false; + + // FIXME: 3. If type contains a media type or media subtype that the MediaSource does not support, then + // return false. + + // FIXME: 4. If type contains a codec that the MediaSource does not support, then return false. + + // FIXME: 5. If the MediaSource does not support the specified combination of media type, media + // subtype, and codecs then return false. + + // 6. Return true. + return true; +} + } diff --git a/Libraries/LibWeb/MediaSourceExtensions/MediaSource.h b/Libraries/LibWeb/MediaSourceExtensions/MediaSource.h index d00e94b932957..1b0501713679d 100644 --- a/Libraries/LibWeb/MediaSourceExtensions/MediaSource.h +++ b/Libraries/LibWeb/MediaSourceExtensions/MediaSource.h @@ -30,6 +30,8 @@ class MediaSource : public DOM::EventTarget { void set_onsourceclose(GC::Ptr); GC::Ptr onsourceclose(); + static WebIDL::ExceptionOr is_type_supported(JS::VM&, String const&); + protected: MediaSource(JS::Realm&); diff --git a/Libraries/LibWeb/MediaSourceExtensions/MediaSource.idl b/Libraries/LibWeb/MediaSourceExtensions/MediaSource.idl index 77d7fbd5336be..18e09318bb617 100644 --- a/Libraries/LibWeb/MediaSourceExtensions/MediaSource.idl +++ b/Libraries/LibWeb/MediaSourceExtensions/MediaSource.idl @@ -38,5 +38,5 @@ interface MediaSource : EventTarget { [FIXME] undefined endOfStream(optional EndOfStreamError error); [FIXME] undefined setLiveSeekableRange(double start, double end); [FIXME] undefined clearLiveSeekableRange(); - [FIXME] static boolean isTypeSupported(DOMString type); + static boolean isTypeSupported(DOMString type); }; diff --git a/Tests/LibWeb/Text/expected/wpt-import/media-source/mediasource-is-type-supported.txt b/Tests/LibWeb/Text/expected/wpt-import/media-source/mediasource-is-type-supported.txt new file mode 100644 index 0000000000000..8cee2130bd600 --- /dev/null +++ b/Tests/LibWeb/Text/expected/wpt-import/media-source/mediasource-is-type-supported.txt @@ -0,0 +1,66 @@ +Summary + +Harness status: OK + +Rerun + +Found 55 tests + +28 Pass +27 Fail +Details +Result Test Name MessagePass Test invalid MIME format "video" +Pass Test invalid MIME format "video/" +Fail Test invalid MIME format "video/webm" +Fail Test invalid MIME format "video/webm;" +Fail Test invalid MIME format "video/webm;codecs" +Fail Test invalid MIME format "video/webm;codecs=" +Fail Test invalid MIME format "video/webm;codecs="" +Fail Test invalid MIME format "video/webm;codecs=""" +Fail Test invalid MIME format "video/webm;codecs=","" +Fail Test invalid MIME format "audio/webm;aaacodecsbbb=opus" +Pass Test invalid MIME format "unsupported_mediatype" +Pass Test invalid MIME format "" +Pass Test invalid MIME format "null" +Pass Test invalid MSE MIME media type "xxx" +Fail Test invalid MSE MIME media type "text/html" +Fail Test invalid MSE MIME media type "image/jpeg" +Fail Test invalid mismatch between MIME type and codec ID "audio/webm;codecs="vp8"" +Fail Test invalid mismatch between MIME type and codec ID "audio/mp4;codecs="avc1.4d001e"" +Fail Test invalid mismatch between MIME type and codec ID "audio/mp4;codecs="vorbis"" +Fail Test invalid mismatch between MIME type and codec ID "audio/webm;codecs="mp4a.40.2"" +Fail Test invalid mismatch between MIME type and codec ID "video/mp4;codecs="vp8"" +Fail Test invalid mismatch between MIME type and codec ID "video/mp4;codecs="vorbis"" +Fail Test invalid mismatch between MIME type and codec ID "video/webm;codecs="mp4a.40.2"" +Fail Test invalid inclusion of codecs parameter for mpeg audio types "audio/mpeg;codecs="mp3"" +Fail Test invalid inclusion of codecs parameter for mpeg audio types "audio/mpeg;codecs="mp4a.69"" +Fail Test invalid inclusion of codecs parameter for mpeg audio types "audio/mpeg;codecs="mp4a.6B"" +Fail Test invalid inclusion of codecs parameter for mpeg audio types "audio/aac;codecs="aac"" +Fail Test invalid inclusion of codecs parameter for mpeg audio types "audio/aac;codecs="adts"" +Fail Test invalid inclusion of codecs parameter for mpeg audio types "audio/aac;codecs="mp4a.40"" +Fail Test invalid codec ID "audio/mp4;codecs="mp4a"" +Fail Test invalid codec ID "audio/mp4;codecs="mp4a.40"" +Fail Test invalid codec ID "audio/mp4;codecs="mp4a.40."" +Fail Test invalid codec ID "audio/mp4;codecs="mp4a.67.3"" +Pass Test valid WebM type "video/webm;codecs="vp8"" +Pass Test valid WebM type "video/webm;codecs="vorbis"" +Pass Test valid WebM type "video/webm;codecs="vp8,vorbis"" +Pass Test valid WebM type "video/webm;codecs="vorbis, vp8"" +Pass Test valid WebM type "audio/webm;codecs="vorbis"" +Pass Test valid WebM type "AUDIO/WEBM;CODECS="vorbis"" +Pass Test valid WebM type "audio/webm;codecs=vorbis;test="6"" +Pass Test valid WebM type "audio/webm;codecs="opus"" +Pass Test valid WebM type "video/webm;codecs="opus"" +Pass Test valid MP4 type "video/mp4;codecs="avc1.4d001e"" +Pass Test valid MP4 type "video/mp4;codecs="avc1.42001e"" +Pass Test valid MP4 type "audio/mp4;codecs="mp4a.40.2"" +Pass Test valid MP4 type "audio/mp4;codecs="mp4a.40.5"" +Pass Test valid MP4 type "audio/mp4;codecs="mp4a.67"" +Pass Test valid MP4 type "video/mp4;codecs="mp4a.40.2"" +Pass Test valid MP4 type "video/mp4;codecs="avc1.4d001e,mp4a.40.2"" +Pass Test valid MP4 type "video/mp4;codecs="mp4a.40.2 , avc1.4d001e "" +Pass Test valid MP4 type "video/mp4;codecs="avc1.4d001e,mp4a.40.5"" +Pass Test valid MP4 type "audio/mp4;codecs="Opus"" +Pass Test valid MP4 type "video/mp4;codecs="Opus"" +Pass Test valid MP4 type "audio/mp4;codecs="fLaC"" +Pass Test valid MP4 type "video/mp4;codecs="fLaC"" diff --git a/Tests/LibWeb/Text/input/wpt-import/media-source/mediasource-is-type-supported.html b/Tests/LibWeb/Text/input/wpt-import/media-source/mediasource-is-type-supported.html new file mode 100644 index 0000000000000..bfc5bc10971fd --- /dev/null +++ b/Tests/LibWeb/Text/input/wpt-import/media-source/mediasource-is-type-supported.html @@ -0,0 +1,106 @@ + + + + + MediaSource.isTypeSupported() test cases. + + + + +
+ + +