Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 <!doctype html> | 1 <!doctype html> |
| 2 <html> | 2 <html> |
| 3 <head> | 3 <head> |
| 4 <title>Test audiocontext suspend/resume</title> | 4 <title>Test AudioContext.suspend() and AudioContext.resume()</title> |
| 5 <script src="resources/compatibility.js"></script> | 5 <script src="../resources/js-test.js"></script> |
| 6 <script src="resources/audio-testing.js"></script> | 6 <script src="resources/compatibility.js"></script> |
| 7 <script src="../resources/js-test.js"></script> | 7 <script src="resources/audio-testing.js"></script> |
| 8 </head> | 8 </head> |
|
Raymond Toy
2015/02/20 21:35:14
Unneeded indentation change?
hongchan
2015/02/20 22:20:09
We agreed to keep the indentation as shown above.
| |
| 9 | 9 |
| 10 <body> | 10 <body> |
| 11 <script> | 11 <script> |
| 12 description("Test suspend/resume for an (offline) AudioContext"); | 12 description("Test suspend/resume for an (offline) AudioContext"); |
| 13 window.jsTestIsAsync = true; | |
| 13 | 14 |
| 14 var context; | 15 var context; |
| 15 var osc; | 16 var osc; |
| 16 var p1; | 17 var p1; |
| 17 var p2; | 18 var p2; |
| 18 | 19 |
| 19 var sampleRate = 44100; | 20 var sampleRate = 44100; |
| 20 var durationInSeconds = 1; | 21 var durationInSeconds = 1; |
| 21 | 22 |
| 22 // Convenience function that returns a function that calls the |passFailMe thod| with the given | 23 var audit = Audit.createTaskRunner(); |
| 23 // |message|. The |passFailMethod| should be either |testPassed| or |test Failed|. | |
| 24 function handlePromise(passFailMethod, message) { | |
| 25 return function () { | |
| 26 passFailMethod(message); | |
| 27 }; | |
| 28 } | |
| 29 | 24 |
| 30 function checkResult (event) { | 25 // Convenience function that returns a function that calls the |passFailFunc | |
| 26 // with the given |message|. The |passFailFunc| should be either |testPasse d| | |
| 27 // or |testFailed|. | |
| 28 function handlePromise(passFailFunc, message) { | |
| 29 return function () { | |
| 30 passFailFunc(message); | |
| 31 }; | |
| 32 } | |
| 33 | |
| 34 // Task 1: test suspend(). | |
| 35 audit.defineTask('test-suspend', function (done) { | |
| 36 | |
| 37 // Test suspend/resume. Ideally this test is best with a online | |
| 38 // AudioContext, but content shell doesn't really have a working online | |
| 39 // AudioContext. Hence, use an OfflineAudioContext. Not all possible | |
| 40 // scenarios can be easily checked with an offline context instead of an | |
| 41 // online context. | |
| 42 | |
| 43 // Create an audio context with an oscillator. | |
| 44 context = new OfflineAudioContext(1, durationInSeconds * sampleRate, sampl eRate); | |
| 45 osc = context.createOscillator(); | |
| 46 osc.connect(context.destination); | |
| 47 | |
| 48 // Verify the state. | |
| 49 shouldBeEqualToString("context.state", "suspended"); | |
| 50 | |
| 51 // Multiple calls to suspend() should not be a problem. But we can't test | |
| 52 // that on an offline context. Thus, check that suspend() on an | |
| 53 // OfflineAudioContext rejects the promise. | |
| 54 shouldNotThrow("p1 = context.suspend()"); | |
| 55 shouldBeType(p1, Promise); | |
| 56 p1.then( | |
| 57 handlePromise(testFailed, "context.suspend() should have been rejected f or an offline context"), | |
| 58 handlePromise(testPassed, "context.suspend() was correctly rejected for an offline context") | |
| 59 ).then(done); | |
| 60 }); | |
| 61 | |
| 62 | |
| 63 // Task 2: test resume(). | |
| 64 audit.defineTask('test-resume', function (done) { | |
| 65 | |
| 66 // Multiple calls to resume should not be a problem. But we can't test | |
| 67 // that on an offline context. Thus, check that resume() on an | |
| 68 // OfflineAudioContext rejects the promise. | |
| 69 shouldNotThrow("p2 = context.resume()"); | |
| 70 shouldBeType(p2, Promise); | |
| 71 | |
| 72 // Resume doesn't actually resume an offline context | |
| 73 shouldBeEqualToString("context.state", "suspended"); | |
| 74 | |
| 75 p2.then( | |
| 76 handlePromise(testFailed, "context.resume() should have been rejected fo r an offline context"), | |
| 77 handlePromise(testPassed, "context.resume() was correctly rejected for a n offline context") | |
| 78 ).then(done); | |
| 79 }); | |
| 80 | |
| 81 // Task 3: test the state after context closed. | |
| 82 audit.defineTask('test-after-close', function (done) { | |
| 83 | |
| 84 // Render the offline context. | |
| 85 osc.start(); | |
| 86 | |
| 87 // Test suspend/resume in tested promise pattern. | |
| 88 context.startRendering().then(function () { | |
| 89 | |
| 31 // We don't care about the actual result of the offline rendering. | 90 // We don't care about the actual result of the offline rendering. |
|
Raymond Toy
2015/02/20 21:35:13
This seems indented incorrectly or inconsistently.
hongchan
2015/02/20 22:20:09
I see. I naively put the comment based on the orig
| |
| 32 shouldBeEqualToString("context.state", "closed"); | 91 shouldBeEqualToString("context.state", "closed"); |
| 92 | |
| 33 // suspend() should be rejected on a closed context. | 93 // suspend() should be rejected on a closed context. |
| 34 context.suspend() | 94 context.suspend().then( |
| 35 .then(handlePromise( | 95 handlePromise(testFailed, "context.suspend() on a closed context not r ejected"), |
| 36 testFailed, | 96 handlePromise(testPassed, "context.suspend() on a closed context rejec ted as expected") |
| 37 "context.suspend() on a closed context not rejected"), | 97 ).then(function () { |
| 38 handlePromise( | 98 // resume() should be rejected on closed context. |
| 39 testPassed, | 99 context.resume().then( |
| 40 "context.suspend() on a closed context rejected as expected")) | 100 handlePromise(testFailed, "context.resume() on a closed context not rejected"), |
| 41 .then(function () { | 101 handlePromise(testPassed, "context.resume() on a closed context reje cted as expected") |
| 42 // resume() should be rejected on closed context. | 102 ).then(done); |
| 43 return context.resume(); | 103 }); |
| 44 }) | |
| 45 .then(handlePromise( | |
| 46 testFailed, | |
| 47 "context.resume() on a closed context not rejected"), | |
| 48 handlePromise( | |
| 49 testPassed, | |
| 50 "context.resume() on a closed context rejected as expected")) | |
| 51 .then(finishJSTest); | |
| 52 } | |
| 53 | 104 |
| 54 function runOfflineContextTest() { | 105 }); |
| 55 // Render the offline context. | 106 }); |
| 56 osc.start(); | |
| 57 context.oncomplete = checkResult; | |
| 58 context.startRendering(); | |
| 59 } | |
| 60 | 107 |
| 61 function runResumeTest () { | 108 audit.defineTask('finish-test', function (done) { |
| 62 // Multiple calls to resume should not be a problem. But we can't test t hat on an offline | 109 done(); |
| 63 // context. Thus, check that resume() on an OfflineAudioContext rejects the promise. | 110 finishJSTest(); |
| 64 shouldNotThrow("p1 = context.resume()"); | 111 }); |
| 65 shouldBeType(p1, Promise); | |
| 66 // Resume doesn't actually resume an offline context | |
| 67 shouldBeEqualToString("context.state", "suspended"); | |
| 68 | |
| 69 p1.then(handlePromise( | |
| 70 testFailed, | |
| 71 "context.resume() should have been rejected for an offline con text"), | |
| 72 handlePromise( | |
| 73 testPassed, | |
| 74 "context.resume() was correctly rejected for an offline contex t")) | |
| 75 .then(runOfflineContextTest); | |
| 76 } | |
| 77 | 112 |
| 78 function runTest() { | 113 audit.runTasks( |
| 79 window.jsTestIsAsync = true; | 114 'test-suspend', |
| 80 // Test suspend/resume. Ideally this test is best with a online AudioCo ntext, but content | 115 'test-resume', |
| 81 // shell doesn't really have a working online AudioContext. Hence, use a n | 116 'test-after-close', |
| 82 // OfflineAudioContext. Not all possible scenarios can be easily checked with an offline | 117 'finish-test' |
| 83 // context instead of an online context. | 118 ); |
| 84 | 119 |
| 85 // Create an audio context with an oscillator. | 120 successfullyParsed = true; |
| 86 context = new OfflineAudioContext(1, durationInSeconds * sampleRate, sam pleRate); | 121 </script> |
| 87 osc = context.createOscillator(); | 122 </body> |
| 88 osc.connect(context.destination); | |
| 89 | |
| 90 // Verify the state. | |
| 91 shouldBeEqualToString("context.state", "suspended"); | |
| 92 | |
| 93 // Multiple calls to suspend() should not be a problem. But we can't tes t that on an offline | |
| 94 // context. Thus, check that suspend() on an OfflineAudioContext reject s the promise. | |
| 95 shouldNotThrow("p1 = context.suspend()"); | |
| 96 shouldBeType(p1, Promise); | |
| 97 p1.then(handlePromise( | |
| 98 testFailed, | |
| 99 "context.suspend() should have been rejected for an offline co ntext"), | |
| 100 handlePromise( | |
| 101 testPassed, | |
| 102 "context.suspend() was correctly rejected for an offline conte xt")) | |
| 103 .then(runResumeTest); | |
| 104 } | |
| 105 | |
| 106 runTest(); | |
| 107 successfullyParsed = true; | |
| 108 </script> | |
| 109 </body> | |
| 110 </html> | 123 </html> |
| OLD | NEW |