mirror of
https://gitlab.winehq.org/wine/wine-gecko.git
synced 2024-09-13 09:24:08 -07:00
161 lines
4.1 KiB
HTML
161 lines
4.1 KiB
HTML
<!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>
|
|
</head>
|
|
<body>
|
|
<pre id="test">
|
|
<script class="testbody" type="text/javascript">
|
|
var manager = new MediaTestManager;
|
|
|
|
const KEYSYSTEM_TYPE = "org.w3.clearkey";
|
|
|
|
function bail(message)
|
|
{
|
|
return function(err) {
|
|
ok(false, message);
|
|
if (err) {
|
|
info(err);
|
|
}
|
|
SimpleTest.finish();
|
|
}
|
|
}
|
|
|
|
function ArrayBufferToString(arr)
|
|
{
|
|
var str = '';
|
|
var view = Uint8Array(arr);
|
|
for (var i = 0; i < view.length; i++) {
|
|
str += String.fromCharCode(view[i]);
|
|
}
|
|
return str;
|
|
}
|
|
|
|
function StringToArrayBuffer(str)
|
|
{
|
|
var arr = ArrayBuffer(str.length);
|
|
var view = Uint8Array(arr);
|
|
for (var i = 0; i < str.length; i++) {
|
|
view[i] = str.charCodeAt(i);
|
|
}
|
|
return arr;
|
|
}
|
|
|
|
function Base64ToHex(str)
|
|
{
|
|
var bin = window.atob(str.replace(/-/g, "+").replace(/_/g, "/"));
|
|
var res = "";
|
|
for (var i = 0; i < bin.length; i++) {
|
|
res += ("0" + bin.charCodeAt(i).toString(16)).substr(-2);
|
|
}
|
|
return res;
|
|
}
|
|
|
|
function HexToBase64(hex)
|
|
{
|
|
var bin = "";
|
|
for (var i = 0; i < hex.length; i += 2) {
|
|
bin += String.fromCharCode(parseInt(hex.substr(i, 2), 16));
|
|
}
|
|
return window.btoa(bin).replace(/=/g, "").replace(/\+/g, "-").replace(/\//g, "_");
|
|
}
|
|
|
|
function UpdateSessionFunc(test) {
|
|
return function(ev) {
|
|
var msgStr = ArrayBufferToString(ev.message);
|
|
var msg = JSON.parse(msgStr);
|
|
|
|
info("got message from CDM: " + msgStr);
|
|
is(msg.type, test.sessionType, "Key session type should match");
|
|
ok(msg.kids, "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) {
|
|
info("found key " + key + " for key id " + idHex);
|
|
outKeys.push({
|
|
"kty":"oct",
|
|
"alg":"A128KW",
|
|
"kid":id64,
|
|
"k":HexToBase64(key)
|
|
});
|
|
} else {
|
|
bail("Couldn't find key for key id " + idHex);
|
|
}
|
|
}
|
|
|
|
var update = JSON.stringify({
|
|
"keys" : outKeys,
|
|
"type" : msg.type
|
|
});
|
|
info("sending update message to CDM: " + update);
|
|
|
|
ev.target.update(StringToArrayBuffer(update)).then(function() {
|
|
info("MediaKeySession update ok!");
|
|
}, bail("MediaKeySession update failed"));
|
|
}
|
|
}
|
|
|
|
function startTest(test, token)
|
|
{
|
|
var v = document.createElement("video");
|
|
manager.started(token);
|
|
|
|
v.addEventListener("encrypted", function(ev) {
|
|
info("got encrypted event");
|
|
ok(MediaKeys.isTypeSupported(KEYSYSTEM_TYPE, ev.initDataType, test.type),
|
|
"MediaKeys should support this keysystem");
|
|
|
|
MediaKeys.create(KEYSYSTEM_TYPE).then(function(mediaKeys) {
|
|
info("created MediaKeys object ok");
|
|
return v.setMediaKeys(mediaKeys);
|
|
}, bail("failed to create MediaKeys object")).then(function() {
|
|
info("set MediaKeys on <video> element ok");
|
|
|
|
var session = v.mediaKeys.createSession(test.sessionType);
|
|
session.addEventListener("message", UpdateSessionFunc(test));
|
|
session.generateRequest(ev.initDataType, ev.initData).then(function() {
|
|
}, bail("Failed to initialise MediaKeySession"));
|
|
|
|
}, bail("Failed to set MediaKeys on <video> element"));
|
|
});
|
|
|
|
v.addEventListener("ended", function(ev) {
|
|
ok(true, "got ended event");
|
|
SimpleTest.finish();
|
|
});
|
|
|
|
v.addEventListener("error", bail("got error event"));
|
|
|
|
v.src = test.name;
|
|
v.play();
|
|
}
|
|
|
|
function beginTest() {
|
|
manager.runTests(gEMETests, startTest);
|
|
}
|
|
|
|
var prefs = [ ];
|
|
|
|
if (/Linux/.test(navigator.userAgent) ||
|
|
!document.createElement('video').canPlayType("video/mp4")) {
|
|
// XXX remove once we have mp4 PlatformDecoderModules on all platforms.
|
|
prefs.push([ "media.fragmented-mp4.exposed", true ]);
|
|
prefs.push([ "media.fragmented-mp4.use-blank-decoder", true ]);
|
|
}
|
|
|
|
SimpleTest.waitForExplicitFinish();
|
|
SpecialPowers.pushPrefEnv({ "set" : prefs }, beginTest);
|
|
</script>
|
|
</pre>
|
|
</body>
|
|
</html>
|