| OLD | NEW |
| 1 <!doctype html> | 1 <!doctype html> |
| 2 <html> | 2 <html> |
| 3 <head> | 3 <head> |
| 4 <title>Test AudioContext.close()</title> | 4 <title>Test AudioContext.close()</title> |
| 5 <script src="../resources/js-test.js"></script> | 5 <script src="../resources/js-test.js"></script> |
| 6 <script src="resources/compatibility.js"></script> | 6 <script src="resources/compatibility.js"></script> |
| 7 <script src="resources/audio-testing.js"></script> | 7 <script src="resources/audio-testing.js"></script> |
| 8 </head> | 8 </head> |
| 9 | 9 |
| 10 <body> | 10 <body> |
| 11 <script> | 11 <script> |
| 12 description("Basic functionality test of closing an AudioContext"); | 12 description("Basic functionality test of closing an AudioContext"); |
| 13 window.jsTestIsAsync = true; | 13 window.jsTestIsAsync = true; |
| 14 | 14 |
| 15 var context; | 15 var context; |
| 16 var offline; | 16 var offline; |
| 17 var osc; | 17 var osc; |
| 18 var gain; | 18 var gain; |
| 19 var promise1; | 19 var promise1; |
| 20 var promise2; | 20 var promise2; |
| 21 var offlinePromise; | 21 var offlinePromise; |
| 22 var wave = new Float32Array(1); | 22 var wave = new Float32Array(1); |
| 23 | 23 |
| 24 var audit = Audit.createTaskRunner(); | 24 var audit = Audit.createTaskRunner(); |
| 25 | 25 |
| 26 // Task: test online context (1). | 26 // Task: test online context (1). |
| 27 audit.defineTask('test-online-context-1', function (done) { | 27 audit.defineTask('test-online-context-1', function (done) { |
| 28 | 28 |
| 29 // Create a context and verify that the various states are correct and | 29 // Create a context and verify that the various states are correct and |
| 30 // that close() exists. | 30 // that close() exists. |
| 31 shouldNotThrow("context = new AudioContext()"); | 31 shouldNotThrow("context = new AudioContext()"); |
| 32 shouldBeEqualToString("context.state", "running"); | 32 shouldBeEqualToString("context.state", "running"); |
| 33 | 33 |
| 34 // Create gain and oscillator for testing later. | 34 // Create gain and oscillator for testing later. |
| 35 shouldNotThrow("osc = context.createOscillator()"); | 35 shouldNotThrow("osc = context.createOscillator()"); |
| 36 shouldNotThrow("gain = context.createGain()"); | 36 shouldNotThrow("gain = context.createGain()"); |
| 37 shouldNotThrow("gain.connect(context.destination)"); | 37 shouldNotThrow("gain.connect(context.destination)"); |
| 38 | 38 |
| 39 // Close the context. When the promise is resolved, continue the next | 39 // Close the context. When the promise is resolved, continue the next |
| 40 // test task. | 40 // test task. |
| 41 context.close().then( | 41 context.close().then( |
| 42 function () { | 42 function () { |
| 43 testPassed("context.close() was correctly resolved"); | 43 testPassed("context.close() was correctly resolved"); |
| 44 }, | 44 }, |
| 45 function () { | 45 function () { |
| 46 testFailed("context.close() was erroneously rejected"); | 46 testFailed("context.close() was erroneously rejected"); |
| 47 } | 47 } |
| 48 ).then(done); | 48 ).then(done); |
| 49 | 49 |
| 50 }); | 50 }); |
| 51 | 51 |
| 52 // Task: test online context (2). | 52 // Task: test online context (2). |
| 53 audit.defineTask('test-online-context-2', function (done) { | 53 audit.defineTask('test-online-context-2', function (done) { |
| 54 | 54 |
| 55 // Context is closed, so verify that we cannot create any more nodes, | 55 // Context is closed, so verify that we cannot create any more nodes, |
| 56 // nor connect any. | 56 // nor connect any. |
| 57 shouldThrow("context.createAnalyser()"); | 57 shouldThrow("context.createAnalyser()"); |
| 58 shouldThrow("context.createBiquadFilter()"); | 58 shouldThrow("context.createBiquadFilter()"); |
| 59 | 59 |
| 60 // createBuffer is an exception because it's not really tied in any way | 60 // createBuffer is an exception because it's not really tied in any way |
| 61 // to an audio context. And it's useful to be able to create a buffer | 61 // to an audio context. And it's useful to be able to create a buffer |
| 62 // inside the oncomplete event of an offline context to use for testing | 62 // inside the oncomplete event of an offline context to use for testing |
| 63 // purposes. | 63 // purposes. |
| 64 shouldNotThrow("context.createBuffer(1, 1, 48000)"); | 64 shouldNotThrow("context.createBuffer(1, 1, 48000)"); |
| 65 | 65 |
| 66 shouldThrow("context.createBufferSource()"); | 66 shouldThrow("context.createBufferSource()"); |
| 67 shouldThrow("context.createChannelMerger()"); | 67 shouldThrow("context.createChannelMerger()"); |
| 68 shouldThrow("context.createChannelSplitter()"); | 68 shouldThrow("context.createChannelSplitter()"); |
| 69 shouldThrow("context.createConvolver()"); | 69 shouldThrow("context.createConvolver()"); |
| 70 shouldThrow("context.createDelay()"); | 70 shouldThrow("context.createDelay()"); |
| 71 shouldThrow("context.createDynamicsCompressor()"); | 71 shouldThrow("context.createDynamicsCompressor()"); |
| 72 shouldThrow("context.createGain()"); | 72 shouldThrow("context.createGain()"); |
| (...skipping 13 matching lines...) Expand all Loading... |
| 86 testFailed("Attempt to resume a closed context erroneously succeeded")
; | 86 testFailed("Attempt to resume a closed context erroneously succeeded")
; |
| 87 }, | 87 }, |
| 88 function () { | 88 function () { |
| 89 testPassed("Attempt to resume a closed context was correctly rejected"
); | 89 testPassed("Attempt to resume a closed context was correctly rejected"
); |
| 90 } | 90 } |
| 91 ).then(done); | 91 ).then(done); |
| 92 }); | 92 }); |
| 93 | 93 |
| 94 // Task: test online context (3). | 94 // Task: test online context (3). |
| 95 audit.defineTask('test-online-context-3', function (done) { | 95 audit.defineTask('test-online-context-3', function (done) { |
| 96 | 96 |
| 97 // Try closing the context again. The promise should be rejected. | 97 // Try closing the context again. The promise should be rejected. |
| 98 context.close().then( | 98 context.close().then( |
| 99 function () { | 99 function () { |
| 100 testFailed("Closing context again erroneously resolved successfully.")
; | 100 testFailed("Closing context again erroneously resolved successfully.")
; |
| 101 }, | 101 }, |
| 102 function () { | 102 function () { |
| 103 testPassed("Closing context again correctly rejected promise."); | 103 testPassed("Closing context again correctly rejected promise."); |
| 104 | 104 // Finally, run GC. The context should be gone, but this seems difficu
lt to verify. |
| 105 // Finally, run GC. The context should be gone, but this seems | 105 gc(); |
| 106 // difficult to verify. | 106 shouldBeNull("context.destination"); |
| 107 if (window.hasOwnProperty('GCController')) { | |
| 108 asyncGC(function () { | |
| 109 shouldBeNull("context.destination"); | |
| 110 }); | |
| 111 } else { | |
| 112 shouldBeNull("context.destination"); | |
| 113 testFailed("asyncGC test not run"); | |
| 114 } | |
| 115 } | 107 } |
| 116 ).then(done); | 108 ).then(done); |
| 117 }); | 109 }); |
| 118 | 110 |
| 119 // Task: test offline context (1). | 111 // Task: test offline context (1). |
| 120 audit.defineTask('test-offline-context-1', function (done) { | 112 audit.defineTask('test-offline-context-1', function (done) { |
| 121 | 113 |
| 122 // For an offline context, just check that if we try to close the context,
| 114 // For an offline context, just check that if we try to close the context, |
| 123 // nothing happens except that the promise returned by close() is rejected
. | 115 // nothing happens except that the promise returned by close() is rejected
. |
| 124 shouldNotThrow("offline = new OfflineAudioContext(1, 1000, 48000)"); | 116 shouldNotThrow("offline = new OfflineAudioContext(1, 1000, 48000)"); |
| 125 shouldBeEqualToString("offline.state", "suspended"); | 117 shouldBeEqualToString("offline.state", "suspended"); |
| 126 offline.close().then( | 118 offline.close().then( |
| 127 function () { | 119 function () { |
| 128 testFailed("Closing offline context erroneously resolved"); | 120 testFailed("Closing offline context erroneously resolved"); |
| 129 }, | 121 }, |
| 130 function () { | 122 function () { |
| 131 testPassed("Closing offline context correctly rejected"); | 123 testPassed("Closing offline context correctly rejected"); |
| 132 } | 124 } |
| 133 ).then(done); | 125 ).then(done); |
| 134 }); | 126 }); |
| 135 | 127 |
| 136 // Task: test offline context (2). | 128 // Task: test offline context (2). |
| 137 audit.defineTask('test-offline-context-2', function (done) { | 129 audit.defineTask('test-offline-context-2', function (done) { |
| 138 | 130 |
| 139 // Try closing again | 131 // Try closing again |
| 140 offline.close().then( | 132 offline.close().then( |
| 141 function () { | 133 function () { |
| 142 testFailed("Closing offline context again erroneously resolved"); | 134 testFailed("Closing offline context again erroneously resolved"); |
| 143 }, | 135 }, |
| 144 function () { | 136 function () { |
| 145 testPassed("Closing offline context again correctly rejected"); | 137 testPassed("Closing offline context again correctly rejected"); |
| 146 } | 138 } |
| 147 ).then( | 139 ).then( |
| 148 function () { | 140 function () { |
| 149 | 141 |
| 150 // Render the context, and check for a valid state | 142 // Render the context, and check for a valid state |
| 151 offline.oncomplete = function (event) { | 143 offline.oncomplete = function (event) { |
| 152 shouldBeEqualToString("event.target.state", "closed"); | 144 shouldBeEqualToString("event.target.state", "closed"); |
| 153 done(); | 145 done(); |
| 154 }; | 146 }; |
| 155 shouldNotThrow("offline.startRendering()"); | 147 shouldNotThrow("offline.startRendering()"); |
| 156 } | 148 } |
| 157 ); | 149 ); |
| 158 | 150 |
| 159 }); | 151 }); |
| 160 | 152 |
| 161 audit.defineTask('finish-test', function (done) { | 153 audit.defineTask('finish-test', function (done) { |
| 162 done(); | 154 done(); |
| 163 finishJSTest(); | 155 finishJSTest(); |
| 164 }); | 156 }); |
| 165 | 157 |
| 166 audit.runTasks( | 158 audit.runTasks( |
| 167 'test-online-context-1', | 159 'test-online-context-1', |
| 168 'test-online-context-2', | 160 'test-online-context-2', |
| 169 'test-online-context-3', | 161 'test-online-context-3', |
| 170 'test-offline-context-1', | 162 'test-offline-context-1', |
| 171 'test-offline-context-2', | 163 'test-offline-context-2', |
| 172 'finish-test' | 164 'finish-test' |
| 173 ); | 165 ); |
| 174 | 166 |
| 175 successfullyParsed = true; | 167 successfullyParsed = true; |
| 176 </script> | 168 </script> |
| 177 </body> | 169 </body> |
| 178 </html> | 170 </html> |
| OLD | NEW |