<!-- webkit-test-runner [ UsesBackForwardCache=true ] -->
<html>
    <head>
        <script src=media-file.js></script>
        <script src=video-test.js></script>
        <script>
            var mediaFile = findMediaFile("video", "content/test");
            var loadCount = 0;

            if (window.testRunner) {
                testRunner.dumpAsText();
                testRunner.waitUntilDone();
            }

            function pageshow(evt) 
            {
                if (!evt.persisted) {
                    // this is the first time the page has been loaded, setup the video element
                    setup();
                } else {
                    consoleWrite("*** Page returned from cache");

                    testExpected("loadCount", 1);

                    // Dump the height of the video so we can verify that the player was restored.
                    video = document.getElementsByTagName('video')[0];
                    videoComputedStyle = getComputedStyle(video);
                    testExpected("videoComputedStyle.width", "320px");
                    testExpected("videoComputedStyle.height", "240px");

                    // schedule the test to end shortly, but wait long enough for the element to fire loading events
                    //  if that is going to happen
                    setTimeout(function() { if (window.testRunner) testRunner.notifyDone(); }, 200);
                }
            }

            function pagehide()
            {
                // Have the video element generate some events that need to be suspended.
                // We use multiple events to verify that they fire in the correct order.
                consoleWrite("*** Changing playbackRate just before going into cache, to schedule a ratechange event.");
                document.getElementsByTagName("video")[0].playbackRate = 2; 
                consoleWrite("*** Changing volume just before going into cache, to schedule a volumechange event.");
                document.getElementsByTagName("video")[0].volume = 0.5; 
            }

            function canplaythrough() 
            {
                testExpected("loadCount", 0);
                if (!loadCount) {
                    video = document.getElementsByTagName('video')[0];
                    consoleWrite("*** Page going into cache");
                    setTimeout('window.location = "data:text/html,<script>history.back()<" + "/script>"', 0);
                }
                ++loadCount;
            }

            function propertyChangeCallback(evt)
            {
                consoleWrite("*** " + evt.type +  " event fired. This should happen AFTER returning from cache.");
            }

            function setup()
            {
                video = mediaElement = document.getElementsByTagName('video')[0];

                waitForEvent('loadstart');
                waitForEvent('canplaythrough', canplaythrough);
                
                video.src = mediaFile;

                video.onratechange = propertyChangeCallback;
                video.onvolumechange = propertyChangeCallback;
            }

            window.onpageshow = pageshow;
            window.onpagehide = pagehide;
        </script>
    </head>
    <body>

        <video controls > </video>
        <p>Make sure we don't reload a &lt;video&gt; element when navigating back to an uncached page.</p>
    </body>
</html>

