Source code

Revision control

Copy as Markdown

Other Tools

function runTest(config, qualifier) {
var testname = testnamePrefix( qualifier, config.keysystem )
+ ', setmediakeys multiple times with different mediakeys';
var configuration = getSimpleConfigurationForContent( config.content );
async_test (function (test) {
var _video = config.video,
_access,
_mediaKeys1,
_mediaKeys2,
_usingMediaKeys2 = false;;
// Test MediaKeys assignment.
assert_equals(_video.mediaKeys, null);
assert_equals(typeof _video.setMediaKeys, 'function');
function onFailure(error) {
forceTestFailureFromPromise(test, error);
}
navigator.requestMediaKeySystemAccess(config.keysystem, [configuration]).then(function(access) {
_access = access;
return _access.createMediaKeys();
}).then(test.step_func(function(result) {
_mediaKeys1 = result;
assert_not_equals(_mediaKeys1, null);
// Create a second mediaKeys.
return _access.createMediaKeys();
})).then(test.step_func(function(result) {
_mediaKeys2 = result;
assert_not_equals(_mediaKeys2, null);
// Set _mediaKeys1 on video.
return _video.setMediaKeys(_mediaKeys1);
})).then(test.step_func(function() {
assert_equals(_video.mediaKeys, _mediaKeys1);
// Set _mediaKeys2 on video (switching MediaKeys).
return _video.setMediaKeys(_mediaKeys2);
})).then(test.step_func(function() {
assert_equals(_video.mediaKeys, _mediaKeys2);
// Clear mediaKeys from video.
return _video.setMediaKeys(null);
})).then(test.step_func(function() {
assert_equals(_video.mediaKeys, null);
// Set _mediaKeys1 on video again.
return _video.setMediaKeys(_mediaKeys1);
})).then(test.step_func(function() {
assert_equals(_video.mediaKeys, _mediaKeys1);
return testmediasource(config);
})).then(function(source) {
// Set src attribute on Video Element
_video.src = URL.createObjectURL(source);
// According to the specification, support for changing the Media Keys object after
// the src attribute on the video element has been set is optional. The following operation
// may therefore either succeed or fail. We handle both cases.
return _video.setMediaKeys(_mediaKeys2);
}).then(test.step_func(function() {
// Changing the Media Keys object succeeded
_usingMediaKeys2 = true;
assert_equals(_video.mediaKeys, _mediaKeys2);
// Return something so the promise resolves properly.
return Promise.resolve();
}), test.step_func(function(error) {
// Changing the Media Keys object failed
_usingMediaKeys2 = false;
assert_equals(_video.mediaKeys, _mediaKeys1);
// The specification allows either NotSupportedError or InvalidStateError depending on
// whether the failure was because changing Media Keys object is not supported
// or just not allowed at this time, respectively.
assert_in_array(error.name, ['InvalidStateError','NotSupportedError']);
assert_not_equals(error.message, '');
// Return something so the promise resolves properly.
return Promise.resolve();
})).then(function() {
// According to the specification, support for clearing the Media Keys object associated
// with the video element is optional. The following operation
// may therefore either succeed or fail. We handle both cases.
return _video.setMediaKeys(null);
}).then(test.step_func(function() {
// Clearing the media keys succeeded
assert_equals(_video.mediaKeys, null);
test.done();
}), test.step_func(function(error) {
// Clearing the media keys failed
if(!_usingMediaKeys2) {
assert_equals(_video.mediaKeys, _mediaKeys1);
} else {
assert_equals(_video.mediaKeys, _mediaKeys2);
}
// The specification allows either NotSupportedError or InvalidStateError depending on
// whether the failure was because changing Media Keys object is not supported
// or just not allowed at this time, respectively.
assert_in_array(error.name, ['InvalidStateError','NotSupportedError']);
assert_not_equals(error.message, '');
test.done();
})).catch(onFailure);
}, testname);
}