Bug 1310879 - Remove EME persistent-license sessions. r?kikuo draft
authorChris Pearce <cpearce@mozilla.com>
Tue, 18 Oct 2016 15:42:02 +1300
changeset 426231 3d0c5e591170ba1366a11da673c565ac2cbd7720
parent 425712 9079d167112122805f99f57bb8856e1b1675af0f
child 426232 b466d5be7dbc9a99191d9dfc392e92500a1e2e26
push id32662
push usercpearce@mozilla.com
push dateTue, 18 Oct 2016 07:35:45 +0000
reviewerskikuo
bugs1310879
milestone52.0a1
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
dom/media/eme/MediaKeySystemAccess.cpp
dom/media/test/mochitest.ini
dom/media/test/test_eme_persistent_sessions.html
dom/media/test/test_eme_requestKeySystemAccess.html
--- 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',
       }