Source code
Revision control
Copy as Markdown
Other Tools
Test Info: Warnings
- This test gets skipped with pattern: os == 'linux' && (asan || debug) OR xorigin OR os == 'android' OR apple_silicon
- 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>
</head>
<body>
<pre id="test">
<script class="testbody" type="text/javascript">
/* import-globals-from eme.js */
var manager = new MediaTestManager;
// Test that if we can capture a video frame while playing clear content after
// removing the MediaKeys object which was used for a previous encrypted content
// playback on the same video element
function startTest(test, token)
{
manager.started(token);
var sessions = [];
function onSessionCreated(session) {
sessions.push(session);
}
function closeSessions() {
let p = new EMEPromise;
Promise.all(sessions.map(s => s.close()))
.then(p.resolve, p.reject);
return p.promise;
}
let v = document.createElement("video");
document.body.appendChild(v);
let finish = new EMEPromise;
function onVideoEnded() {
ok(true, TimeStamp(token) + " (ENCRYPTED) content playback ended.");
function playClearVideo() {
var p1 = once(v, 'loadeddata', () => {
ok(true, TimeStamp(token) + " Receiving event 'loadeddata' for (CLEAR) content.");
let canvasElem = document.createElement('canvas');
document.body.appendChild(canvasElem);
let ctx2d = canvasElem.getContext('2d');
var gotTypeError = false;
try {
ctx2d.drawImage(v, 0, 0);
} catch (ex) {
if (ex instanceof TypeError) {
gotTypeError = true;
}
}
ok(!gotTypeError, TimeStamp(token) + " Canvas2D context drawImage succeed.")
});
v.src = 'bipbop_225w_175kbps.mp4';
v.play();
Promise.all([p1]).then(() => {
manager.finished(token);
}, () => {
ok(false, TimeStamp(token) + " Something wrong.");
manager.finished(token);
});
}
closeSessions()
.then(() => {
v.setMediaKeys(null)
.then(() => {
ok(true, TimeStamp(token) + " Setting MediaKeys to null.");
playClearVideo();
}, () => {
ok(false, TimeStamp(token) + " Setting MediaKeys to null.");
});;
});
}
once(v, "ended", onVideoEnded);
// Create a MediaKeys object and set to HTMLMediaElement then start the playback.
Promise.all([
LoadInitData(v, test, token),
CreateAndSetMediaKeys(v, test, token),
LoadTest(test, v, token)])
.then(values => {
let initData = values[0];
v.play();
initData.map(ev => {
let session = v.mediaKeys.createSession();
onSessionCreated(session);
MakeRequest(test, token, ev, session);
});
})
.then(() => {
return finish.promise;
})
.catch(reason => ok(false, reason))
}
SimpleTest.waitForExplicitFinish();
manager.runTests(gEMETests, startTest);
</script>
</pre>
</body>
</html>