<!DOCTYPE html>

<html>
<head>
<script src="../resources/js-test-pre.js"></script>
<script src="resources/audio-testing.js"></script>
</head>

<body>

<div id="description"></div>
<div id="console"></div>

<script>
description("This tests that we don't trigger an assertion failure due to AudioNode connection order.");

var sampleRate = 44100.0;
var renderLengthSeconds = 0.125;
var delayTimeSeconds = 0.1;

function createSinWaveBuffer(context, lengthInSeconds, frequency) {
    var audioBuffer = context.createBuffer(1, lengthInSeconds * sampleRate, sampleRate);

    var n = audioBuffer.length;
    var data = audioBuffer.getChannelData(0);

    for (var i = 0; i < n; ++i) {
        data[i] = Math.sin(frequency * 2 * Math.PI * i / sampleRate);
    }

    return audioBuffer;
}

function runTest() {
    if (window.testRunner) {
        testRunner.dumpAsText();
        testRunner.waitUntilDone();
    }
    
    window.jsTestIsAsync = true;
        
    // Create offline audio context.
    var context = new webkitOfflineAudioContext(1, sampleRate * renderLengthSeconds, sampleRate);
    var toneBuffer = createSinWaveBuffer(context, renderLengthSeconds, 880);
    
    var bufferSource = context.createBufferSource();
    bufferSource.buffer = toneBuffer;
    bufferSource.connect(context.destination);

    var delay = context.createDelayNode();
    delay.delayTime.value = delayTimeSeconds;

    // We connect delay node to gain node before anything is connected to delay node itself.
    // We do this because we try to trigger the ASSERT which might be fired due to AudioNode connection order,
    // especially when gain node and delay node is involved e.g. https://bugs.webkit.org/show_bug.cgi?id=76685.

    var gain = context.createGainNode();
    gain.connect(context.destination);
    delay.connect(gain);

    bufferSource.noteOn(0);

    context.oncomplete = finishJSTest;
    context.startRendering();
}

runTest();

</script>

<script src="../resources/js-test-post.js"></script>
</body>
</html>
