Test basic dictionary and enum types of Media Capabilities API

On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".


PASS () => {
        return navigator.mediaCapabilities.decodingInfo({ type: 'file' });
    } rejected promise  with TypeError: Type error.
PASS () => {
        return navigator.mediaCapabilities.decodingInfo({ type: 'media-source' });
    } rejected promise  with TypeError: Type error.
PASS () => {
        return navigator.mediaCapabilities.decodingInfo({ type: 'file', audio: { } });
    } rejected promise  with TypeError: Member AudioConfiguration.contentType is required and must be an instance of DOMString.
PASS () => {
        return navigator.mediaCapabilities.decodingInfo({ type: 'file', audio: { contentType: 'video/mp4; codecs="avc1"' } });
    } rejected promise  with TypeError: Type error.
PASS () => {
        return navigator.mediaCapabilities.decodingInfo({ type: 'file', video: { } });
    } rejected promise  with TypeError: Member VideoConfiguration.bitrate is required and must be an instance of unsigned long long.
PASS () => {
        return navigator.mediaCapabilities.decodingInfo({ type: 'file', video: { contentType: 'audio/mp3', width: 640, height: 480, bitrate: 1000, framerate: 24 } });
    } rejected promise  with TypeError: Type error.
PASS () => {
        return navigator.mediaCapabilities.decodingInfo({ type: 'file', video: { contentType: 'video/mp4; codecs="avc1"', height: 480, bitrate: 1000, framerate: 24 } });
    } rejected promise  with TypeError: Member VideoConfiguration.width is required and must be an instance of unsigned long.
PASS () => {
        return navigator.mediaCapabilities.decodingInfo({ type: 'file', video: { contentType: 'video/mp4; codecs="avc1,vp9"', width:640, height: 480, bitrate: 1000, framerate: 24 } });
    } rejected promise  with TypeError: Type error.
PASS () => {
        return navigator.mediaCapabilities.decodingInfo({ type: 'file', video: { contentType: 'video/mp4', width:640, height: 480, bitrate: 1000, framerate: 24 } });
    } rejected promise  with TypeError: Type error.
PASS () => {
        return navigator.mediaCapabilities.decodingInfo({ type: 'file', video: { contentType: 'video/mp4; codecs="avc1"', width: 640, height: 480, bitrate: 1000, framerate: 0 } });
    } rejected promise  with TypeError: Type error.
PASS () => {
        return navigator.mediaCapabilities.decodingInfo({ type: 'file', video: { contentType: 'video/mp4; codecs="avc1"', width: 640, height: 480, bitrate: 1000, framerate: "24/a" } });
    } rejected promise  with TypeError: The provided value is non-finite.
PASS () => {
        return navigator.mediaCapabilities.decodingInfo({ type: 'file', video: { contentType: 'video/mp4; codecs="avc1"', width: 640, height: 480, bitrate: 1000, framerate: "24/0" } });
    } rejected promise  with TypeError: The provided value is non-finite.
PASS () => {
        return navigator.mediaCapabilities.decodingInfo({ type: 'invalid', video: { contentType: 'video/mp4; codecs="avc1"', width: 640, height: 480, bitrate: 1000, framerate: 24 } });
    } rejected promise  with TypeError: Type error.
PASS () => {
        return navigator.mediaCapabilities.encodingInfo({ type: 'record' });
    } rejected promise  with TypeError: Type error.
PASS () => {
        return navigator.mediaCapabilities.encodingInfo({ type: 'record', audio: { } });
    } rejected promise  with TypeError: Member AudioConfiguration.contentType is required and must be an instance of DOMString.
PASS () => {
        return navigator.mediaCapabilities.decodingInfo({ type: 'record', audio: { } });
    } rejected promise  with TypeError: Member AudioConfiguration.contentType is required and must be an instance of DOMString.
PASS () => {
        return navigator.mediaCapabilities.decodingInfo({ type: 'record', audio: { contentType: 'video/mp4; codecs="avc1"' } });
    } rejected promise  with TypeError: Type error.
PASS () => {
        return navigator.mediaCapabilities.decodingInfo({ type: 'record', video: { } });
    } rejected promise  with TypeError: Member VideoConfiguration.bitrate is required and must be an instance of unsigned long long.
PASS () => {
        return navigator.mediaCapabilities.decodingInfo({ type: 'record', video: { contentType: 'audio/mp3', width: 640, height: 480, bitrate: 1000, framerate: 24 } });
    } rejected promise  with TypeError: Type error.
PASS () => {
        return navigator.mediaCapabilities.decodingInfo({ type: 'record', video: { contentType: 'video/mp4; codecs="avc1"', height: 480, bitrate: 1000, framerate: 24 } });
    } rejected promise  with TypeError: Member VideoConfiguration.width is required and must be an instance of unsigned long.
PASS () => {
        return navigator.mediaCapabilities.decodingInfo({ type: 'record', video: { contentType: 'video/mp4; codecs="avc1,vp9"', width:640, height: 480, bitrate: 1000, framerate: 24 } });
    } rejected promise  with TypeError: Type error.
PASS () => {
        return navigator.mediaCapabilities.decodingInfo({ type: 'record', video: { contentType: 'video/mp4', width:640, height: 480, bitrate: 1000, framerate: 24 } });
    } rejected promise  with TypeError: Type error.
PASS () => {
        return navigator.mediaCapabilities.decodingInfo({ type: 'record', video: { contentType: 'video/mp4; codecs="avc1"', width: 640, height: 480, bitrate: 1000, framerate: 0 } });
    } rejected promise  with TypeError: Type error.
PASS () => {
        return navigator.mediaCapabilities.decodingInfo({ type: 'record', video: { contentType: 'video/mp4; codecs="avc1"', width: 640, height: 480, bitrate: 1000, framerate: "24/a" } });
    } rejected promise  with TypeError: The provided value is non-finite.
PASS () => {
        return navigator.mediaCapabilities.decodingInfo({ type: 'record', video: { contentType: 'video/mp4; codecs="avc1"', width: 640, height: 480, bitrate: 1000, framerate: "24/-1" } });
    } rejected promise  with TypeError: The provided value is non-finite.
PASS () => {
        return navigator.mediaCapabilities.decodingInfo({ type: 'invalid', video: { contentType: 'video/mp4; codecs="avc1"', width: 640, height: 480, bitrate: 1000, framerate: 24 } });
    } rejected promise  with TypeError: Type error.
PASS successfullyParsed is true

TEST COMPLETE

