summaryrefslogtreecommitdiffstats
path: root/testing/web-platform/tests/media-capabilities/decodingInfoEncryptedMedia.https.html
diff options
context:
space:
mode:
Diffstat (limited to 'testing/web-platform/tests/media-capabilities/decodingInfoEncryptedMedia.https.html')
-rw-r--r--testing/web-platform/tests/media-capabilities/decodingInfoEncryptedMedia.https.html262
1 files changed, 262 insertions, 0 deletions
diff --git a/testing/web-platform/tests/media-capabilities/decodingInfoEncryptedMedia.https.html b/testing/web-platform/tests/media-capabilities/decodingInfoEncryptedMedia.https.html
new file mode 100644
index 0000000000..7ac914de89
--- /dev/null
+++ b/testing/web-platform/tests/media-capabilities/decodingInfoEncryptedMedia.https.html
@@ -0,0 +1,262 @@
+<!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>