mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-12-11 08:13:35 +00:00
Bug 1587522 - Add test for EME app approval. r=alwu
Add a test to cover app approval for EME. The test is not currently targeted at android despite the feature being made for GeckoView. This is because we do not have clearkey support on Android, and cannot guarantee Widevine support. If we have broad Widevine support on Android we could rework the test to use that when on Android. For now having some test coverage on clearkey platforms seems better than having no test coverage. Differential Revision: https://phabricator.services.mozilla.com/D56105 --HG-- extra : moz-landing-system : lando
This commit is contained in:
parent
dcf1e97e66
commit
3c162f2452
@ -829,6 +829,9 @@ scheme=https
|
||||
[test_eme_requestKeySystemAccess.html]
|
||||
skip-if = toolkit == 'android' # bug 1149374
|
||||
scheme=https
|
||||
[test_eme_requestMediaKeySystemAccess_with_app_approval.html]
|
||||
skip-if = toolkit == 'android' # bug 1149374
|
||||
scheme=https
|
||||
[test_eme_sample_groups_playback.html]
|
||||
skip-if = toolkit == 'android' # bug 1149374
|
||||
scheme=https
|
||||
|
@ -0,0 +1,212 @@
|
||||
<!DOCTYPE HTML>
|
||||
<html>
|
||||
<head>
|
||||
<title>Test Encrypted Media Extensions access can be gated by application</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>
|
||||
<pre id="test">
|
||||
<script class="testbody" type="text/javascript">
|
||||
|
||||
// These test cases should be used to make a request to
|
||||
// requestMediaKeySystemAccess and have the following members:
|
||||
// name: a name describing the test.
|
||||
// askAppApproval: used to set prefs such so that Gecko will ask for app
|
||||
// approval for EME if true, or not if false.
|
||||
// appApproves: used to set prefs to simulate app approval of permission
|
||||
// request, true if the app approves the request, false if not.
|
||||
// expectedKeySystemAccess: true if we expect to be granted key system access,
|
||||
// false if not.
|
||||
const testCases = [
|
||||
{
|
||||
name: "Don't check for app approval",
|
||||
askAppApproval: false,
|
||||
expectedKeySystemAccess: true,
|
||||
},
|
||||
{
|
||||
name: "Check for app approval and app denies request",
|
||||
askAppApproval: true,
|
||||
appApproves: false,
|
||||
expectedKeySystemAccess: false,
|
||||
},
|
||||
{
|
||||
name: "Check for app approval and app allows request",
|
||||
askAppApproval: true,
|
||||
appApproves: true,
|
||||
expectedKeySystemAccess: true,
|
||||
},
|
||||
];
|
||||
|
||||
// Options for requestMediaKeySystemAccess that are expected to work.
|
||||
const options = [{
|
||||
initDataTypes: ['webm'],
|
||||
audioCapabilities: [
|
||||
{ contentType: 'audio/webm; codecs="opus"' },
|
||||
],
|
||||
videoCapabilities: [
|
||||
{ contentType: 'video/webm; codecs="vp8"' }
|
||||
]
|
||||
}];
|
||||
|
||||
async function setTestPrefs({askAppApproval, appApproves}) {
|
||||
if (!askAppApproval) {
|
||||
// Test doesn't want app approval, set pref so we don't ask and unset prefs
|
||||
// used to determine permission response as we don't need them.
|
||||
await SpecialPowers.pushPrefEnv({
|
||||
set: [["media.eme.require-app-approval", false]],
|
||||
clear: [
|
||||
["media.eme.require-app-approval.prompt.testing"],
|
||||
["media.eme.require-app-approval.prompt.testing.allow"],
|
||||
]
|
||||
});
|
||||
return;
|
||||
}
|
||||
|
||||
// Test wants app approval, and will approve deny requests per appApproces
|
||||
// value, set prefs accordingly.
|
||||
await SpecialPowers.pushPrefEnv({
|
||||
set: [
|
||||
["media.eme.require-app-approval", true],
|
||||
["media.eme.require-app-approval.prompt.testing", true],
|
||||
["media.eme.require-app-approval.prompt.testing.allow", appApproves],
|
||||
],
|
||||
});
|
||||
}
|
||||
|
||||
// Run a test case that makes a single requestMediaKeySystemAccess call. The
|
||||
// outcome of such a test run should depend on the test case's setting of
|
||||
// preferences controlling the eme app approval.
|
||||
async function testSingleRequest(testCase) {
|
||||
await setTestPrefs(testCase);
|
||||
|
||||
try {
|
||||
await navigator.requestMediaKeySystemAccess(CLEARKEY_KEYSYSTEM, options);
|
||||
ok(testCase.expectedKeySystemAccess,
|
||||
`testSingleRequest ${testCase.name}: allowed media key system access.`);
|
||||
} catch(e) {
|
||||
is(e.name,
|
||||
"NotSupportedError",
|
||||
"Should get NotSupportedError when request is blocked.");
|
||||
is(e.message,
|
||||
"The application embedding this user agent has blocked MediaKeySystemAccess",
|
||||
"Should get blocked error message.");
|
||||
ok(!testCase.expectedKeySystemAccess,
|
||||
`testSingleRequest ${testCase.name}: denied media key system access.`);
|
||||
}
|
||||
}
|
||||
|
||||
// Run a test case that, but using invalid arguments for
|
||||
// requestMediaKeySystemAccess. Because we expect the args to be checked
|
||||
// before requesting app approval, this test ensures that we always fail when
|
||||
// using bad args, regardless of the app approval prefs set.
|
||||
async function testRequestWithInvalidArgs(testCase) {
|
||||
const badOptions = [{
|
||||
initDataTypes: ['badType'],
|
||||
audioCapabilities: [
|
||||
{ contentType: 'audio/webm; codecs="notACodec"' },
|
||||
],
|
||||
videoCapabilities: [
|
||||
{ contentType: 'video/webm; codecs="notACodec"' }
|
||||
]
|
||||
}];
|
||||
|
||||
await setTestPrefs(testCase);
|
||||
|
||||
// Check that calls with a bad key system fail.
|
||||
try {
|
||||
await navigator.requestMediaKeySystemAccess("BadKeySystem", options);
|
||||
ok(false,
|
||||
`testRequestWithInvalidArgs ${testCase.name}: should not get access when using bad key system.`);
|
||||
} catch(e) {
|
||||
is(e.name,
|
||||
"NotSupportedError",
|
||||
"Should get NotSupportedError using bad key system.");
|
||||
is(e.message,
|
||||
"Key system is unsupported",
|
||||
"Should get not supported key system error message.");
|
||||
}
|
||||
|
||||
// Check that calls with the bad options fail.
|
||||
try {
|
||||
await navigator.requestMediaKeySystemAccess(CLEARKEY_KEYSYSTEM, badOptions);
|
||||
ok(false,
|
||||
`testRequestWithInvalidArgs ${testCase.name}: should not get access when using bad options.`);
|
||||
} catch(e) {
|
||||
is(e.name,
|
||||
"NotSupportedError",
|
||||
"Should get NotSupportedError using bad options.");
|
||||
is(e.message,
|
||||
"Key system configuration is not supported",
|
||||
"Should get not supported config error message.");
|
||||
}
|
||||
}
|
||||
|
||||
// Run a test case and make multiple requests with the same case. Check that
|
||||
// all requests are resolved with the expected outcome.
|
||||
async function testMultipleRequests(testCase) {
|
||||
// Number of requests to concurrently make.
|
||||
const NUM_REQUESTS = 5;
|
||||
|
||||
await setTestPrefs(testCase);
|
||||
|
||||
let resolveHandler = () => {
|
||||
ok(testCase.expectedKeySystemAccess,
|
||||
`testMultipleRequests ${testCase.name}: allowed media key system access.`);
|
||||
}
|
||||
|
||||
let rejectHandler = e => {
|
||||
is(e.name,
|
||||
"NotSupportedError",
|
||||
"Should get NotSupportedError when request is blocked.");
|
||||
is(e.message,
|
||||
"The application embedding this user agent has blocked MediaKeySystemAccess",
|
||||
"Should get blocked error message.");
|
||||
ok(!testCase.expectedKeySystemAccess,
|
||||
`testMultipleRequests ${testCase.name}: denied media key system access.`);
|
||||
}
|
||||
|
||||
let accessPromises = [];
|
||||
for(let i = 0; i < NUM_REQUESTS; i++) {
|
||||
// Request access then chain to our resolve and reject handlers. The
|
||||
// handlers assert test state then resolve the promise chain. Ensuring the
|
||||
// chain is always resolved allows us to correctly await all outstanding
|
||||
// requests -- otherwise rejects short circuit the Promise.all call below.
|
||||
let accessPromise = navigator.requestMediaKeySystemAccess(CLEARKEY_KEYSYSTEM, options)
|
||||
.then(resolveHandler, rejectHandler);
|
||||
accessPromises.push(accessPromise);
|
||||
}
|
||||
// Wait for all promises to be resolved. If not, we'll time out. Because
|
||||
// our reject handler chains back into a resolved promise, this should wait
|
||||
// for all requests to be serviced, even when requestMediaKeySystemAccess's
|
||||
// promise is rejected.
|
||||
await Promise.all(accessPromises);
|
||||
}
|
||||
|
||||
async function beginTest() {
|
||||
// The tests rely on prefs being set, so run them in sequence. If we run in
|
||||
// parallel the tests break each other by overriding prefs.
|
||||
for (const testCase of testCases) {
|
||||
await testSingleRequest(testCase);
|
||||
}
|
||||
for (const testCase of testCases) {
|
||||
await testRequestWithInvalidArgs(testCase);
|
||||
}
|
||||
for (const testCase of testCases) {
|
||||
await testMultipleRequests(testCase);
|
||||
}
|
||||
SimpleTest.finish();
|
||||
}
|
||||
|
||||
if (!IsMacOSSnowLeopardOrEarlier()) {
|
||||
SimpleTest.waitForExplicitFinish();
|
||||
SetupEMEPref(beginTest);
|
||||
} else {
|
||||
todo(false, "Test disabled on this platform.");
|
||||
}
|
||||
</script>
|
||||
</pre>
|
||||
</body>
|
||||
</html>
|
Loading…
Reference in New Issue
Block a user