Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(126)

Unified Diff: chrome/test/data/media/encrypted_media_utils.js

Issue 182113005: Update EME browser tests to include EME WD (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 6 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/test/data/media/encrypted_media_utils.js
diff --git a/chrome/test/data/media/encrypted_media_utils.js b/chrome/test/data/media/encrypted_media_utils.js
index 1c3b8fff0d0b5694abc1b5f98b20ad8fb6b73d4f..03956e2985acb507121d95843165be43c4401f1f 100644
--- a/chrome/test/data/media/encrypted_media_utils.js
+++ b/chrome/test/data/media/encrypted_media_utils.js
@@ -6,6 +6,7 @@ var keySystem = QueryString.keySystem;
var mediaFile = QueryString.mediaFile;
var mediaType = QueryString.mediaType || 'video/webm; codecs="vorbis, vp8"';
var useMSE = QueryString.useMSE == 1;
+var usePrefixedEME = QueryString.usePrefixedEME == 1;
var forceInvalidResponse = QueryString.forceInvalidResponse == 1;
var sessionToLoad = QueryString.sessionToLoad;
var licenseServerURL = QueryString.licenseServerURL;
@@ -50,6 +51,37 @@ function hasPrefix(msg, prefix) {
return true;
}
ddorwin 2014/03/04 21:18:48 Can we say that these are copied from the layout t
jrummell 2014/03/04 23:55:49 They are. Updated.
+// Encodes data into base64 string without trailing '='.
ddorwin 2014/03/04 21:18:48 What you really want is a base64url encoding (thou
jrummell 2014/03/04 23:55:49 Done.
+function base64Encode(data)
ddorwin 2014/03/04 21:18:48 |dataString|?
jrummell 2014/03/04 23:55:49 This is a Uint8Array, not a string. Updated commen
+{
+ var result = btoa(String.fromCharCode.apply(null, data));
ddorwin 2014/03/04 21:18:48 What is the apply() call doing/solving?
jrummell 2014/03/04 23:55:49 It appears to be converting the Uint8Array to a st
+ return result.replace(/=+$/g, '');
+}
+
+// Creates a JWK from raw key ID and key.
+function createJWK(keyId, key)
+{
+ var jwk = "{\"kty\":\"oct\",\"kid\":\"";
+ jwk += base64Encode(keyId);
+ jwk += "\",\"k\":\"";
+ jwk += base64Encode(key);
+ jwk += "\"}";
+ return jwk;
+}
+
+// Creates a JWK Set from multiple JWKs.
ddorwin 2014/03/04 21:18:48 ... from an array of JWK(s).
jrummell 2014/03/04 23:55:49 Done.
+function createJWKSet()
+{
+ var jwkSet = "{\"keys\":[";
+ for (var i = 0; i < arguments.length; i++) {
+ if (i != 0)
+ jwkSet += ",";
+ jwkSet += arguments[i];
+ }
+ jwkSet += "]}";
+ return jwkSet;
+}
+
function isHeartbeatMessage(msg) {
return hasPrefix(msg, HEART_BEAT_HEADER);
}
@@ -59,13 +91,16 @@ function isFileIOTestMessage(msg) {
}
function loadEncryptedMediaFromURL(video) {
- return loadEncryptedMedia(video, mediaFile, keySystem, KEY, useMSE);
+ return loadEncryptedMedia(video, mediaFile, keySystem, KEY, useMSE,
+ usePrefixedEME);
}
function loadEncryptedMedia(video, mediaFile, keySystem, key, useMSE,
- appendSourceCallbackFn) {
+ usePrefixedEME, appendSourceCallbackFn) {
var keyRequested = false;
var sourceOpened = false;
+ var mediaKeys;
+ var mediaKeySession;
// Add properties to enable verification that events occurred.
video.receivedKeyAdded = false;
video.receivedHeartbeat = false;
@@ -77,6 +112,7 @@ function loadEncryptedMedia(video, mediaFile, keySystem, key, useMSE,
return;
}
+ // Shared by prefixed EME and EME WD
ddorwin 2014/03/04 21:18:48 ditto on "WD" in this file.
jrummell 2014/03/04 23:55:49 Done.
function onNeedKey(e) {
if (keyRequested)
return;
@@ -86,13 +122,23 @@ function loadEncryptedMedia(video, mediaFile, keySystem, key, useMSE,
var initData = sessionToLoad ? stringToUint8Array(
PREFIXED_API_LOAD_SESSION_HEADER + sessionToLoad) : e.initData;
try {
- video.webkitGenerateKeyRequest(keySystem, initData);
+ if (usePrefixedEME) {
+ video.webkitGenerateKeyRequest(keySystem, initData);
+ } else {
+ mediaKeySession = mediaKeys.createSession(e.contentType, initData);
+ mediaKeySession.addEventListener('message', onMessage);
+ mediaKeySession.addEventListener('error', function() {
+ setResultInTitle("KeyError");
+ });
+ mediaKeySession.addEventListener('ready', onReady);
+ }
}
catch(error) {
setResultInTitle(error.name);
}
}
+ // Prefixed EME callbacks
function onKeyAdded(e) {
e.target.receivedKeyAdded = true;
}
@@ -117,12 +163,12 @@ function loadEncryptedMedia(video, mediaFile, keySystem, key, useMSE,
if (isHeartbeatMessage(message.message)) {
console.log('onKeyMessage - heartbeat', message);
message.target.receivedHeartbeat = true;
- verifyHeartbeatMessage(message);
+ verifyHeartbeatMessage(message.keySystem, message.defaultURL);
return;
}
if (isFileIOTestMessage(message.message)) {
- var success = getFileIOTestResult(message);
+ var success = getFileIOTestResult(message.keySystem, message);
console.log('onKeyMessage - CDM file IO test: ' +
(success ? 'Success' : 'Fail'));
if (success)
@@ -165,7 +211,75 @@ function loadEncryptedMedia(video, mediaFile, keySystem, key, useMSE,
video.webkitAddKey(keySystem, key, initData);
}
- function verifyHeartbeatMessage(message) {
+ // EME WD callbacks
+ function onReady(e) {
+ video.receivedKeyAdded = true;
ddorwin 2014/03/04 21:18:48 Note: This will break when we remove ready. Maybe
jrummell 2014/03/04 23:55:49 encrypted_media_player.html checks for the flag be
+ }
+
+ function onMessage(message) {
ddorwin 2014/03/04 21:18:48 This function has a lot of duplicate code. How muc
jrummell 2014/03/04 23:55:49 Also keySystem, update()/webKitAddkey(), using vid
+ video.receivedKeyMessage = true;
+
+ if (!message.message) {
+ failTest('Message without a message content: ' + message.message);
+ return;
+ }
+
+ if (isHeartbeatMessage(message.message)) {
+ console.log('onMessage - heartbeat', message);
+ video.receivedHeartbeat = true;
+ verifyHeartbeatMessage(keySystem, message.destinationURL);
+ return;
+ }
+
+ if (isFileIOTestMessage(message.message)) {
+ var success = getFileIOTestResult(keySystem, message);
+ console.log('onMessage - CDM file IO test: ' +
+ (success ? 'Success' : 'Fail'));
+ if (success)
+ setResultInTitle("FILEIOTESTSUCCESS");
+ else
+ setResultInTitle("FAILED");
+ return;
+ }
+
+ // For FileIOTest key system, no need to start playback.
+ if (mediaKeySession.keySystem == EXTERNAL_CLEAR_KEY_FILE_IO_TEST_KEY_SYSTEM)
+ return;
+
+ // No tested key system returns destinationURL in for key request messages.
+ if (message.destinationURL) {
+ failTest('Message unexpectedly has destinationURL: ' +
+ message.destinationURL);
+ return;
+ }
+
+ // When loading a session, no need to call update().
+ if (sessionToLoad)
+ return;
+
+ console.log('onMessage - key request', message);
+ if (forceInvalidResponse) {
+ console.log('Forcing an invalid onMessage response.');
+ var invalidData = new Uint8Array([0xAA]);
+ var jwkSet = stringToUint8Array(
+ createJWKSet(createJWK(invalidData, invalidData)));
+ mediaKeySession.update(jwkSet);
+ return;
+ }
+ // Check if should send request to locally running license server.
+ if (licenseServerURL) {
+ requestLicense(message);
+ return;
+ }
+ console.log('Respond to onMessage with test key.');
+ var initData = message.message;
+ if (mediaType.indexOf('mp4') != -1)
+ initData = KEY_ID; // Temporary hack for Clear Key in v0.1.
+ var jwkSet = stringToUint8Array(createJWKSet(createJWK(initData, key)));
+ mediaKeySession.update(jwkSet);
+ }
+
ddorwin 2014/03/04 21:18:48 I skipped to here.
+ function verifyHeartbeatMessage(keySystem, url) {
String.prototype.startsWith = function(prefix) {
return this.indexOf(prefix) === 0;
}
@@ -176,22 +290,21 @@ function loadEncryptedMedia(video, mediaFile, keySystem, key, useMSE,
}
// Only External Clear Key sends a HEARTBEAT message.
- if (!isExternalClearKey(message.keySystem)) {
- failTest('Unexpected heartbeat from ' + message.keySystem);
+ if (!isExternalClearKey(keySystem)) {
+ failTest('Unexpected heartbeat from ' + keySystem);
return;
}
- if (message.defaultURL != EXTERNAL_CLEAR_KEY_HEARTBEAT_URL) {
- failTest('Heartbeat message with unexpected defaultURL: ' +
- message.defaultURL);
+ if (url != EXTERNAL_CLEAR_KEY_HEARTBEAT_URL) {
+ failTest('Heartbeat message with unexpected URL: ' + url);
return;
}
}
- function getFileIOTestResult(e) {
+ function getFileIOTestResult(keySystem, e) {
// Only External Clear Key sends a FILEIOTESTRESULT message.
- if (e.keySystem != EXTERNAL_CLEAR_KEY_FILE_IO_TEST_KEY_SYSTEM) {
- failTest('Unexpected CDM file IO test result from ' + e.keySystem);
+ if (keySystem != EXTERNAL_CLEAR_KEY_FILE_IO_TEST_KEY_SYSTEM) {
+ failTest('Unexpected CDM file IO test result from ' + keySystem);
return false;
}
@@ -203,12 +316,16 @@ function loadEncryptedMedia(video, mediaFile, keySystem, key, useMSE,
return String.fromCharCode(e.message[result_index]) == 1;
}
- video.addEventListener('webkitneedkey', onNeedKey);
- video.addEventListener('webkitkeymessage', onKeyMessage);
- video.addEventListener('webkitkeyerror', function() {
- setResultInTitle("KeyError");
- });
- video.addEventListener('webkitkeyadded', onKeyAdded);
+ if (usePrefixedEME) {
+ video.addEventListener('webkitneedkey', onNeedKey);
+ video.addEventListener('webkitkeymessage', onKeyMessage);
+ video.addEventListener('webkitkeyerror', function() {
+ setResultInTitle("KeyError");
+ });
+ video.addEventListener('webkitkeyadded', onKeyAdded);
+ } else {
+ video.addEventListener('needkey', onNeedKey);
+ }
installTitleEventHandler(video, 'error');
if (useMSE) {
@@ -218,6 +335,10 @@ function loadEncryptedMedia(video, mediaFile, keySystem, key, useMSE,
} else {
video.src = mediaFile;
}
+ if (!usePrefixedEME) {
+ mediaKeys = new MediaKeys(keySystem);
ddorwin 2014/03/04 21:18:48 nit: Any reason not to do this at 328?
jrummell 2014/03/04 23:55:49 Unprefixed tests timeout if done at 328.
ddorwin 2014/03/05 19:04:36 Bug! Please file. I assume it is the setMediaKeys
jrummell 2014/03/05 23:13:23 Opened http://crbug.com/349546
+ video.setMediaKeys(mediaKeys);
+ }
}
function getInitDataFromKeyId(keyID) {

Powered by Google App Engine
This is Rietveld 408576698