1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
|
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);
}
|