<!-- webkit-test-runner [ enableBackForwardCache=true ] -->
<!DOCTYPE html>
<html>
<body>
<video id="video" autoplay=""></video>
<script src="../resources/testharness.js"></script>
<script src="../resources/testharnessreport.js"></script>
<script src="routines.js"></script>
<script>
t = async_test();

window.addEventListener("pageshow", async function(event) {
    if (!event.persisted)
        return;
    assert_equals(t.pc1.connectionState, "disconnected");

    t.pc1.onconnectionstatechange = () => {
        if (t.pc1.connectionState === "connected")
            t.done();
    }

    t.pc1.onicecandidate = (e) => t.pc2.addIceCandidate(e.candidate);
    t.pc2.onicecandidate = (e) => t.pc1.addIceCandidate(e.candidate);

    const offer = await t.pc1.createOffer();
    await t.pc1.setLocalDescription(offer);
    await t.pc2.setRemoteDescription(offer);

    const answer = await t.pc2.createAnswer();
    await t.pc2.setLocalDescription(answer);
    await t.pc1.setRemoteDescription(answer);
});

window.addEventListener("pagehide", t.step_func((event) => {
    assert_equals(t.pc1.connectionState, "connected");
    if (!event.persisted)
        assert_uneached("Page failed to enter page cache");

}));

onload = () => {
    setTimeout(async () => {
        const localStream = await navigator.mediaDevices.getUserMedia({ video: true });
        const stream = await new Promise((resolve, reject) => {
            createConnections((firstConnection) => {
                t.pc1 = firstConnection;
                firstConnection.addTrack(localStream.getVideoTracks()[0], localStream);
            }, (secondConnection) => {
                t.pc2 = secondConnection;
                secondConnection.ontrack = (trackEvent) => {
                    resolve(trackEvent.streams[0]);
                };
            });
            setTimeout(() => reject("Test timed out"), 5000);
        });
        video.srcObject = stream;
        await video.play();

        window.location = "../fast/history/resources/page-cache-helper-10000ms.html";
    }, 0);
};
</script>
</html>
