OLD | NEW |
1 <!doctype html> | 1 <!DOCTYPE html> |
2 <html> | 2 <html> |
3 <head> | 3 <head> |
4 <title>Test AudioContext.suspend() and AudioContext.resume()</title> | 4 <title> |
5 <script src="../../resources/testharness.js"></script> | 5 Test AudioContext.suspend() and AudioContext.resume() |
6 <script src="../../resources/testharnessreport.js"></script> | 6 </title> |
7 <script src="../resources/audit-util.js"></script> | 7 <script src="../../resources/testharness.js"></script> |
8 <script src="../resources/audit.js"></script> | 8 <script src="../../resources/testharnessreport.js"></script> |
9 </head> | 9 <script src="../resources/audit-util.js"></script> |
| 10 <script src="../resources/audit.js"></script> |
| 11 </head> |
| 12 <body> |
| 13 <script id="layout-test-code"> |
| 14 let offlineContext; |
| 15 let osc; |
| 16 let p1; |
| 17 let p2; |
| 18 let p3; |
10 | 19 |
11 <body> | 20 let sampleRate = 44100; |
12 <script> | 21 let durationInSeconds = 1; |
13 let offlineContext; | |
14 let osc; | |
15 let p1; | |
16 let p2; | |
17 let p3; | |
18 | 22 |
19 let sampleRate = 44100; | 23 let audit = Audit.createTaskRunner(); |
20 let durationInSeconds = 1; | |
21 | 24 |
22 let audit = Audit.createTaskRunner(); | 25 // Task: test suspend(). |
| 26 audit.define( |
| 27 { |
| 28 label: 'test-suspend', |
| 29 description: 'Test suspend() for offline context' |
| 30 }, |
| 31 function(task, should) { |
| 32 // Test suspend/resume. Ideally this test is best with a online |
| 33 // AudioContext, but content shell doesn't really have a working |
| 34 // online AudioContext. Hence, use an OfflineAudioContext. Not all |
| 35 // possible scenarios can be easily checked with an offline context |
| 36 // instead of an online context. |
23 | 37 |
24 // Task: test suspend(). | 38 // Create an audio context with an oscillator. |
25 audit.define({ | 39 should( |
26 label: 'test-suspend', | 40 () => { |
27 description: "Test suspend() for offline context" | 41 offlineContext = new OfflineAudioContext( |
28 }, function (task, should) { | 42 1, durationInSeconds * sampleRate, sampleRate); |
29 // Test suspend/resume. Ideally this test is best with a online | 43 }, |
30 // AudioContext, but content shell doesn't really have a working online | 44 'offlineContext = new OfflineAudioContext(1, ' + |
31 // AudioContext. Hence, use an OfflineAudioContext. Not all possible | 45 (durationInSeconds * sampleRate) + ', ' + sampleRate + ')') |
32 // scenarios can be easily checked with an offline context instead of an | 46 .notThrow(); |
33 // online context. | 47 osc = offlineContext.createOscillator(); |
| 48 osc.connect(offlineContext.destination); |
34 | 49 |
35 // Create an audio context with an oscillator. | 50 // Verify the state. |
36 should(() => { | 51 should(offlineContext.state, 'offlineContext.state') |
37 offlineContext = new OfflineAudioContext(1, durationInSeconds * | 52 .beEqualTo('suspended'); |
38 sampleRate, sampleRate); | |
39 }, | |
40 "offlineContext = new OfflineAudioContext(1, " + ( | |
41 durationInSeconds * | |
42 sampleRate) + ", " + sampleRate + ")" | |
43 ) | |
44 .notThrow(); | |
45 osc = offlineContext.createOscillator(); | |
46 osc.connect(offlineContext.destination); | |
47 | 53 |
48 // Verify the state. | 54 // Multiple calls to suspend() should not be a problem. But we can't |
49 should(offlineContext.state, "offlineContext.state") | 55 // test that on an offline context. Thus, check that suspend() on |
50 .beEqualTo("suspended"); | 56 // an OfflineAudioContext rejects the promise. |
| 57 should( |
| 58 () => p1 = offlineContext.suspend(), |
| 59 'p1 = offlineContext.suspend()') |
| 60 .notThrow(); |
| 61 should(p1 instanceof Promise, 'p1 instanceof Promise').beTrue(); |
51 | 62 |
52 // Multiple calls to suspend() should not be a problem. But we can't test | 63 should(p1, 'p1').beRejected().then(task.done.bind(task)); |
53 // that on an offline context. Thus, check that suspend() on an | 64 }); |
54 // OfflineAudioContext rejects the promise. | |
55 should(() => p1 = offlineContext.suspend(), | |
56 "p1 = offlineContext.suspend()") | |
57 .notThrow(); | |
58 should(p1 instanceof Promise, "p1 instanceof Promise") | |
59 .beTrue(); | |
60 | |
61 should(p1, "p1") | |
62 .beRejected() | |
63 .then(task.done.bind(task)); | |
64 }); | |
65 | 65 |
66 | 66 |
67 // Task: test resume(). | 67 // Task: test resume(). |
68 audit.define({ | 68 audit.define( |
69 label: 'test-resume', | 69 { |
70 description: "Test resume() for offline context" | 70 label: 'test-resume', |
71 }, function (task, should) { | 71 description: 'Test resume() for offline context' |
72 // Multiple calls to resume should not be a problem. But we can't test | 72 }, |
73 // that on an offline context. Thus, check that resume() on an | 73 function(task, should) { |
74 // OfflineAudioContext rejects the promise. | 74 // Multiple calls to resume should not be a problem. But we can't |
75 should(() => p2 = offlineContext.resume(), | 75 // test that on an offline context. Thus, check that resume() on an |
76 "p2 = offlineContext.resume()") | 76 // OfflineAudioContext rejects the promise. |
77 .notThrow(); | 77 should( |
78 should(p2 instanceof Promise, "p2 instanceof Promise") | 78 () => p2 = offlineContext.resume(), |
79 .beTrue(); | 79 'p2 = offlineContext.resume()') |
| 80 .notThrow(); |
| 81 should(p2 instanceof Promise, 'p2 instanceof Promise').beTrue(); |
80 | 82 |
81 // Resume doesn't actually resume an offline context | 83 // Resume doesn't actually resume an offline context |
82 should(offlineContext.state, "After resume, offlineContext.state") | 84 should(offlineContext.state, 'After resume, offlineContext.state') |
83 .beEqualTo("suspended"); | 85 .beEqualTo('suspended'); |
84 should(p2, "p2") | 86 should(p2, 'p2').beRejected().then(task.done.bind(task)); |
85 .beRejected() | 87 }); |
86 .then(task.done.bind(task)); | |
87 }); | |
88 | 88 |
89 // Task: test the state after context closed. | 89 // Task: test the state after context closed. |
90 audit.define({ | 90 audit.define( |
91 label: 'test-after-close', | 91 { |
92 description: "Test state after context closed" | 92 label: 'test-after-close', |
93 }, function (task, should) { | 93 description: 'Test state after context closed' |
94 // Render the offline context. | 94 }, |
95 osc.start(); | 95 function(task, should) { |
| 96 // Render the offline context. |
| 97 osc.start(); |
96 | 98 |
97 // Test suspend/resume in tested promise pattern. We don't care about the | 99 // Test suspend/resume in tested promise pattern. We don't care |
98 // actual result of the offline rendering. | 100 // about the actual result of the offline rendering. |
99 should(() => p3 = offlineContext.startRendering(), | 101 should( |
100 "p3 = offlineContext.startRendering()") | 102 () => p3 = offlineContext.startRendering(), |
101 .notThrow(); | 103 'p3 = offlineContext.startRendering()') |
| 104 .notThrow(); |
102 | 105 |
103 p3.then(() => { | 106 p3.then(() => { |
104 should(offlineContext.state, "After close, offlineContext.state") | 107 should(offlineContext.state, 'After close, offlineContext.state') |
105 .beEqualTo("closed"); | 108 .beEqualTo('closed'); |
106 | 109 |
107 // suspend() should be rejected on a closed context. | 110 // suspend() should be rejected on a closed context. |
108 should(offlineContext.suspend(), "offlineContext.suspend()") | 111 should(offlineContext.suspend(), 'offlineContext.suspend()') |
109 .beRejected() | 112 .beRejected() |
110 .then(() => { | 113 .then(() => { |
111 // resume() should be rejected on closed context. | 114 // resume() should be rejected on closed context. |
112 should(offlineContext.resume(), | 115 should(offlineContext.resume(), 'offlineContext.resume()') |
113 "offlineContext.resume()") | 116 .beRejected() |
114 .beRejected() | 117 .then(task.done.bind(task)); |
115 .then(task.done.bind(task)); | 118 }) |
116 }) | 119 }); |
117 }); | 120 }); |
118 }); | |
119 | 121 |
120 audit.define({ | 122 audit.define( |
121 label: 'resume-running-context', | 123 { |
122 description: 'Test resuming a running context' | 124 label: 'resume-running-context', |
123 }, (task, should) => { | 125 description: 'Test resuming a running context' |
124 let context; | 126 }, |
125 should(() => context = new AudioContext(), | 127 (task, should) => { |
126 'Create online context') | 128 let context; |
127 .notThrow(); | 129 should(() => context = new AudioContext(), 'Create online context') |
| 130 .notThrow(); |
128 | 131 |
129 should(context.state, 'context.state') | 132 should(context.state, 'context.state').beEqualTo('running'); |
130 .beEqualTo('running'); | 133 should(context.resume(), 'context.resume') |
131 should(context.resume(), 'context.resume') | 134 .beResolved() |
132 .beResolved() | 135 .then(() => { |
133 .then(() => { | 136 should(context.state, 'context.state after resume') |
134 should(context.state, 'context.state after resume') | 137 .beEqualTo('running'); |
135 .beEqualTo('running'); | 138 }) |
136 }) | 139 .then(() => task.done()); |
137 .then(() => task.done()); | 140 }); |
138 }); | |
139 | 141 |
140 audit.run(); | 142 audit.run(); |
141 </script> | 143 </script> |
142 </body> | 144 </body> |
143 </html> | 145 </html> |
OLD | NEW |