Bug 1351124 - Factor out ClearKey license generation in EME mochitests. r=jya draft
authorChris Pearce <cpearce@mozilla.com>
Fri, 07 Jul 2017 10:49:42 +1200
changeset 608563 3e2aa140dbf4faad015c1c760fc5b18de396d848
parent 607173 86695af4e0ab9c965735606a31b1c00e8b694fb2
child 608564 29cd7ea0e3b76935d76e376ee0f88f4c93aca85d
push id68328
push usercpearce@mozilla.com
push dateThu, 13 Jul 2017 21:16:57 +0000
reviewersjya
bugs1351124
milestone56.0a1
Bug 1351124 - Factor out ClearKey license generation in EME mochitests. r=jya Makes it easier to re-use in the test in the next patch. MozReview-Commit-ID: 56Gbe8KFSgX
dom/media/test/eme.js
dom/media/test/test_eme_sample_groups_playback.html
--- a/dom/media/test/eme.js
+++ b/dom/media/test/eme.js
@@ -102,51 +102,47 @@ function SourceBufferToString(sb)
     + "}");
 }
 
 function SourceBufferListToString(sbl)
 {
   return "SourceBufferList[" + sbl.map(SourceBufferToString).join(", ") + "]";
 }
 
+function GenerateClearKeyLicense(licenseRequest, keyStore)
+{
+  var msgStr = ArrayBufferToString(licenseRequest);
+  var msg = JSON.parse(msgStr);
+
+  var keys = [];
+  for (var i = 0; i < msg.kids.length; i++) {
+    var id64 = msg.kids[i];
+    var idHex = Base64ToHex(msg.kids[i]).toLowerCase();
+    var key = keyStore[idHex];
+
+    if (key) {
+      keys.push({
+        "kty": "oct",
+        "kid": id64,
+        "k": HexToBase64(key)
+      });
+    }
+  }
+
+  return new TextEncoder().encode(JSON.stringify({
+    "keys" : keys,
+    "type" : msg.type || "temporary"
+  }));
+}
+
 function UpdateSessionFunc(test, token, sessionType, resolve, reject) {
   return function(ev) {
-    var msgStr = ArrayBufferToString(ev.message);
-    var msg = JSON.parse(msgStr);
-
-    Log(token, "got message from CDM: " + msgStr);
-    is(msg.type, sessionType, TimeStamp(token) + " key session type should match");
-    ok(msg.kids, TimeStamp(token) + " message event should contain key ID array");
-
-    var outKeys = [];
-
-    for (var i = 0; i < msg.kids.length; i++) {
-      var id64 = msg.kids[i];
-      var idHex = Base64ToHex(msg.kids[i]).toLowerCase();
-      var key = test.keys[idHex];
-
-      if (key) {
-        Log(token, "found key " + key + " for key id " + idHex);
-        outKeys.push({
-          "kty":"oct",
-          "kid":id64,
-          "k":HexToBase64(key)
-        });
-      } else {
-        reject(`${token} couldn't find key for key id ${idHex}`);
-      }
-    }
-
-    var update = JSON.stringify({
-      "keys" : outKeys,
-      "type" : msg.type
-    });
-    Log(token, "sending update message to CDM: " + update);
-
-    ev.target.update(StringToArrayBuffer(update)).then(function() {
+    var license = GenerateClearKeyLicense(ev.message, test.keys);
+    Log(token, "sending update message to CDM: " + (new TextDecoder().decode(license)));
+    ev.target.update(license).then(function() {
       Log(token, "MediaKeySession update ok!");
       resolve(ev.target);
     }).catch(function(reason) {
       reject(`${token} MediaKeySession update failed: ${reason}`);
     });
   }
 }
 
--- a/dom/media/test/test_eme_sample_groups_playback.html
+++ b/dom/media/test/test_eme_sample_groups_playback.html
@@ -64,39 +64,26 @@
 
         return navigator.requestMediaKeySystemAccess("org.w3.clearkey", options)
           .then((keySystemAccess) => {
             return keySystemAccess.createMediaKeys();
           }, bail("Failed to request key system access."))
 
           .then((mediaKeys) => {
             video.setMediaKeys(mediaKeys);
+
             var session = mediaKeys.createSession();
             once(session, "message", (ev) => {
               is(ev.messageType, "license-request", "Expected a license-request");
+              session.update(GenerateClearKeyLicense(ev.message, test.keys));
+            });
 
-              var keys = [];
-              for (var keyid in test.keys) {
-                keys.push({
-                  "kty":"oct",
-                  "kid":HexToBase64(keyid),
-                  "k":HexToBase64(test.keys[keyid])
-                });
-              }
-
-              var license = new TextEncoder().encode(JSON.stringify({
-                "keys": keys,
-                "type": test.sessionType || "temporary"
-              }));
-              session.update(license);
-            });
             var json = JSON.stringify({
               "kids":Object.keys(test.keys).map(HexToBase64)
             });
-
             var request = new TextEncoder().encode(json);
             session.generateRequest("keyids", request)
               .then(e => {
                 Log(test.name, "Request license success");
               }, reason => {
                 Log("Request license failed! " + reason);
               });
           });