Bug 1310879 - Remove EME persistent-license sessions. r?kikuo
This removes the ability for ClearKey to instantiate persistent-license
sessions using the EME APIs.
MozReview-Commit-ID: KXyuRNMJKIZ
--- a/dom/media/eme/MediaKeySystemAccess.cpp
+++ b/dom/media/eme/MediaKeySystemAccess.cpp
@@ -428,17 +428,16 @@ GetSupportedKeySystems()
KeySystemConfig clearkey;
clearkey.mKeySystem = NS_ConvertUTF8toUTF16(kEMEKeySystemClearkey);
clearkey.mInitDataTypes.AppendElement(NS_LITERAL_STRING("cenc"));
clearkey.mInitDataTypes.AppendElement(NS_LITERAL_STRING("keyids"));
clearkey.mInitDataTypes.AppendElement(NS_LITERAL_STRING("webm"));
clearkey.mPersistentState = KeySystemFeatureSupport::Requestable;
clearkey.mDistinctiveIdentifier = KeySystemFeatureSupport::Prohibited;
clearkey.mSessionTypes.AppendElement(MediaKeySessionType::Temporary);
- clearkey.mSessionTypes.AppendElement(MediaKeySessionType::Persistent_license);
#if defined(XP_WIN)
// Clearkey CDM uses WMF decoders on Windows.
if (WMFDecoderModule::HasAAC()) {
clearkey.mMP4.SetCanDecryptAndDecode(GMP_CODEC_AAC);
} else {
clearkey.mMP4.SetCanDecrypt(GMP_CODEC_AAC);
}
if (WMFDecoderModule::HasH264()) {
--- a/dom/media/test/mochitest.ini
+++ b/dom/media/test/mochitest.ini
@@ -691,18 +691,16 @@ skip-if = toolkit == 'android' # bug 114
[test_eme_initDataTypes.html]
skip-if = toolkit == 'android' # bug 1149374
[test_eme_missing_pssh.html]
skip-if = toolkit == 'android' # bug 1149374
[test_eme_non_mse_fails.html]
skip-if = toolkit == 'android' # bug 1149374
[test_eme_request_notifications.html]
skip-if = toolkit == 'android' # bug 1149374
-[test_eme_persistent_sessions.html]
-skip-if = toolkit == 'android' # bug 1149374
[test_eme_playback.html]
skip-if = toolkit == 'android' || toolkit == 'gonk' # android: bug 1149374; gonk: bug 1193351
[test_eme_requestKeySystemAccess.html]
skip-if = toolkit == 'android' # bug 1149374
[test_eme_setMediaKeys_before_attach_MediaSource.html]
skip-if = toolkit == 'android' # bug 1149374
[test_eme_stream_capture_blocked_case1.html]
tags=msg capturestream
deleted file mode 100644
--- a/dom/media/test/test_eme_persistent_sessions.html
+++ /dev/null
@@ -1,166 +0,0 @@
-<!DOCTYPE HTML>
-<html>
-<head>
- <title>Test Encrypted Media Extensions</title>
- <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
- <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
- <script type="text/javascript" src="manifest.js"></script>
- <script type="text/javascript" src="eme.js"></script>
-</head>
-<body>
-<pre id="test">
-<script class="testbody" type="text/javascript">
-var manager = new MediaTestManager;
-
-function UsableKeyIdsMatch(usableKeyIds, expectedKeyIds) {
- var hexKeyIds = usableKeyIds.map(function(keyId) {
- return Base64ToHex(window.btoa(ArrayBufferToString(keyId)));
- }).sort();
- var expected = Object.keys(expectedKeyIds).sort();
- if (expected.length != hexKeyIds.length) {
- return false;
- }
- for (var i = 0; i < hexKeyIds.length; i++) {
- if (hexKeyIds[i] != expected[i]){
- return false;
- }
- }
- return true;
-}
-
-function AwaitAllKeysUsable(session, keys, token) {
- return new Promise(function(resolve, reject) {
- function check() {
- var map = session.keyStatuses;
- var usableKeyIds = [];
- for (var [key, val] of map.entries()) {
- is(val, "usable", token + ": key status should be usable");
- usableKeyIds.push(key);
- }
- if (UsableKeyIdsMatch(usableKeyIds, keys)) {
- session.removeEventListener("keystatuseschange", check);
- resolve();
- }
- }
- session.addEventListener("keystatuseschange", check);
- check(); // in case all keys are already usable
- });
-}
-
-function AwaitAllKeysNotUsable(session, token) {
- return new Promise(function(resolve, reject) {
- function check() {
- var map = session.keyStatuses;
- if (map.size == 0) {
- session.removeEventListener("keystatuseschange", check);
- resolve();
- }
- }
- session.addEventListener("keystatuseschange", check);
- check(); // in case all keys are already removed
- });
-}
-
-function startTest(test, token)
-{
- manager.started(token);
-
- var recreatedSession; // will have remove() called on it.
-
- var keySystemAccess;
-
- var v = SetupEME(test, token,
- {
- onsessionupdated: function(session) {
- Log(token, "Session created");
- var sessionId;
-
- // Once the session has loaded and has all its keys usable, close
- // all sessions without calling remove() on them.
- AwaitAllKeysUsable(session, test.keys, token)
- .then(function() {
- sessionId = session.sessionId;
- Log(token, "Closing session with id=" + sessionId);
- return session.close();
- })
-
- // Once the session is closed, reload the MediaKeys and reload the session
- .then(function() {
- return navigator.requestMediaKeySystemAccess(CLEARKEY_KEYSYSTEM, gCencMediaKeySystemConfig);
- })
-
- .then(function(requestedKeySystemAccess) {
- keySystemAccess = requestedKeySystemAccess;
- return keySystemAccess.createMediaKeys();
- })
-
- .then(function(mediaKeys) {
- Log(token, "re-created MediaKeys object ok");
- recreatedSession = mediaKeys.createSession("persistent-license");
- Log(token, "Created recreatedSession, loading sessionId=" + sessionId);
- return recreatedSession.load(sessionId);
- })
-
- .then(function(suceeded) {
- if (suceeded) {
- return Promise.resolve();
- } else {
- return Promise.reject("Fail to load recreatedSession, sessionId=" + sessionId);
- }
- })
-
- .then(function() {
- return AwaitAllKeysUsable(recreatedSession, test.keys, token);
- })
-
- .then(function() {
- Log(token, "re-loaded persistent session, all keys still usable");
- return Promise.all([AwaitAllKeysNotUsable(recreatedSession, token), recreatedSession.remove()]);
- })
-
- .then(function() {
- Log(token, "removed session, all keys unusable.");
- // Attempt to recreate the session, the attempt should fail.
- return keySystemAccess.createMediaKeys();
- })
-
- .then(function(mediaKeys) {
- Log(token, "re-re-created MediaKeys object ok");
- // Trying to load the removed persistent session should fail.
- return mediaKeys.createSession("persistent-license").load(sessionId);
- })
-
- .then(function(suceeded) {
- is(suceeded, false, token + " we expect the third session creation to fail, as the session should have been removed.");
- manager.finished(token);
- })
-
- .catch(function(reason) {
- // Catch rejections if any.
- ok(false, token + " rejected, reason=" + reason);
- manager.finished(token);
- });
-
- },
- sessionType: "persistent-license",
- }
- );
-
- LoadTestWithManagedLoadToken(test, v, manager, token,
- { onlyLoadFirstFragments:2, noEndOfStream:false });
-}
-
-function beginTest() {
- manager.runTests(gEMETests.filter(t => t.sessionCount === 1), startTest);
-}
-
-if (!IsMacOSSnowLeopardOrEarlier()) {
- SimpleTest.waitForExplicitFinish();
- SetupEMEPref(beginTest);
-} else {
- todo(false, "Test disabled on this platform.");
-}
-</script>
-</pre>
-</body>
-</html>
--- a/dom/media/test/test_eme_requestKeySystemAccess.html
+++ b/dom/media/test/test_eme_requestKeySystemAccess.html
@@ -243,58 +243,31 @@ var tests = [
{
label: SUPPORTED_LABEL,
initDataTypes: ['cenc'],
videoCapabilities: [{contentType: 'video/mp4'}],
sessionTypes: ['temporary','persistent-license'],
persistentState: 'required',
}
],
- expectedConfig: {
- label: SUPPORTED_LABEL,
- initDataTypes: ['cenc'],
- videoCapabilities: [{contentType: 'video/mp4'}],
- sessionTypes: ['temporary','persistent-license'],
- persistentState: 'required',
- },
- shouldPass: true,
+ shouldPass: false,
},
{
name: 'Persistent sessions not allowed when persistentState prohibited',
options: [
{
initDataTypes: ['cenc'],
videoCapabilities: [{contentType: 'video/mp4'}],
sessionTypes: ['temporary','persistent-license'],
persistentState: 'not-allowed',
}
],
shouldPass: false,
},
{
- name: 'Persistent sessions; should bump optional persistState to required',
- options: [
- {
- label: SUPPORTED_LABEL,
- initDataTypes: ['cenc'],
- videoCapabilities: [{contentType: 'video/mp4'}],
- sessionTypes: ['temporary','persistent-license'],
- persistentState: 'optional',
- }
- ],
- expectedConfig: {
- label: SUPPORTED_LABEL,
- initDataTypes: ['cenc'],
- videoCapabilities: [{contentType: 'video/mp4'}],
- sessionTypes: ['temporary','persistent-license'],
- persistentState: 'required',
- },
- shouldPass: true,
- },
- {
name: 'Persistent-usage-record should not be supported by ClearKey',
options: [
{
initDataTypes: ['cenc'],
videoCapabilities: [{contentType: 'video/mp4'}],
sessionTypes: ['persistent-usage-record'],
persistentState: 'required',
}