| Index: LayoutTests/webaudio/scriptprocessornode-premature-death.html
|
| diff --git a/LayoutTests/webaudio/scriptprocessornode-premature-death.html b/LayoutTests/webaudio/scriptprocessornode-premature-death.html
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..d73d199384b689ce0f6a56395bbf650780021b57
|
| --- /dev/null
|
| +++ b/LayoutTests/webaudio/scriptprocessornode-premature-death.html
|
| @@ -0,0 +1,88 @@
|
| +<!DOCTYPE html>
|
| +<script src="../fast/js/resources/js-test-pre.js"></script>
|
| +<body>
|
| +<script>
|
| +description('Tests that a script processor node is not prematurely GCed');
|
| +var jsTestIsAsync = true;
|
| +
|
| +if (!window.internals) {
|
| + testFailed('This test requires window.internals.');
|
| + finishJSTest();
|
| +}
|
| +
|
| +var wasCalled, wasCollectedPrematurely, savedNode, savedCallback;
|
| +
|
| +function test(saveReference, nextStep) {
|
| + debug('Testing ' + (saveReference ? 'with' : 'without') + ' explicitly ' +
|
| + 'keeping a reference to the script processor node alive.');
|
| +
|
| + // Create an audio context
|
| + var context = new webkitOfflineAudioContext(
|
| + 2, // channels
|
| + 4096, // length (frames)
|
| + 44100.0); // sample rate
|
| +
|
| + // Set up a source, reading from an empty buffer
|
| + var source = context.createBufferSource();
|
| + source.buffer = context.createBuffer(
|
| + 2, // source channels
|
| + 4096, // length (frames)
|
| + 44100.0); // sample rate
|
| +
|
| + // Set up a script processor node to generate something
|
| + var node = context.createScriptProcessor(
|
| + 512, // buffer size
|
| + 0, // input channels
|
| + 2); // output channels
|
| +
|
| + // source -> script processor node -> destination
|
| + source.connect(node);
|
| + node.connect(context.destination);
|
| +
|
| + // Set up something which indicates whether we're called to
|
| + // generate anything
|
| +
|
| + wasCalled = false;
|
| + var callback = function () { wasCalled = true; };
|
| + node.onaudioprocess = callback;
|
| +
|
| + if (saveReference) {
|
| + savedNode = node;
|
| + savedCallback = callback;
|
| + }
|
| +
|
| + // Watch the callback; if it dies, we're obviously not generating anything
|
| +
|
| + var observation = internals.observeGC(callback);
|
| + node = callback = null;
|
| + gc();
|
| + wasCollectedPrematurely = observation.wasCollected;
|
| +
|
| + // Make some noise!
|
| +
|
| + source.start(0);
|
| + context.oncomplete = check(nextStep);
|
| + context.startRendering();
|
| +}
|
| +
|
| +function check(nextStep) {
|
| + return function () {
|
| + shouldBeFalse('wasCollectedPrematurely');
|
| + shouldBeTrue('wasCalled');
|
| + nextStep();
|
| + };
|
| +}
|
| +
|
| +function step1() {
|
| + test(true, step2);
|
| +}
|
| +
|
| +function step2() {
|
| + test(false, finishJSTest);
|
| +}
|
| +
|
| +step1();
|
| +
|
| +var successfullyParsed = true;
|
| +</script>
|
| +<script src="../fast/js/resources/js-test-post.js"></script>
|
|
|