Source code
Revision control
Copy as Markdown
Other Tools
Test Info: Warnings
- This test gets skipped with pattern: os == 'linux' && (asan || debug) OR os == 'android'
- Manifest: dom/media/test/mochitest_eme.toml
<!DOCTYPE HTML>
<html>
<head>
<title>Test Encrypted Media Extensions</title>
<script 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>
<video controls id="video"></video>
<pre id="test">
<script class="testbody" type="text/javascript">
// Tests that files with a default key and a seperate sample keyids in the
// sgpd box play correctly (if the keyid from the sgpd box is not parsed
// or assigned to the sample we will wait indefinitely for the default
// key).
SimpleTest.waitForExplicitFinish();
// Test files for samples encrypted with different media keys.
var gEMESampleGoupTests = [
{
name:"video with 4 keys in sgpd (sbgp in traf sgpd in stbl)",
track: {
name:"video",
type:"video/mp4; codecs=\"avc1.64000d\"",
fragments:[ "sample-encrypted-sgpdstbl-sbgptraf.mp4"
]
},
keys: {
// "keyid" : "key"
"279926496a7f5d25da69f2b3b2799a7f": "5544694d47473326622665665a396b36",
"597669572e55547e656b56586e2f6f68": "7959493a764556786527517849756635",
"205b2b293a342f3d3268293e6f6f4e29": "3a4f3674376d6c48675a273464447b40",
"32783e367c2e4d4d6b46467b3e6b5478": "3e213f6d45584f51713d534f4b417855",
},
sessionType:"temporary",
sessionCount:1,
duration:2,
},
],
test = gEMESampleGoupTests[0];
var video = document.getElementById("video");
video.addEventListener("encrypted", () => {
Log(test.name, "Recieved encrypted event");
});
video.addEventListener("waitingforkey", () => {
Log(test.name, "waitingforkey");
ok(false, test.name + " Video is waitingforkey, indicating that the samples are not being assigned the correct id from the sgpd box!");
SimpleTest.finish();
});
function LoadEME() {
var options = [{
initDataType: "cenc",
videoType: test.track.type,
}];
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 json = JSON.stringify({
"kids":Object.keys(test.keys).map(HexToBase64)
});
var request = new TextEncoder().encode(json);
session.generateRequest("keyids", request)
.then(() => {
Log(test.name, "Request license success");
}, reason => {
Log("Request license failed! " + reason);
});
});
}
function DownloadMedia(url, type, mediaSource) {
return new Promise((resolve) => {
var sourceBuffer = mediaSource.addSourceBuffer(type);
fetchWithXHR(url, (response) => {
once(sourceBuffer, "updateend", resolve);
sourceBuffer.appendBuffer(new Uint8Array(response));
});
});
}
function LoadMSE() {
// Only set the source of the video and download the tracks after we
// have set the license keys, so we don't hit the waitingforkey event
// unless samples are being incorrectly assigned the default key
// (and we can safely fail).
LoadEME()
.then(() => {
var ms = new MediaSource();
video.src = URL.createObjectURL(ms);
once(ms, "sourceopen", () => {
Promise.all(test.track.fragments.map(fragment => DownloadMedia(fragment, test.track.type, ms)))
.then(() => {
ms.endOfStream();
video.play();
});
});
once(video, "ended", SimpleTest.finish);
});
}
LoadMSE();
</script>
</pre>
</body>
</html>