chromium/third_party/blink/web_tests/media/autoplay/webaudio-audio-context-init.html

<!DOCTYPE html>
<title>Test the initial state of AudioContext's with the autoplay policy</title>
<script src='../../resources/testharness.js'></script>
<script src='../../resources/testharnessreport.js'></script>
<script>
async function activateDocument(t) {
  return new Promise((resolve, reject) => {
    chrome.gpuBenchmarking.pointerActionSequence([
      {
        source: 'mouse',
        actions: [
          { name: 'pointerDown', x: 1, y: 1 },
          { name: 'pointerUp' },
        ],
      }
    ], t.step_func(resolve));
  });
}

function setup(t) {
  const autoplayIgnoresWebAudioEnabled =
      internals.runtimeFlags.autoplayIgnoresWebAudioEnabled;

  internals.runtimeFlags.autoplayIgnoresWebAudioEnabled = false;
  internals.settings.setAutoplayPolicy('document-user-activation-required');

  t.add_cleanup(() => {
    internals.runtimeFlags.autoplayIgnoresWebAudioEnabled =
        autoplayIgnoresWebAudioEnabled;
    internals.settings.setAutoplayPolicy('no-user-gesture-required');
  });
}

promise_test(t => {
  setup(t);

  return new Promise((resolve) => {
    const context = new AudioContext();
    assert_equals(context.state, 'suspended');
    resolve();
  });
}, 'AudioContext without document activation is created suspended');

promise_test(t => {
  setup(t);

  return new Promise((resolve) => {
    const context = new OfflineAudioContext(1, 512, 3000);
    assert_equals(context.state, 'suspended');
    resolve();
  });
}, 'OfflineAudioContext without a document action is created suspended');

promise_test(async t => {
  setup(t);

  await activateDocument(t);

  return new Promise((resolve) => {
    const audioContext = new AudioContext();
    assert_equals(audioContext.state, 'running');

    const offlineAudioContext = new OfflineAudioContext(1, 512, 3000);
    assert_equals(offlineAudioContext.state, 'suspended');

    resolve();
  });
}, 'With document actiovation, AudioContext is created running and OfflineAudioContext suspended');
</script>