<!DOCTYPE html>
<script src="../../resources/gc.js"></script>
<script src="../../resources/testharness.js"></script>
<script src="../../resources/testharnessreport.js"></script>
<script>
function soon() { return new Promise(resolve => setTimeout(resolve, 0)); }
async function becomesTrue(predicate) {
while (!predicate()) await soon();
}
function createSelfConnectedNode(context) {
const gain = context.createGain();
gain.connect(gain);
}
promise_test(async () => {
await asyncGC();
await becomesTrue(() => internals.audioHandlerCount() == 0);
let context = new OfflineAudioContext(2, 1024, 44100);
let initialCount = internals.audioHandlerCount();
createSelfConnectedNode(context);
assert_greater_than(internals.audioHandlerCount(), 0);
// Need to render to clean up a cycle on an offline context.
await context.startRendering();
// Wait until the gain node's handler has been destroyed to declare victory.
await asyncGC();
await becomesTrue(() => internals.audioHandlerCount() <= initialCount);
}, "No crash should occur when a node connected to itself is collected.");
</script>