| <!DOCTYPE html> | |
| <title>MediaCapabilities.decodingInfo() for encrypted media</title> | |
| <meta name="timeout" content="long"> | |
| <script src=/resources/testharness.js></script> | |
| <script src="/resources/testharnessreport.js"></script> | |
| <script> | |
| // 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 AudioConfiguration that will be allowed per spec. All optional | |
| // properties are missing. | |
| var minimalAudioConfiguration = { | |
| contentType: 'audio/webm; codecs="opus"', | |
| }; | |
| // Minimal MediaCapabilitiesKeySystemConfiguration that will be allowed per | |
| // spec. All optional properties are missing. | |
| var minimalKeySystemConfiguration = { | |
| keySystem: 'org.w3.clearkey', | |
| }; | |
| // Config with bogus name not provided by any UA. | |
| var bogusKeySystemConfiguration = { | |
| keySystem: 'bogus', | |
| }; | |
| promise_test(t => { | |
| return navigator.mediaCapabilities.decodingInfo({ | |
| type: 'file', | |
| video: minimalVideoConfiguration, | |
| keySystemConfiguration: minimalKeySystemConfiguration, | |
| }); | |
| }, "Test that decodingInfo() accepts a stub key system configuration (w/video)."); | |
| promise_test(t => { | |
| return navigator.mediaCapabilities.decodingInfo({ | |
| type: 'file', | |
| audio: minimalAudioConfiguration, | |
| keySystemConfiguration: minimalKeySystemConfiguration, | |
| }); | |
| }, "Test that decodingInfo() accepts a stub key system configuration (w/audio)."); | |
| promise_test(t => { | |
| return navigator.mediaCapabilities.decodingInfo({ | |
| type: 'file', | |
| video: minimalVideoConfiguration, | |
| keySystemConfiguration: { | |
| keySystem: 'org.w3.clearkey', | |
| video: { | |
| robustness: '', | |
| }, | |
| }, | |
| }); | |
| }, "Test that decodingInfo() accepts a key system configuration with video info."); | |
| promise_test(t => { | |
| return navigator.mediaCapabilities.decodingInfo({ | |
| type: 'file', | |
| audio: minimalAudioConfiguration, | |
| keySystemConfiguration: { | |
| keySystem: 'org.w3.clearkey', | |
| audio : { | |
| robustness: '', | |
| }, | |
| }, | |
| }); | |
| }, "Test that decodingInfo() accepts a key system configuration with audio info."); | |
| promise_test(t => { | |
| return promise_rejects_js(t, TypeError, navigator.mediaCapabilities.decodingInfo({ | |
| type: 'file', | |
| audio: minimalAudioConfiguration, | |
| keySystemConfiguration: { | |
| keySystem: 'org.w3.clearkey', | |
| video: { | |
| robustness: '', | |
| }, | |
| }, | |
| })); | |
| }, "Test that decodingInfo() rejects if robustness and configuration do not match (1)."); | |
| promise_test(t => { | |
| return promise_rejects_js(t, TypeError, navigator.mediaCapabilities.decodingInfo({ | |
| type: 'file', | |
| video: minimalVideoConfiguration, | |
| keySystemConfiguration: { | |
| keySystem: 'org.w3.clearkey', | |
| audio : { | |
| robustness: '', | |
| }, | |
| }, | |
| })); | |
| }, "Test that decodingInfo() rejects if robustness and configuration do not match (2)."); | |
| promise_test(t => { | |
| return promise_rejects_js(t, TypeError, navigator.mediaCapabilities.decodingInfo({ | |
| type: 'file', | |
| video: minimalVideoConfiguration, | |
| keySystemConfiguration: { | |
| keySystem: 'org.w3.clearkey', | |
| audio : { | |
| robustness: '', | |
| }, | |
| video: { | |
| robustness: '', | |
| }, | |
| }, | |
| })); | |
| }, "Test that decodingInfo() rejects if robustness and configuration do not match (3)."); | |
| promise_test(t => { | |
| return promise_rejects_js(t, TypeError, navigator.mediaCapabilities.decodingInfo({ | |
| type: 'file', | |
| audio: minimalAudioConfiguration, | |
| video: minimalVideoConfiguration, | |
| keySystemConfiguration: { | |
| keySystem: 'org.w3.clearkey', | |
| audio : { | |
| robustness: '', | |
| }, | |
| video: { | |
| robustness: '', | |
| }, | |
| persistentState: "foobar", | |
| }, | |
| })); | |
| }, "Test that decodingInfo() rejects if persistentState isn't valid."); | |
| promise_test(t => { | |
| return promise_rejects_js(t, TypeError, navigator.mediaCapabilities.decodingInfo({ | |
| type: 'file', | |
| audio: minimalAudioConfiguration, | |
| video: minimalVideoConfiguration, | |
| keySystemConfiguration: { | |
| keySystem: 'org.w3.clearkey', | |
| audio : { | |
| robustness: '', | |
| }, | |
| video: { | |
| robustness: '', | |
| }, | |
| distinctiveIdentifier: "foobar", | |
| }, | |
| })); | |
| }, "Test that decodingInfo() rejects if distinctiveIdentifier isn't valid."); | |
| promise_test(t => { | |
| return promise_rejects_js(t, TypeError, navigator.mediaCapabilities.decodingInfo({ | |
| type: 'file', | |
| audio: minimalAudioConfiguration, | |
| video: minimalVideoConfiguration, | |
| keySystemConfiguration: { | |
| keySystem: 'org.w3.clearkey', | |
| audio : { | |
| robustness: '', | |
| }, | |
| video: { | |
| robustness: '', | |
| }, | |
| sessionTypes: "foobar", | |
| }, | |
| })); | |
| }, "Test that decodingInfo() rejects if sessionTypes isn't a sequence."); | |
| promise_test(t => { | |
| return navigator.mediaCapabilities.decodingInfo({ | |
| type: 'file', | |
| audio: minimalAudioConfiguration, | |
| video: minimalVideoConfiguration, | |
| keySystemConfiguration: { | |
| keySystem: {}, | |
| initDataType: {}, | |
| audio : { | |
| robustness: '', | |
| }, | |
| video: { | |
| robustness: '', | |
| }, | |
| }, | |
| }); | |
| }, "Test that decodingInfo() does not reject when properties are set to unexpected values."); | |
| promise_test(t => { | |
| return navigator.mediaCapabilities.decodingInfo({ | |
| type: 'file', | |
| video: minimalVideoConfiguration, | |
| audio: minimalAudioConfiguration, | |
| keySystemConfiguration: minimalKeySystemConfiguration, | |
| }).then(ability => { | |
| assert_equals(typeof ability.supported, "boolean"); | |
| assert_equals(typeof ability.smooth, "boolean"); | |
| assert_equals(typeof ability.powerEfficient, "boolean"); | |
| assert_equals(typeof ability.keySystemAccess, "object"); | |
| }); | |
| }, "Test that decodingInfo returns a valid MediaCapabilitiesDecodingInfo objects with encrypted media"); | |
| promise_test(t => { | |
| return navigator.mediaCapabilities.decodingInfo({ | |
| type: 'file', | |
| video: minimalVideoConfiguration, | |
| keySystemConfiguration: { | |
| keySystem: 'foobar', | |
| video: { | |
| robustness: '', | |
| }, | |
| } | |
| }).then(ability => { | |
| assert_false(ability.supported); | |
| assert_false(ability.smooth); | |
| assert_false(ability.powerEfficient); | |
| assert_equals(ability.keySystemAccess, null); | |
| }); | |
| }, "Test that random key systems are reported as non supported."); | |
| // TODO(mlamouri): this test could be split in two tests for which codec support | |
| // across browsers is widely compatible: one when all browsers wouldn't support | |
| // and one where all browsers do support. The current approach is to check that | |
| // the answer is consistent to the spec. | |
| promise_test(t => { | |
| return navigator.mediaCapabilities.decodingInfo({ | |
| type: 'file', | |
| video: minimalVideoConfiguration, | |
| audio: minimalAudioConfiguration, | |
| keySystemConfiguration: minimalKeySystemConfiguration, | |
| }).then(ability => { | |
| if (ability.supported) | |
| assert_not_equals(ability.keySystemAccess, null); | |
| else | |
| assert_equals(ability.keySystemAccess, null); | |
| }); | |
| }, "Test that keySystemAccess is only null when not supported if keySystemConfiguration was used."); | |
| promise_test(t => { | |
| return navigator.mediaCapabilities.decodingInfo({ | |
| type: 'file', | |
| video: minimalVideoConfiguration, | |
| audio: minimalAudioConfiguration, | |
| // Supply bogus config to reliably result in a null keySystemAccess. | |
| keySystemConfiguration: bogusKeySystemConfiguration, | |
| }).then(ability => { | |
| assert_equals(ability.keySystemAccess, null); | |
| assert_false(ability.supported); | |
| }); | |
| }, "Test that supported=false when keySystemConfiguration is unsupported."); | |
| promise_test(t => { | |
| return promise_rejects_js(t, TypeError, navigator.mediaCapabilities.decodingInfo({ | |
| type: 'webrtc', | |
| video: minimalVideoConfiguration, | |
| keySystemConfiguration: minimalKeySystemConfiguration, | |
| })); | |
| }, "Test that decodingInfo() with type webrtc rejects key system configuration."); | |
| </script> |