Backed out changeset 2d160c261384 (bug 1310879) for failing browser-chrome test browser/components/contextualidentity/test/browser/browser_eme.js. r=backout
authorSebastian Hengst <archaeopteryx@coole-files.de>
Wed, 19 Oct 2016 11:26:08 +0200
changeset 318583 27eef31f9434af59344a313481ada7366c151f59
parent 318582 9168ac4608163c233af299f6dc1b468c62199f85
child 318584 8b2d92343bcb398075c909c587ec020286528059
child 318624 266e70286889d91fee537040807dda9462688a6e
push id82960
push usercbook@mozilla.com
push dateWed, 19 Oct 2016 15:04:04 +0000
treeherdermozilla-inbound@c48c53e3492e [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersbackout
bugs1310879
milestone52.0a1
backs out2d160c26138431569ae79e70bc57f925bd80ba6f
first release with
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
Backed out changeset 2d160c261384 (bug 1310879) for failing browser-chrome test browser/components/contextualidentity/test/browser/browser_eme.js. r=backout
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,16 +428,17 @@ 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,16 +691,18 @@ 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
new file mode 100644
--- /dev/null
+++ b/dom/media/test/test_eme_persistent_sessions.html
@@ -0,0 +1,166 @@
+<!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,31 +243,58 @@ var tests = [
       {
         label: SUPPORTED_LABEL,
         initDataTypes: ['cenc'],
         videoCapabilities: [{contentType: 'video/mp4'}],
         sessionTypes: ['temporary','persistent-license'],
         persistentState: 'required',
       }
     ],
-    shouldPass: false,
+    expectedConfig: {
+      label: SUPPORTED_LABEL,
+      initDataTypes: ['cenc'],
+      videoCapabilities: [{contentType: 'video/mp4'}],
+      sessionTypes: ['temporary','persistent-license'],
+      persistentState: 'required',
+    },
+    shouldPass: true,
   },
   {
     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',
       }