OLD | NEW |
1 <!DOCTYPE html> | 1 <!DOCTYPE html> |
2 <html> | 2 <html> |
3 <head> | 3 <head> |
4 <title>Test multiple MediaKeys lifetimes</title> | 4 <title>Test multiple MediaKeys lifetimes</title> |
5 <script src="encrypted-media-utils.js"></script> | 5 <script src="encrypted-media-utils.js"></script> |
6 <script src="../../resources/testharness.js"></script> | 6 <script src="../../resources/testharness.js"></script> |
7 <script src="../../resources/testharnessreport.js"></script> | 7 <script src="../../resources/testharnessreport.js"></script> |
8 </head> | 8 </head> |
9 <body> | 9 <body> |
10 <script> | 10 <script> |
11 // For this test, create several MediaKeys and verify lifetime. | 11 // For this test, create several MediaKeys and verify lifetime. |
12 async_test(function(test) | 12 promise_test(function(test) |
13 { | 13 { |
14 gc(); | 14 var mediaKeys1; |
15 var mediaKeys; | 15 var mediaKeys2; |
16 var startingMediaKeysCount = window.internals.mediaKeysCount(); | 16 var mediaKeys3; |
17 | 17 var mediaKeys4; |
18 function numMediaKeysCreated() | 18 var mediaKeys5; |
19 { | |
20 return window.internals.mediaKeysCount() - startingMediaKeys
Count; | |
21 } | |
22 | 19 |
23 // Create a MediaKeys object. Returns a promise that resolves | 20 // Create a MediaKeys object. Returns a promise that resolves |
24 // with the new MediaKeys object. | 21 // with the new MediaKeys object. |
25 function createMediaKeys() | 22 function createMediaKeys() |
26 { | 23 { |
27 return navigator.requestMediaKeySystemAccess('org.w3.clearke
y', getSimpleConfiguration()).then(function(access) { | 24 return navigator.requestMediaKeySystemAccess('org.w3.clearke
y', getSimpleConfiguration()).then(function(access) { |
28 return access.createMediaKeys(); | 25 return access.createMediaKeys(); |
29 }).then(function(mediaKeys) { | 26 }).then(function(mediaKeys) { |
30 return mediaKeys; | 27 return mediaKeys; |
31 }); | 28 }); |
32 } | 29 } |
33 | 30 |
34 // Create a few MediaKeys objects. Only keep a reference to the | 31 // Create a few MediaKeys objects. Keep references to them, |
35 // last one created. | 32 // to avoid issues if gc() runs. |
36 createMediaKeys().then(function(result) { | 33 return createGCPromise().then(function() { |
37 assert_equals(numMediaKeysCreated(), 1); | 34 assert_equals(window.internals.mediaKeysCount(), 0, 'After i
nitial gc()'); |
38 | 35 |
39 return createMediaKeys(); | 36 return createMediaKeys(); |
40 }).then(function(result) { | 37 }).then(function(result) { |
41 assert_equals(numMediaKeysCreated(), 2); | 38 assert_not_equals(result, null); |
| 39 mediaKeys1 = result; |
| 40 assert_equals(window.internals.mediaKeysCount(), 1, 'Create
first MediaKeys'); |
42 | 41 |
43 return createMediaKeys(); | 42 return createMediaKeys(); |
44 }).then(function(result) { | 43 }).then(function(result) { |
45 assert_equals(numMediaKeysCreated(), 3); | 44 assert_not_equals(result, null); |
| 45 mediaKeys2 = result; |
| 46 assert_equals(window.internals.mediaKeysCount(), 2, 'Create
second MediaKeys'); |
46 | 47 |
47 return createMediaKeys(); | 48 return createMediaKeys(); |
48 }).then(function(result) { | 49 }).then(function(result) { |
49 assert_equals(numMediaKeysCreated(), 4); | 50 assert_not_equals(result, null); |
| 51 mediaKeys3 = result; |
| 52 assert_equals(window.internals.mediaKeysCount(), 3, 'Create
third MediaKeys'); |
50 | 53 |
51 return createMediaKeys(); | 54 return createMediaKeys(); |
52 }).then(function(result) { | 55 }).then(function(result) { |
53 assert_equals(numMediaKeysCreated(), 5); | 56 assert_not_equals(result, null); |
| 57 mediaKeys4 = result; |
| 58 assert_equals(window.internals.mediaKeysCount(), 4, 'Create
fourth MediaKeys'); |
54 | 59 |
55 // |mediaKeys| refers to the most recently created MediaKeys | 60 return createMediaKeys(); |
56 // object. | 61 }).then(function(result) { |
57 mediaKeys = result; | 62 assert_not_equals(result, null); |
| 63 mediaKeys5 = result; |
| 64 assert_equals(window.internals.mediaKeysCount(), 5, 'Create
fifth MediaKeys'); |
58 | 65 |
59 // In order for the MediaKey objects to be garbage | 66 // In order for the MediaKey objects to be garbage |
60 // collected, it needs time to process any pending events. | 67 // collected, it needs time to process any pending events. |
61 return delayToAllowEventProcessingPromise(); | 68 return delayToAllowEventProcessingPromise(); |
62 }).then(function(result) { | 69 }).then(function() { |
63 assert_equals(numMediaKeysCreated(), 5); | 70 assert_equals(window.internals.mediaKeysCount(), 5, 'All ali
ve'); |
64 | 71 |
65 // As we only have a reference (|mediaKeys|) to the last | 72 // Now run garbage collection. Since we have references to |
66 // created MediaKeys object, the other 4 MediaKeys objects | 73 // all 5 MediaKeys, none will be collected. |
67 // are available to be garbage collected. | |
68 return createGCPromise(); | 74 return createGCPromise(); |
69 }).then(function(result) { | 75 }).then(function() { |
70 assert_equals(numMediaKeysCreated(), 1); | 76 assert_equals(window.internals.mediaKeysCount(), 5, 'All sti
ll alive'); |
71 assert_equals(typeof mediaKeys.createSession, 'function'); | 77 |
| 78 // Drop references to 4 of the MediaKeys. As we will only |
| 79 // have a reference to the last created MediaKeys object, |
| 80 // the other 4 MediaKeys objects are available to be |
| 81 // garbage collected. |
| 82 mediaKeys1 = null; |
| 83 mediaKeys2 = null; |
| 84 mediaKeys3 = null; |
| 85 mediaKeys4 = null; |
| 86 return createGCPromise(); |
| 87 }).then(function() { |
| 88 assert_equals(window.internals.mediaKeysCount(), 1, 'Only 1
left'); |
72 | 89 |
73 // Release the last MediaKeys object created. | 90 // Release the last MediaKeys object created. |
74 mediaKeys = null; | 91 mediaKeys5 = null; |
75 | 92 |
76 // Run gc() again to reclaim the remaining MediaKeys object. | 93 // Run gc() again to reclaim the remaining MediaKeys object. |
77 return createGCPromise(); | 94 return createGCPromise(); |
78 }).then(function(result) { | 95 }).then(function() { |
79 assert_equals(numMediaKeysCreated(), 0); | 96 assert_equals(window.internals.mediaKeysCount(), 0, 'After f
inal gc()'); |
80 test.done(); | |
81 }).catch(function(error) { | |
82 forceTestFailureFromPromise(test, error); | |
83 }); | 97 }); |
84 }, 'Multiple MediaKeys lifetime'); | 98 }, 'Multiple MediaKeys lifetime'); |
85 </script> | 99 </script> |
86 </body> | 100 </body> |
87 </html> | 101 </html> |
OLD | NEW |