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
99
100
101
102
103
104
105
106
107
108
109
|
<!DOCTYPE html>
<!-- Copyright © 2016 Chromium authors and World Wide Web Consortium, (Massachusetts Institute of Technology, ERCIM, Keio University, Beihang). -->
<html>
<head>
<title>Set MediaKeys multiple times in parallel</title>
<script src="encrypted-media-utils.js"></script>
<!--
Test has been migrated to the root directory and is being disabled here.
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
-->
</head>
<body>
<video id="video"></video>
<div id="log"></div>
<script>
// Wait for an 'encrypted' event as a promise.
function wait_for_encrypted_event(video)
{
return new Promise(function(resolve) {
video.addEventListener('encrypted', function listener(e) {
video.removeEventListener('encrypted', listener);
resolve();
});
});
};
// Return a promise that calls setMediaKeys() and returns 1 if
// resolved, 0 if rejected. If |must_succeed| is true, then
// setMediaKeys() should not fail.
function setMediaKeys_as_count(video, mediaKeys, must_succeed)
{
return video.setMediaKeys(mediaKeys).then(function() {
return 1;
}, function() {
assert_false(must_succeed);
return 0;
});
};
// Return the sum of the results from |promises|. Each promise
// must return a number.
function count_promise_results(promises)
{
var count = 0;
var result = Promise.resolve(null);
promises.forEach(function(promise) {
result = result.then(function() {
return promise;
}).then(function(i) {
count += i;
});
});
return result.then(function() { return count; });
};
promise_test(function(test)
{
var video = document.getElementById('video');
var content = 'webm/test-encrypted.webm';
var access;
var mediaKeys1;
var mediaKeys2;
var mediaKeys3;
var mediaKeys4;
var mediaKeys5;
// Start a video now so that it is waiting for MediaKeys
// in order to continue.
video.src = content;
video.play();
return wait_for_encrypted_event(video).then(function() {
return navigator.requestMediaKeySystemAccess('org.w3.clearkey', getConfigurationForFile(content));
}).then(function(result) {
access = result;
return access.createMediaKeys();
}).then(function(result) {
mediaKeys1 = result;
return access.createMediaKeys();
}).then(function(result) {
mediaKeys2 = result;
return access.createMediaKeys();
}).then(function(result) {
mediaKeys3 = result;
return access.createMediaKeys();
}).then(function(result) {
mediaKeys4 = result;
return access.createMediaKeys();
}).then(function(result) {
mediaKeys5 = result;
// Create 5 calls to setMediaKeys(). The first one must
// succeed, the others are optional.
var p1 = setMediaKeys_as_count(video, mediaKeys1, true);
var p2 = setMediaKeys_as_count(video, mediaKeys2, false);
var p3 = setMediaKeys_as_count(video, mediaKeys3, false);
var p4 = setMediaKeys_as_count(video, mediaKeys4, false);
var p5 = setMediaKeys_as_count(video, mediaKeys5, false);
return count_promise_results([p1, p2, p3, p4, p5]);
}).then(function(count) {
// At least one of the setMediaKeys() calls should have
// succeeded.
assert_greater_than(count, 0);
});
}, 'Set MediaKeys multiple times in parallel.');
</script>
</body>
</html>
|