<!-- webkit-test-runner [ enablePageCache=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>

