<!doctype html>
<html>
    <head>
        <meta charset="utf-8">
        <title>Testing webaudio autoplay in case of camera capture</title>
        <script src="../resources/testharness.js"></script>
        <script src="../resources/testharnessreport.js"></script>
    </head>
    <body>
        <script>
test(() => {
    assert_true(!!window.internals, "Test requires internals API");

    var context = new webkitAudioContext();
    internals.setAudioContextRestrictions(context, 'RequireUserGestureForAudioStart');

    var node = context.createBufferSource();
    node.connect(context.destination);
    node.start();
}, "Ensuring autoplay does not work when starting an audio node and getUserMedia is off");

promise_test((test) => {
    if (!window.internals)
        return Promise.reject("Test requires internals API");

    var context = new webkitAudioContext();
    internals.setAudioContextRestrictions(context, 'RequireUserGestureForAudioStart');

    var node = context.createBufferSource();
    node.connect(context.destination);

    var resolve, reject;
    var promise = new Promise((res, rej) => {
        resolve = res;
        reject = rej;
    });
    context.resume().then(() => {
        reject("context should not have resumed");
    });
    setTimeout(() => {
        resolve();
    }, 50);
    return promise;
}, "Ensuring autoplay works when resuming audio context and getUserMedia is off");

promise_test((test) => {
    if (!window.internals)
        return Promise.reject("Test requires internals API");
    return navigator.mediaDevices.getUserMedia({audio: true}).then((stream) => {
        var context = new webkitAudioContext();
        internals.setAudioContextRestrictions(context, 'RequireUserGestureForAudioStart');

        var node = context.createBufferSource();
        node.connect(context.destination);
        node.start();
    });
}, "Ensuring autoplay works when starting an audio node and getUserMedia is on");

promise_test((test) => {
    if (!window.internals)
        return Promise.reject("Test requires internals API");
    return navigator.mediaDevices.getUserMedia({audio: true}).then((stream) => {
        var context = new webkitAudioContext();
        internals.setAudioContextRestrictions(context, 'RequireUserGestureForAudioStart');

        var node = context.createBufferSource();
        node.connect(context.destination);
        return context.resume();
    });
}, "Ensuring autoplay works when resuming audio context and getUserMedia is on");
        </script>
    </body>
</html>
