diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-07 09:22:09 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-07 09:22:09 +0000 |
commit | 43a97878ce14b72f0981164f87f2e35e14151312 (patch) | |
tree | 620249daf56c0258faa40cbdcf9cfba06de2a846 /testing/web-platform/tests/media-capabilities/encodingInfo.any.js | |
parent | Initial commit. (diff) | |
download | firefox-43a97878ce14b72f0981164f87f2e35e14151312.tar.xz firefox-43a97878ce14b72f0981164f87f2e35e14151312.zip |
Adding upstream version 110.0.1.upstream/110.0.1upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'testing/web-platform/tests/media-capabilities/encodingInfo.any.js')
-rw-r--r-- | testing/web-platform/tests/media-capabilities/encodingInfo.any.js | 310 |
1 files changed, 310 insertions, 0 deletions
diff --git a/testing/web-platform/tests/media-capabilities/encodingInfo.any.js b/testing/web-platform/tests/media-capabilities/encodingInfo.any.js new file mode 100644 index 0000000000..6882b0ae91 --- /dev/null +++ b/testing/web-platform/tests/media-capabilities/encodingInfo.any.js @@ -0,0 +1,310 @@ +// Minimal VideoConfiguration that will be allowed per spec. All optional +// properties are missing. +var minimalVideoConfiguration = { + contentType: 'video/webm; codecs="vp09.00.10.08"', + width: 800, + height: 600, + bitrate: 3000, + framerate: 24, +}; + +// Minimal WebRTC VideoConfiguration that will be allowed per spec. All optional +// properties are missing. +var minimalWebrtcVideoConfiguration = { + contentType: 'video/VP9', + width: 800, + height: 600, + bitrate: 3000, + framerate: 24, +}; + +// Minimal AudioConfiguration that will be allowed per spec. All optional +// properties are missing. +var minimalAudioConfiguration = { + contentType: 'audio/webm; codecs="opus"', +}; + +// Minimal WebRTC AudioConfiguration that will be allowed per spec. All optional +// properties are missing. +var minimalWebrtcAudioConfiguration = { + contentType: 'audio/opus', +}; + +promise_test(t => { + return promise_rejects_js(t, TypeError, navigator.mediaCapabilities.encodingInfo()); +}, "Test that encodingInfo rejects if it doesn't get a configuration"); + +promise_test(t => { + return promise_rejects_js(t, TypeError, navigator.mediaCapabilities.encodingInfo({})); +}, "Test that encodingInfo rejects if the MediaConfiguration isn't valid"); + +promise_test(t => { + return promise_rejects_js(t, TypeError, navigator.mediaCapabilities.encodingInfo({ + video: minimalVideoConfiguration, + audio: minimalAudioConfiguration, + })); +}, "Test that encodingInfo rejects if the MediaConfiguration does not have a type"); + +promise_test(t => { + return promise_rejects_js(t, TypeError, navigator.mediaCapabilities.encodingInfo({ + type: 'record', + })); +}, "Test that encodingInfo rejects if the configuration doesn't have an audio or video field"); + +promise_test(t => { + return promise_rejects_js(t, TypeError, navigator.mediaCapabilities.encodingInfo({ + type: 'record', + video: { + contentType: 'video/webm; codecs="vp09.00.10.08"', + width: 800, + height: 600, + bitrate: 3000, + framerate: -1, + }, + })); +}, "Test that encodingInfo rejects if the video configuration has a negative framerate"); + +promise_test(t => { + return promise_rejects_js(t, TypeError, navigator.mediaCapabilities.encodingInfo({ + type: 'record', + video: { + contentType: 'video/webm; codecs="vp09.00.10.08"', + width: 800, + height: 600, + bitrate: 3000, + framerate: 0, + }, + })); +}, "Test that encodingInfo rejects if the video configuration has a framerate set to 0"); + +promise_test(t => { + return promise_rejects_js(t, TypeError, navigator.mediaCapabilities.encodingInfo({ + type: 'record', + video: { + contentType: 'video/webm; codecs="vp09.00.10.08"', + width: 800, + height: 600, + bitrate: 3000, + framerate: Infinity, + }, + })); +}, "Test that encodingInfo rejects if the video configuration has a framerate set to Infinity"); + +promise_test(t => { + return promise_rejects_js(t, TypeError, navigator.mediaCapabilities.encodingInfo({ + type: 'record', + video: { + contentType: 'fgeoa', + width: 800, + height: 600, + bitrate: 3000, + framerate: 24, + }, + })); +}, "Test that encodingInfo rejects if the video configuration contentType doesn't parse"); + +promise_test(t => { + return promise_rejects_js(t, TypeError, navigator.mediaCapabilities.encodingInfo({ + type: 'record', + video: { + contentType: 'audio/fgeoa', + width: 800, + height: 600, + bitrate: 3000, + framerate: 24, + }, + })); +}, "Test that encodingInfo rejects if the video configuration contentType isn't of type video"); + +promise_test(t => { + return promise_rejects_js(t, TypeError, navigator.mediaCapabilities.encodingInfo({ + type: 'record', + video: { + contentType: 'video/webm; codecs="vp09.00.10.08"; foo="bar"', + width: 800, + height: 600, + bitrate: 3000, + framerate: 24, + }, + })); +}, "Test that encodingInfo rejects if the video configuration contentType has more than one parameter"); + +promise_test(t => { + return promise_rejects_js(t, TypeError, navigator.mediaCapabilities.encodingInfo({ + type: 'record', + video: { + contentType: 'video/webm; foo="bar"', + width: 800, + height: 600, + bitrate: 3000, + framerate: 24, + }, + })); +}, "Test that encodingInfo rejects if the video configuration contentType has one parameter that isn't codecs"); + +promise_test(t => { + return promise_rejects_js(t, TypeError, navigator.mediaCapabilities.encodingInfo({ + type: 'record', + video: { + contentType: 'video/webm; codecs="vp09.00.10.08"', + width: 800, + height: 600, + bitrate: 3000, + framerate: '24000/1001', + } + })); +}, "Test that encodingInfo() rejects framerate in the form of x/y"); + +promise_test(t => { + return promise_rejects_js(t, TypeError, navigator.mediaCapabilities.encodingInfo({ + type: 'record', + video: { + contentType: 'video/webm; codecs="vp09.00.10.08"', + width: 800, + height: 600, + bitrate: 3000, + framerate: '24000/0', + } + })); +}, "Test that encodingInfo() rejects framerate in the form of x/0"); + +promise_test(t => { + return promise_rejects_js(t, TypeError, navigator.mediaCapabilities.encodingInfo({ + type: 'record', + video: { + contentType: 'video/webm; codecs="vp09.00.10.08"', + width: 800, + height: 600, + bitrate: 3000, + framerate: '0/10001', + } + })); +}, "Test that encodingInfo() rejects framerate in the form of 0/y"); + +promise_test(t => { + return promise_rejects_js(t, TypeError, navigator.mediaCapabilities.encodingInfo({ + type: 'record', + video: { + contentType: 'video/webm; codecs="vp09.00.10.08"', + width: 800, + height: 600, + bitrate: 3000, + framerate: '-24000/10001', + } + })); +}, "Test that encodingInfo() rejects framerate in the form of -x/y"); + +promise_test(t => { + return promise_rejects_js(t, TypeError, navigator.mediaCapabilities.encodingInfo({ + type: 'record', + video: { + contentType: 'video/webm; codecs="vp09.00.10.08"', + width: 800, + height: 600, + bitrate: 3000, + framerate: '24000/-10001', + } + })); +}, "Test that encodingInfo() rejects framerate in the form of x/-y"); + +promise_test(t => { + return promise_rejects_js(t, TypeError, navigator.mediaCapabilities.encodingInfo({ + type: 'record', + video: { + contentType: 'video/webm; codecs="vp09.00.10.08"', + width: 800, + height: 600, + bitrate: 3000, + framerate: '24000/', + } + })); +}, "Test that encodingInfo() rejects framerate in the form of x/"); + +promise_test(t => { + return promise_rejects_js(t, TypeError, navigator.mediaCapabilities.encodingInfo({ + type: 'record', + video: { + contentType: 'video/webm; codecs="vp09.00.10.08"', + width: 800, + height: 600, + bitrate: 3000, + framerate: '1/3x', + } + })); +}, "Test that encodingInfo() rejects framerate with trailing unallowed characters"); + +promise_test(t => { + return promise_rejects_js(t, TypeError, navigator.mediaCapabilities.encodingInfo({ + type: 'record', + audio: { contentType: 'fgeoa' }, + })); +}, "Test that encodingInfo rejects if the audio configuration contenType doesn't parse"); + +promise_test(t => { + return promise_rejects_js(t, TypeError, navigator.mediaCapabilities.encodingInfo({ + type: 'record', + audio: { contentType: 'video/fgeoa' }, + })); +}, "Test that encodingInfo rejects if the audio configuration contentType isn't of type audio"); + +promise_test(t => { + return promise_rejects_js(t, TypeError, navigator.mediaCapabilities.encodingInfo({ + type: 'record', + audio: { contentType: 'audio/webm; codecs="opus"; foo="bar"' }, + })); +}, "Test that encodingInfo rejects if the audio configuration contentType has more than one parameters"); + +promise_test(t => { + return promise_rejects_js(t, TypeError, navigator.mediaCapabilities.encodingInfo({ + type: 'record', + audio: { contentType: 'audio/webm; foo="bar"' }, + })); +}, "Test that encodingInfo rejects if the audio configuration contentType has one parameter that isn't codecs"); + +promise_test(t => { + return navigator.mediaCapabilities.encodingInfo({ + type: 'record', + video: minimalVideoConfiguration, + audio: minimalAudioConfiguration, + }).then(ability => { + assert_equals(typeof ability.supported, "boolean"); + assert_equals(typeof ability.smooth, "boolean"); + assert_equals(typeof ability.powerEfficient, "boolean"); + }); +}, "Test that encodingInfo returns a valid MediaCapabilitiesInfo objects for record type"); + +async_test(t => { + var validTypes = [ 'record', 'webrtc' ]; + var invalidTypes = [ undefined, null, '', 'foobar', 'mse', 'MediaSource', + 'file', 'media-source', ]; + + var validPromises = []; + var invalidCaught = 0; + + validTypes.forEach(type => { + validPromises.push(navigator.mediaCapabilities.encodingInfo({ + type: type, + video: type != "webrtc" ? minimalVideoConfiguration : minimalWebrtcVideoConfiguration, + audio: type != "webrtc" ? minimalAudioConfiguration : minimalWebrtcAudioConfiguration, + })); + }); + + // validTypes are tested via Promise.all(validPromises) because if one of the + // promises fail, Promise.all() will reject. This mechanism can't be used for + // invalid types which will be tested individually and increment invalidCaught + // when rejected until the amount of rejection matches the expectation. + Promise.all(validPromises).then(t.step_func(() => { + for (var i = 0; i < invalidTypes.length; ++i) { + navigator.mediaCapabilities.encodingInfo({ + type: invalidTypes[i], + video: minimalVideoConfiguration, + audio: minimalAudioConfiguration, + }).then(t.unreached_func(), t.step_func(e => { + assert_equals(e.name, 'TypeError'); + ++invalidCaught; + if (invalidCaught == invalidTypes.length) + t.done(); + })); + } + }), t.unreached_func('Promise.all should not reject for valid types')); +}, "Test that encodingInfo rejects if the MediaConfiguration does not have a valid type"); |