<!DOCTYPE html>
<html>
  <head>
    <title>
      offlineaudiocontext-detached-no-crash.html
    </title>
    <script src="../../resources/js-test.js"></script>
    <script src="../resources/audit-util.js"></script>
  </head>
  <body>
    <script id="layout-test-code">
      description(
          'Tests document-detached use of OfflineAudioContext, pass if no crash.');

      window.jsTestIsAsync = true;

      function errorCallback(error) {
        testPassed(
            'OfflineAudioContext.startRendering() on a closed context threw an exception.');
        finishJSTest();
      }

      function successCallback() {
        testFailed(
            'OfflineAudioContext.startRendering() on a closed context did not throw an exception.');
        finishJSTest();
      }

      let context;
      function runTest() {
        context.startRendering().then(successCallback, errorCallback);
      }

      function createOfflineContext() {
        let sampleRate = 44100.0;
        let renderLengthInFrames = 512;
        let bufferSize = 512;

        context =
            new w.OfflineAudioContext(1, renderLengthInFrames, sampleRate);
        let node = context.createScriptProcessor(bufferSize, 0, 1);
        let source = context.createBufferSource();
        source.buffer = createImpulseBuffer(context, bufferSize);
        node.onaudioprocess = function(e) {};
        source.connect(node);
        node.connect(context.destination);
        source.start(0);
      }

      let w;
      function processMessage(event) {
        if (event.data == 'opened') {
          createOfflineContext();
          w.close();
        } else if (event.data == 'closed') {
          setTimeout(runTest, 100);
        }
      }

      if (window.testRunner) {
        testRunner.dumpAsText();
        testRunner.waitUntilDone();
        testRunner.setCanOpenWindows();
      }

      w = window.open('../../resources/window-postmessage-open-close.html');
      window.addEventListener('message', processMessage, false);
    </script>
  </body>
</html>
