<!DOCTYPE html>
<html>
    <head>
        <script src="../../resources/js-test-pre.js"></script>
    </head>
    <body>
        <script>
            description("Tests RTCPeerConnection onnegotiationneeded.");

            let stream;
            let pc;
            let audioSender;

            function error()
            {
                testFailed('Stream generation failed.');
                finishJSTest();
            }

            function onNegotiationNeeded(event)
            {
                testPassed('onNegotiationNeeded was called when a track was added.');
                removeTrack();
            }

            function onNegotiationNeeded2(event)
            {
                testPassed('onNegotiationNeeded2 was called when a track was removed.');
                addTrack();
            }

            function onNegotiationNeeded3(event)
            {
                testPassed('onNegotiationNeeded3 was called when a track was added.');
                finishJSTest();
            }

            function gotStream(s)
            {
                testPassed('Got a stream.');
                stream = s;

                pc = new RTCPeerConnection({iceServers:[{urls:'stun:foo.com'}]});
                pc.onnegotiationneeded = onNegotiationNeeded;

                audioSender = pc.addTrack(stream.getAudioTracks()[0], stream);
            }

            function removeTrack()
            {
                pc.onnegotiationneeded = onNegotiationNeeded2;
                pc.removeTrack(audioSender);
            }

            function addTrack()
            {
                pc.onnegotiationneeded = onNegotiationNeeded3;
                pc.addTrack(stream.getVideoTracks()[0], stream);
            }

            if (window.testRunner)
                testRunner.setUserMediaPermission(true);
            else {
                debug("This test can not be run without the testRunner");
                finishJSTest();
            }

            navigator.mediaDevices.getUserMedia({audio:true, video:true}).then(gotStream).catch(error);

            window.jsTestIsAsync = true;
            window.successfullyParsed = true;
        </script>
        <script src="../../resources/js-test-post.js"></script>
    </body>
</html>
