https://github.com/web-platform-tests/wpt
Raw File
Tip revision: f941f71d5aae723c2204aa8c1024280b9ecab055 authored by Sam Goto on 18 December 2018, 20:56:38 UTC
Idle Detection API: Prototype
Tip revision: f941f71
decodingInfoEncryptedMedia.https.html
<!DOCTYPE html>
<title>MediaCapabilities.decodingInfo() for encrypted media</title>
<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',
};

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',
      videoRobustness: '',
    },
  });
}, "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',
      audioRobustness: '',
    },
  });
}, "Test that decodingInfo() accepts a key system configuration with audio info.");

promise_test(t => {
  return promise_rejects(t, new TypeError(), navigator.mediaCapabilities.decodingInfo({
    type: 'file',
    audio: minimalAudioConfiguration,
    keySystemConfiguration: {
      keySystem: 'org.w3.clearkey',
      videoRobustness: '',
    },
  }));
}, "Test that decodingInfo() rejects if robustness and configuration do not match (1).");

promise_test(t => {
  return promise_rejects(t, new TypeError(), navigator.mediaCapabilities.decodingInfo({
    type: 'file',
    video: minimalVideoConfiguration,
    keySystemConfiguration: {
      keySystem: 'org.w3.clearkey',
      audioRobustness: '',
    },
  }));
}, "Test that decodingInfo() rejects if robustness and configuration do not match (2).");

promise_test(t => {
  return promise_rejects(t, new TypeError(), navigator.mediaCapabilities.decodingInfo({
    type: 'file',
    video: minimalVideoConfiguration,
    keySystemConfiguration: {
      keySystem: 'org.w3.clearkey',
      audioRobustness: '',
      videoRobustness: '',
    },
  }));
}, "Test that decodingInfo() rejects if robustness and configuration do not match (3).");

promise_test(t => {
  return promise_rejects(t, new TypeError(), navigator.mediaCapabilities.decodingInfo({
    type: 'file',
    audio: minimalAudioConfiguration,
    video: minimalVideoConfiguration,
    keySystemConfiguration: {
      keySystem: 'org.w3.clearkey',
      audioRobustness: '',
      videoRobustness: '',
      persistentState: "foobar",
    },
  }));
}, "Test that decodingInfo() rejects if persistentState isn't valid.");

promise_test(t => {
  return promise_rejects(t, new TypeError(), navigator.mediaCapabilities.decodingInfo({
    type: 'file',
    audio: minimalAudioConfiguration,
    video: minimalVideoConfiguration,
    keySystemConfiguration: {
      keySystem: 'org.w3.clearkey',
      audioRobustness: '',
      videoRobustness: '',
      distinctiveIdentifier: "foobar",
    },
  }));
}, "Test that decodingInfo() rejects if distinctiveIdentifier isn't valid.");

promise_test(t => {
  return promise_rejects(t, new TypeError(), navigator.mediaCapabilities.decodingInfo({
    type: 'file',
    audio: minimalAudioConfiguration,
    video: minimalVideoConfiguration,
    keySystemConfiguration: {
      keySystem: 'org.w3.clearkey',
      audioRobustness: '',
      videoRobustness: '',
      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: {},
      audioRobustness: {},
      videoRobustness: {},
    },
  });
}, "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',
      videoRobustness: '',
    }
  }).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.");

</script>
back to top